fuse: make DAX mount option a tri-state
[linux-2.6-microblaze.git] / fs / fuse / virtio_fs.c
index 4cfa4bc..e54dc06 100644 (file)
@@ -88,12 +88,21 @@ struct virtio_fs_req_work {
 static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq,
                                 struct fuse_req *req, bool in_flight);
 
+static const struct constant_table dax_param_enums[] = {
+       {"always",      FUSE_DAX_ALWAYS },
+       {"never",       FUSE_DAX_NEVER },
+       {"inode",       FUSE_DAX_INODE_USER },
+       {}
+};
+
 enum {
        OPT_DAX,
+       OPT_DAX_ENUM,
 };
 
 static const struct fs_parameter_spec virtio_fs_parameters[] = {
        fsparam_flag("dax", OPT_DAX),
+       fsparam_enum("dax", OPT_DAX_ENUM, dax_param_enums),
        {}
 };
 
@@ -110,7 +119,10 @@ static int virtio_fs_parse_param(struct fs_context *fsc,
 
        switch (opt) {
        case OPT_DAX:
-               ctx->dax = 1;
+               ctx->dax_mode = FUSE_DAX_ALWAYS;
+               break;
+       case OPT_DAX_ENUM:
+               ctx->dax_mode = result.uint_32;
                break;
        default:
                return -EINVAL;
@@ -1326,8 +1338,8 @@ static int virtio_fs_fill_super(struct super_block *sb, struct fs_context *fsc)
 
        /* virtiofs allocates and installs its own fuse devices */
        ctx->fudptr = NULL;
-       if (ctx->dax) {
-               if (!fs->dax_dev) {
+       if (ctx->dax_mode != FUSE_DAX_NEVER) {
+               if (ctx->dax_mode == FUSE_DAX_ALWAYS && !fs->dax_dev) {
                        err = -EINVAL;
                        pr_err("virtio-fs: dax can't be enabled as filesystem"
                               " device does not support it.\n");