All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] sysfs support for LightNVM
@ 2016-06-10 12:20 ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme
  Cc: Matias Bjørling

Hi Jens and Keith,

If the patches look good to you, would you pick them up through your
tree?

The common way to expose a storage device is to export it through the
gendisk structure, which takes care of handling the visibility lifetime
of the device to user-space and carries device driver and block layer
specific sysfs entries.

For LightNVM, no gendisk is exposed, which hides these entries.

This patchset enables LightNVM to expose a subset of the gendisk entries
by implementing a new non-gendisk device that only exposes the sysfs
entries that are relevant to the device driver and LightNVM. For example
/mq and the NVMe sysfs entries.

The new non-gendisk exposes itself in place of the original gendisk.
Thus, a gendisk device exposed through /sys/class/nvme/nvme0n1, will
still be exposed through the same directory, although only with the /mq,
lightnvm, and nvme specific entries.

The LightNVM storage device can be found through sysfs by searching
for devices that has the "lightnvm" dev type.

v2:
 - Updated "expose gennvm target type" to expose its own kobject, which
   pblk and others can hook into.
 - Fixed missing disk_name in null_blk patch on lightnvm device

Thanks,
Matias

Matias Bjørling (4):
  nvme: refactor namespaces to support non-gendisk devices
  null_blk: refactor to support non-gendisk devices
  blk-mq: register device instead of disk
  lightnvm: let drivers control the lifetime of nvm_dev

Simon A. F. Lund (2):
  lightnvm: expose device geometry through sysfs
  lightnvm: expose gennvm target type through sysfs

 block/blk-mq-sysfs.c         |  13 ++-
 block/blk-sysfs.c            |   4 +-
 drivers/block/null_blk.c     | 128 +++++++++++++++++-----------
 drivers/lightnvm/Makefile    |   2 +-
 drivers/lightnvm/core.c      |  52 +++++-------
 drivers/lightnvm/gennvm.c    | 112 +++++++++++++++++++++----
 drivers/lightnvm/lightnvm.h  |  35 ++++++++
 drivers/lightnvm/sysfs.c     | 195 +++++++++++++++++++++++++++++++++++++++++++
 drivers/md/dm.c              |   2 +-
 drivers/nvme/host/core.c     | 165 ++++++++++++++++++++----------------
 drivers/nvme/host/lightnvm.c |  29 ++++++-
 drivers/nvme/host/nvme.h     |  26 ++++--
 include/linux/blk-mq.h       |   4 +-
 include/linux/lightnvm.h     |  28 +++++--
 14 files changed, 597 insertions(+), 198 deletions(-)
 create mode 100644 drivers/lightnvm/lightnvm.h
 create mode 100644 drivers/lightnvm/sysfs.c

-- 
2.1.4


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

* [PATCH 0/6] sysfs support for LightNVM
@ 2016-06-10 12:20 ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)


Hi Jens and Keith,

If the patches look good to you, would you pick them up through your
tree?

The common way to expose a storage device is to export it through the
gendisk structure, which takes care of handling the visibility lifetime
of the device to user-space and carries device driver and block layer
specific sysfs entries.

For LightNVM, no gendisk is exposed, which hides these entries.

This patchset enables LightNVM to expose a subset of the gendisk entries
by implementing a new non-gendisk device that only exposes the sysfs
entries that are relevant to the device driver and LightNVM. For example
/mq and the NVMe sysfs entries.

The new non-gendisk exposes itself in place of the original gendisk.
Thus, a gendisk device exposed through /sys/class/nvme/nvme0n1, will
still be exposed through the same directory, although only with the /mq,
lightnvm, and nvme specific entries.

The LightNVM storage device can be found through sysfs by searching
for devices that has the "lightnvm" dev type.

v2:
 - Updated "expose gennvm target type" to expose its own kobject, which
   pblk and others can hook into.
 - Fixed missing disk_name in null_blk patch on lightnvm device

Thanks,
Matias

Matias Bj?rling (4):
  nvme: refactor namespaces to support non-gendisk devices
  null_blk: refactor to support non-gendisk devices
  blk-mq: register device instead of disk
  lightnvm: let drivers control the lifetime of nvm_dev

Simon A. F. Lund (2):
  lightnvm: expose device geometry through sysfs
  lightnvm: expose gennvm target type through sysfs

 block/blk-mq-sysfs.c         |  13 ++-
 block/blk-sysfs.c            |   4 +-
 drivers/block/null_blk.c     | 128 +++++++++++++++++-----------
 drivers/lightnvm/Makefile    |   2 +-
 drivers/lightnvm/core.c      |  52 +++++-------
 drivers/lightnvm/gennvm.c    | 112 +++++++++++++++++++++----
 drivers/lightnvm/lightnvm.h  |  35 ++++++++
 drivers/lightnvm/sysfs.c     | 195 +++++++++++++++++++++++++++++++++++++++++++
 drivers/md/dm.c              |   2 +-
 drivers/nvme/host/core.c     | 165 ++++++++++++++++++++----------------
 drivers/nvme/host/lightnvm.c |  29 ++++++-
 drivers/nvme/host/nvme.h     |  26 ++++--
 include/linux/blk-mq.h       |   4 +-
 include/linux/lightnvm.h     |  28 +++++--
 14 files changed, 597 insertions(+), 198 deletions(-)
 create mode 100644 drivers/lightnvm/lightnvm.h
 create mode 100644 drivers/lightnvm/sysfs.c

-- 
2.1.4

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

