Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fccca7fc authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Fix a sillyrename race...



Ensure that readdir revalidates its data cache after blocking on
sillyrename.

Also fix a typo in nfs_do_call_unlink(): swap the ^= for an |=. The result
is the same, since we've already checked that the flag is unset, but it
makes the code more readable.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 5b10ca19
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -537,12 +537,6 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)

	lock_kernel();

	res = nfs_revalidate_mapping_nolock(inode, filp->f_mapping);
	if (res < 0) {
		unlock_kernel();
		return res;
	}

	/*
	 * filp->f_pos points to the dirent entry number.
	 * *desc->dir_cookie has the cookie for the next entry. We have
@@ -564,6 +558,10 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
	desc->entry = &my_entry;

	nfs_block_sillyrename(dentry);
	res = nfs_revalidate_mapping_nolock(inode, filp->f_mapping);
	if (res < 0)
		goto out;

	while(!desc->entry->eof) {
		res = readdir_search_pagecache(desc);

@@ -594,6 +592,7 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
			break;
		}
	}
out:
	nfs_unblock_sillyrename(dentry);
	unlock_kernel();
	if (res > 0)
+1 −1
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ static int nfs_do_call_unlink(struct dentry *parent, struct inode *dir, struct n
		spin_lock(&alias->d_lock);
		if (!(alias->d_flags & DCACHE_NFSFS_RENAMED)) {
			alias->d_fsdata = data;
			alias->d_flags ^= DCACHE_NFSFS_RENAMED;
			alias->d_flags |= DCACHE_NFSFS_RENAMED;
			ret = 1;
		}
		spin_unlock(&alias->d_lock);