On Tue, Jun 19, 2018 at 6:26 PM Chengguang Xu <cgxu519@xxxxxxx> wrote: > > When the size of acl extended attribution is larger than pre-allocated > value buffer size, we will hit error '-ERANGE' and it's probabaly caused > by concurrent get/set acl from different clients. In this case, current > logic just sets acl to NULL so that we cannot get proper information but > the operation looks successful. > > This patch adds retry logic for error -ERANGE and return -EIO if fail > from retry. > > Signed-off-by: Chengguang Xu <cgxu519@xxxxxxx> > --- > fs/ceph/acl.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c > index 59cb307b15fb..f8750c09cec3 100644 > --- a/fs/ceph/acl.c > +++ b/fs/ceph/acl.c > @@ -48,6 +48,7 @@ struct posix_acl *ceph_get_acl(struct inode *inode, int type) > const char *name; > char *value = NULL; > struct posix_acl *acl; > + bool retried = false; > > switch (type) { > case ACL_TYPE_ACCESS: > @@ -60,6 +61,7 @@ struct posix_acl *ceph_get_acl(struct inode *inode, int type) > BUG(); > } > > +retry: > size = __ceph_getxattr(inode, name, "", 0); > if (size > 0) { > value = kzalloc(size, GFP_NOFS); > @@ -68,9 +70,16 @@ struct posix_acl *ceph_get_acl(struct inode *inode, int type) > size = __ceph_getxattr(inode, name, value, size); > } > > + if (size == -ERANGE && !retried) { > + retried = true; > + kfree(value); > + value = NULL; > + goto retry; > + } I think we should retry more times (maybe 10 times) for -ERANGE > + > if (size > 0) > acl = posix_acl_from_xattr(&init_user_ns, value, size); > - else if (size == -ERANGE || size == -ENODATA || size == 0) > + else if (size == -ENODATA || size == 0) > acl = NULL; > else > acl = ERR_PTR(-EIO); > -- > 2.17.1 > > -- > To unsubscribe from this list: send the line "unsubscribe ceph-devel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html