All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cyrill Gorcunov <gorcunov@openvz.org>
To: "J. Bruce Fields" <bfields@fieldses.org>
Cc: Pavel Emelyanov <xemul@parallels.com>,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	Al Viro <viro@zeniv.linux.org.uk>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
	Alexey Dobriyan <adobriyan@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	James Bottomley <jbottomley@parallels.com>,
	Matthew Helsley <matt.helsley@gmail.com>
Subject: Re: [patch 4/8] fs, exportfs: Add export_encode_inode_fh helper
Date: Tue, 21 Aug 2012 17:40:04 +0400	[thread overview]
Message-ID: <20120821134004.GF7670@moon> (raw)
In-Reply-To: <20120821122908.GE9483@fieldses.org>

On Tue, Aug 21, 2012 at 08:29:08AM -0400, J. Bruce Fields wrote:
> > Initial problem -- we don't know what is being watched by an inotify fd.
> > 
> > Having a dentry somewhere was the 1st attempt to solve this -- keep a path
> > in inotify and show it when required. It doesn't work since holding a ref on
> > path changes the behavior of watched inode (we cannot rename/unlink/remount
> > it the same way as we could before patching the kernel).
> 
> OK.  So if you don't mind the fact that there are filesystems with
> inotify support but not filehandle support, then I think generating a
> filehandle early as you describe would work.  I guess it's a little more
> memory per watched inode.

So, I thought about something like below, any comments?
---
 fs/notify/inotify/inotify.h      |    8 +++++++
 fs/notify/inotify/inotify_user.c |   41 ++++++++++++++++++++++++++++++++++-----
 2 files changed, 44 insertions(+), 5 deletions(-)

Index: linux-2.6.git/fs/notify/inotify/inotify.h
===================================================================
--- linux-2.6.git.orig/fs/notify/inotify/inotify.h
+++ linux-2.6.git/fs/notify/inotify/inotify.h
@@ -1,6 +1,7 @@
 #include <linux/fsnotify_backend.h>
 #include <linux/inotify.h>
 #include <linux/slab.h> /* struct kmem_cache */
+#include <linux/exportfs.h>
 
 extern struct kmem_cache *event_priv_cachep;
 
@@ -9,9 +10,16 @@ struct inotify_event_private_data {
 	int wd;
 };
 
+#if defined(CONFIG_PROC_FS) && defined(CONFIG_EXPORTFS) && defined(CONFIG_CHECKPOINT_RESTORE)
+# define INOTIFY_USE_FHANDLE
+#endif
+
 struct inotify_inode_mark {
 	struct fsnotify_mark fsn_mark;
 	int wd;
+#ifdef INOTIFY_USE_FHANDLE
+	__u8 fhandle[sizeof(struct file_handle) + MAX_HANDLE_SZ];
+#endif
 };
 
 extern void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark,
Index: linux-2.6.git/fs/notify/inotify/inotify_user.c
===================================================================
--- linux-2.6.git.orig/fs/notify/inotify/inotify_user.c
+++ linux-2.6.git/fs/notify/inotify/inotify_user.c
@@ -566,6 +566,32 @@ static void inotify_free_mark(struct fsn
 	kmem_cache_free(inotify_inode_mark_cachep, i_mark);
 }
 
+#ifdef INOTIFY_USE_FHANDLE
+static int inotify_encode_wd_fhandle(struct inotify_inode_mark *mark, struct dentry *dentry)
+{
+	struct file_handle *fhandle = (struct file_handle *)mark->fhandle;
+	int size, ret;
+
+	BUILD_BUG_ON(sizeof(mark->fhandle) <= sizeof(struct file_handle));
+
+	fhandle->handle_bytes = sizeof(mark->fhandle) - sizeof(struct file_handle);
+	size = fhandle->handle_bytes >> 2;
+
+	ret = exportfs_encode_fh(dentry, (struct fid *)fhandle->f_handle, &size,  0);
+	if ((ret == 255) || (ret == -ENOSPC))
+		return -EOVERFLOW;
+
+	fhandle->handle_type = ret;
+
+	return 0;
+}
+# else
+static int inotify_encode_wd_fhandle(struct inotify_inode_mark *mark, struct dentry *dentry)
+{
+	return 0;
+}
+#endif
+
 static int inotify_update_existing_watch(struct fsnotify_group *group,
 					 struct inode *inode,
 					 u32 arg)
