Patch "afs: Fix afs_getattr() to refetch file status if callback break occurred" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    afs: Fix afs_getattr() to refetch file status if callback break occurred

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     afs-fix-afs_getattr-to-refetch-file-status-if-callba.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 39fbe3614bc713a5479e2d8246a41f06787bd0ff
Author: David Howells <dhowells@xxxxxxxxxx>
Date:   Sat May 21 08:18:28 2022 +0100

    afs: Fix afs_getattr() to refetch file status if callback break occurred
    
    [ Upstream commit 2aeb8c86d49967552394d5e723f87454cb53f501 ]
    
    If a callback break occurs (change notification), afs_getattr() needs to
    issue an FS.FetchStatus RPC operation to update the status of the file
    being examined by the stat-family of system calls.
    
    Fix afs_getattr() to do this if AFS_VNODE_CB_PROMISED has been cleared
    on a vnode by a callback break.  Skip this if AT_STATX_DONT_SYNC is set.
    
    This can be tested by appending to a file on one AFS client and then
    using "stat -L" to examine its length on a machine running kafs.  This
    can also be watched through tracing on the kafs machine.  The callback
    break is seen:
    
         kworker/1:1-46      [001] .....   978.910812: afs_cb_call: c=0000005f YFSCB.CallBack
         kworker/1:1-46      [001] ...1.   978.910829: afs_cb_break: 100058:23b4c:242d2c2 b=2 s=1 break-cb
         kworker/1:1-46      [001] .....   978.911062: afs_call_done:    c=0000005f ret=0 ab=0 [0000000082994ead]
    
    And then the stat command generated no traffic if unpatched, but with
    this change a call to fetch the status can be observed:
    
                stat-4471    [000] .....   986.744122: afs_make_fs_call: c=000000ab 100058:023b4c:242d2c2 YFS.FetchStatus
                stat-4471    [000] .....   986.745578: afs_call_done:    c=000000ab ret=0 ab=0 [0000000087fc8c84]
    
    Fixes: 08e0e7c82eea ("[AF_RXRPC]: Make the in-kernel AFS filesystem use AF_RXRPC.")
    Reported-by: Markus Suvanto <markus.suvanto@xxxxxxxxx>
    Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
    cc: Marc Dionne <marc.dionne@xxxxxxxxxxxx>
    cc: linux-afs@xxxxxxxxxxxxxxxxxxx
    Tested-by: Markus Suvanto <markus.suvanto@xxxxxxxxx>
    Tested-by: kafs-testing+fedora34_64checkkafs-build-496@xxxxxxxxxxxx
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=216010
    Link: https://lore.kernel.org/r/165308359800.162686.14122417881564420962.stgit@xxxxxxxxxxxxxxxxxxxxxx/ # v1
    Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index e6f11da5461b..a12ae3ef8fb4 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -468,10 +468,22 @@ int afs_getattr(const struct path *path, struct kstat *stat,
 {
 	struct inode *inode = d_inode(path->dentry);
 	struct afs_vnode *vnode = AFS_FS_I(inode);
-	int seq = 0;
+	struct key *key;
+	int ret, seq = 0;
 
 	_enter("{ ino=%lu v=%u }", inode->i_ino, inode->i_generation);
 
+	if (!(query_flags & AT_STATX_DONT_SYNC) &&
+	    !test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags)) {
+		key = afs_request_key(vnode->volume->cell);
+		if (IS_ERR(key))
+			return PTR_ERR(key);
+		ret = afs_validate(vnode, key);
+		key_put(key);
+		if (ret < 0)
+			return ret;
+	}
+
 	do {
 		read_seqbegin_or_lock(&vnode->cb_lock, &seq);
 		generic_fillattr(inode, stat);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux