afs: use read_seqbegin() in afs_check_validity() and afs_getattr()
authorOleg Nesterov <oleg@redhat.com>
Thu, 30 Nov 2023 11:56:17 +0000 (12:56 +0100)
committerDavid Howells <dhowells@redhat.com>
Sun, 24 Dec 2023 15:22:48 +0000 (15:22 +0000)
David Howells says:

 (3) afs_check_validity().
 (4) afs_getattr().

     These are both pretty short, so your solution is probably good for them.
     That said, afs_vnode_commit_status() can spend a long time under the
     write lock - and pretty much every file RPC op returns a status update.

Change these functions to use read_seqbegin(). This simplifies the code
and doesn't change the current behaviour, the "seq" counter is always even
so read_seqbegin_or_lock() can never take the lock.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
Link: https://lore.kernel.org/r/20231130115617.GA21584@redhat.com/
fs/afs/inode.c

index 78efc971934932f7caacd9073aa85b38cf3dc3fd..a6ae74d5b698a1aa20319174eb7d7341e197cb79 100644 (file)
@@ -629,10 +629,10 @@ bool afs_check_validity(struct afs_vnode *vnode)
        enum afs_cb_break_reason need_clear = afs_cb_break_no_break;
        time64_t now = ktime_get_real_seconds();
        unsigned int cb_break;
-       int seq = 0;
+       int seq;
 
        do {
-               read_seqbegin_or_lock(&vnode->cb_lock, &seq);
+               seq = read_seqbegin(&vnode->cb_lock);
                cb_break = vnode->cb_break;
 
                if (test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags)) {
@@ -650,9 +650,7 @@ bool afs_check_validity(struct afs_vnode *vnode)
                        need_clear = afs_cb_break_no_promise;
                }
 
-       } while (need_seqretry(&vnode->cb_lock, seq));
-
-       done_seqretry(&vnode->cb_lock, seq);
+       } while (read_seqretry(&vnode->cb_lock, seq));
 
        if (need_clear == afs_cb_break_no_break)
                return true;
@@ -755,7 +753,7 @@ int afs_getattr(struct mnt_idmap *idmap, const struct path *path,
        struct inode *inode = d_inode(path->dentry);
        struct afs_vnode *vnode = AFS_FS_I(inode);
        struct key *key;
-       int ret, seq = 0;
+       int ret, seq;
 
        _enter("{ ino=%lu v=%u }", inode->i_ino, inode->i_generation);
 
@@ -772,7 +770,7 @@ int afs_getattr(struct mnt_idmap *idmap, const struct path *path,
        }
 
        do {
-               read_seqbegin_or_lock(&vnode->cb_lock, &seq);
+               seq = read_seqbegin(&vnode->cb_lock);
                generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
                if (test_bit(AFS_VNODE_SILLY_DELETED, &vnode->flags) &&
                    stat->nlink > 0)
@@ -784,9 +782,8 @@ int afs_getattr(struct mnt_idmap *idmap, const struct path *path,
                 */
                if (S_ISDIR(inode->i_mode))
                        stat->size = vnode->netfs.remote_i_size;
-       } while (need_seqretry(&vnode->cb_lock, seq));
+       } while (read_seqretry(&vnode->cb_lock, seq));
 
-       done_seqretry(&vnode->cb_lock, seq);
        return 0;
 }