diff options
Diffstat (limited to 'fs/nfs')
-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 d26a32f5b53b..1f1f38f0c5d5 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) | |||
335 | struct inode *old_dir = data->old_dir; | 335 | struct inode *old_dir = data->old_dir; |
336 | struct inode *new_dir = data->new_dir; | 336 | struct inode *new_dir = data->new_dir; |
337 | struct dentry *old_dentry = data->old_dentry; | 337 | struct dentry *old_dentry = data->old_dentry; |
338 | struct dentry *new_dentry = data->new_dentry; | ||
339 | 338 | ||
340 | if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) { | 339 | if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) { |
341 | rpc_restart_call_prepare(task); | 340 | rpc_restart_call_prepare(task); |
342 | return; | 341 | return; |
343 | } | 342 | } |
344 | 343 | ||
345 | if (task->tk_status != 0) { | 344 | if (task->tk_status != 0) |
346 | nfs_cancel_async_unlink(old_dentry); | 345 | nfs_cancel_async_unlink(old_dentry); |
347 | return; | ||
348 | } | ||
349 | |||
350 | d_drop(old_dentry); | ||
351 | d_drop(new_dentry); | ||
352 | } | 346 | } |
353 | 347 | ||
354 | /** | 348 | /** |
@@ -549,6 +543,18 @@ nfs_sillyrename(struct inode *dir, struct dentry *dentry) | |||
549 | error = rpc_wait_for_completion_task(task); | 543 | error = rpc_wait_for_completion_task(task); |
550 | if (error == 0) | 544 | if (error == 0) |
551 | error = task->tk_status; | 545 | error = task->tk_status; |
546 | switch (error) { | ||
547 | case 0: | ||
548 | /* The rename succeeded */ | ||
549 | nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); | ||
550 | d_move(dentry, sdentry); | ||
551 | break; | ||
552 | case -ERESTARTSYS: | ||
553 | /* The result of the rename is unknown. Play it safe by | ||
554 | * forcing a new lookup */ | ||
555 | d_drop(dentry); | ||
556 | d_drop(sdentry); | ||
557 | } | ||
552 | rpc_put_task(task); | 558 | rpc_put_task(task); |
553 | out_dput: | 559 | out_dput: |
554 | dput(sdentry); | 560 | dput(sdentry); |