diff --git a/fs/fuse/backing.c b/fs/fuse/backing.c index 63bfd60897b1..c351d04ccd9a 100644 --- a/fs/fuse/backing.c +++ b/fs/fuse/backing.c @@ -557,12 +557,15 @@ int fuse_listxattr_backing(struct fuse_args *fa, struct dentry *dentry, vfs_listxattr(get_fuse_dentry(dentry)->backing_path.dentry, list, size); + if (ret < 0) + return ret; + if (fa->out_argvar) fa->out_args[0].size = ret; else ((struct fuse_getxattr_out *)fa->out_args[0].value)->size = ret; - return 0; + return ret; } void *fuse_listxattr_finalize(struct fuse_args *fa, struct dentry *dentry, @@ -570,11 +573,13 @@ void *fuse_listxattr_finalize(struct fuse_args *fa, struct dentry *dentry, { struct fuse_getxattr_out *fgo; + if (fa->error_in) + return NULL; + if (fa->out_argvar) return ERR_PTR(fa->out_args[0].size); fgo = fa->out_args[0].value; - return ERR_PTR(fgo->size); } diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index a5a070461524..d15d0b896e85 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -1843,12 +1843,12 @@ struct fuse_err_ret { ERR_PTR(backing(&fa, args)), \ true, \ }; \ + if (IS_ERR(fer.result)) \ + fa.error_in = PTR_ERR(fer.result); \ if (!(ext_flags & FUSE_BPF_POST_FILTER)) \ break; \ \ fa.opcode |= FUSE_POSTFILTER; \ - if (IS_ERR(fer.result)) \ - fa.error_in = PTR_ERR(fer.result); \ for (i = 0; i < fa.out_numargs; ++i) \ fa.in_args[fa.in_numargs++] = \ (struct fuse_in_arg) { \