All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Matias Bjørling" <m@bjorling.me>
To: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
	axboe@fb.com, keith.busch@intel.com,
	linux-nvme@lists.infradead.org
Cc: "Matias Bjørling" <m@bjorling.me>
Subject: [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
Date: Fri, 10 Jun 2016 14:20:57 +0200	[thread overview]
Message-ID: <1465561262-13789-2-git-send-email-m@bjorling.me> (raw)
In-Reply-To: <1465561262-13789-1-git-send-email-m@bjorling.me>

V2l0aCBMaWdodE5WTSBlbmFibGVkIG5hbWVzcGFjZXMsIHRoZSBnZW5kaXNrIHN0cnVjdHVyZSBp
cyBub3QgZXhwb3NlZAp0byB0aGUgdXNlci4gVGhpcyBwcmV2ZW50cyBMaWdodE5WTSB1c2VycyBm
cm9tIGFjY2Vzc2luZyB0aGUgTlZNZSBkZXZpY2UKZHJpdmVyIHNwZWNpZmljIHN5c2ZzIGVudHJp
ZXMsIGFuZCBMaWdodE5WTSBuYW1lc3BhY2UgZ2VvbWV0cnkuCgpSZWZhY3RvciB0aGUgcmV2YWxp
ZGF0aW9uIHByb2Nlc3MsIHNvIHRoYXQgYSBuYW1lc3BhY2UsIGluc3RlYWQgb2YgYQpnZW5kaXNr
LCBpcyByZXZhbGlkYXRlZC4gVGhpcyBsYXRlciBhbGxvd3MgcGF0Y2hlcyB0byB3aXJlIHVwIHRo
ZQpzeXNmcyBlbnRyaWVzIHVwIHRvIGEgbm9uLWdlbmRpc2sgbmFtZXNwYWNlLgoKU2lnbmVkLW9m
Zi1ieTogTWF0aWFzIEJqw7hybGluZyA8bUBiam9ybGluZy5tZT4KLS0tCiBkcml2ZXJzL252bWUv
aG9zdC9jb3JlLmMgfCAxMzQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0t
LS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA4MiBpbnNlcnRpb25zKCspLCA1MiBkZWxldGlvbnMo
LSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMgYi9kcml2ZXJzL252bWUv
aG9zdC9jb3JlLmMKaW5kZXggNjg0MDYyYS4uZjYxNWI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9u
dm1lL2hvc3QvY29yZS5jCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYwpAQCAtNzg1LDQy
ICs3ODUsMzMgQEAgc3RhdGljIHZvaWQgbnZtZV9jb25maWdfZGlzY2FyZChzdHJ1Y3QgbnZtZV9u
cyAqbnMpCiAJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBucy0+
cXVldWUpOwogfQogCi1zdGF0aWMgaW50IG52bWVfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5k
aXNrICpkaXNrKQorc3RhdGljIGludCBudm1lX3JldmFsaWRhdGVfbnMoc3RydWN0IG52bWVfbnMg
Km5zLCBzdHJ1Y3QgbnZtZV9pZF9ucyAqKmlkKQogewotCXN0cnVjdCBudm1lX25zICpucyA9IGRp
c2stPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbnZtZV9pZF9ucyAqaWQ7Ci0JdTggbGJhZiwgcGlf
dHlwZTsKLQl1MTYgb2xkX21zOwotCXVuc2lnbmVkIHNob3J0IGJzOwotCi0JaWYgKHRlc3RfYml0
KE5WTUVfTlNfREVBRCwgJm5zLT5mbGFncykpIHsKLQkJc2V0X2NhcGFjaXR5KGRpc2ssIDApOwot
CQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JaWYgKG52bWVfaWRlbnRpZnlfbnMobnMtPmN0cmwsIG5z
LT5uc19pZCwgJmlkKSkgeworCWlmIChudm1lX2lkZW50aWZ5X25zKG5zLT5jdHJsLCBucy0+bnNf
aWQsIGlkKSkgewogCQlkZXZfd2FybihkaXNrX3RvX2Rldihucy0+ZGlzayksICIlczogSWRlbnRp
ZnkgZmFpbHVyZVxuIiwKIAkJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlp
ZiAoaWQtPm5jYXAgPT0gMCkgewotCQlrZnJlZShpZCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0K
IAotCWlmIChudm1lX252bV9uc19zdXBwb3J0ZWQobnMsIGlkKSAmJiBucy0+dHlwZSAhPSBOVk1F
X05TX0xJR0hUTlZNKSB7Ci0JCWlmIChudm1lX252bV9yZWdpc3Rlcihucy0+cXVldWUsIGRpc2st
PmRpc2tfbmFtZSkpIHsKLQkJCWRldl93YXJuKGRpc2tfdG9fZGV2KG5zLT5kaXNrKSwKLQkJCQki
JXM6IExpZ2h0TlZNIGluaXQgZmFpbHVyZVxuIiwgX19mdW5jX18pOwotCQkJa2ZyZWUoaWQpOwot
CQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQkJbnMtPnR5cGUgPSBOVk1FX05TX0xJR0hUTlZNOwor
CWlmICgoKmlkKS0+bmNhcCA9PSAwKSB7CisJCWtmcmVlKCppZCk7CisJCXJldHVybiAtRU5PREVW
OwogCX0KIAogCWlmIChucy0+Y3RybC0+dnMgPj0gTlZNRV9WUygxLCAxKSkKLQkJbWVtY3B5KG5z
LT5ldWksIGlkLT5ldWk2NCwgc2l6ZW9mKG5zLT5ldWkpKTsKKwkJbWVtY3B5KG5zLT5ldWksICgq
aWQpLT5ldWk2NCwgc2l6ZW9mKG5zLT5ldWkpKTsKIAlpZiAobnMtPmN0cmwtPnZzID49IE5WTUVf
VlMoMSwgMikpCi0JCW1lbWNweShucy0+dXVpZCwgaWQtPm5ndWlkLCBzaXplb2YobnMtPnV1aWQp
KTsKKwkJbWVtY3B5KG5zLT51dWlkLCAoKmlkKS0+bmd1aWQsIHNpemVvZihucy0+dXVpZCkpOwor
CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fbnZtZV9yZXZhbGlkYXRlX2Rpc2soc3Ry
dWN0IGdlbmRpc2sgKmRpc2ssIHN0cnVjdCBudm1lX2lkX25zICppZCkKK3sKKwlzdHJ1Y3QgbnZt
ZV9ucyAqbnMgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisJdTggbGJhZiwgcGlfdHlwZTsKKwl1MTYg
b2xkX21zOworCXVuc2lnbmVkIHNob3J0IGJzOwogCiAJb2xkX21zID0gbnMtPm1zOwogCWxiYWYg
PSBpZC0+ZmxiYXMgJiBOVk1FX05TX0ZMQkFTX0xCQV9NQVNLOwpAQCAtODU5LDggKzg1MCwyNiBA
QCBzdGF0aWMgaW50IG52bWVfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQog
CWlmIChucy0+Y3RybC0+b25jcyAmIE5WTUVfQ1RSTF9PTkNTX0RTTSkKIAkJbnZtZV9jb25maWdf
ZGlzY2FyZChucyk7CiAJYmxrX21xX3VuZnJlZXplX3F1ZXVlKGRpc2stPnF1ZXVlKTsKK30KIAor
c3RhdGljIGludCBudm1lX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sK
KwlzdHJ1Y3QgbnZtZV9ucyAqbnMgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG52bWVf
aWRfbnMgKmlkID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKHRlc3RfYml0KE5WTUVfTlNfREVB
RCwgJm5zLT5mbGFncykpIHsKKwkJc2V0X2NhcGFjaXR5KGRpc2ssIDApOworCQlyZXR1cm4gLUVO
T0RFVjsKKwl9CisKKwlyZXQgPSBudm1lX3JldmFsaWRhdGVfbnMobnMsICZpZCk7CisJaWYgKHJl
dCkKKwkJcmV0dXJuIHJldDsKKworCV9fbnZtZV9yZXZhbGlkYXRlX2Rpc2soZGlzaywgaWQpOwog
CWtmcmVlKGlkKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDMwLDYgKzE0MzksOCBAQCBzdGF0
aWMgdm9pZCBudm1lX2FsbG9jX25zKHN0cnVjdCBudm1lX2N0cmwgKmN0cmwsIHVuc2lnbmVkIG5z
aWQpCiB7CiAJc3RydWN0IG52bWVfbnMgKm5zOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0
cnVjdCBudm1lX2lkX25zICppZDsKKwljaGFyIGRpc2tfbmFtZVtESVNLX05BTUVfTEVOXTsKIAlp
bnQgbm9kZSA9IGRldl90b19ub2RlKGN0cmwtPmRldik7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxk
KCZjdHJsLT5uYW1lc3BhY2VzX211dGV4KTsKQEAgLTE0NDksNDQgKzE0NjAsNjMgQEAgc3RhdGlj
IHZvaWQgbnZtZV9hbGxvY19ucyhzdHJ1Y3QgbnZtZV9jdHJsICpjdHJsLCB1bnNpZ25lZCBuc2lk
KQogCW5zLT5xdWV1ZS0+cXVldWVkYXRhID0gbnM7CiAJbnMtPmN0cmwgPSBjdHJsOwogCi0JZGlz
ayA9IGFsbG9jX2Rpc2tfbm9kZSgwLCBub2RlKTsKLQlpZiAoIWRpc2spCi0JCWdvdG8gb3V0X2Zy
ZWVfcXVldWU7Ci0KIAlrcmVmX2luaXQoJm5zLT5rcmVmKTsKIAlucy0+bnNfaWQgPSBuc2lkOwot
CW5zLT5kaXNrID0gZGlzazsKIAlucy0+bGJhX3NoaWZ0ID0gOTsgLyogc2V0IHRvIGEgZGVmYXVs
dCB2YWx1ZSBmb3IgNTEyIHVudGlsIGRpc2sgaXMgdmFsaWRhdGVkICovCiAKLQogCWJsa19xdWV1
ZV9sb2dpY2FsX2Jsb2NrX3NpemUobnMtPnF1ZXVlLCAxIDw8IG5zLT5sYmFfc2hpZnQpOwogCW52
bWVfc2V0X3F1ZXVlX2xpbWl0cyhjdHJsLCBucy0+cXVldWUpOwogCi0JZGlzay0+bWFqb3IgPSBu
dm1lX21ham9yOwotCWRpc2stPmZpcnN0X21pbm9yID0gMDsKLQlkaXNrLT5mb3BzID0gJm52bWVf
Zm9wczsKLQlkaXNrLT5wcml2YXRlX2RhdGEgPSBuczsKLQlkaXNrLT5xdWV1ZSA9IG5zLT5xdWV1
ZTsKLQlkaXNrLT5kcml2ZXJmc19kZXYgPSBjdHJsLT5kZXZpY2U7Ci0JZGlzay0+ZmxhZ3MgPSBH
RU5IRF9GTF9FWFRfREVWVDsKLQlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgIm52bWUlZG4lZCIs
IGN0cmwtPmluc3RhbmNlLCBucy0+aW5zdGFuY2UpOwotCi0JaWYgKG52bWVfcmV2YWxpZGF0ZV9k
aXNrKG5zLT5kaXNrKSkKLQkJZ290byBvdXRfZnJlZV9kaXNrOworCWlmIChudm1lX3JldmFsaWRh
dGVfbnMobnMsICZpZCkpCisJCWdvdG8gb3V0X2ZyZWVfcXVldWU7CisKKwlzcHJpbnRmKGRpc2tf
bmFtZSwgIm52bWUlZG4lZCIsIGN0cmwtPmluc3RhbmNlLCBucy0+aW5zdGFuY2UpOworCisJaWYg
KG52bWVfbnZtX25zX3N1cHBvcnRlZChucywgaWQpKSB7CisJCWlmIChudm1lX252bV9yZWdpc3Rl
cihucy0+cXVldWUsIGRpc2tfbmFtZSkpIHsKKwkJCWRldl93YXJuKGN0cmwtPmRldiwKKwkJCQki
JXM6IExpZ2h0TlZNIGluaXQgZmFpbHVyZVxuIiwgX19mdW5jX18pOworCQkJZ290byBvdXRfZnJl
ZV9pZDsKKwkJfQorCisJCWRpc2sgPSBhbGxvY19kaXNrX25vZGUoMCwgbm9kZSk7CisJCWlmICgh
ZGlzaykKKwkJCWdvdG8gb3V0X2ZyZWVfaWQ7CisJCW1lbWNweShkaXNrLT5kaXNrX25hbWUsIGRp
c2tfbmFtZSwgRElTS19OQU1FX0xFTik7CisJCW5zLT5kaXNrID0gZGlzazsKKwkJbnMtPnR5cGUg
PSBOVk1FX05TX0xJR0hUTlZNOworCX0gZWxzZSB7CisJCWRpc2sgPSBhbGxvY19kaXNrX25vZGUo
MCwgbm9kZSk7CisJCWlmICghZGlzaykKKwkJCWdvdG8gb3V0X2ZyZWVfaWQ7CisKKwkJZGlzay0+
bWFqb3IgPSBudm1lX21ham9yOworCQlkaXNrLT5maXJzdF9taW5vciA9IDA7CisJCWRpc2stPmZv
cHMgPSAmbnZtZV9mb3BzOworCQlkaXNrLT5wcml2YXRlX2RhdGEgPSBuczsKKwkJZGlzay0+cXVl
dWUgPSBucy0+cXVldWU7CisJCWRpc2stPmRyaXZlcmZzX2RldiA9IGN0cmwtPmRldmljZTsKKwkJ
ZGlzay0+ZmxhZ3MgPSBHRU5IRF9GTF9FWFRfREVWVDsKKwkJbWVtY3B5KGRpc2stPmRpc2tfbmFt
ZSwgZGlza19uYW1lLCBESVNLX05BTUVfTEVOKTsKKwkJbnMtPmRpc2sgPSBkaXNrOworCisJCV9f
bnZtZV9yZXZhbGlkYXRlX2Rpc2soZGlzaywgaWQpOworCisJCWFkZF9kaXNrKG5zLT5kaXNrKTsK
KworCQlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZkaXNrX3RvX2Rldihucy0+ZGlzayktPmtvYmos
CisJCQkJCQkJJm52bWVfbnNfYXR0cl9ncm91cCkpCisJCQlwcl93YXJuKCIlczogZmFpbGVkIHRv
IGNyZWF0ZSBzeXNmcyBncm91cCBmb3IgaWRlbnRpZmljYXRpb25cbiIsCisJCQkJbnMtPmRpc2st
PmRpc2tfbmFtZSk7CisJfQogCiAJbGlzdF9hZGRfdGFpbF9yY3UoJm5zLT5saXN0LCAmY3RybC0+
bmFtZXNwYWNlcyk7CiAJa3JlZl9nZXQoJmN0cmwtPmtyZWYpOwotCWlmIChucy0+dHlwZSA9PSBO
Vk1FX05TX0xJR0hUTlZNKQotCQlyZXR1cm47CiAKLQlhZGRfZGlzayhucy0+ZGlzayk7Ci0JaWYg
KHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGlza190b19kZXYobnMtPmRpc2spLT5rb2JqLAotCQkJCQkm
bnZtZV9uc19hdHRyX2dyb3VwKSkKLQkJcHJfd2FybigiJXM6IGZhaWxlZCB0byBjcmVhdGUgc3lz
ZnMgZ3JvdXAgZm9yIGlkZW50aWZpY2F0aW9uXG4iLAotCQkJbnMtPmRpc2stPmRpc2tfbmFtZSk7
CisJa2ZyZWUoaWQpOwogCXJldHVybjsKLSBvdXRfZnJlZV9kaXNrOgotCWtmcmVlKGRpc2spOwor
IG91dF9mcmVlX2lkOgorCWtmcmVlKGlkKTsKICBvdXRfZnJlZV9xdWV1ZToKIAlibGtfY2xlYW51
cF9xdWV1ZShucy0+cXVldWUpOwogIG91dF9yZWxlYXNlX2luc3RhbmNlOgotLSAKMi4xLjQKCgpf
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1udm1l
IG1haWxpbmcgbGlzdApMaW51eC1udm1lQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz
LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1udm1lCg==

WARNING: multiple messages have this Message-ID (diff)
From: "Matias Bjørling" <m@bjorling.me>
To: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
	axboe@fb.com, keith.busch@intel.com,
	linux-nvme@lists.infradead.org
Cc: "Matias Bjørling" <m@bjorling.me>
Subject: [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
Date: Fri, 10 Jun 2016 14:20:57 +0200	[thread overview]
Message-ID: <1465561262-13789-2-git-send-email-m@bjorling.me> (raw)
In-Reply-To: <1465561262-13789-1-git-send-email-m@bjorling.me>

With LightNVM enabled namespaces, the gendisk structure is not exposed
to the user. This prevents LightNVM users from accessing the NVMe device
driver specific sysfs entries, and LightNVM namespace geometry.

Refactor the revalidation process, so that a namespace, instead of a
gendisk, is revalidated. This later allows patches to wire up the
sysfs entries up to a non-gendisk namespace.

Signed-off-by: Matias Bjørling <m@bjorling.me>
---
 drivers/nvme/host/core.c | 134 +++++++++++++++++++++++++++++------------------
 1 file changed, 82 insertions(+), 52 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 684062a..f615b6b 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -785,42 +785,33 @@ static void nvme_config_discard(struct nvme_ns *ns)
 	queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, ns->queue);
 }
 
