|
@@ -509,6 +509,51 @@ long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(bdev_direct_access);
|
|
|
|
|
|
+/**
|
|
|
+ * bdev_dax_supported() - Check if the device supports dax for filesystem
|
|
|
+ * @sb: The superblock of the device
|
|
|
+ * @blocksize: The block size of the device
|
|
|
+ *
|
|
|
+ * This is a library function for filesystems to check if the block device
|
|
|
+ * can be mounted with dax option.
|
|
|
+ *
|
|
|
+ * Return: negative errno if unsupported, 0 if supported.
|
|
|
+ */
|
|
|
+int bdev_dax_supported(struct super_block *sb, int blocksize)
|
|
|
+{
|
|
|
+ struct blk_dax_ctl dax = {
|
|
|
+ .sector = 0,
|
|
|
+ .size = PAGE_SIZE,
|
|
|
+ };
|
|
|
+ int err;
|
|
|
+
|
|
|
+ if (blocksize != PAGE_SIZE) {
|
|
|
+ vfs_msg(sb, KERN_ERR, "error: unsupported blocksize for dax");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = bdev_direct_access(sb->s_bdev, &dax);
|
|
|
+ if (err < 0) {
|
|
|
+ switch (err) {
|
|
|
+ case -EOPNOTSUPP:
|
|
|
+ vfs_msg(sb, KERN_ERR,
|
|
|
+ "error: device does not support dax");
|
|
|
+ break;
|
|
|
+ case -EINVAL:
|
|
|
+ vfs_msg(sb, KERN_ERR,
|
|
|
+ "error: unaligned partition for dax");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ vfs_msg(sb, KERN_ERR,
|
|
|
+ "error: dax access failed (%d)", err);
|
|
|
+ }
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(bdev_dax_supported);
|
|
|
+
|
|
|
/*
|
|
|
* pseudo-fs
|
|
|
*/
|