diff options
Diffstat (limited to 'fs/nfs/unlink.c')
| -rw-r--r-- | fs/nfs/unlink.c | 20 | 
1 files changed, 13 insertions, 7 deletions
diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c index d26a32f5b53..1f1f38f0c5d 100644 --- a/fs/nfs/unlink.c +++ b/fs/nfs/unlink.c @@ -335,20 +335,14 @@ static void nfs_async_rename_done(struct rpc_task *task, void *calldata)  	struct inode *old_dir = data->old_dir;  	struct inode *new_dir = data->new_dir;  	struct dentry *old_dentry = data->old_dentry; -	struct dentry *new_dentry = data->new_dentry;  	if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) {  		rpc_restart_call_prepare(task);  		return;  	} -	if (task->tk_status != 0) { +	if (task->tk_status != 0)  		nfs_cancel_async_unlink(old_dentry); -		return; -	} - -	d_drop(old_dentry); -	d_drop(new_dentry);  }  /** @@ -549,6 +543,18 @@ nfs_sillyrename(struct inode *dir, struct dentry *dentry)  	error = rpc_wait_for_completion_task(task);  	if (error == 0)  		error = task->tk_status; +	switch (error) { +	case 0: +		/* The rename succeeded */ +		nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); +		d_move(dentry, sdentry); +		break; +	case -ERESTARTSYS: +		/* The result of the rename is unknown. Play it safe by +		 * forcing a new lookup */ +		d_drop(dentry); +		d_drop(sdentry); +	}  	rpc_put_task(task);  out_dput:  	dput(sdentry);  |