-static int nvme_revalidate_disk(struct gendisk *disk)
+static int nvme_revalidate_ns(struct nvme_ns *ns, struct nvme_id_ns **id)
 {
-	struct nvme_ns *ns = disk->private_data;
-	struct nvme_id_ns *id;
-	u8 lbaf, pi_type;
-	u16 old_ms;
-	unsigned short bs;
-
-	if (test_bit(NVME_NS_DEAD, &ns->flags)) {
-		set_capacity(disk, 0);
-		return -ENODEV;
-	}
-	if (nvme_identify_ns(ns->ctrl, ns->ns_id, &id)) {
+	if (nvme_identify_ns(ns->ctrl, ns->ns_id, id)) {
 		dev_warn(disk_to_dev(ns->disk), "%s: Identify failure\n",
 				__func__);
 		return -ENODEV;
 	}
-	if (id->ncap == 0) {
-		kfree(id);
-		return -ENODEV;
-	}
 
-	if (nvme_nvm_ns_supported(ns, id) && ns->type != NVME_NS_LIGHTNVM) {
-		if (nvme_nvm_register(ns->queue, disk->disk_name)) {
-			dev_warn(disk_to_dev(ns->disk),
-				"%s: LightNVM init failure\n", __func__);
-			kfree(id);
-			return -ENODEV;
-		}
-		ns->type = NVME_NS_LIGHTNVM;
+	if ((*id)->ncap == 0) {
+		kfree(*id);
+		return -ENODEV;
 	}
 
 	if (ns->ctrl->vs >= NVME_VS(1, 1))
-		memcpy(ns->eui, id->eui64, sizeof(ns->eui));
+		memcpy(ns->eui, (*id)->eui64, sizeof(ns->eui));
 	if (ns->ctrl->vs >= NVME_VS(1, 2))
-		memcpy(ns->uuid, id->nguid, sizeof(ns->uuid));
+		memcpy(ns->uuid, (*id)->nguid, sizeof(ns->uuid));
+
+	return 0;
+}
+
+static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)
+{
+	struct nvme_ns *ns = disk->private_data;
+	u8 lbaf, pi_type;
+	u16 old_ms;
+	unsigned short bs;
 
 	old_ms = ns->ms;
 	lbaf = id->flbas & NVME_NS_FLBAS_LBA_MASK;
@@ -859,8 +850,26 @@ static int nvme_revalidate_disk(struct gendisk *disk)
 	if (ns->ctrl->oncs & NVME_CTRL_ONCS_DSM)
 		nvme_config_discard(ns);
 	blk_mq_unfreeze_queue(disk->queue);
+}
 
+static int nvme_revalidate_disk(struct gendisk *disk)
+{
+	struct nvme_ns *ns = disk->private_data;
+	struct nvme_id_ns *id = NULL;
+	int ret;
+
+	if (test_bit(NVME_NS_DEAD, &ns->flags)) {
+		set_capacity(disk, 0);
+		return -ENODEV;
+	}
+
+	ret = nvme_revalidate_ns(ns, &id);
+	if (ret)
+		return ret;
+
+	__nvme_revalidate_disk(disk, id);
 	kfree(id);
+
 	return 0;
 }
 
@@ -1430,6 +1439,8 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 {
 	struct nvme_ns *ns;
 	struct gendisk *disk;
+	struct nvme_id_ns *id;
+	char disk_name[DISK_NAME_LEN];
 	int node = dev_to_node(ctrl->dev);
 
 	lockdep_assert_held(&ctrl->namespaces_mutex);
@@ -1449,44 +1460,63 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 	ns->queue->queuedata = ns;
 	ns->ctrl = ctrl;
 
-	disk = alloc_disk_node(0, node);
-	if (!disk)
-		goto out_free_queue;
-
 	kref_init(&ns->kref);
 	ns->ns_id = nsid;
-	ns->disk = disk;
 	ns->lba_shift = 9; /* set to a default value for 512 until disk is validated */
 
-
 	blk_queue_logical_block_size(ns->queue, 1 << ns->lba_shift);
 	nvme_set_queue_limits(ctrl, ns->queue);
 
-	disk->major = nvme_major;
-	disk->first_minor = 0;
-	disk->fops = &nvme_fops;
-	disk->private_data = ns;
-	disk->queue = ns->queue;
-	disk->driverfs_dev = ctrl->device;
-	disk->flags = GENHD_FL_EXT_DEVT;
-	sprintf(disk->disk_name, "nvme%dn%d", ctrl->instance, ns->instance);
-
-	if (nvme_revalidate_disk(ns->disk))
-		goto out_free_disk;
+	if (nvme_revalidate_ns(ns, &id))
+		goto out_free_queue;
+
+	sprintf(disk_name, "nvme%dn%d", ctrl->instance, ns->instance);
+
+	if (nvme_nvm_ns_supported(ns, id)) {
+		if (nvme_nvm_register(ns->queue, disk_name)) {
+			dev_warn(ctrl->dev,
+				"%s: LightNVM init failure\n", __func__);
+			goto out_free_id;
+		}
+
+		disk = alloc_disk_node(0, node);
+		if (!disk)
+			goto out_free_id;
+		memcpy(disk->disk_name, disk_name, DISK_NAME_LEN);
+		ns->disk = disk;
+		ns->type = NVME_NS_LIGHTNVM;
+	} else {
+		disk = alloc_disk_node(0, node);
+		if (!disk)
+			goto out_free_id;
+
+		disk->major = nvme_major;
+		disk->first_minor = 0;
+		disk->fops = &nvme_fops;
+		disk->private_data = ns;
+		disk->queue = ns->queue;
+		disk->driverfs_dev = ctrl->device;
+		disk->flags = GENHD_FL_EXT_DEVT;
+		memcpy(disk->disk_name, disk_name, DISK_NAME_LEN);
+		ns->disk = disk;
+
+		__nvme_revalidate_disk(disk, id);
+
+		add_disk(ns->disk);
+
+		if (sysfs_create_group(&disk_to_dev(ns->disk)->kobj,
+							&nvme_ns_attr_group))
+			pr_warn("%s: failed to create sysfs group for identification\n",
+				ns->disk->disk_name);
+	}
 
 	list_add_tail_rcu(&ns->list, &ctrl->namespaces);
 	kref_get(&ctrl->kref);
-	if (ns->type == NVME_NS_LIGHTNVM)
-		return;
 
-	add_disk(ns->disk);
-	if (sysfs_create_group(&disk_to_dev(ns->disk)->kobj,
-					&nvme_ns_attr_group))
-		pr_warn("%s: failed to create sysfs group for identification\n",
-			ns->disk->disk_name);
+	kfree(id);
 	return;
- out_free_disk:
-	kfree(disk);
+ out_free_id:
+	kfree(id);
  out_free_queue:
 	blk_cleanup_queue(ns->queue);
  out_release_instance:
-- 
2.1.4

WARNING: multiple messages have this Message-ID (diff)
From: m@bjorling.me (Matias Bjørling)
Subject: [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
Date: Fri, 10 Jun 2016 14:20:57 +0200	[thread overview]
Message-ID: <1465561262-13789-2-git-send-email-m@bjorling.me> (raw)
In-Reply-To: <1465561262-13789-1-git-send-email-m@bjorling.me>

With LightNVM enabled namespaces, the gendisk structure is not exposed
to the user. This prevents LightNVM users from accessing the NVMe device
driver specific sysfs entries, and LightNVM namespace geometry.

Refactor the revalidation process, so that a namespace, instead of a
gendisk, is revalidated. This later allows patches to wire up the
sysfs entries up to a non-gendisk namespace.

Signed-off-by: Matias Bj?rling <m at bjorling.me>
---
 drivers/nvme/host/core.c | 134 +++++++++++++++++++++++++++++------------------
 1 file changed, 82 insertions(+), 52 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 684062a..f615b6b 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -785,42 +785,33 @@ static void nvme_config_discard(struct nvme_ns *ns)
 	queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, ns->queue);
 }
 
-static int nvme_revalidate_disk(struct gendisk *disk)
+static int nvme_revalidate_ns(struct nvme_ns *ns, struct nvme_id_ns **id)
 {
-	struct nvme_ns *ns = disk->private_data;
-	struct nvme_id_ns *id;
-	u8 lbaf, pi_type;
-	u16 old_ms;
-	unsigned short bs;
-
-	if (test_bit(NVME_NS_DEAD, &ns->flags)) {
-		set_capacity(disk, 0);
-		return -ENODEV;
-	}
-	if (nvme_identify_ns(ns->ctrl, ns->ns_id, &id)) {
+	if (nvme_identify_ns(ns->ctrl, ns->ns_id, id)) {
 		dev_warn(disk_to_dev(ns->disk), "%s: Identify failure\n",
 				__func__);
 		return -ENODEV;
 	}
-	if (id->ncap == 0) {
-		kfree(id);
-		return -ENODEV;
-	}
 
-	if (nvme_nvm_ns_supported(ns, id) && ns->type != NVME_NS_LIGHTNVM) {
-		if (nvme_nvm_register(ns->queue, disk->disk_name)) {
-			dev_warn(disk_to_dev(ns->disk),
-				"%s: LightNVM init failure\n", __func__);
-			kfree(id);
-			return -ENODEV;
-		}
-		ns->type = NVME_NS_LIGHTNVM;
+	if ((*id)->ncap == 0) {
+		kfree(*id);
+		return -ENODEV;
 	}
 
 	if (ns->ctrl->vs >= NVME_VS(1, 1))
-		memcpy(ns->eui, id->eui64, sizeof(ns->eui));
+		memcpy(ns->eui, (*id)->eui64, sizeof(ns->eui));
 	if (ns->ctrl->vs >= NVME_VS(1, 2))
-		memcpy(ns->uuid, id->nguid, sizeof(ns->uuid));
+		memcpy(ns->uuid, (*id)->nguid, sizeof(ns->uuid));
+
+	return 0;
+}
+
+static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)
+{
+	struct nvme_ns *ns = disk->private_data;
+	u8 lbaf, pi_type;
+	u16 old_ms;
+	unsigned short bs;
 
 	old_ms = ns->ms;
 	lbaf = id->flbas & NVME_NS_FLBAS_LBA_MASK;
@@ -859,8 +850,26 @@ static int nvme_revalidate_disk(struct gendisk *disk)
 	if (ns->ctrl->oncs & NVME_CTRL_ONCS_DSM)
 		nvme_config_discard(ns);
 	blk_mq_unfreeze_queue(disk->queue);
+}
 
+static int nvme_revalidate_disk(struct gendisk *disk)
+{
+	struct nvme_ns *ns = disk->private_data;
+	struct nvme_id_ns *id = NULL;
+	int ret;
+
+	if (test_bit(NVME_NS_DEAD, &ns->flags)) {
+		set_capacity(disk, 0);
+		return -ENODEV;
+	}
+
+	ret = nvme_revalidate_ns(ns, &id);
+	if (ret)
+		return ret;
+
+	__nvme_revalidate_disk(disk, id);
 	kfree(id);
+
 	return 0;
 }
 
@@ -1430,6 +1439,8 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 {
 	struct nvme_ns *ns;
 	struct gendisk *disk;
+	struct nvme_id_ns *id;
+	char disk_name[DISK_NAME_LEN];
 	int node = dev_to_node(ctrl->dev);
 
 	lockdep_assert_held(&ctrl->namespaces_mutex);
@@ -1449,44 +1460,63 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 	ns->queue->queuedata = ns;
 	ns->ctrl = ctrl;
 
-	disk = alloc_disk_node(0, node);
-	if (!disk)
-		goto out_free_queue;
-
 	kref_init(&ns->kref);
 	ns->ns_id = nsid;
-	ns->disk = disk;
 	ns->lba_shift = 9; /* set to a default value for 512 until disk is validated */
 
-
 	blk_queue_logical_block_size(ns->queue, 1 << ns->lba_shift);
 	nvme_set_queue_limits(ctrl, ns->queue);
 
-	disk->major = nvme_major;
-	disk->first_minor = 0;
-	disk->fops = &nvme_fops;
-	disk->private_data = ns;
-	disk->queue = ns->queue;
-	disk->driverfs_dev = ctrl->device;
-	disk->flags = GENHD_FL_EXT_DEVT;
-	sprintf(disk->disk_name, "nvme%dn%d", ctrl->instance, ns->instance);
-
-	if (nvme_revalidate_disk(ns->disk))
-		goto out_free_disk;
+	if (nvme_revalidate_ns(ns, &id))
+		goto out_free_queue;
+
+	sprintf(disk_name, "nvme%dn%d", ctrl->instance, ns->instance);
+
+	if (nvme_nvm_ns_supported(ns, id)) {
+		if (nvme_nvm_register(ns->queue, disk_name)) {
+			dev_warn(ctrl->dev,
+				"%s: LightNVM init failure\n", __func__);
+			goto out_free_id;
+		}
+
+		disk = alloc_disk_node(0, node);
+		if (!disk)
+			goto out_free_id;
+		memcpy(disk->disk_name, disk_name, DISK_NAME_LEN);
+		ns->disk = disk;
+		ns->type = NVME_NS_LIGHTNVM;
+	} else {
+		disk = alloc_disk_node(0, node);
+		if (!disk)
+			goto out_free_id;
+
+		disk->major = nvme_major;
+		disk->first_minor = 0;
+		disk->fops = &nvme_fops;
+		disk->private_data = ns;
+		disk->queue = ns->queue;
+		disk->driverfs_dev = ctrl->device;
+		disk->flags = GENHD_FL_EXT_DEVT;
+		memcpy(disk->disk_name, disk_name, DISK_NAME_LEN);
+		ns->disk = disk;
+
+		__nvme_revalidate_disk(disk, id);
+
+		add_disk(ns->disk);
+
+		if (sysfs_create_group(&disk_to_dev(ns->disk)->kobj,
+							&nvme_ns_attr_group))
+			pr_warn("%s: failed to create sysfs group for identification\n",
+				ns->disk->disk_name);
+	}
 
 	list_add_tail_rcu(&ns->list, &ctrl->namespaces);
 	kref_get(&ctrl->kref);
-	if (ns->type == NVME_NS_LIGHTNVM)
-		return;
 
-	add_disk(ns->disk);
-	if (sysfs_create_group(&disk_to_dev(ns->disk)->kobj,
-					&nvme_ns_attr_group))
-		pr_warn("%s: failed to create sysfs group for identification\n",
-			ns->disk->disk_name);
+	kfree(id);
 	return;
- out_free_disk:
-	kfree(disk);
+ out_free_id:
+	kfree(id);
  out_free_queue:
 	blk_cleanup_queue(ns->queue);
  out_release_instance:
-- 
2.1.4

  reply	other threads:[~2016-06-10 12:20 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-10 12:20 [PATCH 0/6] sysfs support for LightNVM Matias Bjørling
2016-06-10 12:20 ` Matias Bjørling
2016-06-10 12:20 ` Matias Bjørling [this message]
2016-06-10 12:20   ` [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices Matias Bjørling
2016-06-10 12:20   ` Matias Bjørling
2016-06-10 12:20 ` [PATCH 2/6] null_blk: refactor " Matias Bjørling
2016-06-10 12:20   ` Matias Bjørling
2016-06-10 12:20   ` Matias Bjørling
2016-06-10 12:20 ` [PATCH 3/6] blk-mq: register device instead of disk Matias Bjørling
2016-06-10 12:20   ` Matias Bjørling
2016-06-10 12:21 ` [PATCH 4/6] lightnvm: let drivers control the lifetime of nvm_dev Matias Bjørling
2016-06-10 12:21   ` Matias Bjørling
2016-06-10 12:21   ` Matias Bjørling
2016-06-29 14:51 [PATCH 0/6] enable sysfs for lightnvm Matias Bjørling
2016-06-29 14:51 ` [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices Matias Bjørling
2016-06-29 14:51   ` Matias Bjørling
2016-06-29 14:51   ` Matias Bjørling
2016-06-29 14:51   ` Matias Bjørling

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1465561262-13789-2-git-send-email-m@bjorling.me \
    --to=m@bjorling.me \
    --cc=axboe@fb.com \
    --cc=keith.busch@intel.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.