* [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
  2016-06-10 12:20 ` Matias Bjørling
  (?)
@ 2016-06-10 12:20   ` Matias Bjørling
  -1 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme
  Cc: Matias Bjørling

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==

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

* [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
@ 2016-06-10 12:20   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme
  Cc: Matias Bjørling

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

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

* [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
@ 2016-06-10 12:20   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)


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

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

* [PATCH 2/6] null_blk: refactor to support non-gendisk devices
  2016-06-10 12:20 ` Matias Bjørling
  (?)
@ 2016-06-10 12:20   ` Matias Bjørling
  -1 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme
  Cc: Matias Bjørling

V2l0aCBMaWdodE5WTSBlbmFibGVkIGRldmljZXMsIHRoZSBnZW5kaXNrIHN0cnVjdHVyZSBpcyBu
b3QgZXhwb3NlZAp0byB0aGUgdXNlci4gVGhpcyBoaWRlcyB0aGUgZGV2aWNlIGRyaXZlciBzcGVj
aWZpYyBzeXNmcyBlbnRyaWVzLCBhbmQKcHJldmVudHMgYmluZGluZyBvZiBMaWdodE5WTSBnZW9t
ZXRyeSBpbmZvcm1hdGlvbiB0byB0aGUgZGV2aWNlLgoKUmVmYWN0b3IgdGhlIGRldmljZSByZWdp
c3RyYXRpb24gcHJvY2Vzcywgc28gdGhhdCBnZW5kaXNrIGFuZApub24tZ2VuZGlzayBkZXZpY2Vz
IGFyZSBlYXNpbHkgbWFuYWdlZC4KClNpZ25lZC1vZmYtYnk6IE1hdGlhcyBCasO4cmxpbmcgPG1A
YmpvcmxpbmcubWU+Ci0tLQogZHJpdmVycy9ibG9jay9udWxsX2Jsay5jIHwgMTEwICsrKysrKysr
KysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwg
NjEgaW5zZXJ0aW9ucygrKSwgNDkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9i
bG9jay9udWxsX2Jsay5jIGIvZHJpdmVycy9ibG9jay9udWxsX2Jsay5jCmluZGV4IGNhYjk3NTku
LjMxMTdkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbnVsbF9ibGsuYworKysgYi9kcml2
ZXJzL2Jsb2NrL251bGxfYmxrLmMKQEAgLTQxNCwyMyArNDE0LDYgQEAgc3RhdGljIHZvaWQgY2xl
YW51cF9xdWV1ZXMoc3RydWN0IG51bGxiICpudWxsYikKIAlrZnJlZShudWxsYi0+cXVldWVzKTsK
IH0KIAotc3RhdGljIHZvaWQgbnVsbF9kZWxfZGV2KHN0cnVjdCBudWxsYiAqbnVsbGIpCi17Ci0J
bGlzdF9kZWxfaW5pdCgmbnVsbGItPmxpc3QpOwotCi0JaWYgKHVzZV9saWdodG52bSkKLQkJbnZt
X3VucmVnaXN0ZXIobnVsbGItPmRpc2tfbmFtZSk7Ci0JZWxzZQotCQlkZWxfZ2VuZGlzayhudWxs
Yi0+ZGlzayk7Ci0JYmxrX2NsZWFudXBfcXVldWUobnVsbGItPnEpOwotCWlmIChxdWV1ZV9tb2Rl
ID09IE5VTExfUV9NUSkKLQkJYmxrX21xX2ZyZWVfdGFnX3NldCgmbnVsbGItPnRhZ19zZXQpOwot
CWlmICghdXNlX2xpZ2h0bnZtKQotCQlwdXRfZGlzayhudWxsYi0+ZGlzayk7Ci0JY2xlYW51cF9x
dWV1ZXMobnVsbGIpOwotCWtmcmVlKG51bGxiKTsKLX0KLQogI2lmZGVmIENPTkZJR19OVk0KIAog
c3RhdGljIHZvaWQgbnVsbF9sbnZtX2VuZF9pbyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJv
cikKQEAgLTU2NCwxMCArNTQ3LDQxIEBAIHN0YXRpYyBzdHJ1Y3QgbnZtX2Rldl9vcHMgbnVsbF9s
bnZtX2Rldl9vcHMgPSB7CiAJLyogU2ltdWxhdGUgbnZtZSBwcm90b2NvbCByZXN0cmljdGlvbiAq
LwogCS5tYXhfcGh5c19zZWN0CQk9IDY0LAogfTsKKworc3RhdGljIGludCBudWxsX252bV9yZWdp
c3RlcihzdHJ1Y3QgbnVsbGIgKm51bGxiKQoreworCXJldHVybiBudm1fcmVnaXN0ZXIobnVsbGIt
PnEsIG51bGxiLT5kaXNrX25hbWUsICZudWxsX2xudm1fZGV2X29wcyk7Cit9CisKK3N0YXRpYyB2
b2lkIG51bGxfbnZtX3VucmVnaXN0ZXIoc3RydWN0IG51bGxiICpudWxsYikKK3sKKwludm1fdW5y
ZWdpc3RlcihudWxsYi0+ZGlza19uYW1lKTsKK30KICNlbHNlCi1zdGF0aWMgc3RydWN0IG52bV9k
ZXZfb3BzIG51bGxfbG52bV9kZXZfb3BzOworc3RhdGljIGludCBudWxsX252bV9yZWdpc3Rlcihz
dHJ1Y3QgbnVsbGIgKm51bGxiKQoreworCXJldHVybiAtRUlOVkFMOworfQorc3RhdGljIHZvaWQg
bnVsbF9udm1fdW5yZWdpc3RlcihzdHJ1Y3QgbnVsbGIgKm51bGxiKSB7fQogI2VuZGlmIC8qIENP
TkZJR19OVk0gKi8KIAorc3RhdGljIHZvaWQgbnVsbF9kZWxfZGV2KHN0cnVjdCBudWxsYiAqbnVs
bGIpCit7CisJbGlzdF9kZWxfaW5pdCgmbnVsbGItPmxpc3QpOworCisJaWYgKHVzZV9saWdodG52
bSkKKwkJbnVsbF9udm1fdW5yZWdpc3RlcihudWxsYik7CisJZWxzZQorCQlkZWxfZ2VuZGlzayhu
dWxsYi0+ZGlzayk7CisJYmxrX2NsZWFudXBfcXVldWUobnVsbGItPnEpOworCWlmIChxdWV1ZV9t
b2RlID09IE5VTExfUV9NUSkKKwkJYmxrX21xX2ZyZWVfdGFnX3NldCgmbnVsbGItPnRhZ19zZXQp
OworCWlmICghdXNlX2xpZ2h0bnZtKQorCQlwdXRfZGlzayhudWxsYi0+ZGlzayk7CisJY2xlYW51
cF9xdWV1ZXMobnVsbGIpOworCWtmcmVlKG51bGxiKTsKK30KKwogc3RhdGljIGludCBudWxsX29w
ZW4oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlKQogewogCXJldHVybiAw
OwpAQCAtNjQwLDExICs2NTQsMzIgQEAgc3RhdGljIGludCBpbml0X2RyaXZlcl9xdWV1ZXMoc3Ry
dWN0IG51bGxiICpudWxsYikKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBudWxsX2FkZF9k
ZXYodm9pZCkKK3N0YXRpYyBpbnQgbnVsbF9nZW5kaXNrX3JlZ2lzdGVyKHN0cnVjdCBudWxsYiAq
bnVsbGIpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7Ci0Jc3RydWN0IG51bGxiICpudWxsYjsK
IAlzZWN0b3JfdCBzaXplOworCisJZGlzayA9IG51bGxiLT5kaXNrID0gYWxsb2NfZGlza19ub2Rl
KDEsIGhvbWVfbm9kZSk7CisJaWYgKCFkaXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaXplID0g
Z2IgKiAxMDI0ICogMTAyNCAqIDEwMjRVTEw7CisJc2V0X2NhcGFjaXR5KGRpc2ssIHNpemUgPj4g
OSk7CisKKwlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9FWFRfREVWVCB8IEdFTkhEX0ZMX1NVUFBS
RVNTX1BBUlRJVElPTl9JTkZPOworCWRpc2stPm1ham9yCQk9IG51bGxfbWFqb3I7CisJZGlzay0+
Zmlyc3RfbWlub3IJPSBudWxsYi0+aW5kZXg7CisJZGlzay0+Zm9wcwkJPSAmbnVsbF9mb3BzOwor
CWRpc2stPnByaXZhdGVfZGF0YQk9IG51bGxiOworCWRpc2stPnF1ZXVlCQk9IG51bGxiLT5xOwor
CXN0cm5jcHkoZGlzay0+ZGlza19uYW1lLCBudWxsYi0+ZGlza19uYW1lLCBESVNLX05BTUVfTEVO
KTsKKworCWFkZF9kaXNrKGRpc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG51bGxf
YWRkX2Rldih2b2lkKQoreworCXN0cnVjdCBudWxsYiAqbnVsbGI7CiAJaW50IHJ2OwogCiAJbnVs
bGIgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpudWxsYiksIEdGUF9LRVJORUwsIGhvbWVfbm9kZSk7
CkBAIC03MTYsNDIgKzc1MSwxOSBAQCBzdGF0aWMgaW50IG51bGxfYWRkX2Rldih2b2lkKQogCiAJ
c3ByaW50ZihudWxsYi0+ZGlza19uYW1lLCAibnVsbGIlZCIsIG51bGxiLT5pbmRleCk7CiAKLQlp
ZiAodXNlX2xpZ2h0bnZtKSB7Ci0JCXJ2ID0gbnZtX3JlZ2lzdGVyKG51bGxiLT5xLCBudWxsYi0+
ZGlza19uYW1lLAotCQkJCQkJCSZudWxsX2xudm1fZGV2X29wcyk7Ci0JCWlmIChydikKLQkJCWdv
dG8gb3V0X2NsZWFudXBfYmxrX3F1ZXVlOwotCQlnb3RvIGRvbmU7Ci0JfQorCWlmICh1c2VfbGln
aHRudm0pCisJCXJ2ID0gbnVsbF9udm1fcmVnaXN0ZXIobnVsbGIpOworCWVsc2UKKwkJcnYgPSBu
dWxsX2dlbmRpc2tfcmVnaXN0ZXIobnVsbGIpOwogCi0JZGlzayA9IG51bGxiLT5kaXNrID0gYWxs
b2NfZGlza19ub2RlKDEsIGhvbWVfbm9kZSk7Ci0JaWYgKCFkaXNrKSB7Ci0JCXJ2ID0gLUVOT01F
TTsKLQkJZ290byBvdXRfY2xlYW51cF9saWdodG52bTsKLQl9Ci0Jc2l6ZSA9IGdiICogMTAyNCAq
IDEwMjQgKiAxMDI0VUxMOwotCXNldF9jYXBhY2l0eShkaXNrLCBzaXplID4+IDkpOworCWlmIChy
dikKKwkJZ290byBvdXRfY2xlYW51cF9ibGtfcXVldWU7CiAKLQlkaXNrLT5mbGFncyB8PSBHRU5I
RF9GTF9FWFRfREVWVCB8IEdFTkhEX0ZMX1NVUFBSRVNTX1BBUlRJVElPTl9JTkZPOwotCWRpc2st
Pm1ham9yCQk9IG51bGxfbWFqb3I7Ci0JZGlzay0+Zmlyc3RfbWlub3IJPSBudWxsYi0+aW5kZXg7
Ci0JZGlzay0+Zm9wcwkJPSAmbnVsbF9mb3BzOwotCWRpc2stPnByaXZhdGVfZGF0YQk9IG51bGxi
OwotCWRpc2stPnF1ZXVlCQk9IG51bGxiLT5xOwotCXN0cm5jcHkoZGlzay0+ZGlza19uYW1lLCBu
dWxsYi0+ZGlza19uYW1lLCBESVNLX05BTUVfTEVOKTsKLQotCWFkZF9kaXNrKGRpc2spOwotCi1k
b25lOgogCW11dGV4X2xvY2soJmxvY2spOwogCWxpc3RfYWRkX3RhaWwoJm51bGxiLT5saXN0LCAm
bnVsbGJfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKIAogCXJldHVybiAwOwotCi1vdXRf
Y2xlYW51cF9saWdodG52bToKLQlpZiAodXNlX2xpZ2h0bnZtKQotCQludm1fdW5yZWdpc3Rlcihu
dWxsYi0+ZGlza19uYW1lKTsKIG91dF9jbGVhbnVwX2Jsa19xdWV1ZToKIAlibGtfY2xlYW51cF9x
dWV1ZShudWxsYi0+cSk7CiBvdXRfY2xlYW51cF90YWdzOgotLSAKMi4xLjQKCgpfX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1udm1lIG1haWxpbmcg
bGlzdApMaW51eC1udm1lQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVh
ZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1udm1lCg==

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

* [PATCH 2/6] null_blk: refactor to support non-gendisk devices
@ 2016-06-10 12:20   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme
  Cc: Matias Bjørling

With LightNVM enabled devices, the gendisk structure is not exposed
to the user. This hides the device driver specific sysfs entries, and
prevents binding of LightNVM geometry information to the device.

Refactor the device registration process, so that gendisk and
non-gendisk devices are easily managed.

Signed-off-by: Matias Bjørling <m@bjorling.me>
---
 drivers/block/null_blk.c | 110 ++++++++++++++++++++++++++---------------------
 1 file changed, 61 insertions(+), 49 deletions(-)

diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index cab9759..3117df1 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -414,23 +414,6 @@ static void cleanup_queues(struct nullb *nullb)
 	kfree(nullb->queues);
 }
 
-static void null_del_dev(struct nullb *nullb)
-{
-	list_del_init(&nullb->list);
-
-	if (use_lightnvm)
-		nvm_unregister(nullb->disk_name);
-	else
-		del_gendisk(nullb->disk);
-	blk_cleanup_queue(nullb->q);
-	if (queue_mode == NULL_Q_MQ)
-		blk_mq_free_tag_set(&nullb->tag_set);
-	if (!use_lightnvm)
-		put_disk(nullb->disk);
-	cleanup_queues(nullb);
-	kfree(nullb);
-}
-
 #ifdef CONFIG_NVM
 
 static void null_lnvm_end_io(struct request *rq, int error)
@@ -564,10 +547,41 @@ static struct nvm_dev_ops null_lnvm_dev_ops = {
 	/* Simulate nvme protocol restriction */
 	.max_phys_sect		= 64,
 };
+
+static int null_nvm_register(struct nullb *nullb)
+{
+	return nvm_register(nullb->q, nullb->disk_name, &null_lnvm_dev_ops);
+}
+
+static void null_nvm_unregister(struct nullb *nullb)
+{
+	nvm_unregister(nullb->disk_name);
+}
 #else
-static struct nvm_dev_ops null_lnvm_dev_ops;
+static int null_nvm_register(struct nullb *nullb)
+{
+	return -EINVAL;
+}
+static void null_nvm_unregister(struct nullb *nullb) {}
 #endif /* CONFIG_NVM */
 
+static void null_del_dev(struct nullb *nullb)
+{
+	list_del_init(&nullb->list);
+
+	if (use_lightnvm)
+		null_nvm_unregister(nullb);
+	else
+		del_gendisk(nullb->disk);
+	blk_cleanup_queue(nullb->q);
+	if (queue_mode == NULL_Q_MQ)
+		blk_mq_free_tag_set(&nullb->tag_set);
+	if (!use_lightnvm)
+		put_disk(nullb->disk);
+	cleanup_queues(nullb);
+	kfree(nullb);
+}
+
 static int null_open(struct block_device *bdev, fmode_t mode)
 {
 	return 0;
@@ -640,11 +654,32 @@ static int init_driver_queues(struct nullb *nullb)
 	return 0;
 }
 
-static int null_add_dev(void)
+static int null_gendisk_register(struct nullb *nullb)
 {
 	struct gendisk *disk;
-	struct nullb *nullb;
 	sector_t size;
+
+	disk = nullb->disk = alloc_disk_node(1, home_node);
+	if (!disk)
+		return -ENOMEM;
+	size = gb * 1024 * 1024 * 1024ULL;
+	set_capacity(disk, size >> 9);
+
+	disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO;
+	disk->major		= null_major;
+	disk->first_minor	= nullb->index;
+	disk->fops		= &null_fops;
+	disk->private_data	= nullb;
+	disk->queue		= nullb->q;
+	strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
+
+	add_disk(disk);
+	return 0;
+}
+
+static int null_add_dev(void)
+{
+	struct nullb *nullb;
 	int rv;
 
 	nullb = kzalloc_node(sizeof(*nullb), GFP_KERNEL, home_node);
@@ -716,42 +751,19 @@ static int null_add_dev(void)
 
 	sprintf(nullb->disk_name, "nullb%d", nullb->index);
 
-	if (use_lightnvm) {
-		rv = nvm_register(nullb->q, nullb->disk_name,
-							&null_lnvm_dev_ops);
-		if (rv)
-			goto out_cleanup_blk_queue;
-		goto done;
-	}
+	if (use_lightnvm)
+		rv = null_nvm_register(nullb);
+	else
+		rv = null_gendisk_register(nullb);
 
-	disk = nullb->disk = alloc_disk_node(1, home_node);
-	if (!disk) {
-		rv = -ENOMEM;
-		goto out_cleanup_lightnvm;
-	}
-	size = gb * 1024 * 1024 * 1024ULL;
-	set_capacity(disk, size >> 9);
+	if (rv)
+		goto out_cleanup_blk_queue;
 
-	disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO;
-	disk->major		= null_major;
-	disk->first_minor	= nullb->index;
-	disk->fops		= &null_fops;
-	disk->private_data	= nullb;
-	disk->queue		= nullb->q;
-	strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
-
-	add_disk(disk);
-
-done:
 	mutex_lock(&lock);
 	list_add_tail(&nullb->list, &nullb_list);
 	mutex_unlock(&lock);
 
 	return 0;
-
-out_cleanup_lightnvm:
-	if (use_lightnvm)
-		nvm_unregister(nullb->disk_name);
 out_cleanup_blk_queue:
 	blk_cleanup_queue(nullb->q);
 out_cleanup_tags:
-- 
2.1.4

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

* [PATCH 2/6] null_blk: refactor to support non-gendisk devices
@ 2016-06-10 12:20   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)


With LightNVM enabled devices, the gendisk structure is not exposed
to the user. This hides the device driver specific sysfs entries, and
prevents binding of LightNVM geometry information to the device.

Refactor the device registration process, so that gendisk and
non-gendisk devices are easily managed.

Signed-off-by: Matias Bj?rling <m at bjorling.me>
---
 drivers/block/null_blk.c | 110 ++++++++++++++++++++++++++---------------------
 1 file changed, 61 insertions(+), 49 deletions(-)

diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index cab9759..3117df1 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -414,23 +414,6 @@ static void cleanup_queues(struct nullb *nullb)
 	kfree(nullb->queues);
 }
 
-static void null_del_dev(struct nullb *nullb)
-{
-	list_del_init(&nullb->list);
-
-	if (use_lightnvm)
-		nvm_unregister(nullb->disk_name);
-	else
-		del_gendisk(nullb->disk);
-	blk_cleanup_queue(nullb->q);
-	if (queue_mode == NULL_Q_MQ)
-		blk_mq_free_tag_set(&nullb->tag_set);
-	if (!use_lightnvm)
-		put_disk(nullb->disk);
-	cleanup_queues(nullb);
-	kfree(nullb);
-}
-
 #ifdef CONFIG_NVM
 
 static void null_lnvm_end_io(struct request *rq, int error)
@@ -564,10 +547,41 @@ static struct nvm_dev_ops null_lnvm_dev_ops = {
 	/* Simulate nvme protocol restriction */
 	.max_phys_sect		= 64,
 };
+
+static int null_nvm_register(struct nullb *nullb)
+{
+	return nvm_register(nullb->q, nullb->disk_name, &null_lnvm_dev_ops);
+}
+
+static void null_nvm_unregister(struct nullb *nullb)
+{
+	nvm_unregister(nullb->disk_name);
+}
 #else
-static struct nvm_dev_ops null_lnvm_dev_ops;
+static int null_nvm_register(struct nullb *nullb)
+{
+	return -EINVAL;
+}
+static void null_nvm_unregister(struct nullb *nullb) {}
 #endif /* CONFIG_NVM */
 
+static void null_del_dev(struct nullb *nullb)
+{
+	list_del_init(&nullb->list);
+
+	if (use_lightnvm)
+		null_nvm_unregister(nullb);
+	else
+		del_gendisk(nullb->disk);
+	blk_cleanup_queue(nullb->q);
+	if (queue_mode == NULL_Q_MQ)
+		blk_mq_free_tag_set(&nullb->tag_set);
+	if (!use_lightnvm)
+		put_disk(nullb->disk);
+	cleanup_queues(nullb);
+	kfree(nullb);
+}
+
 static int null_open(struct block_device *bdev, fmode_t mode)
 {
 	return 0;
@@ -640,11 +654,32 @@ static int init_driver_queues(struct nullb *nullb)
 	return 0;
 }
 
