ceph: choose auth MDS for getxattr with the Xs caps
authorXiubo Li <xiubli@redhat.com>
Fri, 27 May 2022 04:39:17 +0000 (12:39 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 2 Aug 2022 22:54:12 +0000 (00:54 +0200)
And for the 'Xs' caps for getxattr we will also choose the auth MDS,
because the MDS side code is buggy due to setxattr won't notify the
replica MDSes when the values changed and the replica MDS will return
the old values. Though we will fix it in MDS code, but this still
makes sense for old ceph.

Link: https://tracker.ceph.com/issues/55331
Signed-off-by: Xiubo Li <xiubli@redhat.com>
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/inode.c

index 56c53ab3618e8eb1b4aae7cf17027f9908de50d3..1834d6529f25d87dbd2c0ef4532524126157d12c 100644 (file)
@@ -2275,9 +2275,15 @@ int ceph_try_to_choose_auth_mds(struct inode *inode, int mask)
         *
         * This cost much when doing the Locker state transition and
         * usually will need to revoke caps from clients.
+        *
+        * And for the 'Xs' caps for getxattr we will also choose the
+        * auth MDS, because the MDS side code is buggy due to setxattr
+        * won't notify the replica MDSes when the values changed and
+        * the replica MDS will return the old values. Though we will
+        * fix it in MDS code, but this still makes sense for old ceph.
         */
        if (((mask & CEPH_CAP_ANY_SHARED) && (issued & CEPH_CAP_ANY_EXCL))
-           || (mask & CEPH_STAT_RSTAT))
+           || (mask & (CEPH_STAT_RSTAT | CEPH_STAT_CAP_XATTR)))
                return USE_AUTH_MDS;
        else
                return USE_ANY_MDS;