From: Keith Busch <kbusch@kernel.org>
Rotational block devices can be detected in NVMe through the rotational
attribute in the independent namespace identify data structure.
Extend nvmet with support for the independent namespace identify data
structure and expose the rotational support of the backend device.
Signed-off-by: Keith Busch <kbusch@kernel.org>
---
drivers/nvme/target/admin-cmd.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
index f7e1156ac7ec..f08f1226c897 100644
--- a/drivers/nvme/target/admin-cmd.c
+++ b/drivers/nvme/target/admin-cmd.c
@@ -675,6 +675,35 @@ static void nvmet_execute_identify_ctrl_nvm(struct nvmet_req *req)
nvmet_zero_sgl(req, 0, sizeof(struct nvme_id_ctrl_nvm)));
}
+static void nvmet_execute_id_cs_indep(struct nvmet_req *req)
+{
+ struct nvme_id_ns_cs_indep *id;
+ u16 status;
+
+ status = nvmet_req_find_ns(req);
+ if (status)
+ goto out;
+
+ id = kzalloc(sizeof(*id), GFP_KERNEL);
+ if (!id) {
+ status = NVME_SC_INTERNAL;
+ goto out;
+ }
+
+ id->nstat = NVME_NSTAT_NRDY;
+ id->anagrpid = req->ns->anagrpid;
+ id->nmic = NVME_NS_NMIC_SHARED;
+ if (req->ns->readonly)
+ id->nsattr |= NVME_NS_ATTR_RO;
+ if (req->ns->bdev && !bdev_nonrot(req->ns->bdev))
+ id->nsfeat |= NVME_NS_ROTATIONAL;
+
+ status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
+ kfree(id);
+out:
+ nvmet_req_complete(req, status);
+}
+
static void nvmet_execute_identify(struct nvmet_req *req)
{
if (!nvmet_check_transfer_len(req, NVME_IDENTIFY_DATA_SIZE))
@@ -719,6 +748,9 @@ static void nvmet_execute_identify(struct nvmet_req *req)
break;
}
break;
+ case NVME_ID_CNS_NS_CS_INDEP:
+ nvmet_execute_id_cs_indep(req);
+ return;
}
pr_debug("unhandled identify cns %d on qid %d\n",
--
2.46.0
在 2024/10/10 20:39, Matias Bjørling 写道:
> From: Keith Busch <kbusch@kernel.org>
>
> Rotational block devices can be detected in NVMe through the rotational
> attribute in the independent namespace identify data structure.
>
> Extend nvmet with support for the independent namespace identify data
> structure and expose the rotational support of the backend device.
>
> Signed-off-by: Keith Busch <kbusch@kernel.org>
> ---
> drivers/nvme/target/admin-cmd.c | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
> index f7e1156ac7ec..f08f1226c897 100644
> --- a/drivers/nvme/target/admin-cmd.c
> +++ b/drivers/nvme/target/admin-cmd.c
> @@ -675,6 +675,35 @@ static void nvmet_execute_identify_ctrl_nvm(struct nvmet_req *req)
> nvmet_zero_sgl(req, 0, sizeof(struct nvme_id_ctrl_nvm)));
> }
>
> +static void nvmet_execute_id_cs_indep(struct nvmet_req *req)
> +{
> + struct nvme_id_ns_cs_indep *id;
> + u16 status;
> +
> + status = nvmet_req_find_ns(req);
> + if (status)
> + goto out;
> +
> + id = kzalloc(sizeof(*id), GFP_KERNEL);
> + if (!id) {
> + status = NVME_SC_INTERNAL;
> + goto out;
> + }
> +
> + id->nstat = NVME_NSTAT_NRDY;
> + id->anagrpid = req->ns->anagrpid;
Hi Matias,
Here should use "cpu_to_le32(req->ns->anagrpid)",
And I send 3 patches to support ns's respective vwc which depends on
your patch,
you can search "[PATCH RFC 0/3] set nvme ns's vwc respectively" to find
my patches,
waiting for your patch applied, and I will work continue.
Best Regards,
Guixin Liu
> + id->nmic = NVME_NS_NMIC_SHARED;
> + if (req->ns->readonly)
> + id->nsattr |= NVME_NS_ATTR_RO;
> + if (req->ns->bdev && !bdev_nonrot(req->ns->bdev))
> + id->nsfeat |= NVME_NS_ROTATIONAL;
> +
> + status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
> + kfree(id);
> +out:
> + nvmet_req_complete(req, status);
> +}
> +
> static void nvmet_execute_identify(struct nvmet_req *req)
> {
> if (!nvmet_check_transfer_len(req, NVME_IDENTIFY_DATA_SIZE))
> @@ -719,6 +748,9 @@ static void nvmet_execute_identify(struct nvmet_req *req)
> break;
> }
> break;
> + case NVME_ID_CNS_NS_CS_INDEP:
> + nvmet_execute_id_cs_indep(req);
> + return;
> }
>
> pr_debug("unhandled identify cns %d on qid %d\n",
Hi Matias,
kernel test robot noticed the following build warnings:
[auto build test WARNING on v6.12-rc2]
[also build test WARNING on linus/master next-20241011]
[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#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Matias-Bj-rling/nvme-make-independent-ns-identify-default/20241010-204205
base: v6.12-rc2
patch link: https://lore.kernel.org/r/20241010123951.1226105-4-m%40bjorling.me
patch subject: [PATCH 3/3 v2] nvmet: add rotational support
config: i386-randconfig-062-20241011 (https://download.01.org/0day-ci/archive/20241012/202410120113.A3HaEkbg-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241012/202410120113.A3HaEkbg-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410120113.A3HaEkbg-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> drivers/nvme/target/admin-cmd.c:704:22: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le32 [usertype] anagrpid @@ got unsigned int [usertype] anagrpid @@
drivers/nvme/target/admin-cmd.c:704:22: sparse: expected restricted __le32 [usertype] anagrpid
drivers/nvme/target/admin-cmd.c:704:22: sparse: got unsigned int [usertype] anagrpid
vim +704 drivers/nvme/target/admin-cmd.c
687
688 static void nvmet_execute_id_cs_indep(struct nvmet_req *req)
689 {
690 struct nvme_id_ns_cs_indep *id;
691 u16 status;
692
693 status = nvmet_req_find_ns(req);
694 if (status)
695 goto out;
696
697 id = kzalloc(sizeof(*id), GFP_KERNEL);
698 if (!id) {
699 status = NVME_SC_INTERNAL;
700 goto out;
701 }
702
703 id->nstat = NVME_NSTAT_NRDY;
> 704 id->anagrpid = req->ns->anagrpid;
705 id->nmic = NVME_NS_NMIC_SHARED;
706 if (req->ns->readonly)
707 id->nsattr |= NVME_NS_ATTR_RO;
708 if (req->ns->bdev && !bdev_nonrot(req->ns->bdev))
709 id->nsfeat |= NVME_NS_ROTATIONAL;
710
711 status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
712 kfree(id);
713 out:
714 nvmet_req_complete(req, status);
715 }
716
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On Thu, Oct 10, 2024 at 02:39:51PM +0200, Matias Bjørling wrote:
> From: Keith Busch <kbusch@kernel.org>
>
> Rotational block devices can be detected in NVMe through the rotational
> attribute in the independent namespace identify data structure.
>
> Extend nvmet with support for the independent namespace identify data
> structure and expose the rotational support of the backend device.
Most of this patches looks fine, but what it really is, is just an
implementation of the I/O Command Set Independent Identify
Namespace data structure.
NVMe actually requires more for rotational media support (quoting
from section 8.1.23 in the NVMe 2.1 Base Specification):
A controller that supports namespaces that store user data on rotational media
shall:
a) set the Rotational Media bit to ‘1’ in the NSFEAT field of the I/O
Command Set Independent Identify Namespace data structure (refer to
the NVM Command Set Specification) for any namespace that stores data
on rotational media;
b) support the Rotational Media Information log page (refer to section
5.1.12.1.22);
c) support the Spinup Control feature (refer to section 5.1.25.1.18);
d) support Endurance Groups (refer to section 3.2.3); and
e) set the EG Rotational Media bit to ‘1’ in the EGFEAT field in the
Endurance Group Information log page for each Endurance Group that
stores data on rotational media.
So we'll need to implement a bit more here. Most of this should be
pretty trivial stubby code, though.
> Signed-off-by: Keith Busch <kbusch@kernel.org>
This also needs your signoff if you pass it on.
© 2016 - 2026 Red Hat, Inc.