@@ -279,8 +279,8 @@ int fuse_ctl_add_conn(struct fuse_conn *fc)
if (!fuse_ctl_add_dentry(parent, fc, "waiting", S_IFREG | 0400, 1,
NULL, &fuse_ctl_waiting_ops) ||
- !fuse_ctl_add_dentry(parent, fc, "abort", S_IFREG | 0200, 1,
- NULL, &fuse_ctl_abort_ops) ||
+ (!fc->no_abort && !fuse_ctl_add_dentry(parent, fc, "abort",
+ S_IFREG | 0200, 1, NULL, &fuse_ctl_abort_ops)) ||
!fuse_ctl_add_dentry(parent, fc, "max_background", S_IFREG | 0600,
1, NULL, &fuse_conn_max_background_ops) ||
!fuse_ctl_add_dentry(parent, fc, "congestion_threshold",
@@ -73,6 +73,7 @@ struct fuse_mount_data {
unsigned default_permissions:1;
unsigned allow_other:1;
unsigned destroy:1;
+ unsigned no_abort:1;
unsigned max_read;
unsigned blksize;
@@ -789,6 +790,9 @@ struct fuse_conn {
/** Does the filesystem support copy_file_range? */
unsigned no_copy_file_range:1;
+ /** Do not create abort file in fuse control fs */
+ unsigned no_abort:1;
+
/** The number of requests waiting for completion */
atomic_t num_waiting;
@@ -1157,6 +1157,7 @@ int fuse_fill_super_common(struct super_block *sb,
fc->user_id = mount_data->user_id;
fc->group_id = mount_data->group_id;
fc->max_read = max_t(unsigned, 4096, mount_data->max_read);
+ fc->no_abort = mount_data->no_abort;
/* Used by get_root_inode() */
sb->s_fs_info = fc;
@@ -886,6 +886,7 @@ static int virtio_fs_fill_super(struct super_block *sb, char *opts,
d->fudptr = (void **)&fs->vqs[VQ_REQUEST].fud;
d->destroy = true; /* Send destroy request on unmount */
+ d->no_abort = 1;
err = fuse_fill_super_common(sb, d);
if (err < 0)
goto err_free_init_req;
virtio-fs does not support aborting requests which are being processed. That is requests which have been sent to fuse daemon on host. So do not provide "abort" interface for virtio-fs in fusectl. Signed-off-by: Vivek Goyal <vgoyal@redhat.com> --- fs/fuse/control.c | 4 ++-- fs/fuse/fuse_i.h | 4 ++++ fs/fuse/inode.c | 1 + fs/fuse/virtio_fs.c | 1 + 4 files changed, 8 insertions(+), 2 deletions(-)