mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
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: Dave Botsch <botsch@cnf.cornell.edu> Suggested-by: Jeffrey Altman <jaltman@auristor.com> Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
parent
32f71aa497
commit
13fcc6356a
@ -658,7 +658,8 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
|
||||
|
||||
cookie->ctx.actor = afs_lookup_filldir;
|
||||
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);
|
||||
dcbi = rcu_dereference_protected(dvnode->cb_interest,
|
||||
@ -709,7 +710,11 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
|
||||
if (!cookie->inodes)
|
||||
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];
|
||||
|
||||
/* Find any inodes that already exist and get their
|
||||
|
Loading…
Reference in New Issue
Block a user