All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH] nvmet: add support reading with offset from ANA log
@ 2021-12-30  3:09 kernel test robot
  0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2021-12-30  3:09 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 5520 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20211229155302.16789-1-dwagner@suse.de>
References: <20211229155302.16789-1-dwagner@suse.de>
TO: Daniel Wagner <dwagner@suse.de>
TO: linux-nvme(a)lists.infradead.org
CC: linux-kernel(a)vger.kernel.org
CC: Daniel Wagner <dwagner@suse.de>

Hi Daniel,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linux/master]
[also build test WARNING on linus/master v5.16-rc7 next-20211224]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Daniel-Wagner/nvmet-add-support-reading-with-offset-from-ANA-log/20211229-235321
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 136057256686de39cc3a07c2e39ef6bc43003ff6
:::::: branch date: 11 hours ago
:::::: commit date: 11 hours ago
config: ia64-randconfig-m031-20211229 (https://download.01.org/0day-ci/archive/20211230/202112301112.j0GHPdfj-lkp(a)intel.com/config)
compiler: ia64-linux-gcc (GCC) 11.2.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
drivers/nvme/target/admin-cmd.c:307 nvmet_execute_get_log_page_ana() warn: is 'buffer' large enough for 'struct nvme_ana_rsp_hdr'? 15

vim +307 drivers/nvme/target/admin-cmd.c

72efd25dcf4f63 Christoph Hellwig 2018-07-19  268  
72efd25dcf4f63 Christoph Hellwig 2018-07-19  269  static void nvmet_execute_get_log_page_ana(struct nvmet_req *req)
72efd25dcf4f63 Christoph Hellwig 2018-07-19  270  {
d4f2899b84cf50 Daniel Wagner     2021-12-29  271  	struct nvme_ana_rsp_hdr *hdr;
72efd25dcf4f63 Christoph Hellwig 2018-07-19  272  	struct nvme_ana_group_desc *desc;
d4f2899b84cf50 Daniel Wagner     2021-12-29  273  	u64 offset = nvmet_get_log_page_offset(req->cmd);
72efd25dcf4f63 Christoph Hellwig 2018-07-19  274  	size_t len;
d4f2899b84cf50 Daniel Wagner     2021-12-29  275  	void *buffer;
72efd25dcf4f63 Christoph Hellwig 2018-07-19  276  	u32 grpid;
72efd25dcf4f63 Christoph Hellwig 2018-07-19  277  	u16 ngrps = 0;
72efd25dcf4f63 Christoph Hellwig 2018-07-19  278  	u16 status;
72efd25dcf4f63 Christoph Hellwig 2018-07-19  279  
d4f2899b84cf50 Daniel Wagner     2021-12-29  280  	if (offset & 0x3) {
d4f2899b84cf50 Daniel Wagner     2021-12-29  281  		req->error_loc =
d4f2899b84cf50 Daniel Wagner     2021-12-29  282  			offsetof(struct nvme_get_log_page_command, lpo);
d4f2899b84cf50 Daniel Wagner     2021-12-29  283  		status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
d4f2899b84cf50 Daniel Wagner     2021-12-29  284  		goto out;
d4f2899b84cf50 Daniel Wagner     2021-12-29  285  	}
d4f2899b84cf50 Daniel Wagner     2021-12-29  286  
72efd25dcf4f63 Christoph Hellwig 2018-07-19  287  	status = NVME_SC_INTERNAL;
d4f2899b84cf50 Daniel Wagner     2021-12-29  288  	len = sizeof(*hdr) + struct_size(desc, nsids, NVMET_MAX_NAMESPACES);
d4f2899b84cf50 Daniel Wagner     2021-12-29  289  	buffer = kzalloc(len, GFP_KERNEL);
d4f2899b84cf50 Daniel Wagner     2021-12-29  290  	if (!buffer)
72efd25dcf4f63 Christoph Hellwig 2018-07-19  291  		goto out;
d4f2899b84cf50 Daniel Wagner     2021-12-29  292  	hdr = buffer;
d4f2899b84cf50 Daniel Wagner     2021-12-29  293  	desc = buffer + sizeof(*hdr);
72efd25dcf4f63 Christoph Hellwig 2018-07-19  294  
72efd25dcf4f63 Christoph Hellwig 2018-07-19  295  	down_read(&nvmet_ana_sem);
72efd25dcf4f63 Christoph Hellwig 2018-07-19  296  	for (grpid = 1; grpid <= NVMET_MAX_ANAGRPS; grpid++) {
72efd25dcf4f63 Christoph Hellwig 2018-07-19  297  		if (!nvmet_ana_group_enabled[grpid])
72efd25dcf4f63 Christoph Hellwig 2018-07-19  298  			continue;
d4f2899b84cf50 Daniel Wagner     2021-12-29  299  		nvmet_format_ana_group(req, grpid, desc);
72efd25dcf4f63 Christoph Hellwig 2018-07-19  300  		ngrps++;
72efd25dcf4f63 Christoph Hellwig 2018-07-19  301  	}
be1277f5eb17a2 Hannes Reinecke   2018-07-16  302  	for ( ; grpid <= NVMET_MAX_ANAGRPS; grpid++) {
be1277f5eb17a2 Hannes Reinecke   2018-07-16  303  		if (nvmet_ana_group_enabled[grpid])
be1277f5eb17a2 Hannes Reinecke   2018-07-16  304  			ngrps++;
be1277f5eb17a2 Hannes Reinecke   2018-07-16  305  	}
72efd25dcf4f63 Christoph Hellwig 2018-07-19  306  
d4f2899b84cf50 Daniel Wagner     2021-12-29 @307  	hdr->chgcnt = cpu_to_le64(nvmet_ana_chgcnt);
d4f2899b84cf50 Daniel Wagner     2021-12-29  308  	hdr->ngrps = cpu_to_le16(ngrps);
7114ddeb40c0cc Jay Sternberg     2018-11-12  309  	nvmet_clear_aen_bit(req, NVME_AEN_BIT_ANA_CHANGE);
72efd25dcf4f63 Christoph Hellwig 2018-07-19  310  	up_read(&nvmet_ana_sem);
72efd25dcf4f63 Christoph Hellwig 2018-07-19  311  
d4f2899b84cf50 Daniel Wagner     2021-12-29  312  	status = nvmet_copy_to_sgl(req, 0, buffer + offset,
d4f2899b84cf50 Daniel Wagner     2021-12-29  313  				   nvmet_get_log_page_len(req->cmd));
72efd25dcf4f63 Christoph Hellwig 2018-07-19  314  
d4f2899b84cf50 Daniel Wagner     2021-12-29  315  	kfree(buffer);
72efd25dcf4f63 Christoph Hellwig 2018-07-19  316  out:
72efd25dcf4f63 Christoph Hellwig 2018-07-19  317  	nvmet_req_complete(req, status);
72efd25dcf4f63 Christoph Hellwig 2018-07-19  318  }
72efd25dcf4f63 Christoph Hellwig 2018-07-19  319  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH] nvmet: add support reading with offset from ANA log
@ 2021-12-29 15:53 Daniel Wagner
  0 siblings, 0 replies; 2+ messages in thread
