summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2014-03-17 11:06:58 (GMT)
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-03-17 19:14:17 (GMT)
commitf7be728468263fcbaa1e9dcae83fb97a88b4127c (patch)
tree778750a4e2eb18c2a84e0514dd3fa88afbb0a858
parent33912be816d96e204ed7a93690552daa39c08ea9 (diff)
downloadlinux-f7be728468263fcbaa1e9dcae83fb97a88b4127c.tar.xz
nfs: emit a fsnotify_nameremove call in sillyrename codepath
If a file is sillyrenamed, then the generic vfs_unlink code will skip emitting fsnotify events for it. This patch has the sillyrename code do that instead. In truth this is a little bit odd since we aren't actually removing the dentry per-se, but renaming it. Still, this is probably the right thing to do since it's what userland apps expect to see when an unlink() occurs or some file is renamed on top of the dentry. Signed-off-by: Jeff Layton <jlayton@redhat.com> Tested-by: Anna Schumaker <Anna.Schumaker@netapp.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r--fs/nfs/unlink.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c
index 818ded7..de54129 100644
--- a/fs/nfs/unlink.c
+++ b/fs/nfs/unlink.c
@@ -14,6 +14,7 @@
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/namei.h>
+#include <linux/fsnotify.h>
#include "internal.h"
#include "nfs4_fs.h"
@@ -465,8 +466,18 @@ nfs_async_rename(struct inode *old_dir, struct inode *new_dir,
static void
nfs_complete_sillyrename(struct rpc_task *task, struct nfs_renamedata *data)
{
- if (task->tk_status != 0)
- nfs_cancel_async_unlink(data->old_dentry);
+ struct dentry *dentry = data->old_dentry;
+
+ if (task->tk_status != 0) {
+ nfs_cancel_async_unlink(dentry);
+ return;
+ }
+
+ /*
+ * vfs_unlink and the like do not issue this when a file is
+ * sillyrenamed, so do it here.
+ */
+ fsnotify_nameremove(dentry, 0);
}
#define SILLYNAME_PREFIX ".nfs"