Thread (100 messages) 100 messages, 4 authors, 2021-11-24

Re: [PATCH 25/29] dax: return the partition offset from fs_dax_get_by_bdev

From: Dan Williams <hidden>
Date: 2021-11-24 02:56:42
Also in: dm-devel, linux-ext4, linux-fsdevel, linux-s390, linux-xfs, virtualization

On Tue, Nov 9, 2021 at 12:34 AM Christoph Hellwig [off-list ref] wrote:
Prepare from removing the block_device from the DAX I/O path by returning
s/from removing/for the removal of/
quoted hunk ↗ jump to hunk
the partition offset from fs_dax_get_by_bdev so that the file systems
have it at hand for use during I/O.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/dax/super.c | 9 ++++++---
 drivers/md/dm.c     | 4 ++--
 fs/erofs/internal.h | 2 ++
 fs/erofs/super.c    | 4 ++--
 fs/ext2/ext2.h      | 1 +
 fs/ext2/super.c     | 2 +-
 fs/ext4/ext4.h      | 1 +
 fs/ext4/super.c     | 2 +-
 fs/xfs/xfs_buf.c    | 2 +-
 fs/xfs/xfs_buf.h    | 1 +
 include/linux/dax.h | 6 ++++--
 11 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/drivers/dax/super.c b/drivers/dax/super.c
index c0910687fbcb2..cc32dcf71c116 100644
--- a/drivers/dax/super.c
+++ b/drivers/dax/super.c
@@ -70,17 +70,20 @@ EXPORT_SYMBOL_GPL(dax_remove_host);
 /**
  * dax_get_by_host() - temporary lookup mechanism for filesystem-dax
  * @bdev: block device to find a dax_device for
+ * @start_off: returns the byte offset into the dax_device that @bdev starts
  */
-struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev)
+struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev, u64 *start_off)
 {
        struct dax_device *dax_dev;
+       u64 part_size;
        int id;

        if (!blk_queue_dax(bdev->bd_disk->queue))
                return NULL;

-       if ((get_start_sect(bdev) * SECTOR_SIZE) % PAGE_SIZE ||
-           (bdev_nr_sectors(bdev) * SECTOR_SIZE) % PAGE_SIZE) {
+       *start_off = get_start_sect(bdev) * SECTOR_SIZE;
+       part_size = bdev_nr_sectors(bdev) * SECTOR_SIZE;
+       if (*start_off % PAGE_SIZE || part_size % PAGE_SIZE) {
                pr_info("%pg: error: unaligned partition for dax\n", bdev);
                return NULL;
        }
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 282008afc465f..5ea6115d19bdc 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -637,7 +637,7 @@ static int open_table_device(struct table_device *td, dev_t dev,
                             struct mapped_device *md)
 {
        struct block_device *bdev;
-
+       u64 part_off;
        int r;

        BUG_ON(td->dm_dev.bdev);
@@ -653,7 +653,7 @@ static int open_table_device(struct table_device *td, dev_t dev,
        }

        td->dm_dev.bdev = bdev;
-       td->dm_dev.dax_dev = fs_dax_get_by_bdev(bdev);
+       td->dm_dev.dax_dev = fs_dax_get_by_bdev(bdev, &part_off);
Perhaps allow NULL as an argument for callers that do not care about
the start offset?


Otherwise, looks good / clever.

Reviewed-by: Dan Williams <redacted>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help