-static int null_add_dev(void)
+static int null_gendisk_register(struct nullb *nullb)
 {
 	struct gendisk *disk;
-	struct nullb *nullb;
 	sector_t size;
+
+	disk = nullb->disk = alloc_disk_node(1, home_node);
+	if (!disk)
+		return -ENOMEM;
+	size = gb * 1024 * 1024 * 1024ULL;
+	set_capacity(disk, size >> 9);
+
+	disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO;
+	disk->major		= null_major;
+	disk->first_minor	= nullb->index;
+	disk->fops		= &null_fops;
+	disk->private_data	= nullb;
+	disk->queue		= nullb->q;
+	strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
+
+	add_disk(disk);
+	return 0;
+}
+
+static int null_add_dev(void)
+{
+	struct nullb *nullb;
 	int rv;
 
 	nullb = kzalloc_node(sizeof(*nullb), GFP_KERNEL, home_node);
@@ -716,42 +751,19 @@ static int null_add_dev(void)
 
 	sprintf(nullb->disk_name, "nullb%d", nullb->index);
 
-	if (use_lightnvm) {
-		rv = nvm_register(nullb->q, nullb->disk_name,
-							&null_lnvm_dev_ops);
-		if (rv)
-			goto out_cleanup_blk_queue;
-		goto done;
-	}
+	if (use_lightnvm)
+		rv = null_nvm_register(nullb);
+	else
+		rv = null_gendisk_register(nullb);
 
-	disk = nullb->disk = alloc_disk_node(1, home_node);
-	if (!disk) {
-		rv = -ENOMEM;
-		goto out_cleanup_lightnvm;
-	}
-	size = gb * 1024 * 1024 * 1024ULL;
-	set_capacity(disk, size >> 9);
+	if (rv)
+		goto out_cleanup_blk_queue;
 
-	disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO;
-	disk->major		= null_major;
-	disk->first_minor	= nullb->index;
-	disk->fops		= &null_fops;
-	disk->private_data	= nullb;
-	disk->queue		= nullb->q;
-	strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
-
-	add_disk(disk);
-
-done:
 	mutex_lock(&lock);
 	list_add_tail(&nullb->list, &nullb_list);
 	mutex_unlock(&lock);
 
 	return 0;
-
-out_cleanup_lightnvm:
-	if (use_lightnvm)
-		nvm_unregister(nullb->disk_name);
 out_cleanup_blk_queue:
 	blk_cleanup_queue(nullb->q);
 out_cleanup_tags:
-- 
2.1.4

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

* [PATCH 3/6] blk-mq: register device instead of disk
  2016-06-10 12:20 ` Matias Bjørling
@ 2016-06-10 12:20   ` Matias Bjørling
  -1 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme
  Cc: Matias Bjørling

Enable devices without a gendisk instance to register itself with blk-mq
and expose the associated multi-queue sysfs entries.

Signed-off-by: Matias Bjørling <m@bjorling.me>
---
 block/blk-mq-sysfs.c   | 13 +++++--------
 block/blk-sysfs.c      |  4 ++--
 drivers/md/dm.c        |  2 +-
 include/linux/blk-mq.h |  4 ++--
 4 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c
index 4ea4dd8..f67b5c1 100644
--- a/block/blk-mq-sysfs.c
+++ b/block/blk-mq-sysfs.c
@@ -380,9 +380,8 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
 	return ret;
 }
 
-void blk_mq_unregister_disk(struct gendisk *disk)
+void blk_mq_unregister_dev(struct device *dev, struct request_queue *q)
 {
-	struct request_queue *q = disk->queue;
 	struct blk_mq_hw_ctx *hctx;
 	struct blk_mq_ctx *ctx;
 	int i, j;
@@ -402,7 +401,7 @@ void blk_mq_unregister_disk(struct gendisk *disk)
 	kobject_del(&q->mq_kobj);
 	kobject_put(&q->mq_kobj);
 
-	kobject_put(&disk_to_dev(disk)->kobj);
+	kobject_put(&dev->kobj);
 
 	q->mq_sysfs_init_done = false;
 	blk_mq_enable_hotplug();
@@ -426,10 +425,8 @@ static void blk_mq_sysfs_init(struct request_queue *q)
 	}
 }
 
-int blk_mq_register_disk(struct gendisk *disk)
+int blk_mq_register_dev(struct device *dev, struct request_queue *q)
 {
-	struct device *dev = disk_to_dev(disk);
-	struct request_queue *q = disk->queue;
 	struct blk_mq_hw_ctx *hctx;
 	int ret, i;
 
@@ -450,7 +447,7 @@ int blk_mq_register_disk(struct gendisk *disk)
 	}
 
 	if (ret)
-		blk_mq_unregister_disk(disk);
+		blk_mq_unregister_dev(dev, q);
 	else
 		q->mq_sysfs_init_done = true;
 out:
@@ -458,7 +455,7 @@ out:
 
 	return ret;
 }
-EXPORT_SYMBOL_GPL(blk_mq_register_disk);
+EXPORT_SYMBOL_GPL(blk_mq_register_dev);
 
 void blk_mq_sysfs_unregister(struct request_queue *q)
 {
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 9920596..5223c5f 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -693,7 +693,7 @@ int blk_register_queue(struct gendisk *disk)
 	kobject_uevent(&q->kobj, KOBJ_ADD);
 
 	if (q->mq_ops)
-		blk_mq_register_disk(disk);
+		blk_mq_register_dev(disk_to_dev(disk), q);
 
 	if (!q->request_fn)
 		return 0;
@@ -718,7 +718,7 @@ void blk_unregister_queue(struct gendisk *disk)
 		return;
 
 	if (q->mq_ops)
-		blk_mq_unregister_disk(disk);
+		blk_mq_unregister_dev(disk_to_dev(disk), q);
 
 	if (q->request_fn)
 		elv_unregister_queue(q);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index aba7ed9..9de3a9c 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -2798,7 +2798,7 @@ static int dm_mq_init_request_queue(struct mapped_device *md,
 	dm_init_md_queue(md);
 
 	/* backfill 'mq' sysfs registration normally done in blk_register_queue */
-	blk_mq_register_disk(md->disk);
+	blk_mq_register_dev(disk_to_dev(md->disk), q);
 
 	return 0;
 
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 2498fdf..ab6fb32 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -176,8 +176,8 @@ enum {
 struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
 struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
 						  struct request_queue *q);
-int blk_mq_register_disk(struct gendisk *);
-void blk_mq_unregister_disk(struct gendisk *);
+int blk_mq_register_dev(struct device *, struct request_queue *);
+void blk_mq_unregister_dev(struct device *, struct request_queue *);
 
 int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set);
 void blk_mq_free_tag_set(struct blk_mq_tag_set *set);
-- 
2.1.4


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

* [PATCH 3/6] blk-mq: register device instead of disk
@ 2016-06-10 12:20   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:20 UTC (permalink / raw)


Enable devices without a gendisk instance to register itself with blk-mq
and expose the associated multi-queue sysfs entries.

Signed-off-by: Matias Bj?rling <m at bjorling.me>
---
 block/blk-mq-sysfs.c   | 13 +++++--------
 block/blk-sysfs.c      |  4 ++--
 drivers/md/dm.c        |  2 +-
 include/linux/blk-mq.h |  4 ++--
 4 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c
index 4ea4dd8..f67b5c1 100644
--- a/block/blk-mq-sysfs.c
+++ b/block/blk-mq-sysfs.c
@@ -380,9 +380,8 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
 	return ret;
 }
 
-void blk_mq_unregister_disk(struct gendisk *disk)
+void blk_mq_unregister_dev(struct device *dev, struct request_queue *q)
 {
-	struct request_queue *q = disk->queue;
 	struct blk_mq_hw_ctx *hctx;
 	struct blk_mq_ctx *ctx;
 	int i, j;
@@ -402,7 +401,7 @@ void blk_mq_unregister_disk(struct gendisk *disk)
 	kobject_del(&q->mq_kobj);
 	kobject_put(&q->mq_kobj);
 
-	kobject_put(&disk_to_dev(disk)->kobj);
+	kobject_put(&dev->kobj);
 
 	q->mq_sysfs_init_done = false;
 	blk_mq_enable_hotplug();
@@ -426,10 +425,8 @@ static void blk_mq_sysfs_init(struct request_queue *q)
 	}
 }
 
-int blk_mq_register_disk(struct gendisk *disk)
+int blk_mq_register_dev(struct device *dev, struct request_queue *q)
 {
-	struct device *dev = disk_to_dev(disk);
-	struct request_queue *q = disk->queue;
 	struct blk_mq_hw_ctx *hctx;
 	int ret, i;
 
@@ -450,7 +447,7 @@ int blk_mq_register_disk(struct gendisk *disk)
 	}
 
 	if (ret)
-		blk_mq_unregister_disk(disk);
+		blk_mq_unregister_dev(dev, q);
 	else
 		q->mq_sysfs_init_done = true;
 out:
@@ -458,7 +455,7 @@ out:
 
 	return ret;
 }
