aboutsummaryrefslogtreecommitdiffstats
path: root/fs/afs
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2019-05-14 06:52:03 -0400
committerDavid Howells <dhowells@redhat.com>2019-05-16 11:25:21 -0400
commitd9052dda8a39069312218f913d22d99c48d90004 (patch)
tree177e0597fd7ec898cf1ca8d87a0bb8f0b48ffbb2 /fs/afs
parent781070551c26def14784ce5ca14194d7ca234b04 (diff)
afs: Don't invalidate callback if AFS_VNODE_DIR_VALID not set
Don't invalidate the callback promise on a directory if the AFS_VNODE_DIR_VALID flag is not set (which indicates that the directory contents are invalid, due to edit failure, callback break, page reclaim). The directory will be reloaded next time the directory is accessed, so clearing the callback flag at this point may race with a reload of the directory and cancel it's recorded callback promise. Fixes: f3ddee8dc4e2 ("afs: Fix directory handling") Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs')
-rw-r--r--fs/afs/inode.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index 1e630f016dc5..bf8f56e851df 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -430,12 +430,9 @@ int afs_validate(struct afs_vnode *vnode, struct key *key)
430 vnode->cb_s_break = vnode->cb_interest->server->cb_s_break; 430 vnode->cb_s_break = vnode->cb_interest->server->cb_s_break;
431 vnode->cb_v_break = vnode->volume->cb_v_break; 431 vnode->cb_v_break = vnode->volume->cb_v_break;
432 valid = false; 432 valid = false;
433 } else if (vnode->status.type == AFS_FTYPE_DIR && 433 } else if (test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags)) {
434 (!test_bit(AFS_VNODE_DIR_VALID, &vnode->flags) ||
435 vnode->cb_expires_at - 10 <= now)) {
436 valid = false; 434 valid = false;
437 } else if (test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags) || 435 } else if (vnode->cb_expires_at - 10 <= now) {
438 vnode->cb_expires_at - 10 <= now) {
439 valid = false; 436 valid = false;
440 } else { 437 } else {
441 valid = true; 438 valid = true;