From: Sasha Levin Date: Mon, 23 May 2022 13:29:45 +0000 (-0400) Subject: Fixes for 4.19 X-Git-Tag: v4.9.316~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7a53ef4f05b21d6ab05a9e179e968bac7b6f1572;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/afs-fix-afs_getattr-to-refetch-file-status-if-callba.patch b/queue-4.19/afs-fix-afs_getattr-to-refetch-file-status-if-callba.patch new file mode 100644 index 00000000000..e89083c8e40 --- /dev/null +++ b/queue-4.19/afs-fix-afs_getattr-to-refetch-file-status-if-callba.patch @@ -0,0 +1,78 @@ +From 39fbe3614bc713a5479e2d8246a41f06787bd0ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 21 May 2022 08:18:28 +0100 +Subject: afs: Fix afs_getattr() to refetch file status if callback break + occurred + +From: David Howells + +[ 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 +Signed-off-by: David Howells +cc: Marc Dionne +cc: linux-afs@lists.infradead.org +Tested-by: Markus Suvanto +Tested-by: kafs-testing+fedora34_64checkkafs-build-496@auristor.com +Link: https://bugzilla.kernel.org/show_bug.cgi?id=216010 +Link: https://lore.kernel.org/r/165308359800.162686.14122417881564420962.stgit@warthog.procyon.org.uk/ # v1 +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + fs/afs/inode.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +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); +-- +2.35.1 + diff --git a/queue-4.19/series b/queue-4.19/series index b45f6267c39..3c8cddebc05 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -39,3 +39,4 @@ mac80211-fix-rx-reordering-with-non-explicit-psmp-ac.patch ethernet-tulip-fix-missing-pci_disable_device-on-err.patch net-stmmac-fix-missing-pci_disable_device-on-error-i.patch net-atlantic-verify-hw_head_-lies-within-tx-buffer-r.patch +afs-fix-afs_getattr-to-refetch-file-status-if-callba.patch