-EXPORT_SYMBOL_GPL(blk_mq_register_disk);
+EXPORT_SYMBOL_GPL(blk_mq_register_dev);
 
 void blk_mq_sysfs_unregister(struct request_queue *q)
 {
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 9920596..5223c5f 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -693,7 +693,7 @@ int blk_register_queue(struct gendisk *disk)
 	kobject_uevent(&q->kobj, KOBJ_ADD);
 
 	if (q->mq_ops)
-		blk_mq_register_disk(disk);
+		blk_mq_register_dev(disk_to_dev(disk), q);
 
 	if (!q->request_fn)
 		return 0;
@@ -718,7 +718,7 @@ void blk_unregister_queue(struct gendisk *disk)
 		return;
 
 	if (q->mq_ops)
-		blk_mq_unregister_disk(disk);
+		blk_mq_unregister_dev(disk_to_dev(disk), q);
 
 	if (q->request_fn)
 		elv_unregister_queue(q);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index aba7ed9..9de3a9c 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -2798,7 +2798,7 @@ static int dm_mq_init_request_queue(struct mapped_device *md,
 	dm_init_md_queue(md);
 
 	/* backfill 'mq' sysfs registration normally done in blk_register_queue */
-	blk_mq_register_disk(md->disk);
+	blk_mq_register_dev(disk_to_dev(md->disk), q);
 
 	return 0;
 
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 2498fdf..ab6fb32 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -176,8 +176,8 @@ enum {
 struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
 struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
 						  struct request_queue *q);
-int blk_mq_register_disk(struct gendisk *);
-void blk_mq_unregister_disk(struct gendisk *);
+int blk_mq_register_dev(struct device *, struct request_queue *);
+void blk_mq_unregister_dev(struct device *, struct request_queue *);
 
 int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set);
 void blk_mq_free_tag_set(struct blk_mq_tag_set *set);
-- 
2.1.4

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

* [PATCH 4/6] lightnvm: let drivers control the lifetime of nvm_dev
  2016-06-10 12:20 ` Matias Bjørling
  (?)
@ 2016-06-10 12:21   ` Matias Bjørling
  -1 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:21 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme
  Cc: Matias Bjørling

TGlnaHROVk0gZG9lcyBub3QgY3VycmVudGx5IGV4cG9zZSB0aGUgZGV2aWNlIGRyaXZlciBzeXNm
cyBzcGVjaWZpYwplbnRyaWVzIHRvIHVzZXItc3BhY2UsIGFzIHRoZSBkZXZpY2UgZHJpdmVyIHNr
aXBzIHRoZSBpbml0aWFsaXphdGlvbiBvZgpnZW5kaXNrLgoKVG8gZW5hYmxlIGEgZGV2aWNlIGRy
aXZlciBzeXNmcyBlbnRyaWVzIHRvIGJlIGV4cG9zZWQsIHdlIG5lZWQgYSBzdHJ1Y3QKZGV2aWNl
IHRvIGF0dGFjaCBpdCB0by4gVG8gYWxsb3cgYm90aCB0aGUgZGV2aWNlIGRyaXZlciBhbmQgTGln
aHROVk0gdG8KYWNjZXNzIHRoZSBzYW1lIHN0cnVjdCBkZXZpY2UsIHdlIG5lZWQgdGhlIGRldmlj
ZSBkcml2ZXIgdG8gdHJhY2sgdGhlCmxpZmV0aW1lIG9mIHRoZSBudm1fZGV2IHN0cnVjdHVyZS4K
ClRoaXMgcGF0Y2ggcmVmYWN0b3JzIHRoZSB0d28gdXNlcnMgb2YgTGlnaHROVk0gKE5WTWUgYW5k
IG51bGxfYmxrKSwKZW5hYmxlcyB0aGVtIHRvIGFsbG9jYXRlIGFuZCBmcmVlIG52bV9kZXYsIGFu
ZCBhdCBsYXN0IHJlbW92ZXMgZ2VuZGlzawp1c2FnZSB3aGVuIGEgTGlnaHROVk0gZGV2aWNlIGlz
IHVzZWQuCgpTaWduZWQtb2ZmLWJ5OiBNYXRpYXMgQmrDuHJsaW5nIDxtQGJqb3JsaW5nLm1lPgot
LS0KIGRyaXZlcnMvYmxvY2svbnVsbF9ibGsuYyAgICAgfCAyMiArKysrKysrKysrKysrKysrKysr
Ky0tCiBkcml2ZXJzL2xpZ2h0bnZtL2NvcmUuYyAgICAgIHwgMzQgKysrKysrKy0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQogZHJpdmVycy9udm1lL2hvc3QvY29yZS5jICAgICB8IDM0ICsrKysr
KysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvbnZtZS9ob3N0L2xpZ2h0bnZt
LmMgfCAyMSArKysrKysrKysrKysrKysrKy0tLS0KIGRyaXZlcnMvbnZtZS9ob3N0L252bWUuaCAg
ICAgfCAgOCArKysrKy0tLQogaW5jbHVkZS9saW51eC9saWdodG52bS5oICAgICB8IDE1ICsrKysr
KysrKy0tLS0tLQogNiBmaWxlcyBjaGFuZ2VkLCA3MiBpbnNlcnRpb25zKCspLCA2MiBkZWxldGlv
bnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL251bGxfYmxrLmMgYi9kcml2ZXJzL2Js
b2NrL251bGxfYmxrLmMKaW5kZXggMzExN2RmMS4uNWEwZGE4YiAxMDA2NDQKLS0tIGEvZHJpdmVy
cy9ibG9jay9udWxsX2Jsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svbnVsbF9ibGsuYwpAQCAtMzQs
NiArMzQsNyBAQCBzdHJ1Y3QgbnVsbGIgewogCXVuc2lnbmVkIGludCBpbmRleDsKIAlzdHJ1Y3Qg
cmVxdWVzdF9xdWV1ZSAqcTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlzdHJ1Y3QgbnZtX2Rl
diAqbmRldjsKIAlzdHJ1Y3QgYmxrX21xX3RhZ19zZXQgdGFnX3NldDsKIAlzdHJ1Y3QgaHJ0aW1l
ciB0aW1lcjsKIAl1bnNpZ25lZCBpbnQgcXVldWVfZGVwdGg7CkBAIC01NTAsMTIgKzU1MSwyOSBA
QCBzdGF0aWMgc3RydWN0IG52bV9kZXZfb3BzIG51bGxfbG52bV9kZXZfb3BzID0gewogCiBzdGF0
aWMgaW50IG51bGxfbnZtX3JlZ2lzdGVyKHN0cnVjdCBudWxsYiAqbnVsbGIpCiB7Ci0JcmV0dXJu
IG52bV9yZWdpc3RlcihudWxsYi0+cSwgbnVsbGItPmRpc2tfbmFtZSwgJm51bGxfbG52bV9kZXZf
b3BzKTsKKwlzdHJ1Y3QgbnZtX2RldiAqZGV2OworCWludCBydjsKKworCWRldiA9IG52bV9hbGxv
Y19kZXYoMCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5xID0gbnVs
bGItPnE7CisJbWVtY3B5KGRldi0+bmFtZSwgbnVsbGItPmRpc2tfbmFtZSwgRElTS19OQU1FX0xF
Tik7CisJZGV2LT5vcHMgPSAmbnVsbF9sbnZtX2Rldl9vcHM7CisKKwlydiA9IG52bV9yZWdpc3Rl
cihkZXYpOworCWlmIChydikgeworCQlrZnJlZShkZXYpOworCQlyZXR1cm4gcnY7CisJfQorCW51
bGxiLT5uZGV2ID0gZGV2OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBudWxsX252bV91
bnJlZ2lzdGVyKHN0cnVjdCBudWxsYiAqbnVsbGIpCiB7Ci0JbnZtX3VucmVnaXN0ZXIobnVsbGIt
PmRpc2tfbmFtZSk7CisJbnZtX3VucmVnaXN0ZXIobnVsbGItPm5kZXYpOwogfQogI2Vsc2UKIHN0
YXRpYyBpbnQgbnVsbF9udm1fcmVnaXN0ZXIoc3RydWN0IG51bGxiICpudWxsYikKZGlmZiAtLWdp
dCBhL2RyaXZlcnMvbGlnaHRudm0vY29yZS5jIGIvZHJpdmVycy9saWdodG52bS9jb3JlLmMKaW5k
ZXggNDU3NGMwYi4uYWQyNzc2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9saWdodG52bS9jb3JlLmMK
KysrIGIvZHJpdmVycy9saWdodG52bS9jb3JlLmMKQEAgLTY1NSwyMyArNjU1LDE1IEBAIHN0YXRp
YyB2b2lkIG52bV9leGl0KHN0cnVjdCBudm1fZGV2ICpkZXYpCiAJcHJfaW5mbygibnZtOiBzdWNj
ZXNzZnVsbHkgdW5sb2FkZWRcbiIpOwogfQogCi1pbnQgbnZtX3JlZ2lzdGVyKHN0cnVjdCByZXF1
ZXN0X3F1ZXVlICpxLCBjaGFyICpkaXNrX25hbWUsCi0JCQkJCQkJc3RydWN0IG52bV9kZXZfb3Bz
ICpvcHMpCitzdHJ1Y3QgbnZtX2RldiAqbnZtX2FsbG9jX2RldihpbnQgbm9kZSkKK3sKKwlyZXR1
cm4ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgbnZtX2RldiksIEdGUF9LRVJORUwsIG5vZGUp
OworfQorCitpbnQgbnZtX3JlZ2lzdGVyKHN0cnVjdCBudm1fZGV2ICpkZXYpCiB7Ci0Jc3RydWN0
IG52bV9kZXYgKmRldjsKIAlpbnQgcmV0OwogCi0JaWYgKCFvcHMtPmlkZW50aXR5KQotCQlyZXR1
cm4gLUVJTlZBTDsKLQotCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBudm1fZGV2KSwgR0ZQ
X0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGV2LT5xID0gcTsK
LQlkZXYtPm9wcyA9IG9wczsKLQlzdHJuY3B5KGRldi0+bmFtZSwgZGlza19uYW1lLCBESVNLX05B
TUVfTEVOKTsKLQogCXJldCA9IG52bV9pbml0KGRldik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJf
aW5pdDsKQEAgLTcwOSwyOSArNzAxLDE3IEBAIGludCBudm1fcmVnaXN0ZXIoc3RydWN0IHJlcXVl
c3RfcXVldWUgKnEsIGNoYXIgKmRpc2tfbmFtZSwKIAlyZXR1cm4gMDsKIGVycl9pbml0OgogCWtm
cmVlKGRldi0+bHVuX21hcCk7Ci0Ja2ZyZWUoZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JU
X1NZTUJPTChudm1fcmVnaXN0ZXIpOwogCi12b2lkIG52bV91bnJlZ2lzdGVyKGNoYXIgKmRpc2tf
bmFtZSkKK3ZvaWQgbnZtX3VucmVnaXN0ZXIoc3RydWN0IG52bV9kZXYgKmRldikKIHsKLQlzdHJ1
Y3QgbnZtX2RldiAqZGV2OwotCiAJZG93bl93cml0ZSgmbnZtX2xvY2spOwotCWRldiA9IG52bV9m
aW5kX252bV9kZXYoZGlza19uYW1lKTsKLQlpZiAoIWRldikgewotCQlwcl9lcnIoIm52bTogY291
bGQgbm90IGZpbmQgZGV2aWNlICVzIHRvIHVucmVnaXN0ZXJcbiIsCi0JCQkJCQkJCWRpc2tfbmFt
ZSk7Ci0JCXVwX3dyaXRlKCZudm1fbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0KIAlsaXN0X2RlbCgm
ZGV2LT5kZXZpY2VzKTsKIAl1cF93cml0ZSgmbnZtX2xvY2spOwogCiAJbnZtX2V4aXQoZGV2KTsK
LQlrZnJlZShkZXYpOwogfQogRVhQT1JUX1NZTUJPTChudm1fdW5yZWdpc3Rlcik7CiAKZGlmZiAt
LWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYyBiL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUu
YwppbmRleCBmNjE1YjZiLi5mZTEzNWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9j
b3JlLmMKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCkBAIC0xMzcsMTIgKzEzNywxNCBA
QCBzdGF0aWMgdm9pZCBudm1lX2ZyZWVfbnMoc3RydWN0IGtyZWYgKmtyZWYpCiB7CiAJc3RydWN0
IG52bWVfbnMgKm5zID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBudm1lX25zLCBrcmVmKTsK
IAotCWlmIChucy0+dHlwZSA9PSBOVk1FX05TX0xJR0hUTlZNKQotCQludm1lX252bV91bnJlZ2lz
dGVyKG5zLT5xdWV1ZSwgbnMtPmRpc2stPmRpc2tfbmFtZSk7CisJaWYgKG5zLT5uZGV2KQorCQlu
dm1lX252bV91bnJlZ2lzdGVyKG5zKTsKIAotCXNwaW5fbG9jaygmZGV2X2xpc3RfbG9jayk7Ci0J
bnMtPmRpc2stPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJmRldl9saXN0X2xv
Y2spOworCWlmIChucy0+ZGlzaykgeworCQlzcGluX2xvY2soJmRldl9saXN0X2xvY2spOworCQlu
cy0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJmRldl9saXN0X2xv
Y2spOworCX0KIAogCXB1dF9kaXNrKG5zLT5kaXNrKTsKIAlpZGFfc2ltcGxlX3JlbW92ZSgmbnMt
PmN0cmwtPm5zX2lkYSwgbnMtPmluc3RhbmNlKTsKQEAgLTc4OCw4ICs3OTAsNyBAQCBzdGF0aWMg
dm9pZCBudm1lX2NvbmZpZ19kaXNjYXJkKHN0cnVjdCBudm1lX25zICpucykKIHN0YXRpYyBpbnQg
bnZtZV9yZXZhbGlkYXRlX25zKHN0cnVjdCBudm1lX25zICpucywgc3RydWN0IG52bWVfaWRfbnMg
KippZCkKIHsKIAlpZiAobnZtZV9pZGVudGlmeV9ucyhucy0+Y3RybCwgbnMtPm5zX2lkLCBpZCkp
IHsKLQkJZGV2X3dhcm4oZGlza190b19kZXYobnMtPmRpc2spLCAiJXM6IElkZW50aWZ5IGZhaWx1
cmVcbiIsCi0JCQkJX19mdW5jX18pOworCQlkZXZfd2Fybihucy0+Y3RybC0+ZGV2LCAiJXM6IElk
ZW50aWZ5IGZhaWx1cmVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBA
IC0xNDczLDE4ICsxNDc0LDExIEBAIHN0YXRpYyB2b2lkIG52bWVfYWxsb2NfbnMoc3RydWN0IG52
bWVfY3RybCAqY3RybCwgdW5zaWduZWQgbnNpZCkKIAlzcHJpbnRmKGRpc2tfbmFtZSwgIm52bWUl
ZG4lZCIsIGN0cmwtPmluc3RhbmNlLCBucy0+aW5zdGFuY2UpOwogCiAJaWYgKG52bWVfbnZtX25z
X3N1cHBvcnRlZChucywgaWQpKSB7Ci0JCWlmIChudm1lX252bV9yZWdpc3Rlcihucy0+cXVldWUs
IGRpc2tfbmFtZSkpIHsKLQkJCWRldl93YXJuKGN0cmwtPmRldiwKLQkJCQkiJXM6IExpZ2h0TlZN
IGluaXQgZmFpbHVyZVxuIiwgX19mdW5jX18pOworCQlpZiAobnZtZV9udm1fcmVnaXN0ZXIobnMs
IGRpc2tfbmFtZSwgbm9kZSkpIHsKKwkJCWRldl93YXJuKGN0cmwtPmRldiwgIiVzOiBMaWdodE5W
TSBpbml0IGZhaWx1cmVcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKIAkJCWdvdG8gb3V0X2ZyZWVf
aWQ7CiAJCX0KLQotCQlkaXNrID0gYWxsb2NfZGlza19ub2RlKDAsIG5vZGUpOwotCQlpZiAoIWRp
c2spCi0JCQlnb3RvIG91dF9mcmVlX2lkOwotCQltZW1jcHkoZGlzay0+ZGlza19uYW1lLCBkaXNr
X25hbWUsIERJU0tfTkFNRV9MRU4pOwotCQlucy0+ZGlzayA9IGRpc2s7Ci0JCW5zLT50eXBlID0g
TlZNRV9OU19MSUdIVE5WTTsKIAl9IGVsc2UgewogCQlkaXNrID0gYWxsb2NfZGlza19ub2RlKDAs
IG5vZGUpOwogCQlpZiAoIWRpc2spCkBAIC0xNTMyLDcgKzE1MjYsNyBAQCBzdGF0aWMgdm9pZCBu
dm1lX25zX3JlbW92ZShzdHJ1Y3QgbnZtZV9ucyAqbnMpCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQo
TlZNRV9OU19SRU1PVklORywgJm5zLT5mbGFncykpCiAJCXJldHVybjsKIAotCWlmIChucy0+ZGlz
ay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkgeworCWlmIChucy0+ZGlzayAmJiBucy0+ZGlzay0+Zmxh
Z3MgJiBHRU5IRF9GTF9VUCkgewogCQlpZiAoYmxrX2dldF9pbnRlZ3JpdHkobnMtPmRpc2spKQog
CQkJYmxrX2ludGVncml0eV91bnJlZ2lzdGVyKG5zLT5kaXNrKTsKIAkJc3lzZnNfcmVtb3ZlX2dy
b3VwKCZkaXNrX3RvX2Rldihucy0+ZGlzayktPmtvYmosCkBAIC0xNTUyLDcgKzE1NDYsNyBAQCBz
dGF0aWMgdm9pZCBudm1lX3ZhbGlkYXRlX25zKHN0cnVjdCBudm1lX2N0cmwgKmN0cmwsIHVuc2ln
bmVkIG5zaWQpCiAKIAlucyA9IG52bWVfZmluZF9ucyhjdHJsLCBuc2lkKTsKIAlpZiAobnMpIHsK
LQkJaWYgKHJldmFsaWRhdGVfZGlzayhucy0+ZGlzaykpCisJCWlmIChucy0+ZGlzayAmJiByZXZh
bGlkYXRlX2Rpc2sobnMtPmRpc2spKQogCQkJbnZtZV9uc19yZW1vdmUobnMpOwogCX0gZWxzZQog
CQludm1lX2FsbG9jX25zKGN0cmwsIG5zaWQpOwpAQCAtMTg1Niw3ICsxODUwLDcgQEAgdm9pZCBu
dm1lX2tpbGxfcXVldWVzKHN0cnVjdCBudm1lX2N0cmwgKmN0cmwpCiAJCSAqIFJldmFsaWRhdGlu
ZyBhIGRlYWQgbmFtZXNwYWNlIHNldHMgY2FwYWNpdHkgdG8gMC4gVGhpcyB3aWxsCiAJCSAqIGVu
ZCBidWZmZXJlZCB3cml0ZXJzIGRpcnR5aW5nIHBhZ2VzIHRoYXQgY2FuJ3QgYmUgc3luY2VkLgog
CQkgKi8KLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE5WTUVfTlNfREVBRCwgJm5zLT5mbGFncykp
CisJCWlmIChucy0+ZGlzayAmJiAhdGVzdF9hbmRfc2V0X2JpdChOVk1FX05TX0RFQUQsICZucy0+
ZmxhZ3MpKQogCQkJcmV2YWxpZGF0ZV9kaXNrKG5zLT5kaXNrKTsKIAogCQlibGtfc2V0X3F1ZXVl
X2R5aW5nKG5zLT5xdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9saWdodG52
bS5jIGIvZHJpdmVycy9udm1lL2hvc3QvbGlnaHRudm0uYwppbmRleCA5N2ZlNjEwLi4wOTVlNThl
IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9saWdodG52bS5jCisrKyBiL2RyaXZlcnMv
bnZtZS9ob3N0L2xpZ2h0bnZtLmMKQEAgLTU5MiwxNCArNTkyLDI3IEBAIHN0YXRpYyBzdHJ1Y3Qg
bnZtX2Rldl9vcHMgbnZtZV9udm1fZGV2X29wcyA9IHsKIAkubWF4X3BoeXNfc2VjdAkJPSA2NCwK
IH07CiAKLWludCBudm1lX252bV9yZWdpc3RlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hh
ciAqZGlza19uYW1lKQoraW50IG52bWVfbnZtX3JlZ2lzdGVyKHN0cnVjdCBudm1lX25zICpucywg
Y2hhciAqZGlza19uYW1lLCBpbnQgbm9kZSkKIHsKLQlyZXR1cm4gbnZtX3JlZ2lzdGVyKHEsIGRp
c2tfbmFtZSwgJm52bWVfbnZtX2Rldl9vcHMpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0g
bnMtPnF1ZXVlOworCXN0cnVjdCBudm1fZGV2ICpkZXY7CisKKwlkZXYgPSBudm1fYWxsb2NfZGV2
KG5vZGUpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+cSA9IHE7CisJ
bWVtY3B5KGRldi0+bmFtZSwgZGlza19uYW1lLCBESVNLX05BTUVfTEVOKTsKKwlkZXYtPm9wcyA9
ICZudm1lX252bV9kZXZfb3BzOworCW5zLT5uZGV2ID0gZGV2OworCisJcmV0dXJuIG52bV9yZWdp
c3RlcihkZXYpOwogfQogCi12b2lkIG52bWVfbnZtX3VucmVnaXN0ZXIoc3RydWN0IHJlcXVlc3Rf
cXVldWUgKnEsIGNoYXIgKmRpc2tfbmFtZSkKK3ZvaWQgbnZtZV9udm1fdW5yZWdpc3RlcihzdHJ1
Y3QgbnZtZV9ucyAqbnMpCiB7Ci0JbnZtX3VucmVnaXN0ZXIoZGlza19uYW1lKTsKKwludm1fdW5y
ZWdpc3Rlcihucy0+bmRldik7CisJa2ZyZWUobnMtPm5kZXYpOwogfQogCiAvKiBtb3ZlIHRvIHNo
YXJlZCBwbGFjZSB3aGVuIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzLiAqLwpkaWZmIC0tZ2l0IGEv
ZHJpdmVycy9udm1lL2hvc3QvbnZtZS5oIGIvZHJpdmVycy9udm1lL2hvc3QvbnZtZS5oCmluZGV4
IDI4MjQyMWYuLjdiNDliNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaAor
KysgYi9kcml2ZXJzL252bWUvaG9zdC9udm1lLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRl
IDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgv
YmxrLW1xLmg+CisjaW5jbHVkZSA8bGludXgvbGlnaHRudm0uaD4KIAogZW51bSB7CiAJLyoKQEAg
LTEyMiw2ICsxMjMsNyBAQCBzdHJ1Y3QgbnZtZV9ucyB7CiAJc3RydWN0IG52bWVfY3RybCAqY3Ry
bDsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWU7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7
CisJc3RydWN0IG52bV9kZXYgKm5kZXY7CiAJc3RydWN0IGtyZWYga3JlZjsKIAlpbnQgaW5zdGFu
Y2U7CiAKQEAgLTEzMyw3ICsxMzUsNiBAQCBzdHJ1Y3QgbnZtZV9ucyB7CiAJdTE2IG1zOwogCWJv
b2wgZXh0OwogCXU4IHBpX3R5cGU7Ci0JaW50IHR5cGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsK
IAogI2RlZmluZSBOVk1FX05TX1JFTU9WSU5HIDAKQEAgLTI2OSwxMiArMjcwLDEzIEBAIGludCBu
dm1lX252bV9uc19zdXBwb3J0ZWQoc3RydWN0IG52bWVfbnMgKm5zLCBzdHJ1Y3QgbnZtZV9pZF9u
cyAqaWQpOwogaW50IG52bWVfbnZtX3JlZ2lzdGVyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBj
aGFyICpkaXNrX25hbWUpOwogdm9pZCBudm1lX252bV91bnJlZ2lzdGVyKHN0cnVjdCByZXF1ZXN0
X3F1ZXVlICpxLCBjaGFyICpkaXNrX25hbWUpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IG52
bWVfbnZtX3JlZ2lzdGVyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpkaXNrX25hbWUp
CitzdGF0aWMgaW5saW5lIGludCBudm1lX252bV9yZWdpc3RlcihzdHJ1Y3QgbnZtZV9ucyAqbnMs
IGNoYXIgKmRpc2tfbmFtZSwKKwkJCQkJCQkJaW50IG5vZGUpCiB7CiAJcmV0dXJuIDA7CiB9CiAK
LXN0YXRpYyBpbmxpbmUgdm9pZCBudm1lX252bV91bnJlZ2lzdGVyKHN0cnVjdCByZXF1ZXN0X3F1
ZXVlICpxLCBjaGFyICpkaXNrX25hbWUpIHt9Oworc3RhdGljIGlubGluZSB2b2lkIG52bWVfbnZt
X3VucmVnaXN0ZXIoc3RydWN0IG52bWVfbnMgKm5zKSB7fTsKIAogc3RhdGljIGlubGluZSBpbnQg
bnZtZV9udm1fbnNfc3VwcG9ydGVkKHN0cnVjdCBudm1lX25zICpucywgc3RydWN0IG52bWVfaWRf
bnMgKmlkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWdodG52bS5oIGIvaW5jbHVk
ZS9saW51eC9saWdodG52bS5oCmluZGV4IGJhNzhiODMuLjVhZmMyNjMgMTAwNjQ0Ci0tLSBhL2lu
Y2x1ZGUvbGludXgvbGlnaHRudm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpZ2h0bnZtLmgKQEAg
LTUyNCw5ICs1MjQsOSBAQCBleHRlcm4gc3RydWN0IG52bV9ibG9jayAqbnZtX2dldF9ibGsoc3Ry
dWN0IG52bV9kZXYgKiwgc3RydWN0IG52bV9sdW4gKiwKIAkJCQkJCQkJdW5zaWduZWQgbG9uZyk7
CiBleHRlcm4gdm9pZCBudm1fcHV0X2JsayhzdHJ1Y3QgbnZtX2RldiAqLCBzdHJ1Y3QgbnZtX2Js
b2NrICopOwogCi1leHRlcm4gaW50IG52bV9yZWdpc3RlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAq
LCBjaGFyICosCi0JCQkJCQlzdHJ1Y3QgbnZtX2Rldl9vcHMgKik7Ci1leHRlcm4gdm9pZCBudm1f
dW5yZWdpc3RlcihjaGFyICopOworZXh0ZXJuIHN0cnVjdCBudm1fZGV2ICpudm1fYWxsb2NfZGV2
KGludCk7CitleHRlcm4gaW50IG52bV9yZWdpc3RlcihzdHJ1Y3QgbnZtX2RldiAqKTsKK2V4dGVy
biB2b2lkIG52bV91bnJlZ2lzdGVyKHN0cnVjdCBudm1fZGV2ICopOwogCiB2b2lkIG52bV9tYXJr
X2JsayhzdHJ1Y3QgbnZtX2RldiAqZGV2LCBzdHJ1Y3QgcHBhX2FkZHIgcHBhLCBpbnQgdHlwZSk7
CiAKQEAgLTU3NSwxMSArNTc1LDE0IEBAIGV4dGVybiBpbnQgbnZtX2Rldl9mYWN0b3J5KHN0cnVj
dCBudm1fZGV2ICosIGludCBmbGFncyk7CiAjZWxzZSAvKiBDT05GSUdfTlZNICovCiBzdHJ1Y3Qg
bnZtX2Rldl9vcHM7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG52bV9yZWdpc3RlcihzdHJ1Y3QgcmVx
dWVzdF9xdWV1ZSAqcSwgY2hhciAqZGlza19uYW1lLAotCQkJCQkJCXN0cnVjdCBudm1fZGV2X29w
cyAqb3BzKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbnZtX2RldiAqbnZtX2FsbG9jX2RldihpbnQg
bm9kZSkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50
IG52bV9yZWdpc3RlcihzdHJ1Y3QgbnZtX2RldiAqZGV2KQogewogCXJldHVybiAtRUlOVkFMOwog
fQotc3RhdGljIGlubGluZSB2b2lkIG52bV91bnJlZ2lzdGVyKGNoYXIgKmRpc2tfbmFtZSkge30K
K3N0YXRpYyBpbmxpbmUgdm9pZCBudm1fdW5yZWdpc3RlcihzdHJ1Y3QgbnZtX2RldiAqZGV2KSB7
fQogI2VuZGlmIC8qIENPTkZJR19OVk0gKi8KICNlbmRpZiAvKiBMSUdIVE5WTS5IICovCi0tIAoy
LjEuNAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxp
bnV4LW52bWUgbWFpbGluZyBsaXN0CkxpbnV4LW52bWVAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw
Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW52bWUK

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

* [PATCH 4/6] lightnvm: let drivers control the lifetime of nvm_dev
@ 2016-06-10 12:21   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:21 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme
  Cc: Matias Bjørling

LightNVM does not currently expose the device driver sysfs specific
entries to user-space, as the device driver skips the initialization of
gendisk.

To enable a device driver sysfs entries to be exposed, we need a struct
device to attach it to. To allow both the device driver and LightNVM to
access the same struct device, we need the device driver to track the
lifetime of the nvm_dev structure.

This patch refactors the two users of LightNVM (NVMe and null_blk),
enables them to allocate and free nvm_dev, and at last removes gendisk
usage when a LightNVM device is used.

Signed-off-by: Matias Bjørling <m@bjorling.me>
---
 drivers/block/null_blk.c     | 22 ++++++++++++++++++++--
 drivers/lightnvm/core.c      | 34 +++++++---------------------------
 drivers/nvme/host/core.c     | 34 ++++++++++++++--------------------
 drivers/nvme/host/lightnvm.c | 21 +++++++++++++++++----
 drivers/nvme/host/nvme.h     |  8 +++++---
 include/linux/lightnvm.h     | 15 +++++++++------
 6 files changed, 72 insertions(+), 62 deletions(-)

diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index 3117df1..5a0da8b 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -34,6 +34,7 @@ struct nullb {
 	unsigned int index;
 	struct request_queue *q;
 	struct gendisk *disk;
+	struct nvm_dev *ndev;
 	struct blk_mq_tag_set tag_set;
 	struct hrtimer timer;
 	unsigned int queue_depth;
@@ -550,12 +551,29 @@ static struct nvm_dev_ops null_lnvm_dev_ops = {
 
 static int null_nvm_register(struct nullb *nullb)
 {
-	return nvm_register(nullb->q, nullb->disk_name, &null_lnvm_dev_ops);
+	struct nvm_dev *dev;
+	int rv;
+
+	dev = nvm_alloc_dev(0);
+	if (!dev)
+		return -ENOMEM;
+
+	dev->q = nullb->q;
+	memcpy(dev->name, nullb->disk_name, DISK_NAME_LEN);
+	dev->ops = &null_lnvm_dev_ops;
+
+	rv = nvm_register(dev);
+	if (rv) {
+		kfree(dev);
+		return rv;
+	}
+	nullb->ndev = dev;
+	return 0;
 }
 
 static void null_nvm_unregister(struct nullb *nullb)
 {
-	nvm_unregister(nullb->disk_name);
+	nvm_unregister(nullb->ndev);
 }
 #else
 static int null_nvm_register(struct nullb *nullb)
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 4574c0b..ad27768 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -655,23 +655,15 @@ static void nvm_exit(struct nvm_dev *dev)
 	pr_info("nvm: successfully unloaded\n");
 }
 
-int nvm_register(struct request_queue *q, char *disk_name,
-							struct nvm_dev_ops *ops)
+struct nvm_dev *nvm_alloc_dev(int node)
+{
+	return kzalloc_node(sizeof(struct nvm_dev), GFP_KERNEL, node);
+}
+
+int nvm_register(struct nvm_dev *dev)
 {
-	struct nvm_dev *dev;
 	int ret;
 
-	if (!ops->identity)
-		return -EINVAL;
-
-	dev = kzalloc(sizeof(struct nvm_dev), GFP_KERNEL);
-	if (!dev)
-		return -ENOMEM;
-
-	dev->q = q;
-	dev->ops = ops;
-	strncpy(dev->name, disk_name, DISK_NAME_LEN);
-
 	ret = nvm_init(dev);
 	if (ret)
 		goto err_init;
@@ -709,29 +701,17 @@ int nvm_register(struct request_queue *q, char *disk_name,
 	return 0;
 err_init:
 	kfree(dev->lun_map);
-	kfree(dev);
 	return ret;
 }
 EXPORT_SYMBOL(nvm_register);
 
-void nvm_unregister(char *disk_name)
+void nvm_unregister(struct nvm_dev *dev)
 {
-	struct nvm_dev *dev;
-
 	down_write(&nvm_lock);
-	dev = nvm_find_nvm_dev(disk_name);
-	if (!dev) {
-		pr_err("nvm: could not find device %s to unregister\n",
-								disk_name);
-		up_write(&nvm_lock);
-		return;
-	}
-
 	list_del(&dev->devices);
 	up_write(&nvm_lock);
 
 	nvm_exit(dev);
-	kfree(dev);
 }
 EXPORT_SYMBOL(nvm_unregister);
 
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index f615b6b..fe135d9 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -137,12 +137,14 @@ static void nvme_free_ns(struct kref *kref)
 {
 	struct nvme_ns *ns = container_of(kref, struct nvme_ns, kref);
 
-	if (ns->type == NVME_NS_LIGHTNVM)
-		nvme_nvm_unregister(ns->queue, ns->disk->disk_name);
+	if (ns->ndev)
+		nvme_nvm_unregister(ns);
 
-	spin_lock(&dev_list_lock);
-	ns->disk->private_data = NULL;
-	spin_unlock(&dev_list_lock);
+	if (ns->disk) {
+		spin_lock(&dev_list_lock);
+		ns->disk->private_data = NULL;
+		spin_unlock(&dev_list_lock);
+	}
 
 	put_disk(ns->disk);
 	ida_simple_remove(&ns->ctrl->ns_ida, ns->instance);
@@ -788,8 +790,7 @@ static void nvme_config_discard(struct nvme_ns *ns)
 static int nvme_revalidate_ns(struct nvme_ns *ns, struct nvme_id_ns **id)
 {
 	if (nvme_identify_ns(ns->ctrl, ns->ns_id, id)) {
-		dev_warn(disk_to_dev(ns->disk), "%s: Identify failure\n",
-				__func__);
+		dev_warn(ns->ctrl->dev, "%s: Identify failure\n", __func__);
 		return -ENODEV;
 	}
 
@@ -1473,18 +1474,11 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 	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__);
+		if (nvme_nvm_register(ns, disk_name, node)) {
+			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)
@@ -1532,7 +1526,7 @@ static void nvme_ns_remove(struct nvme_ns *ns)
 	if (test_and_set_bit(NVME_NS_REMOVING, &ns->flags))
 		return;
 
-	if (ns->disk->flags & GENHD_FL_UP) {
+	if (ns->disk && ns->disk->flags & GENHD_FL_UP) {
 		if (blk_get_integrity(ns->disk))
 			blk_integrity_unregister(ns->disk);
 		sysfs_remove_group(&disk_to_dev(ns->disk)->kobj,
@@ -1552,7 +1546,7 @@ static void nvme_validate_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 
 	ns = nvme_find_ns(ctrl, nsid);
 	if (ns) {
-		if (revalidate_disk(ns->disk))
+		if (ns->disk && revalidate_disk(ns->disk))
 			nvme_ns_remove(ns);
 	} else
 		nvme_alloc_ns(ctrl, nsid);
@@ -1856,7 +1850,7 @@ void nvme_kill_queues(struct nvme_ctrl *ctrl)
 		 * Revalidating a dead namespace sets capacity to 0. This will
 		 * end buffered writers dirtying pages that can't be synced.
 		 */
-		if (!test_and_set_bit(NVME_NS_DEAD, &ns->flags))
+		if (ns->disk && !test_and_set_bit(NVME_NS_DEAD, &ns->flags))
 			revalidate_disk(ns->disk);
 
 		blk_set_queue_dying(ns->queue);
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index 97fe610..095e58e 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -592,14 +592,27 @@ static struct nvm_dev_ops nvme_nvm_dev_ops = {
 	.max_phys_sect		= 64,
 };
 
-int nvme_nvm_register(struct request_queue *q, char *disk_name)
+int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node)
 {
-	return nvm_register(q, disk_name, &nvme_nvm_dev_ops);
+	struct request_queue *q = ns->queue;
+	struct nvm_dev *dev;
+
+	dev = nvm_alloc_dev(node);
+	if (!dev)
+		return -ENOMEM;
+
+	dev->q = q;
+	memcpy(dev->name, disk_name, DISK_NAME_LEN);
+	dev->ops = &nvme_nvm_dev_ops;
+	ns->ndev = dev;
+
+	return nvm_register(dev);
 }
 
-void nvme_nvm_unregister(struct request_queue *q, char *disk_name)
+void nvme_nvm_unregister(struct nvme_ns *ns)
 {
-	nvm_unregister(disk_name);
+	nvm_unregister(ns->ndev);
+	kfree(ns->ndev);
 }
 
 /* move to shared place when used in multiple places. */
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 282421f..7b49b45 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -18,6 +18,7 @@
 #include <linux/pci.h>
 #include <linux/kref.h>
 #include <linux/blk-mq.h>
+#include <linux/lightnvm.h>
 
 enum {
 	/*
@@ -122,6 +123,7 @@ struct nvme_ns {
 	struct nvme_ctrl *ctrl;
 	struct request_queue *queue;
 	struct gendisk *disk;
+	struct nvm_dev *ndev;
 	struct kref kref;
 	int instance;
 
@@ -133,7 +135,6 @@ struct nvme_ns {
 	u16 ms;
 	bool ext;
 	u8 pi_type;
-	int type;
 	unsigned long flags;
 
 #define NVME_NS_REMOVING 0
@@ -269,12 +270,13 @@ int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id);
 int nvme_nvm_register(struct request_queue *q, char *disk_name);
 void nvme_nvm_unregister(struct request_queue *q, char *disk_name);
 #else
-static inline int nvme_nvm_register(struct request_queue *q, char *disk_name)
+static inline int nvme_nvm_register(struct nvme_ns *ns, char *disk_name,
+								int node)
 {
 	return 0;
 }
 
-static inline void nvme_nvm_unregister(struct request_queue *q, char *disk_name) {};
+static inline void nvme_nvm_unregister(struct nvme_ns *ns) {};
 
 static inline int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id)
 {
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index ba78b83..5afc263 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -524,9 +524,9 @@ extern struct nvm_block *nvm_get_blk(struct nvm_dev *, struct nvm_lun *,
 								unsigned long);
 extern void nvm_put_blk(struct nvm_dev *, struct nvm_block *);
 
-extern int nvm_register(struct request_queue *, char *,
-						struct nvm_dev_ops *);
-extern void nvm_unregister(char *);
+extern struct nvm_dev *nvm_alloc_dev(int);
+extern int nvm_register(struct nvm_dev *);
+extern void nvm_unregister(struct nvm_dev *);
 
 void nvm_mark_blk(struct nvm_dev *dev, struct ppa_addr ppa, int type);
 
@@ -575,11 +575,14 @@ extern int nvm_dev_factory(struct nvm_dev *, int flags);
 #else /* CONFIG_NVM */
 struct nvm_dev_ops;
 
-static inline int nvm_register(struct request_queue *q, char *disk_name,
-							struct nvm_dev_ops *ops)
+static inline struct nvm_dev *nvm_alloc_dev(int node)
+{
+	return ERR_PTR(-EINVAL);
+}
+static inline int nvm_register(struct nvm_dev *dev)
 {
 	return -EINVAL;
 }
-static inline void nvm_unregister(char *disk_name) {}
+static inline void nvm_unregister(struct nvm_dev *dev) {}
 #endif /* CONFIG_NVM */
 #endif /* LIGHTNVM.H */
-- 
2.1.4

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

* [PATCH 4/6] lightnvm: let drivers control the lifetime of nvm_dev
@ 2016-06-10 12:21   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-10 12:21 UTC (permalink / raw)


LightNVM does not currently expose the device driver sysfs specific
entries to user-space, as the device driver skips the initialization of
gendisk.

To enable a device driver sysfs entries to be exposed, we need a struct
device to attach it to. To allow both the device driver and LightNVM to
access the same struct device, we need the device driver to track the
lifetime of the nvm_dev structure.

This patch refactors the two users of LightNVM (NVMe and null_blk),
enables them to allocate and free nvm_dev, and at last removes gendisk
usage when a LightNVM device is used.

Signed-off-by: Matias Bj?rling <m at bjorling.me>
---
 drivers/block/null_blk.c     | 22 ++++++++++++++++++++--
 drivers/lightnvm/core.c      | 34 +++++++---------------------------
 drivers/nvme/host/core.c     | 34 ++++++++++++++--------------------
 drivers/nvme/host/lightnvm.c | 21 +++++++++++++++++----
 drivers/nvme/host/nvme.h     |  8 +++++---
 include/linux/lightnvm.h     | 15 +++++++++------
 6 files changed, 72 insertions(+), 62 deletions(-)

diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index 3117df1..5a0da8b 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -34,6 +34,7 @@ struct nullb {
 	unsigned int index;
 	struct request_queue *q;
 	struct gendisk *disk;
+	struct nvm_dev *ndev;
 	struct blk_mq_tag_set tag_set;
 	struct hrtimer timer;
 	unsigned int queue_depth;
@@ -550,12 +551,29 @@ static struct nvm_dev_ops null_lnvm_dev_ops = {
 
 static int null_nvm_register(struct nullb *nullb)
 {
-	return nvm_register(nullb->q, nullb->disk_name, &null_lnvm_dev_ops);
+	struct nvm_dev *dev;
+	int rv;
+
+	dev = nvm_alloc_dev(0);
+	if (!dev)
+		return -ENOMEM;
+
+	dev->q = nullb->q;
+	memcpy(dev->name, nullb->disk_name, DISK_NAME_LEN);
+	dev->ops = &null_lnvm_dev_ops;
+
+	rv = nvm_register(dev);
+	if (rv) {
+		kfree(dev);
+		return rv;
+	}
+	nullb->ndev = dev;
+	return 0;
 }
 
 static void null_nvm_unregister(struct nullb *nullb)
 {
-	nvm_unregister(nullb->disk_name);
+	nvm_unregister(nullb->ndev);
 }
 #else
 static int null_nvm_register(struct nullb *nullb)
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 4574c0b..ad27768 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -655,23 +655,15 @@ static void nvm_exit(struct nvm_dev *dev)
 	pr_info("nvm: successfully unloaded\n");
 }
 
-int nvm_register(struct request_queue *q, char *disk_name,
-							struct nvm_dev_ops *ops)
+struct nvm_dev *nvm_alloc_dev(int node)
+{
+	return kzalloc_node(sizeof(struct nvm_dev), GFP_KERNEL, node);
+}
+
+int nvm_register(struct nvm_dev *dev)
 {
-	struct nvm_dev *dev;
 	int ret;
 
-	if (!ops->identity)
-		return -EINVAL;
-
-	dev = kzalloc(sizeof(struct nvm_dev), GFP_KERNEL);
-	if (!dev)
-		return -ENOMEM;
-
-	dev->q = q;
-	dev->ops = ops;
-	strncpy(dev->name, disk_name, DISK_NAME_LEN);
-
 	ret = nvm_init(dev);
 	if (ret)
 		goto err_init;
@@ -709,29 +701,17 @@ int nvm_register(struct request_queue *q, char *disk_name,
 	return 0;
 err_init:
 	kfree(dev->lun_map);
-	kfree(dev);
 	return ret;
 }
 EXPORT_SYMBOL(nvm_register);
 
-void nvm_unregister(char *disk_name)
+void nvm_unregister(struct nvm_dev *dev)
 {
-	struct nvm_dev *dev;
-
 	down_write(&nvm_lock);
-	dev = nvm_find_nvm_dev(disk_name);
-	if (!dev) {
-		pr_err("nvm: could not find device %s to unregister\n",
-								disk_name);
-		up_write(&nvm_lock);
-		return;
-	}
-
 	list_del(&dev->devices);
 	up_write(&nvm_lock);
 
 	nvm_exit(dev);
-	kfree(dev);
 }
 EXPORT_SYMBOL(nvm_unregister);
 
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index f615b6b..fe135d9 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -137,12 +137,14 @@ static void nvme_free_ns(struct kref *kref)
 {
 	struct nvme_ns *ns = container_of(kref, struct nvme_ns, kref);
 
-	if (ns->type == NVME_NS_LIGHTNVM)
-		nvme_nvm_unregister(ns->queue, ns->disk->disk_name);
+	if (ns->ndev)
+		nvme_nvm_unregister(ns);
 
-	spin_lock(&dev_list_lock);
-	ns->disk->private_data = NULL;
-	spin_unlock(&dev_list_lock);
+	if (ns->disk) {
+		spin_lock(&dev_list_lock);
+		ns->disk->private_data = NULL;
+		spin_unlock(&dev_list_lock);
+	}
 
 	put_disk(ns->disk);
 	ida_simple_remove(&ns->ctrl->ns_ida, ns->instance);
@@ -788,8 +790,7 @@ static void nvme_config_discard(struct nvme_ns *ns)
 static int nvme_revalidate_ns(struct nvme_ns *ns, struct nvme_id_ns **id)
 {
 	if (nvme_identify_ns(ns->ctrl, ns->ns_id, id)) {
-		dev_warn(disk_to_dev(ns->disk), "%s: Identify failure\n",
-				__func__);
+		dev_warn(ns->ctrl->dev, "%s: Identify failure\n", __func__);
 		return -ENODEV;
 	}
 
@@ -1473,18 +1474,11 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 	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__);
+		if (nvme_nvm_register(ns, disk_name, node)) {
+			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)
@@ -1532,7 +1526,7 @@ static void nvme_ns_remove(struct nvme_ns *ns)
 	if (test_and_set_bit(NVME_NS_REMOVING, &ns->flags))
 		return;
 
-	if (ns->disk->flags & GENHD_FL_UP) {
+	if (ns->disk && ns->disk->flags & GENHD_FL_UP) {
 		if (blk_get_integrity(ns->disk))
 			blk_integrity_unregister(ns->disk);
 		sysfs_remove_group(&disk_to_dev(ns->disk)->kobj,
@@ -1552,7 +1546,7 @@ static void nvme_validate_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 
 	ns = nvme_find_ns(ctrl, nsid);
 	if (ns) {
-		if (revalidate_disk(ns->disk))
+		if (ns->disk && revalidate_disk(ns->disk))
 			nvme_ns_remove(ns);
 	} else
 		nvme_alloc_ns(ctrl, nsid);
@@ -1856,7 +1850,7 @@ void nvme_kill_queues(struct nvme_ctrl *ctrl)
 		 * Revalidating a dead namespace sets capacity to 0. This will
 		 * end buffered writers dirtying pages that can't be synced.
 		 */
-		if (!test_and_set_bit(NVME_NS_DEAD, &ns->flags))
+		if (ns->disk && !test_and_set_bit(NVME_NS_DEAD, &ns->flags))
 			revalidate_disk(ns->disk);
 
 		blk_set_queue_dying(ns->queue);
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index 97fe610..095e58e 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -592,14 +592,27 @@ static struct nvm_dev_ops nvme_nvm_dev_ops = {
 	.max_phys_sect		= 64,
 };
 
-int nvme_nvm_register(struct request_queue *q, char *disk_name)
+int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node)
 {
-	return nvm_register(q, disk_name, &nvme_nvm_dev_ops);
+	struct request_queue *q = ns->queue;
+	struct nvm_dev *dev;
+
+	dev = nvm_alloc_dev(node);
+	if (!dev)
+		return -ENOMEM;
+
+	dev->q = q;
+	memcpy(dev->name, disk_name, DISK_NAME_LEN);
+	dev->ops = &nvme_nvm_dev_ops;
+	ns->ndev = dev;
+
+	return nvm_register(dev);
 }
 
-void nvme_nvm_unregister(struct request_queue *q, char *disk_name)
+void nvme_nvm_unregister(struct nvme_ns *ns)
 {
-	nvm_unregister(disk_name);
+	nvm_unregister(ns->ndev);
+	kfree(ns->ndev);
 }
 
 /* move to shared place when used in multiple places. */
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 282421f..7b49b45 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -18,6 +18,7 @@
 #include <linux/pci.h>
 #include <linux/kref.h>
 #include <linux/blk-mq.h>
+#include <linux/lightnvm.h>
 
 enum {
 	/*
@@ -122,6 +123,7 @@ struct nvme_ns {
 	struct nvme_ctrl *ctrl;
 	struct request_queue *queue;
 	struct gendisk *disk;
+	struct nvm_dev *ndev;
 	struct kref kref;
 	int instance;
 
@@ -133,7 +135,6 @@ struct nvme_ns {
 	u16 ms;
 	bool ext;
 	u8 pi_type;
-	int type;
 	unsigned long flags;
 
 #define NVME_NS_REMOVING 0
@@ -269,12 +270,13 @@ int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id);
 int nvme_nvm_register(struct request_queue *q, char *disk_name);
 void nvme_nvm_unregister(struct request_queue *q, char *disk_name);
 #else
-static inline int nvme_nvm_register(struct request_queue *q, char *disk_name)
+static inline int nvme_nvm_register(struct nvme_ns *ns, char *disk_name,
+								int node)
 {
 	return 0;
 }
 
-static inline void nvme_nvm_unregister(struct request_queue *q, char *disk_name) {};
+static inline void nvme_nvm_unregister(struct nvme_ns *ns) {};
 
 static inline int nvme_nvm_ns_supported(struct nvme_ns *ns, struct nvme_id_ns *id)
 {
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index ba78b83..5afc263 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -524,9 +524,9 @@ extern struct nvm_block *nvm_get_blk(struct nvm_dev *, struct nvm_lun *,
 								unsigned long);
 extern void nvm_put_blk(struct nvm_dev *, struct nvm_block *);
 
-extern int nvm_register(struct request_queue *, char *,
-						struct nvm_dev_ops *);
-extern void nvm_unregister(char *);
+extern struct nvm_dev *nvm_alloc_dev(int);
+extern int nvm_register(struct nvm_dev *);
+extern void nvm_unregister(struct nvm_dev *);
 
 void nvm_mark_blk(struct nvm_dev *dev, struct ppa_addr ppa, int type);
 
@@ -575,11 +575,14 @@ extern int nvm_dev_factory(struct nvm_dev *, int flags);
 #else /* CONFIG_NVM */
 struct nvm_dev_ops;
 
-static inline int nvm_register(struct request_queue *q, char *disk_name,
-							struct nvm_dev_ops *ops)
+static inline struct nvm_dev *nvm_alloc_dev(int node)
+{
+	return ERR_PTR(-EINVAL);
+}
+static inline int nvm_register(struct nvm_dev *dev)
 {
 	return -EINVAL;
 }
-static inline void nvm_unregister(char *disk_name) {}
+static inline void nvm_unregister(struct nvm_dev *dev) {}
 #endif /* CONFIG_NVM */
 #endif /* LIGHTNVM.H */
-- 
2.1.4

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

* [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
  2016-06-29 14:51 [PATCH 0/6] enable sysfs for lightnvm Matias Bjørling
  2016-06-29 14:51   ` Matias Bjørling
  (?)
@ 2016-06-29 14:51   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-29 14:51 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme, dm-devel
  Cc: Matias Bjørling

V2l0aCBMaWdodE5WTSBlbmFibGVkIG5hbWVzcGFjZXMsIHRoZSBnZW5kaXNrIHN0cnVjdHVyZSBp
cyBub3QgZXhwb3NlZAp0byB0aGUgdXNlci4gVGhpcyBwcmV2ZW50cyBMaWdodE5WTSB1c2VycyBm
cm9tIGFjY2Vzc2luZyB0aGUgTlZNZSBkZXZpY2UKZHJpdmVyIHNwZWNpZmljIHN5c2ZzIGVudHJp
ZXMsIGFuZCBMaWdodE5WTSBuYW1lc3BhY2UgZ2VvbWV0cnkuCgpSZWZhY3RvciB0aGUgcmV2YWxp
ZGF0aW9uIHByb2Nlc3MsIHNvIHRoYXQgYSBuYW1lc3BhY2UsIGluc3RlYWQgb2YgYQpnZW5kaXNr
LCBpcyByZXZhbGlkYXRlZC4gVGhpcyBsYXRlciBhbGxvd3MgcGF0Y2hlcyB0byB3aXJlIHVwIHRo
ZQpzeXNmcyBlbnRyaWVzIHVwIHRvIGEgbm9uLWdlbmRpc2sgbmFtZXNwYWNlLgoKU2lnbmVkLW9m
Zi1ieTogTWF0aWFzIEJqw7hybGluZyA8bUBiam9ybGluZy5tZT4KLS0tCiBkcml2ZXJzL2xpZ2h0
bnZtL2NvcmUuYyAgICAgIHwgICAyICsKIGRyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYyAgICAgfCAx
MzQgKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLQogZHJpdmVycy9u
dm1lL2hvc3QvbGlnaHRudm0uYyB8ICAgNSArLQogMyBmaWxlcyBjaGFuZ2VkLCA4NyBpbnNlcnRp
b25zKCspLCA1NCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xpZ2h0bnZtL2Nv
cmUuYyBiL2RyaXZlcnMvbGlnaHRudm0vY29yZS5jCmluZGV4IDllYmQyY2YuLjI1YzVkZjkgMTAw
NjQ0Ci0tLSBhL2RyaXZlcnMvbGlnaHRudm0vY29yZS5jCisrKyBiL2RyaXZlcnMvbGlnaHRudm0v
Y29yZS5jCkBAIC01ODEsNiArNTgxLDggQEAgc3RhdGljIGludCBudm1fY29yZV9pbml0KHN0cnVj
dCBudm1fZGV2ICpkZXYpCiAJbXV0ZXhfaW5pdCgmZGV2LT5tbG9jayk7CiAJc3Bpbl9sb2NrX2lu
aXQoJmRldi0+bG9jayk7CiAKKwlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGRldi0+cSwg
ZGV2LT5zZWNfc2l6ZSk7CisKIAlyZXR1cm4gMDsKIGVycl9mbXR5cGU6CiAJa2ZyZWUoZGV2LT5s
dW5fbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYyBiL2RyaXZlcnMv
bnZtZS9ob3N0L2NvcmUuYwppbmRleCA2ODQwNjJhLi5mNjE1YjZiIDEwMDY0NAotLS0gYS9kcml2
ZXJzL252bWUvaG9zdC9jb3JlLmMKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCkBAIC03
ODUsNDIgKzc4NSwzMyBAQCBzdGF0aWMgdm9pZCBudm1lX2NvbmZpZ19kaXNjYXJkKHN0cnVjdCBu
dm1lX25zICpucykKIAlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX0RJU0NBUkQs
IG5zLT5xdWV1ZSk7CiB9CiAKLXN0YXRpYyBpbnQgbnZtZV9yZXZhbGlkYXRlX2Rpc2soc3RydWN0
IGdlbmRpc2sgKmRpc2spCitzdGF0aWMgaW50IG52bWVfcmV2YWxpZGF0ZV9ucyhzdHJ1Y3QgbnZt
ZV9ucyAqbnMsIHN0cnVjdCBudm1lX2lkX25zICoqaWQpCiB7Ci0Jc3RydWN0IG52bWVfbnMgKm5z
ID0gZGlzay0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBudm1lX2lkX25zICppZDsKLQl1OCBsYmFm
LCBwaV90eXBlOwotCXUxNiBvbGRfbXM7Ci0JdW5zaWduZWQgc2hvcnQgYnM7Ci0KLQlpZiAodGVz
dF9iaXQoTlZNRV9OU19ERUFELCAmbnMtPmZsYWdzKSkgewotCQlzZXRfY2FwYWNpdHkoZGlzaywg
MCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAobnZtZV9pZGVudGlmeV9ucyhucy0+Y3Ry
bCwgbnMtPm5zX2lkLCAmaWQpKSB7CisJaWYgKG52bWVfaWRlbnRpZnlfbnMobnMtPmN0cmwsIG5z
LT5uc19pZCwgaWQpKSB7CiAJCWRldl93YXJuKGRpc2tfdG9fZGV2KG5zLT5kaXNrKSwgIiVzOiBJ
ZGVudGlmeSBmYWlsdXJlXG4iLAogCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJ
fQotCWlmIChpZC0+bmNhcCA9PSAwKSB7Ci0JCWtmcmVlKGlkKTsKLQkJcmV0dXJuIC1FTk9ERVY7
Ci0JfQogCi0JaWYgKG52bWVfbnZtX25zX3N1cHBvcnRlZChucywgaWQpICYmIG5zLT50eXBlICE9
IE5WTUVfTlNfTElHSFROVk0pIHsKLQkJaWYgKG52bWVfbnZtX3JlZ2lzdGVyKG5zLT5xdWV1ZSwg
ZGlzay0+ZGlza19uYW1lKSkgewotCQkJZGV2X3dhcm4oZGlza190b19kZXYobnMtPmRpc2spLAot
CQkJCSIlczogTGlnaHROVk0gaW5pdCBmYWlsdXJlXG4iLCBfX2Z1bmNfXyk7Ci0JCQlrZnJlZShp
ZCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlucy0+dHlwZSA9IE5WTUVfTlNfTElHSFRO
Vk07CisJaWYgKCgqaWQpLT5uY2FwID09IDApIHsKKwkJa2ZyZWUoKmlkKTsKKwkJcmV0dXJuIC1F
Tk9ERVY7CiAJfQogCiAJaWYgKG5zLT5jdHJsLT52cyA+PSBOVk1FX1ZTKDEsIDEpKQotCQltZW1j
cHkobnMtPmV1aSwgaWQtPmV1aTY0LCBzaXplb2YobnMtPmV1aSkpOworCQltZW1jcHkobnMtPmV1
aSwgKCppZCktPmV1aTY0LCBzaXplb2YobnMtPmV1aSkpOwogCWlmIChucy0+Y3RybC0+dnMgPj0g
TlZNRV9WUygxLCAyKSkKLQkJbWVtY3B5KG5zLT51dWlkLCBpZC0+bmd1aWQsIHNpemVvZihucy0+
dXVpZCkpOworCQltZW1jcHkobnMtPnV1aWQsICgqaWQpLT5uZ3VpZCwgc2l6ZW9mKG5zLT51dWlk
KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19udm1lX3JldmFsaWRhdGVfZGlz
ayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgc3RydWN0IG52bWVfaWRfbnMgKmlkKQoreworCXN0cnVj
dCBudm1lX25zICpucyA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwl1OCBsYmFmLCBwaV90eXBlOwor
CXUxNiBvbGRfbXM7CisJdW5zaWduZWQgc2hvcnQgYnM7CiAKIAlvbGRfbXMgPSBucy0+bXM7CiAJ
bGJhZiA9IGlkLT5mbGJhcyAmIE5WTUVfTlNfRkxCQVNfTEJBX01BU0s7CkBAIC04NTksOCArODUw
LDI2IEBAIHN0YXRpYyBpbnQgbnZtZV9yZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRp
c2spCiAJaWYgKG5zLT5jdHJsLT5vbmNzICYgTlZNRV9DVFJMX09OQ1NfRFNNKQogCQludm1lX2Nv
bmZpZ19kaXNjYXJkKG5zKTsKIAlibGtfbXFfdW5mcmVlemVfcXVldWUoZGlzay0+cXVldWUpOwor
fQogCitzdGF0aWMgaW50IG52bWVfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNr
KQoreworCXN0cnVjdCBudm1lX25zICpucyA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qg
bnZtZV9pZF9ucyAqaWQgPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAodGVzdF9iaXQoTlZNRV9O
U19ERUFELCAmbnMtPmZsYWdzKSkgeworCQlzZXRfY2FwYWNpdHkoZGlzaywgMCk7CisJCXJldHVy
biAtRU5PREVWOworCX0KKworCXJldCA9IG52bWVfcmV2YWxpZGF0ZV9ucyhucywgJmlkKTsKKwlp
ZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJX19udm1lX3JldmFsaWRhdGVfZGlzayhkaXNrLCBp
ZCk7CiAJa2ZyZWUoaWQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzAsNiArMTQzOSw4IEBA
IHN0YXRpYyB2b2lkIG52bWVfYWxsb2NfbnMoc3RydWN0IG52bWVfY3RybCAqY3RybCwgdW5zaWdu
ZWQgbnNpZCkKIHsKIAlzdHJ1Y3QgbnZtZV9ucyAqbnM7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7
CisJc3RydWN0IG52bWVfaWRfbnMgKmlkOworCWNoYXIgZGlza19uYW1lW0RJU0tfTkFNRV9MRU5d
OwogCWludCBub2RlID0gZGV2X3RvX25vZGUoY3RybC0+ZGV2KTsKIAogCWxvY2tkZXBfYXNzZXJ0
X2hlbGQoJmN0cmwtPm5hbWVzcGFjZXNfbXV0ZXgpOwpAQCAtMTQ0OSw0NCArMTQ2MCw2MyBAQCBz
dGF0aWMgdm9pZCBudm1lX2FsbG9jX25zKHN0cnVjdCBudm1lX2N0cmwgKmN0cmwsIHVuc2lnbmVk
IG5zaWQpCiAJbnMtPnF1ZXVlLT5xdWV1ZWRhdGEgPSBuczsKIAlucy0+Y3RybCA9IGN0cmw7CiAK
LQlkaXNrID0gYWxsb2NfZGlza19ub2RlKDAsIG5vZGUpOwotCWlmICghZGlzaykKLQkJZ290byBv
dXRfZnJlZV9xdWV1ZTsKLQogCWtyZWZfaW5pdCgmbnMtPmtyZWYpOwogCW5zLT5uc19pZCA9IG5z
aWQ7Ci0JbnMtPmRpc2sgPSBkaXNrOwogCW5zLT5sYmFfc2hpZnQgPSA5OyAvKiBzZXQgdG8gYSBk
ZWZhdWx0IHZhbHVlIGZvciA1MTIgdW50aWwgZGlzayBpcyB2YWxpZGF0ZWQgKi8KIAotCiAJYmxr
X3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShucy0+cXVldWUsIDEgPDwgbnMtPmxiYV9zaGlmdCk7
CiAJbnZtZV9zZXRfcXVldWVfbGltaXRzKGN0cmwsIG5zLT5xdWV1ZSk7CiAKLQlkaXNrLT5tYWpv
ciA9IG52bWVfbWFqb3I7Ci0JZGlzay0+Zmlyc3RfbWlub3IgPSAwOwotCWRpc2stPmZvcHMgPSAm
bnZtZV9mb3BzOwotCWRpc2stPnByaXZhdGVfZGF0YSA9IG5zOwotCWRpc2stPnF1ZXVlID0gbnMt
PnF1ZXVlOwotCWRpc2stPmRyaXZlcmZzX2RldiA9IGN0cmwtPmRldmljZTsKLQlkaXNrLT5mbGFn
cyA9IEdFTkhEX0ZMX0VYVF9ERVZUOwotCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAibnZtZSVk
biVkIiwgY3RybC0+aW5zdGFuY2UsIG5zLT5pbnN0YW5jZSk7Ci0KLQlpZiAobnZtZV9yZXZhbGlk
YXRlX2Rpc2sobnMtPmRpc2spKQotCQlnb3RvIG91dF9mcmVlX2Rpc2s7CisJaWYgKG52bWVfcmV2
YWxpZGF0ZV9ucyhucywgJmlkKSkKKwkJZ290byBvdXRfZnJlZV9xdWV1ZTsKKworCXNwcmludGYo
ZGlza19uYW1lLCAibnZtZSVkbiVkIiwgY3RybC0+aW5zdGFuY2UsIG5zLT5pbnN0YW5jZSk7CisK
KwlpZiAobnZtZV9udm1fbnNfc3VwcG9ydGVkKG5zLCBpZCkpIHsKKwkJaWYgKG52bWVfbnZtX3Jl
Z2lzdGVyKG5zLT5xdWV1ZSwgZGlza19uYW1lKSkgeworCQkJZGV2X3dhcm4oY3RybC0+ZGV2LAor
CQkJCSIlczogTGlnaHROVk0gaW5pdCBmYWlsdXJlXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91
dF9mcmVlX2lkOworCQl9CisKKwkJZGlzayA9IGFsbG9jX2Rpc2tfbm9kZSgwLCBub2RlKTsKKwkJ
aWYgKCFkaXNrKQorCQkJZ290byBvdXRfZnJlZV9pZDsKKwkJbWVtY3B5KGRpc2stPmRpc2tfbmFt
ZSwgZGlza19uYW1lLCBESVNLX05BTUVfTEVOKTsKKwkJbnMtPmRpc2sgPSBkaXNrOworCQlucy0+
dHlwZSA9IE5WTUVfTlNfTElHSFROVk07CisJfSBlbHNlIHsKKwkJZGlzayA9IGFsbG9jX2Rpc2tf
bm9kZSgwLCBub2RlKTsKKwkJaWYgKCFkaXNrKQorCQkJZ290byBvdXRfZnJlZV9pZDsKKworCQlk
aXNrLT5tYWpvciA9IG52bWVfbWFqb3I7CisJCWRpc2stPmZpcnN0X21pbm9yID0gMDsKKwkJZGlz
ay0+Zm9wcyA9ICZudm1lX2ZvcHM7CisJCWRpc2stPnByaXZhdGVfZGF0YSA9IG5zOworCQlkaXNr
LT5xdWV1ZSA9IG5zLT5xdWV1ZTsKKwkJZGlzay0+ZHJpdmVyZnNfZGV2ID0gY3RybC0+ZGV2aWNl
OworCQlkaXNrLT5mbGFncyA9IEdFTkhEX0ZMX0VYVF9ERVZUOworCQltZW1jcHkoZGlzay0+ZGlz
a19uYW1lLCBkaXNrX25hbWUsIERJU0tfTkFNRV9MRU4pOworCQlucy0+ZGlzayA9IGRpc2s7CisK
KwkJX19udm1lX3JldmFsaWRhdGVfZGlzayhkaXNrLCBpZCk7CisKKwkJYWRkX2Rpc2sobnMtPmRp
c2spOworCisJCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJmRpc2tfdG9fZGV2KG5zLT5kaXNrKS0+
a29iaiwKKwkJCQkJCQkmbnZtZV9uc19hdHRyX2dyb3VwKSkKKwkJCXByX3dhcm4oIiVzOiBmYWls
ZWQgdG8gY3JlYXRlIHN5c2ZzIGdyb3VwIGZvciBpZGVudGlmaWNhdGlvblxuIiwKKwkJCQlucy0+
ZGlzay0+ZGlza19uYW1lKTsKKwl9CiAKIAlsaXN0X2FkZF90YWlsX3JjdSgmbnMtPmxpc3QsICZj
dHJsLT5uYW1lc3BhY2VzKTsKIAlrcmVmX2dldCgmY3RybC0+a3JlZik7Ci0JaWYgKG5zLT50eXBl
ID09IE5WTUVfTlNfTElHSFROVk0pCi0JCXJldHVybjsKIAotCWFkZF9kaXNrKG5zLT5kaXNrKTsK
LQlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZkaXNrX3RvX2Rldihucy0+ZGlzayktPmtvYmosCi0J
CQkJCSZudm1lX25zX2F0dHJfZ3JvdXApKQotCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIGNyZWF0
ZSBzeXNmcyBncm91cCBmb3IgaWRlbnRpZmljYXRpb25cbiIsCi0JCQlucy0+ZGlzay0+ZGlza19u
YW1lKTsKKwlrZnJlZShpZCk7CiAJcmV0dXJuOwotIG91dF9mcmVlX2Rpc2s6Ci0Ja2ZyZWUoZGlz
ayk7Cisgb3V0X2ZyZWVfaWQ6CisJa2ZyZWUoaWQpOwogIG91dF9mcmVlX3F1ZXVlOgogCWJsa19j
bGVhbnVwX3F1ZXVlKG5zLT5xdWV1ZSk7CiAgb3V0X3JlbGVhc2VfaW5zdGFuY2U6CmRpZmYgLS1n
aXQgYS9kcml2ZXJzL252bWUvaG9zdC9saWdodG52bS5jIGIvZHJpdmVycy9udm1lL2hvc3QvbGln
aHRudm0uYwppbmRleCA5N2ZlNjEwLi5iYTUxNjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUv
aG9zdC9saWdodG52bS5jCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L2xpZ2h0bnZtLmMKQEAgLTQ3
NCw4ICs0NzQsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgbnZtZV9udm1fcnF0b2NtZChzdHJ1Y3Qg
cmVxdWVzdCAqcnEsIHN0cnVjdCBudm1fcnEgKnJxZCwKIAljLT5waF9ydy5sZW5ndGggPSBjcHVf
dG9fbGUxNihycWQtPm5yX3BwYXMgLSAxKTsKIAogCWlmIChycWQtPm9wY29kZSA9PSBOVk1fT1Bf
SEJXUklURSB8fCBycWQtPm9wY29kZSA9PSBOVk1fT1BfSEJSRUFEKQotCQljLT5oYl9ydy5zbGJh
ID0gY3B1X3RvX2xlNjQobnZtZV9ibG9ja19ucihucywKLQkJCQkJCXJxZC0+YmlvLT5iaV9pdGVy
LmJpX3NlY3RvcikpOworCQkvKiBtb21lbnRhcmlseSBoYXJkY29kZSB0aGUgc2hpZnQgY29uZmln
dXJhdGlvbi4gbGJhX3NoaWZ0IGZyb20KKwkJICogbnZtX2RldiB3aWxsIGJlIGF2YWlsYWJsZSBp
biBhIGZvbGxvdy11cCBwYXRjaCAqLworCQljLT5oYl9ydy5zbGJhID0gY3B1X3RvX2xlNjQocnFk
LT5iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID4+IDMpOwogfQogCiBzdGF0aWMgdm9pZCBudm1lX252
bV9lbmRfaW8oc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IpCi0tIAoyLjEuNAoKCl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW52bWUgbWFp
bGluZyBsaXN0CkxpbnV4LW52bWVAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m
cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW52bWUK

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

* [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
@ 2016-06-29 14:51   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-29 14:51 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme, dm-devel
  Cc: Matias Bjørling

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/lightnvm/core.c      |   2 +
 drivers/nvme/host/core.c     | 134 ++++++++++++++++++++++++++-----------------
 drivers/nvme/host/lightnvm.c |   5 +-
 3 files changed, 87 insertions(+), 54 deletions(-)

diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 9ebd2cf..25c5df9 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -581,6 +581,8 @@ static int nvm_core_init(struct nvm_dev *dev)
 	mutex_init(&dev->mlock);
 	spin_lock_init(&dev->lock);
 
+	blk_queue_logical_block_size(dev->q, dev->sec_size);
+
 	return 0;
 err_fmtype:
 	kfree(dev->lun_map);
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:
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index 97fe610..ba51602 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -474,8 +474,9 @@ static inline void nvme_nvm_rqtocmd(struct request *rq, struct nvm_rq *rqd,
 	c->ph_rw.length = cpu_to_le16(rqd->nr_ppas - 1);
 
 	if (rqd->opcode == NVM_OP_HBWRITE || rqd->opcode == NVM_OP_HBREAD)
-		c->hb_rw.slba = cpu_to_le64(nvme_block_nr(ns,
-						rqd->bio->bi_iter.bi_sector));
+		/* momentarily hardcode the shift configuration. lba_shift from
+		 * nvm_dev will be available in a follow-up patch */
+		c->hb_rw.slba = cpu_to_le64(rqd->bio->bi_iter.bi_sector >> 3);
 }
 
 static void nvme_nvm_end_io(struct request *rq, int error)
-- 
2.1.4

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

* [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
@ 2016-06-29 14:51   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-29 14:51 UTC (permalink / raw)


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/lightnvm/core.c      |   2 +
 drivers/nvme/host/core.c     | 134 ++++++++++++++++++++++++++-----------------
 drivers/nvme/host/lightnvm.c |   5 +-
 3 files changed, 87 insertions(+), 54 deletions(-)

diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 9ebd2cf..25c5df9 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -581,6 +581,8 @@ static int nvm_core_init(struct nvm_dev *dev)
 	mutex_init(&dev->mlock);
 	spin_lock_init(&dev->lock);
 
+	blk_queue_logical_block_size(dev->q, dev->sec_size);
+
 	return 0;
 err_fmtype:
 	kfree(dev->lun_map);
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:
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index 97fe610..ba51602 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -474,8 +474,9 @@ static inline void nvme_nvm_rqtocmd(struct request *rq, struct nvm_rq *rqd,
 	c->ph_rw.length = cpu_to_le16(rqd->nr_ppas - 1);
 
 	if (rqd->opcode == NVM_OP_HBWRITE || rqd->opcode == NVM_OP_HBREAD)
-		c->hb_rw.slba = cpu_to_le64(nvme_block_nr(ns,
-						rqd->bio->bi_iter.bi_sector));
+		/* momentarily hardcode the shift configuration. lba_shift from
+		 * nvm_dev will be available in a follow-up patch */
+		c->hb_rw.slba = cpu_to_le64(rqd->bio->bi_iter.bi_sector >> 3);
 }
 
 static void nvme_nvm_end_io(struct request *rq, int error)
-- 
2.1.4

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

* [PATCH 1/6] nvme: refactor namespaces to support non-gendisk devices
@ 2016-06-29 14:51   ` Matias Bjørling
  0 siblings, 0 replies; 17+ messages in thread
From: Matias Bjørling @ 2016-06-29 14:51 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe, keith.busch, linux-nvme, dm-devel
  Cc: Matias Bjørling

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/lightnvm/core.c      |   2 +
 drivers/nvme/host/core.c     | 134 ++++++++++++++++++++++++++-----------------
 drivers/nvme/host/lightnvm.c |   5 +-
 3 files changed, 87 insertions(+), 54 deletions(-)

diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 9ebd2cf..25c5df9 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -581,6 +581,8 @@ static int nvm_core_init(struct nvm_dev *dev)
 	mutex_init(&dev->mlock);
 	spin_lock_init(&dev->lock);
 
+	blk_queue_logical_block_size(dev->q, dev->sec_size);
+
 	return 0;
 err_fmtype:
 	kfree(dev->lun_map);
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:
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index 97fe610..ba51602 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -474,8 +474,9 @@ static inline void nvme_nvm_rqtocmd(struct request *rq, struct nvm_rq *rqd,
 	c->ph_rw.length = cpu_to_le16(rqd->nr_ppas - 1);
 
 	if (rqd->opcode == NVM_OP_HBWRITE || rqd->opcode == NVM_OP_HBREAD)
-		c->hb_rw.slba = cpu_to_le64(nvme_block_nr(ns,
-						rqd->bio->bi_iter.bi_sector));
+		/* momentarily hardcode the shift configuration. lba_shift from
+		 * nvm_dev will be available in a follow-up patch */
+		c->hb_rw.slba = cpu_to_le64(rqd->bio->bi_iter.bi_sector >> 3);
 }
 
 static void nvme_nvm_end_io(struct request *rq, int error)
-- 
2.1.4

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

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

end of thread, other threads:[~2016-06-29 14:53 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [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   ` 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

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.