@@ -621,10 +647,11 @@ static int inotify_update_existing_watch
 }
 
 static int inotify_new_watch(struct fsnotify_group *group,
-			     struct inode *inode,
+			     struct dentry *dentry,
 			     u32 arg)
 {
 	struct inotify_inode_mark *tmp_i_mark;
+	struct inode *inode = dentry->d_inode;
 	__u32 mask;
 	int ret;
 	struct idr *idr = &group->inotify_data.idr;
@@ -647,6 +674,10 @@ static int inotify_new_watch(struct fsno
 	if (atomic_read(&group->inotify_data.user->inotify_watches) >= inotify_max_user_watches)
 		goto out_err;
 
+	ret = inotify_encode_wd_fhandle(tmp_i_mark, dentry);
+	if (ret)
+		goto out_err;
+
 	ret = inotify_add_to_idr(idr, idr_lock, &group->inotify_data.last_wd,
 				 tmp_i_mark);
 	if (ret)
@@ -673,16 +704,16 @@ out_err:
 	return ret;
 }
 
-static int inotify_update_watch(struct fsnotify_group *group, struct inode *inode, u32 arg)
+static int inotify_update_watch(struct fsnotify_group *group, struct dentry *dentry, u32 arg)
 {
 	int ret = 0;
 
 retry:
 	/* try to update and existing watch with the new arg */
-	ret = inotify_update_existing_watch(group, inode, arg);
+	ret = inotify_update_existing_watch(group, dentry->d_inode, arg);
 	/* no mark present, try to add a new one */
 	if (ret == -ENOENT)
-		ret = inotify_new_watch(group, inode, arg);
+		ret = inotify_new_watch(group, dentry, arg);
 	/*
 	 * inotify_new_watch could race with another thread which did an
 	 * inotify_new_watch between the update_existing and the add watch
@@ -785,7 +816,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int,
 	group = filp->private_data;
 
 	/* create/update an inode mark */
-	ret = inotify_update_watch(group, inode, mask);
+	ret = inotify_update_watch(group, path.dentry, mask);
 	path_put(&path);
 fput_and_out:
 	fput_light(filp, fput_needed);

  parent reply	other threads:[~2012-08-21 13:40 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-15  9:21 [patch 0/8] procfs, fdinfo updated Cyrill Gorcunov
2012-08-15  9:21 ` [patch 1/8] procfs: Move /proc/pid/fd[info] handling code to fd.[ch] Cyrill Gorcunov
2012-08-15  9:21 ` [patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file Cyrill Gorcunov
2012-08-15  9:21 ` [patch 3/8] procfs: Add ability to plug in auxiliary fdinfo providers Cyrill Gorcunov
2012-08-15 21:16   ` Al Viro
2012-08-15 21:31     ` Cyrill Gorcunov
2012-08-15 21:29   ` Al Viro
2012-08-15 21:34     ` Cyrill Gorcunov
2012-08-16 10:58     ` Cyrill Gorcunov
2012-08-15  9:21 ` [patch 4/8] fs, exportfs: Add export_encode_inode_fh helper Cyrill Gorcunov
2012-08-15 20:45   ` J. Bruce Fields
2012-08-15 21:02     ` Cyrill Gorcunov
2012-08-15 22:06       ` J. Bruce Fields
2012-08-16  6:24         ` Cyrill Gorcunov
2012-08-16 12:38           ` Cyrill Gorcunov
2012-08-16 12:47             ` J. Bruce Fields
2012-08-16 13:16               ` Cyrill Gorcunov
2012-08-16 14:57               ` Cyrill Gorcunov
2012-08-16 15:05                 ` Al Viro
2012-08-16 15:09                   ` Cyrill Gorcunov
2012-08-16 13:43             ` Al Viro
2012-08-16 13:47               ` Pavel Emelyanov
2012-08-16 13:50                 ` Al Viro
2012-08-16 13:53                   ` Pavel Emelyanov
2012-08-16 13:54                   ` Cyrill Gorcunov
2012-08-16 14:03                     ` James Bottomley
2012-08-16 14:03                       ` James Bottomley
2012-08-16 14:13                       ` Pavel Emelyanov
2012-08-16 14:15                       ` Cyrill Gorcunov
2012-08-16 14:41                         ` Al Viro
2012-08-16 14:48                           ` Cyrill Gorcunov
2012-08-16 14:54                             ` J. Bruce Fields
2012-08-16 14:55                             ` Al Viro
2012-08-16 15:06                               ` Pavel Emelyanov
2012-08-16 15:35                                 ` Cyrill Gorcunov
2012-08-16 15:07                               ` Cyrill Gorcunov
2012-08-17 20:58                           ` Eric W. Biederman
2012-08-16 13:48               ` Al Viro
2012-08-20 14:19   ` Aneesh Kumar K.V
2012-08-20 16:33     ` Cyrill Gorcunov
2012-08-20 18:32       ` J. Bruce Fields
2012-08-20 19:06         ` Cyrill Gorcunov
2012-08-20 19:32           ` J. Bruce Fields
2012-08-20 19:40             ` Cyrill Gorcunov
2012-08-21  9:18             ` Pavel Emelyanov
2012-08-21 10:42               ` Aneesh Kumar K.V
2012-08-21 10:49                 ` Pavel Emelyanov
2012-08-21 10:54                   ` Cyrill Gorcunov
2012-08-21 11:09                     ` Pavel Emelyanov
2012-08-21 12:11                       ` J. Bruce Fields
2012-08-21 12:22                         ` Pavel Emelyanov
2012-08-21 12:29                           ` J. Bruce Fields
2012-08-21 12:40                             ` Pavel Emelyanov
2012-08-21 12:51                             ` Boaz Harrosh
2012-08-21 12:59                               ` Pavel Emelyanov
2012-08-21 13:08                                 ` Boaz Harrosh
2012-08-21 13:12                               ` Al Viro
2012-08-21 13:40                             ` Cyrill Gorcunov [this message]
2012-08-21 12:09                   ` J. Bruce Fields
2012-08-21 12:25                     ` Pavel Emelyanov
2012-08-22  5:49                   ` Aneesh Kumar K.V
2012-08-23  8:06                     ` Cyrill Gorcunov
2012-08-23  8:54                       ` Marco Stornelli
2012-08-23  9:29                         ` Cyrill Gorcunov
2012-08-15  9:21 ` [patch 5/8] fs, notify: Add procfs fdinfo helper v3 Cyrill Gorcunov
2012-08-15  9:21 ` [patch 6/8] fs, eventfd: Add procfs fdinfo helper Cyrill Gorcunov
2012-08-15  9:21 ` [patch 7/8] fs, epoll: Add procfs fdinfo helper v2 Cyrill Gorcunov
2012-08-15  9:21 ` [patch 8/8] fdinfo: Show sigmask for signalfd fd v2 Cyrill Gorcunov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120821134004.GF7670@moon \
    --to=gorcunov@openvz.org \
    --cc=adobriyan@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=bfields@fieldses.org \
    --cc=jbottomley@parallels.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matt.helsley@gmail.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=xemul@parallels.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.