From: Daniel Wagner @ 2021-12-29 15:53 UTC (permalink / raw)
  To: linux-nvme; +Cc: linux-kernel, Daniel Wagner

Add support to read with offsets from ANA log buffer.

The controller claims to support extended data for the Get Log Page
command (including extended Number of Dwords and Log Page Offset 2
fields):

lpa     : 0x7
  [2:2] : 0x1   Extended data for Get Log Page Supported
  [1:1] : 0x1   Command Effects Log Page Supported
  [0:0] : 0x1   SMART/Health Log Page per NS Supported

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 drivers/nvme/target/admin-cmd.c | 37 +++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
index 6fb24746de06..7c8806f477e2 100644
--- a/drivers/nvme/target/admin-cmd.c
+++ b/drivers/nvme/target/admin-cmd.c
@@ -263,35 +263,40 @@ static u32 nvmet_format_ana_group(struct nvmet_req *req, u32 grpid,
 	desc->nnsids = cpu_to_le32(count);
 	desc->chgcnt = cpu_to_le64(nvmet_ana_chgcnt);
 	desc->state = req->port->ana_state[grpid];
-	memset(desc->rsvd17, 0, sizeof(desc->rsvd17));
 	return struct_size(desc, nsids, count);
 }
 
 static void nvmet_execute_get_log_page_ana(struct nvmet_req *req)
 {
-	struct nvme_ana_rsp_hdr hdr = { 0, };
+	struct nvme_ana_rsp_hdr *hdr;
 	struct nvme_ana_group_desc *desc;
-	size_t offset = sizeof(struct nvme_ana_rsp_hdr); /* start beyond hdr */
+	u64 offset = nvmet_get_log_page_offset(req->cmd);
 	size_t len;
+	void *buffer;
 	u32 grpid;
 	u16 ngrps = 0;
 	u16 status;
 
+	if (offset & 0x3) {
+		req->error_loc =
+			offsetof(struct nvme_get_log_page_command, lpo);
+		status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
+		goto out;
+	}
+
 	status = NVME_SC_INTERNAL;
-	desc = kmalloc(struct_size(desc, nsids, NVMET_MAX_NAMESPACES),
-		       GFP_KERNEL);
-	if (!desc)
+	len = sizeof(*hdr) + struct_size(desc, nsids, NVMET_MAX_NAMESPACES);
+	buffer = kzalloc(len, GFP_KERNEL);
+	if (!buffer)
 		goto out;
+	hdr = buffer;
+	desc = buffer + sizeof(*hdr);
 
 	down_read(&nvmet_ana_sem);
 	for (grpid = 1; grpid <= NVMET_MAX_ANAGRPS; grpid++) {
 		if (!nvmet_ana_group_enabled[grpid])
 			continue;
-		len = nvmet_format_ana_group(req, grpid, desc);
-		status = nvmet_copy_to_sgl(req, offset, desc, len);
-		if (status)
-			break;
-		offset += len;
+		nvmet_format_ana_group(req, grpid, desc);
 		ngrps++;
 	}
 	for ( ; grpid <= NVMET_MAX_ANAGRPS; grpid++) {
@@ -299,15 +304,15 @@ static void nvmet_execute_get_log_page_ana(struct nvmet_req *req)
 			ngrps++;
 	}
 
-	hdr.chgcnt = cpu_to_le64(nvmet_ana_chgcnt);
-	hdr.ngrps = cpu_to_le16(ngrps);
+	hdr->chgcnt = cpu_to_le64(nvmet_ana_chgcnt);
+	hdr->ngrps = cpu_to_le16(ngrps);
 	nvmet_clear_aen_bit(req, NVME_AEN_BIT_ANA_CHANGE);
 	up_read(&nvmet_ana_sem);
 
-	kfree(desc);
+	status = nvmet_copy_to_sgl(req, 0, buffer + offset,
+				   nvmet_get_log_page_len(req->cmd));
 
-	/* copy the header last once we know the number of groups */
-	status = nvmet_copy_to_sgl(req, 0, &hdr, sizeof(hdr));
+	kfree(buffer);
 out:
 	nvmet_req_complete(req, status);
 }
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-12-30  3:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-30  3:09 [PATCH] nvmet: add support reading with offset from ANA log kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2021-12-29 15:53 Daniel Wagner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.