On 13.12.2019 14:23, Konstantin Khorenko wrote: > Stock kernels don't have FIEMAP support in fuse filesystems, > we've added the support for FIEMAP for pStorage performance. > > Now if you call FIEMAP ioctl on a FUSE fs (for example mergerfs, sshfs, > mhddfs), libfuse crashes (the function fuse_lib_ioctl aborts due to > inbufsz > != outbufsz), so FIEMAP support autodetection does not work. > > Let's pretend we don't provide FIEMAP for any FUSE fs except for pStorage. > > https://bugs.openvz.org/browse/OVZ-7145 > > Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com>
Acked-by: Kirill Tkhai <ktk...@virtuozzo.com> > > v2: don't perform the check for FUSE fs every fiemap call, > do it only once on fuse mount. > > --- > fs/fuse/inode.c | 26 ++++++++++++++++++-------- > 1 file changed, 18 insertions(+), 8 deletions(-) > > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c > index fc5f066d3e4d9..7c8d9350d34d6 100644 > --- a/fs/fuse/inode.c > +++ b/fs/fuse/inode.c > @@ -1439,23 +1439,33 @@ static struct dentry *fuse_mount(struct > file_system_type *fs_type, > void *raw_data) > { > struct dentry *dentry; > + struct fuse_conn *fc; > > dentry = mount_nodev(fs_type, flags, raw_data, fuse_fill_super); > + if (IS_ERR(dentry)) > + return dentry; > + > + fc = dentry->d_sb->s_fs_info; > > - /* Hack to distinguish pcs fuse service and to force synchronous close > for it. > - * Seems, this is the only place where we have some variable > (dev_name), which > - * is not confined by fuse API and already defined. > + /* Hack to distinguish pcs fuse service and to force synchronous > + * close for it. Seems, this is the only place where we have some > + * variable (dev_name), which is not confined by fuse API and > + * already defined. > + * > + * libfuse is not ready for fiemap autodetection, so disable fiemap > + * support check in advance for all FUSE fs except for pStorage. > */ > - if (!IS_ERR(dentry) && dev_name && > - (strncmp(dev_name, "pstorage://", 11) == 0 || > - strncmp(dev_name, "vstorage://", 11) == 0) ) { > - struct fuse_conn *fc = dentry->d_sb->s_fs_info; > + if (dev_name && > + (strncmp(dev_name, "pstorage://", 11) == 0 || > + strncmp(dev_name, "vstorage://", 11) == 0)) { > > if (!(fc->flags & FUSE_DISABLE_CLOSE_WAIT)) > fc->close_wait = 1; > > fc->compat_inval_files = 1; > - } > + } else > + fc->no_fiemap = 1; > + > return dentry; > } _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel