Patch "Revert "NFS: nfs_rename() handle -ERESTARTSYS dentry left behind"" has been added to the 4.11-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
Revert "NFS: nfs_rename() handle -ERESTARTSYS dentry left behind"
to the 4.11-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
revert-nfs-nfs_rename-handle-erestartsys-dentry-left-behind.patch
and it can be found in the queue-4.11 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
d9f2950006f110f54444a10442752372ee568289Mon Sep 17 00:00:00 2001
From: Benjamin Coddington <[email protected]>
Date: Fri, 16 Jun 2017 11:12:59 -0400
Subject: Revert "NFS: nfs_rename() handle -ERESTARTSYS dentry left behind"
From: Benjamin Coddington <[email protected]>
commit d9f2950006f110f54444a10442752372ee568289 upstream.
This reverts commit 920b4530fb80430ff30ef83efe21ba1fa5623731 which could call d_move() without holding the directory's i_mutex, and reverts commit d4ea7e3c5c0e341c15b073016dbf3ab6c65f12f3 "NFS: Fix old dentry rehash after move", which was a follow-up fix.
--- fs/nfs/dir.c | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-)
fs/nfs/dir.c +24 -27
@@ -2002,29 +2002,6 @@ nfs_link(struct dentry *old_dentry, stru }EXPORT_SYMBOL_GPL (nfs_link); -static void -nfs_complete_rename (struct rpc_task *task,struct nfs_renamedata *data) -{ -struct dentry *old_dentry = data->old_dentry; -struct dentry *new_dentry = data->new_dentry; -struct inode *old_inode =d_inode (old_dentry); -struct inode *new_inode =d_inode (new_dentry); - -nfs_mark_for_revalidate (old_inode); - -switch (task->tk_status) { -case 0 : -if (new_inode !=NULL ) -nfs_drop_nlink (new_inode); -d_move (old_dentry, new_dentry); -nfs_set_verifier (new_dentry, -nfs_save_change_attribute (data->new_dir)); -break ; -case -ENOENT : -nfs_dentry_handle_enoent (old_dentry); - } -} -/* * RENAME * FIXME: Some nfsds, like the Linux user space nfsd, may generate a
@@ -2055,7 +2032,7 @@ int nfs_rename(struct inode *old_dir, st {struct inode *old_inode =d_inode (old_dentry);struct inode *new_inode =d_inode (new_dentry); -struct dentry *dentry =NULL ; +struct dentry *dentry =NULL , *rehash =NULL ;struct rpc_task *task;int error = -EBUSY ;
@@ -2078,8 +2055,10 @@ int nfs_rename(struct inode *old_dir, st* To prevent any new references to the target during the * rename, we unhash the dentry in advance. */ -if (!d_unhashed (new_dentry)) +if (!d_unhashed (new_dentry)) {d_drop (new_dentry); + rehash = new_dentry; + }if (d_count (new_dentry) >2 ) {int err;
@@ -2096,6 +2075,7 @@ int nfs_rename(struct inode *old_dir, st goto out; new_dentry = dentry; + rehash =NULL ; new_inode =NULL ; } }
@@ -2104,8 +2084,7 @@ int nfs_rename(struct inode *old_dir, stif (new_inode !=NULL )NFS_PROTO (new_inode)->return_delegation (new_inode); - task =nfs_async_rename (old_dir, new_dir, old_dentry, new_dentry, - nfs_complete_rename); + task =nfs_async_rename (old_dir, new_dir, old_dentry, new_dentry,NULL );if (IS_ERR (task)) { error =PTR_ERR (task); goto out;
@@ -2115,9 +2094,27 @@ int nfs_rename(struct inode *old_dir, stif (error ==0 ) error = task->tk_status;rpc_put_task (task); +nfs_mark_for_revalidate (old_inode); out: +if (rehash) +d_rehash (rehash);trace_nfs_rename_exit (old_dir, old_dentry, new_dir, new_dentry, error); +if (!error) { +if (new_inode !=NULL ) +nfs_drop_nlink (new_inode); +/* +* The d_move() should be here instead of in an async RPC completion +* handler because we need the proper locks to move the dentry. If +* we're interrupted by a signal, the async RPC completion handler +* should mark the directories for revalidation. +*/ +d_move (old_dentry, new_dentry); +nfs_set_verifier (new_dentry, +nfs_save_change_attribute (new_dir)); + }else if (error == -ENOENT ) +nfs_dentry_handle_enoent (old_dentry); +/* new dentry created? */ if (dentry)dput (dentry);
Patches currently in stable-queue which might be from [email protected] are
queue-4.11/revert-nfs-nfs_rename-handle-erestartsys-dentry-left-behind.patch queue-4.11/nfsv4.2-don-t-send-mode-again-in-post-exclusive4_1-setattr-with-umask.patch