Message ID | 20240628062930.2467993-5-libaokun@huaweicloud.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | cachefiles: random bugfixes | expand |
On 2024/6/28 14:29, libaokun@huaweicloud.com wrote: > From: Baokun Li <libaokun1@huawei.com> > > In cachefiles_check_volume_xattr(), the error returned by vfs_getxattr() > is not passed to ret, so it ends up returning -ESTALE, which leads to an > endless loop as follows: > > cachefiles_acquire_volume > retry: > ret = cachefiles_check_volume_xattr > ret = -ESTALE > xlen = vfs_getxattr // return -EIO > // The ret is not updated when xlen < 0, so -ESTALE is returned. > return ret > // Supposed to jump out of the loop at this judgement. > if (ret != -ESTALE) > goto error_dir; > cachefiles_bury_object > // EIO causes rename failure > goto retry; > > Hence propagate the error returned by vfs_getxattr() to avoid the above > issue. Do the same in cachefiles_check_auxdata(). > > Fixes: 32e150037dce ("fscache, cachefiles: Store the volume coherency data") > Fixes: 72b957856b0c ("cachefiles: Implement metadata/coherency data storage in xattrs") > Signed-off-by: Baokun Li <libaokun1@huawei.com> It looks good to me, Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com> Thanks, Gao Xiang
diff --git a/fs/cachefiles/xattr.c b/fs/cachefiles/xattr.c index bcb6173943ee..4dd8a993c60a 100644 --- a/fs/cachefiles/xattr.c +++ b/fs/cachefiles/xattr.c @@ -110,9 +110,11 @@ int cachefiles_check_auxdata(struct cachefiles_object *object, struct file *file if (xlen == 0) xlen = vfs_getxattr(&nop_mnt_idmap, dentry, cachefiles_xattr_cache, buf, tlen); if (xlen != tlen) { - if (xlen < 0) + if (xlen < 0) { + ret = xlen; trace_cachefiles_vfs_error(object, file_inode(file), xlen, cachefiles_trace_getxattr_error); + } if (xlen == -EIO) cachefiles_io_error_obj( object, @@ -252,6 +254,7 @@ int cachefiles_check_volume_xattr(struct cachefiles_volume *volume) xlen = vfs_getxattr(&nop_mnt_idmap, dentry, cachefiles_xattr_cache, buf, len); if (xlen != len) { if (xlen < 0) { + ret = xlen; trace_cachefiles_vfs_error(NULL, d_inode(dentry), xlen, cachefiles_trace_getxattr_error); if (xlen == -EIO)