* fix a dax/block device attribute registration regression @ 2021-09-22 18:33 Christoph Hellwig 2021-09-22 18:33 ` [PATCH 1/3] nvdimm/pmem: fix creating the dax group Christoph Hellwig ` (3 more replies) 0 siblings, 4 replies; 8+ messages in thread From: Christoph Hellwig @ 2021-09-22 18:33 UTC (permalink / raw) To: Dan Williams, Jens Axboe Cc: Vishal Verma, Dave Jiang, Ira Weiny, linux-block, nvdimm Hi Dan and Jens, this series fixed a regression in how the dax/write_cache attribute of the pmem devices was registere. It does so by both fixing the API abuse in the driver and (temporarily) the behavior change in the block layer that made this API abuse not work anymore. Diffstat: block/genhd.c | 3 +- drivers/dax/super.c | 64 -------------------------------------------------- drivers/nvdimm/pmem.c | 48 ++++++++++++++++++++++++++++++++++--- include/linux/dax.h | 2 - 4 files changed, 46 insertions(+), 71 deletions(-) ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/3] nvdimm/pmem: fix creating the dax group 2021-09-22 18:33 fix a dax/block device attribute registration regression Christoph Hellwig @ 2021-09-22 18:33 ` Christoph Hellwig 2021-09-22 18:33 ` [PATCH 2/3] nvdimm/pmem: move dax_attribute_group from dax to pmem Christoph Hellwig ` (2 subsequent siblings) 3 siblings, 0 replies; 8+ messages in thread From: Christoph Hellwig @ 2021-09-22 18:33 UTC (permalink / raw) To: Dan Williams, Jens Axboe Cc: Vishal Verma, Dave Jiang, Ira Weiny, linux-block, nvdimm The recent block layer refactoring broke the way how the pmem driver abused device_add_disk. Fix this by properly passing the attribute groups to device_add_disk. Fixes: 52b85909f85d ("block: fold register_disk into device_add_disk") Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Dan Williams <dan.j.williams@intel.com> --- drivers/nvdimm/pmem.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 72de88ff0d30d..ef4950f808326 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -380,7 +380,6 @@ static int pmem_attach_disk(struct device *dev, struct nd_pfn_sb *pfn_sb; struct pmem_device *pmem; struct request_queue *q; - struct device *gendev; struct gendisk *disk; void *addr; int rc; @@ -489,10 +488,8 @@ static int pmem_attach_disk(struct device *dev, } dax_write_cache(dax_dev, nvdimm_has_cache(nd_region)); pmem->dax_dev = dax_dev; - gendev = disk_to_dev(disk); - gendev->groups = pmem_attribute_groups; - device_add_disk(dev, disk, NULL); + device_add_disk(dev, disk, pmem_attribute_groups); if (devm_add_action_or_reset(dev, pmem_release_disk, pmem)) return -ENOMEM; -- 2.30.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/3] nvdimm/pmem: move dax_attribute_group from dax to pmem 2021-09-22 18:33 fix a dax/block device attribute registration regression Christoph Hellwig 2021-09-22 18:33 ` [PATCH 1/3] nvdimm/pmem: fix creating the dax group Christoph Hellwig @ 2021-09-22 18:33 ` Christoph Hellwig 2021-09-22 21:40 ` Ira Weiny 2021-09-22 18:33 ` [PATCH 3/3] block: warn if ->groups is set when calling add_disk Christoph Hellwig 2021-09-27 18:19 ` Dan Williams 3 siblings, 1 reply; 8+ messages in thread From: Christoph Hellwig @ 2021-09-22 18:33 UTC (permalink / raw) To: Dan Williams, Jens Axboe Cc: Vishal Verma, Dave Jiang, Ira Weiny, linux-block, nvdimm dax_attribute_group is only used by the pmem driver, and can avoid the completely pointless lookup by the disk name if moved there. This leaves just a single caller of dax_get_by_host, so move dax_get_by_host into the same ifdef block as that caller. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dan Williams <dan.j.williams@intel.com> --- drivers/dax/super.c | 100 ++++++++---------------------------------- drivers/nvdimm/pmem.c | 43 ++++++++++++++++++ include/linux/dax.h | 2 - 3 files changed, 61 insertions(+), 84 deletions(-) diff --git a/drivers/dax/super.c b/drivers/dax/super.c index fc89e91beea7c..b882cf8106ea3 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -63,6 +63,24 @@ static int dax_host_hash(const char *host) return hashlen_hash(hashlen_string("DAX", host)) % DAX_HASH_SIZE; } +#ifdef CONFIG_BLOCK +#include <linux/blkdev.h> + +int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size, + pgoff_t *pgoff) +{ + sector_t start_sect = bdev ? get_start_sect(bdev) : 0; + phys_addr_t phys_off = (start_sect + sector) * 512; + + if (pgoff) + *pgoff = PHYS_PFN(phys_off); + if (phys_off % PAGE_SIZE || size % PAGE_SIZE) + return -EINVAL; + return 0; +} +EXPORT_SYMBOL(bdev_dax_pgoff); + +#if IS_ENABLED(CONFIG_FS_DAX) /** * dax_get_by_host() - temporary lookup mechanism for filesystem-dax * @host: alternate name for the device registered by a dax driver @@ -94,24 +112,6 @@ static struct dax_device *dax_get_by_host(const char *host) return found; } -#ifdef CONFIG_BLOCK -#include <linux/blkdev.h> - -int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size, - pgoff_t *pgoff) -{ - sector_t start_sect = bdev ? get_start_sect(bdev) : 0; - phys_addr_t phys_off = (start_sect + sector) * 512; - - if (pgoff) - *pgoff = PHYS_PFN(phys_off); - if (phys_off % PAGE_SIZE || size % PAGE_SIZE) - return -EINVAL; - return 0; -} -EXPORT_SYMBOL(bdev_dax_pgoff); - -#if IS_ENABLED(CONFIG_FS_DAX) struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) { if (!blk_queue_dax(bdev->bd_disk->queue)) @@ -231,70 +231,6 @@ enum dax_device_flags { DAXDEV_SYNC, }; -static ssize_t write_cache_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct dax_device *dax_dev = dax_get_by_host(dev_name(dev)); - ssize_t rc; - - WARN_ON_ONCE(!dax_dev); - if (!dax_dev) - return -ENXIO; - - rc = sprintf(buf, "%d\n", !!dax_write_cache_enabled(dax_dev)); - put_dax(dax_dev); - return rc; -} - -static ssize_t write_cache_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) -{ - bool write_cache; - int rc = strtobool(buf, &write_cache); - struct dax_device *dax_dev = dax_get_by_host(dev_name(dev)); - - WARN_ON_ONCE(!dax_dev); - if (!dax_dev) - return -ENXIO; - - if (rc) - len = rc; - else - dax_write_cache(dax_dev, write_cache); - - put_dax(dax_dev); - return len; -} -static DEVICE_ATTR_RW(write_cache); - -static umode_t dax_visible(struct kobject *kobj, struct attribute *a, int n) -{ - struct device *dev = container_of(kobj, typeof(*dev), kobj); - struct dax_device *dax_dev = dax_get_by_host(dev_name(dev)); - - WARN_ON_ONCE(!dax_dev); - if (!dax_dev) - return 0; - -#ifndef CONFIG_ARCH_HAS_PMEM_API - if (a == &dev_attr_write_cache.attr) - return 0; -#endif - return a->mode; -} - -static struct attribute *dax_attributes[] = { - &dev_attr_write_cache.attr, - NULL, -}; - -struct attribute_group dax_attribute_group = { - .name = "dax", - .attrs = dax_attributes, - .is_visible = dax_visible, -}; -EXPORT_SYMBOL_GPL(dax_attribute_group); - /** * dax_direct_access() - translate a device pgoff to an absolute pfn * @dax_dev: a dax_device instance representing the logical memory range diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index ef4950f808326..bbeb3f46db157 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -328,6 +328,49 @@ static const struct dax_operations pmem_dax_ops = { .zero_page_range = pmem_dax_zero_page_range, }; +static ssize_t write_cache_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct pmem_device *pmem = dev_to_disk(dev)->private_data; + + return sprintf(buf, "%d\n", !!dax_write_cache_enabled(pmem->dax_dev)); +} + +static ssize_t write_cache_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) +{ + struct pmem_device *pmem = dev_to_disk(dev)->private_data; + bool write_cache; + int rc; + + rc = strtobool(buf, &write_cache); + if (rc) + return rc; + dax_write_cache(pmem->dax_dev, write_cache); + return len; +} +static DEVICE_ATTR_RW(write_cache); + +static umode_t dax_visible(struct kobject *kobj, struct attribute *a, int n) +{ +#ifndef CONFIG_ARCH_HAS_PMEM_API + if (a == &dev_attr_write_cache.attr) + return 0; +#endif + return a->mode; +} + +static struct attribute *dax_attributes[] = { + &dev_attr_write_cache.attr, + NULL, +}; + +static const struct attribute_group dax_attribute_group = { + .name = "dax", + .attrs = dax_attributes, + .is_visible = dax_visible, +}; + static const struct attribute_group *pmem_attribute_groups[] = { &dax_attribute_group, NULL, diff --git a/include/linux/dax.h b/include/linux/dax.h index 2619d94c308d4..8623caa673889 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -38,8 +38,6 @@ struct dax_operations { int (*zero_page_range)(struct dax_device *, pgoff_t, size_t); }; -extern struct attribute_group dax_attribute_group; - #if IS_ENABLED(CONFIG_DAX) struct dax_device *alloc_dax(void *private, const char *host, const struct dax_operations *ops, unsigned long flags); -- 2.30.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] nvdimm/pmem: move dax_attribute_group from dax to pmem 2021-09-22 18:33 ` [PATCH 2/3] nvdimm/pmem: move dax_attribute_group from dax to pmem Christoph Hellwig @ 2021-09-22 21:40 ` Ira Weiny 0 siblings, 0 replies; 8+ messages in thread From: Ira Weiny @ 2021-09-22 21:40 UTC (permalink / raw) To: Christoph Hellwig Cc: Dan Williams, Jens Axboe, Vishal Verma, Dave Jiang, linux-block, nvdimm On Wed, Sep 22, 2021 at 08:33:30PM +0200, Christoph Hellwig wrote: > dax_attribute_group is only used by the pmem driver, and can avoid the > completely pointless lookup by the disk name if moved there. This > leaves just a single caller of dax_get_by_host, so move dax_get_by_host > into the same ifdef block as that caller. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> > --- > drivers/dax/super.c | 100 ++++++++---------------------------------- > drivers/nvdimm/pmem.c | 43 ++++++++++++++++++ > include/linux/dax.h | 2 - > 3 files changed, 61 insertions(+), 84 deletions(-) > > diff --git a/drivers/dax/super.c b/drivers/dax/super.c > index fc89e91beea7c..b882cf8106ea3 100644 > --- a/drivers/dax/super.c > +++ b/drivers/dax/super.c > @@ -63,6 +63,24 @@ static int dax_host_hash(const char *host) > return hashlen_hash(hashlen_string("DAX", host)) % DAX_HASH_SIZE; > } > > +#ifdef CONFIG_BLOCK > +#include <linux/blkdev.h> > + > +int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size, > + pgoff_t *pgoff) > +{ > + sector_t start_sect = bdev ? get_start_sect(bdev) : 0; > + phys_addr_t phys_off = (start_sect + sector) * 512; > + > + if (pgoff) > + *pgoff = PHYS_PFN(phys_off); > + if (phys_off % PAGE_SIZE || size % PAGE_SIZE) > + return -EINVAL; > + return 0; > +} > +EXPORT_SYMBOL(bdev_dax_pgoff); > + > +#if IS_ENABLED(CONFIG_FS_DAX) > /** > * dax_get_by_host() - temporary lookup mechanism for filesystem-dax > * @host: alternate name for the device registered by a dax driver > @@ -94,24 +112,6 @@ static struct dax_device *dax_get_by_host(const char *host) > return found; > } > > -#ifdef CONFIG_BLOCK > -#include <linux/blkdev.h> > - > -int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size, > - pgoff_t *pgoff) > -{ > - sector_t start_sect = bdev ? get_start_sect(bdev) : 0; > - phys_addr_t phys_off = (start_sect + sector) * 512; > - > - if (pgoff) > - *pgoff = PHYS_PFN(phys_off); > - if (phys_off % PAGE_SIZE || size % PAGE_SIZE) > - return -EINVAL; > - return 0; > -} > -EXPORT_SYMBOL(bdev_dax_pgoff); > - > -#if IS_ENABLED(CONFIG_FS_DAX) > struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) > { > if (!blk_queue_dax(bdev->bd_disk->queue)) > @@ -231,70 +231,6 @@ enum dax_device_flags { > DAXDEV_SYNC, > }; > > -static ssize_t write_cache_show(struct device *dev, > - struct device_attribute *attr, char *buf) > -{ > - struct dax_device *dax_dev = dax_get_by_host(dev_name(dev)); > - ssize_t rc; > - > - WARN_ON_ONCE(!dax_dev); > - if (!dax_dev) > - return -ENXIO; > - > - rc = sprintf(buf, "%d\n", !!dax_write_cache_enabled(dax_dev)); > - put_dax(dax_dev); > - return rc; > -} > - > -static ssize_t write_cache_store(struct device *dev, > - struct device_attribute *attr, const char *buf, size_t len) > -{ > - bool write_cache; > - int rc = strtobool(buf, &write_cache); > - struct dax_device *dax_dev = dax_get_by_host(dev_name(dev)); > - > - WARN_ON_ONCE(!dax_dev); > - if (!dax_dev) > - return -ENXIO; > - > - if (rc) > - len = rc; > - else > - dax_write_cache(dax_dev, write_cache); > - > - put_dax(dax_dev); > - return len; > -} > -static DEVICE_ATTR_RW(write_cache); > - > -static umode_t dax_visible(struct kobject *kobj, struct attribute *a, int n) > -{ > - struct device *dev = container_of(kobj, typeof(*dev), kobj); > - struct dax_device *dax_dev = dax_get_by_host(dev_name(dev)); > - > - WARN_ON_ONCE(!dax_dev); > - if (!dax_dev) > - return 0; > - > -#ifndef CONFIG_ARCH_HAS_PMEM_API > - if (a == &dev_attr_write_cache.attr) > - return 0; > -#endif > - return a->mode; > -} > - > -static struct attribute *dax_attributes[] = { > - &dev_attr_write_cache.attr, > - NULL, > -}; > - > -struct attribute_group dax_attribute_group = { > - .name = "dax", > - .attrs = dax_attributes, > - .is_visible = dax_visible, > -}; > -EXPORT_SYMBOL_GPL(dax_attribute_group); > - > /** > * dax_direct_access() - translate a device pgoff to an absolute pfn > * @dax_dev: a dax_device instance representing the logical memory range > diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c > index ef4950f808326..bbeb3f46db157 100644 > --- a/drivers/nvdimm/pmem.c > +++ b/drivers/nvdimm/pmem.c > @@ -328,6 +328,49 @@ static const struct dax_operations pmem_dax_ops = { > .zero_page_range = pmem_dax_zero_page_range, > }; > > +static ssize_t write_cache_show(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct pmem_device *pmem = dev_to_disk(dev)->private_data; > + > + return sprintf(buf, "%d\n", !!dax_write_cache_enabled(pmem->dax_dev)); > +} > + > +static ssize_t write_cache_store(struct device *dev, > + struct device_attribute *attr, const char *buf, size_t len) > +{ > + struct pmem_device *pmem = dev_to_disk(dev)->private_data; > + bool write_cache; > + int rc; > + > + rc = strtobool(buf, &write_cache); > + if (rc) > + return rc; > + dax_write_cache(pmem->dax_dev, write_cache); > + return len; > +} > +static DEVICE_ATTR_RW(write_cache); > + > +static umode_t dax_visible(struct kobject *kobj, struct attribute *a, int n) > +{ > +#ifndef CONFIG_ARCH_HAS_PMEM_API > + if (a == &dev_attr_write_cache.attr) > + return 0; > +#endif > + return a->mode; > +} > + > +static struct attribute *dax_attributes[] = { > + &dev_attr_write_cache.attr, > + NULL, > +}; > + > +static const struct attribute_group dax_attribute_group = { > + .name = "dax", > + .attrs = dax_attributes, > + .is_visible = dax_visible, > +}; > + > static const struct attribute_group *pmem_attribute_groups[] = { > &dax_attribute_group, > NULL, > diff --git a/include/linux/dax.h b/include/linux/dax.h > index 2619d94c308d4..8623caa673889 100644 > --- a/include/linux/dax.h > +++ b/include/linux/dax.h > @@ -38,8 +38,6 @@ struct dax_operations { > int (*zero_page_range)(struct dax_device *, pgoff_t, size_t); > }; > > -extern struct attribute_group dax_attribute_group; > - > #if IS_ENABLED(CONFIG_DAX) > struct dax_device *alloc_dax(void *private, const char *host, > const struct dax_operations *ops, unsigned long flags); > -- > 2.30.2 > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] block: warn if ->groups is set when calling add_disk 2021-09-22 18:33 fix a dax/block device attribute registration regression Christoph Hellwig 2021-09-22 18:33 ` [PATCH 1/3] nvdimm/pmem: fix creating the dax group Christoph Hellwig 2021-09-22 18:33 ` [PATCH 2/3] nvdimm/pmem: move dax_attribute_group from dax to pmem Christoph Hellwig @ 2021-09-22 18:33 ` Christoph Hellwig 2021-09-27 18:19 ` Dan Williams 3 siblings, 0 replies; 8+ messages in thread From: Christoph Hellwig @ 2021-09-22 18:33 UTC (permalink / raw) To: Dan Williams, Jens Axboe Cc: Vishal Verma, Dave Jiang, Ira Weiny, linux-block, nvdimm The proper API is to pass the groups to device_add_disk, but the code used to also allow groups being set before calling *add_disk. Warn about that but keep the group pointer intact for now so that it can be removed again after a grace period. Fixes: 52b85909f85d ("block: fold register_disk into device_add_disk") Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Dan Williams <dan.j.williams@intel.com> --- block/genhd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/block/genhd.c b/block/genhd.c index 7b6e5e1cf9564..409cf608cc5bd 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -439,7 +439,8 @@ int device_add_disk(struct device *parent, struct gendisk *disk, dev_set_uevent_suppress(ddev, 1); ddev->parent = parent; - ddev->groups = groups; + if (!WARN_ON_ONCE(ddev->groups)) + ddev->groups = groups; dev_set_name(ddev, "%s", disk->disk_name); if (!(disk->flags & GENHD_FL_HIDDEN)) ddev->devt = MKDEV(disk->major, disk->first_minor); -- 2.30.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: fix a dax/block device attribute registration regression 2021-09-22 18:33 fix a dax/block device attribute registration regression Christoph Hellwig @ 2021-09-27 18:19 ` Dan Williams 2021-09-22 18:33 ` [PATCH 2/3] nvdimm/pmem: move dax_attribute_group from dax to pmem Christoph Hellwig ` (2 subsequent siblings) 3 siblings, 0 replies; 8+ messages in thread From: Dan Williams @ 2021-09-27 18:19 UTC (permalink / raw) To: Christoph Hellwig Cc: Jens Axboe, Vishal Verma, Dave Jiang, Ira Weiny, linux-block, Linux NVDIMM On Wed, Sep 22, 2021 at 11:34 AM Christoph Hellwig <hch@lst.de> wrote: > > Hi Dan and Jens, > > this series fixed a regression in how the dax/write_cache attribute of the > pmem devices was registere. It does so by both fixing the API abuse in the > driver and (temporarily) the behavior change in the block layer that made > this API abuse not work anymore. I took patch1 into for-5.15/libnvdimm, patch2 into for-5.16/libnvdimm, and I'll leave patch3 for Jens. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: fix a dax/block device attribute registration regression @ 2021-09-27 18:19 ` Dan Williams 0 siblings, 0 replies; 8+ messages in thread From: Dan Williams @ 2021-09-27 18:19 UTC (permalink / raw) To: Christoph Hellwig Cc: Jens Axboe, Vishal Verma, Dave Jiang, Ira Weiny, linux-block, Linux NVDIMM On Wed, Sep 22, 2021 at 11:34 AM Christoph Hellwig <hch@lst.de> wrote: > > Hi Dan and Jens, > > this series fixed a regression in how the dax/write_cache attribute of the > pmem devices was registere. It does so by both fixing the API abuse in the > driver and (temporarily) the behavior change in the block layer that made > this API abuse not work anymore. I took patch1 into for-5.15/libnvdimm, patch2 into for-5.16/libnvdimm, and I'll leave patch3 for Jens. ^ permalink raw reply [flat|nested] 8+ messages in thread
* fix a dax/block device attribute registration regression @ 2021-09-20 7:27 Christoph Hellwig 0 siblings, 0 replies; 8+ messages in thread From: Christoph Hellwig @ 2021-09-20 7:27 UTC (permalink / raw) To: Dan Williams, Jens Axboe Cc: Vishal Verma, Dave Jiang, Ira Weiny, linux-block, nvdimm Hi Dan and Jens, this series fixed a regression in how the dax/write_cache attribute of the pmem devices was registere. It does so by both fixing the API abuse in the driver and (temporarily) the behavior change in the block layer that made this API abuse not work anymore. Diffstat: block/genhd.c | 3 +- drivers/dax/super.c | 64 -------------------------------------------------- drivers/nvdimm/pmem.c | 48 ++++++++++++++++++++++++++++++++++--- include/linux/dax.h | 2 - 4 files changed, 46 insertions(+), 71 deletions(-) ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-09-27 18:19 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-09-22 18:33 fix a dax/block device attribute registration regression Christoph Hellwig 2021-09-22 18:33 ` [PATCH 1/3] nvdimm/pmem: fix creating the dax group Christoph Hellwig 2021-09-22 18:33 ` [PATCH 2/3] nvdimm/pmem: move dax_attribute_group from dax to pmem Christoph Hellwig 2021-09-22 21:40 ` Ira Weiny 2021-09-22 18:33 ` [PATCH 3/3] block: warn if ->groups is set when calling add_disk Christoph Hellwig 2021-09-27 18:19 ` fix a dax/block device attribute registration regression Dan Williams 2021-09-27 18:19 ` Dan Williams -- strict thread matches above, loose matches on Subject: below -- 2021-09-20 7:27 Christoph Hellwig
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.