Re: [PATCH] ceph: check set quota operation support before syncing setxattr.

From: Yanhu Cao
Date: Wed Dec 04 2019 - 21:43:01 EST


On Wed, Dec 4, 2019 at 6:36 PM Luis Henriques <lhenriques@xxxxxxxx> wrote:
>
> On Wed, Dec 04, 2019 at 11:10:05AM +0800, Yanhu Cao wrote:
> > Environment
> > -----------
> > ceph version: 12.2.*
> > kernel version: 4.19+
> >
> > setfattr quota operation actually sends op to MDS, and settings
> > effective. but kclient outputs 'Operation not supported'. This may confuse
> > users' understandings.
>
> What exactly do you mean by "settings effective"? There have been
> changes in the way CephFS quotas work in mimic and, if you're using a
> Luminous cluster (12.2.*) the kernel client effectively does *not*
> support quotas -- you'll be able to exceed the quotas you've tried to
> set because the client won't be checking the limits. Thus, -EOPNOTSUPP
> seems appropriate for this scenario.
>
> I guess that the confusing part is that the xattr is actually set in
> that case, but the kernel client won't be able to use it to validate
> quotas in the filesystem tree because realms won't be created.
>
Yes. we use kcephfs+nfs for CentOS6.*, it does not support ceph-fuse(12.2.*).
The operating system of other applications is CentOS7.*, which uses
ceph-fuse and can get quota settings set by kclient.

Thanks.
BRs

> Cheers,
> --
> LuÃs
> >
> > If the kernel version and ceph version are not compatible, should check
> > quota operations are supported first, then do sync_setxattr.
> >
> > reference: https://docs.ceph.com/docs/master/cephfs/quota/
> >
> > Signed-off-by: Yanhu Cao <gmayyyha@xxxxxxxxx>
> > ---
> > fs/ceph/xattr.c | 6 ++++--
> > 1 file changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
> > index cb18ee637cb7..189aace75186 100644
> > --- a/fs/ceph/xattr.c
> > +++ b/fs/ceph/xattr.c
> > @@ -1132,8 +1132,8 @@ int __ceph_setxattr(struct inode *inode, const char *name,
> > "during filling trace\n", inode);
> > err = -EBUSY;
> > } else {
> > - err = ceph_sync_setxattr(inode, name, value, size, flags);
> > - if (err >= 0 && check_realm) {
> > + err = 0;
> > + if (check_realm) {
> > /* check if snaprealm was created for quota inode */
> > spin_lock(&ci->i_ceph_lock);
> > if ((ci->i_max_files || ci->i_max_bytes) &&
> > @@ -1142,6 +1142,8 @@ int __ceph_setxattr(struct inode *inode, const char *name,
> > err = -EOPNOTSUPP;
> > spin_unlock(&ci->i_ceph_lock);
> > }
> > + if (err == 0)
> > + err = ceph_sync_setxattr(inode, name, value, size, flags);
> > }
> > out:
> > ceph_free_cap_flush(prealloc_cf);
> > --
> > 2.21.0 (Apple Git-122.2)
> >