Commit 13fcc635 authored by David Howells's avatar David Howells

afs: Always include dir in bulk status fetch from afs_do_lookup()

When a lookup is done in an AFS directory, the filesystem will speculate
and fetch up to 49 other statuses for files in the same directory and fetch
those as well, turning them into inodes or updating inodes that already
exist.

However, occasionally, a callback break might go missing due to NAT timing
out, but the afs filesystem doesn't then realise that the directory is not
up to date.

Alleviate this by using one of the status slots to check the directory in
which the lookup is being done.
Reported-by: default avatarDave Botsch <botsch@cnf.cornell.edu>
Suggested-by: default avatarJeffrey Altman <jaltman@auristor.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 32f71aa4
...@@ -658,7 +658,8 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry, ...@@ -658,7 +658,8 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
cookie->ctx.actor = afs_lookup_filldir; cookie->ctx.actor = afs_lookup_filldir;
cookie->name = dentry->d_name; cookie->name = dentry->d_name;
cookie->nr_fids = 1; /* slot 0 is saved for the fid we actually want */ cookie->nr_fids = 2; /* slot 0 is saved for the fid we actually want
* and slot 1 for the directory */
read_seqlock_excl(&dvnode->cb_lock); read_seqlock_excl(&dvnode->cb_lock);
dcbi = rcu_dereference_protected(dvnode->cb_interest, dcbi = rcu_dereference_protected(dvnode->cb_interest,
...@@ -709,7 +710,11 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry, ...@@ -709,7 +710,11 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
if (!cookie->inodes) if (!cookie->inodes)
goto out_s; goto out_s;
for (i = 1; i < cookie->nr_fids; i++) { cookie->fids[1] = dvnode->fid;
cookie->statuses[1].cb_break = afs_calc_vnode_cb_break(dvnode);
cookie->inodes[1] = igrab(&dvnode->vfs_inode);
for (i = 2; i < cookie->nr_fids; i++) {
scb = &cookie->statuses[i]; scb = &cookie->statuses[i];
/* Find any inodes that already exist and get their /* Find any inodes that already exist and get their
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment