NFS: Sillyrename: in the case of a race, check aliases are really positive
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 29 Jan 2008 00:42:59 +0000 (19:42 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 30 Jan 2008 07:05:22 +0000 (02:05 -0500)
In nfs_do_call_unlink() we check that we haven't raced, and that lookup()
hasn't created an aliased dentry to our sillydeleted dentry. If somebody
has deleted the file on the server and the lookup() resulted in a negative
dentry, then ignore...

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/unlink.c

index c5fa6d8001f18be48f2cc31bce29781151208df7..431981d0265f917965abe2e1e589512accdff31a 100644 (file)
@@ -130,13 +130,15 @@ static int nfs_do_call_unlink(struct dentry *parent, struct inode *dir, struct n
        alias = d_lookup(parent, &data->args.name);
        if (alias != NULL) {
                int ret = 0;
+
                /*
                 * Hey, we raced with lookup... See if we need to transfer
                 * the sillyrename information to the aliased dentry.
                 */
                nfs_free_dname(data);
                spin_lock(&alias->d_lock);
-               if (!(alias->d_flags & DCACHE_NFSFS_RENAMED)) {
+               if (alias->d_inode != NULL &&
+                   !(alias->d_flags & DCACHE_NFSFS_RENAMED)) {
                        alias->d_fsdata = data;
                        alias->d_flags |= DCACHE_NFSFS_RENAMED;
                        ret = 1;