vfs: support STATX_DIOALIGN on block devices
[linux-block.git] / block / bdev.c
index ce05175e71cea49ef0a9133c99395026f1426c8c..d699ecdb32604e7cb3f3ddcb9b71fa9762a3ba03 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/namei.h>
 #include <linux/part_stat.h>
 #include <linux/uaccess.h>
+#include <linux/stat.h>
 #include "../fs/internal.h"
 #include "blk.h"
 
@@ -1069,3 +1070,25 @@ void sync_bdevs(bool wait)
        spin_unlock(&blockdev_superblock->s_inode_list_lock);
        iput(old_inode);
 }
+
+/*
+ * Handle STATX_DIOALIGN for block devices.
+ *
+ * Note that the inode passed to this is the inode of a block device node file,
+ * not the block device's internal inode.  Therefore it is *not* valid to use
+ * I_BDEV() here; the block device has to be looked up by i_rdev instead.
+ */
+void bdev_statx_dioalign(struct inode *inode, struct kstat *stat)
+{
+       struct block_device *bdev;
+
+       bdev = blkdev_get_no_open(inode->i_rdev);
+       if (!bdev)
+               return;
+
+       stat->dio_mem_align = bdev_dma_alignment(bdev) + 1;
+       stat->dio_offset_align = bdev_logical_block_size(bdev);
+       stat->result_mask |= STATX_DIOALIGN;
+
+       blkdev_put_no_open(bdev);
+}