linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Valerie Aurora <vaurora@redhat.com>
To: Erez Zadok <ezk@cs.sunysb.edu>
Cc: Jan Blunck <jblunck@suse.de>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Christoph Hellwig <hch@infradead.org>,
	Andy Whitcroft <apw@canonical.com>,
	Scott James Remnant <scott@canonical.com>,
	Sandu Popa Marius <sandupopamarius@gmail.com>,
	Jan Rekorajski <baggins@sith.mimuw.edu.pl>,
	"J. R. Okajima" <hooanon05@yahoo.co.jp>,
	Arnd Bergmann <arnd@arndb.de>,
	Vladimir Dronnikov <dronnikov@gmail.com>,
	Felix Fietkau <nbd@openwrt.org>,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 06/41] VFS: Introduce dput() variant that maintains a kill-list
Date: Wed, 20 Jan 2010 18:31:02 -0500	[thread overview]
Message-ID: <20100120233102.GA16090@shell> (raw)
In-Reply-To: <200911300228.nAU2Se3A007387@agora.fsl.cs.sunysb.edu>

On Sun, Nov 29, 2009 at 09:28:40PM -0500, Erez Zadok wrote:
> In message <1256152779-10054-7-git-send-email-vaurora@redhat.com>, Valerie Aurora writes:
> > From: Jan Blunck <jblunck@suse.de>
> > 
> > This patch introduces a new variant of dput(). This becomes necessary to
> > prevent a recursive call to dput() from the union mount code.
> > 
> >   void __dput(struct dentry *dentry, struct list_head *list, int greedy);
> >   struct dentry *__d_kill(struct dentry *dentry, struct list_head *list,
> >   	 		  int greedy);
> > 
> > __dput() works mostly like the original dput() did. The main difference is
> > that if it the greedy argument is zero it will put the parent on a special
> > list instead of trying to get rid of it directly.
> > 
> > Therefore the union mount code can safely call __dput() when it wants to get
> > rid of underlying dentry references during a dput(). After calling __dput()
> > or __d_kill() the caller must make sure that __d_kill_final() is called on all
> > dentries on the kill list. __d_kill_final() is actually doing the
> > dentry_iput() and is also dereferencing the parent.
> 
> From the description above, there is something somewhat unclean about all
> the special things that now have to happen: a special flags to affect how a
> function behaves, an extra requirement on the caller of __d_kill, etc.  I
> wonder if there is a clear way to achieve this.

I looked into this some more, and looks like this patch might be
unnecessary with the current code base.

We were worried about a recursive dput() call through:

dput()->d_kill()->shrink_d_unions()->union_put()->dput()

But this path can only be reached if the dentry is unhashed when we
enter the first dput(), and it can only be unhashed if it was
rmdir()'d, and that means we called d_delete(), and d_delete() calls
shrink_d_unions() for us.  So if we do call d_kill() from dput(), the
unions are already gone and there is no danger of calling dput()
again.

Jan, does this make sense?  If not, do you have a test case that
triggers a recursive dput()?

Thanks,

-VAL

> > Signed-off-by: Jan Blunck <jblunck@suse.de>
> > Signed-off-by: Valerie Aurora <vaurora@redhat.com>
> > ---
> >  fs/dcache.c |  115 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
> >  1 files changed, 105 insertions(+), 10 deletions(-)
> > 
> > diff --git a/fs/dcache.c b/fs/dcache.c
> > index 38bf982..3415e9e 100644
> > --- a/fs/dcache.c
> > +++ b/fs/dcache.c
> > @@ -157,14 +157,19 @@ static void dentry_lru_del_init(struct dentry *dentry)
> >  }
> >  
> >  /**
> > - * d_kill - kill dentry and return parent
> > + * __d_kill - kill dentry and return parent
> >   * @dentry: dentry to kill
> > + * @list: kill list
> > + * @greedy: return parent instead of putting it on the kill list
> >   *
> >   * The dentry must already be unhashed and removed from the LRU.
> >   *
> > - * If this is the root of the dentry tree, return NULL.
> > + * If this is the root of the dentry tree, return NULL. If greedy is zero, we
> > + * put the parent of this dentry on the kill list instead. The callers must
> > + * make sure that __d_kill_final() is called on all dentries on the kill list.
> >   */
> > -static struct dentry *d_kill(struct dentry *dentry)
> > +static struct dentry *__d_kill(struct dentry *dentry, struct list_head *list,
> > +			       int greedy)
> 
> If you're keeping 'greedy' then perhaps make it a bool instead of 'int';
> that way you don't have to pass an unclear '0' or '1' in the rest of the
> code.
> 
> > +void __dput(struct dentry *, struct list_head *, int);
> 
> Can you move the __dput() code here and avoid the forward function
> declaration?
> 
> Can __dput() be made static, or you need to call it from elsewhere.  I
> didn't see an extern for it in this patch.  If there's an extern in another
> patch, then it should be moved here.
> 
> > +static void __d_kill_final(struct dentry *dentry, struct list_head *list)
> > +{
> 
> Your patch header says that the caller of __dput or _-d_kill must called
> __d_kill_final.  So shouldn't this be a non-static extern'ed function?
> 
> Either way, I suggest documenting in a comment above __d_kill_final() who
> should call it and under what circumstances.
> 
> 
> > +			iput(inode);
> > +	}
> > +
> > +	if (IS_ROOT(dentry))
> > +		parent = NULL;
> > +	else
> > +		parent = dentry->d_parent;
> > +	d_free(dentry);
> > +	__dput(parent, list, 1);
> > +}
> > +
> > +/**
> > + * d_kill - kill dentry and return parent
> > + * @dentry: dentry to kill
> > + *
> > + * The dentry must already be unhashed and removed from the LRU.
> > + *
> > + * If this is the root of the dentry tree, return NULL.
> > + */
> > +static struct dentry *d_kill(struct dentry *dentry)
> > +{
> > +	LIST_HEAD(mortuary);
> > +	struct dentry *parent;
> > +
> > +	parent = __d_kill(dentry, &mortuary, 1);
> > +	while (!list_empty(&mortuary)) {
> > +		dentry = list_entry(mortuary.next, struct dentry, d_lru);
> > +		list_del(&dentry->d_lru);
> > +		__d_kill_final(dentry, &mortuary);
> > +	}
> > +
> > +	return parent;
> > +}
> > +
> >  /* 
> >   * This is dput
> >   *
> > @@ -199,19 +266,24 @@ static struct dentry *d_kill(struct dentry *dentry)
> >   * Real recursion would eat up our stack space.
> >   */
> >  
> > -/*
> > - * dput - release a dentry
> > - * @dentry: dentry to release 
> > +/**
> > + * __dput - release a dentry
> > + * @dentry: dentry to release
> > + * @list: kill list argument for __d_kill()
> > + * @greedy: greedy argument for __d_kill()
> >   *
> >   * Release a dentry. This will drop the usage count and if appropriate
> >   * call the dentry unlink method as well as removing it from the queues and
> >   * releasing its resources. If the parent dentries were scheduled for release
> > - * they too may now get deleted.
> > + * they too may now get deleted if @greedy is not zero. Otherwise parent is
> > + * added to the kill list. The callers must make sure that __d_kill_final() is
> > + * called on all dentries on the kill list.
> > + *
> > + * You probably want to use dput() instead.
> >   *
> >   * no dcache lock, please.
> >   */
> > -
> > -void dput(struct dentry *dentry)
> > +void __dput(struct dentry *dentry, struct list_head *list, int greedy)
> >  {
> 
> I wonder now if the "__" prefix in __dput is appropriate: usually it's
> reserved for "hidden" internal functions that are not supposed to be called
> by other users, right?  I try to avoid naming things FOO and __FOO because
> the name alone doesn't help me understand what each one might be doing.  So
> maybe rename __dput() to something more descriptive?
> 
> Erez.

  reply	other threads:[~2010-01-20 23:31 UTC|newest]

Thread overview: 100+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-21 19:18 [RFC PATCH 00/40] Writable overlays (union mounts) Valerie Aurora
2009-10-21 19:18 ` [PATCH 01/41] VFS: BUG() if somebody tries to rehash an already hashed dentry Valerie Aurora
2009-10-21 19:19   ` [PATCH 02/41] VFS: propagate mnt_flags into do_loopback Valerie Aurora
2009-10-21 19:19     ` [PATCH 03/41] VFS: Make lookup_hash() return a struct path Valerie Aurora
2009-10-21 19:19       ` [PATCH 04/41] VFS: Remove unnecessary micro-optimization in cached_lookup() Valerie Aurora
2009-10-21 19:19         ` [PATCH 05/41] VFS: Make real_lookup() return a struct path Valerie Aurora
2009-10-21 19:19           ` [PATCH 06/41] VFS: Introduce dput() variant that maintains a kill-list Valerie Aurora
2009-10-21 19:19             ` [PATCH 07/41] VFS: Add read-only users count to superblock Valerie Aurora
2009-10-21 19:19               ` [PATCH 08/41] Don't replace nameidata path when following links Valerie Aurora
2009-10-21 19:19                 ` [PATCH 09/41] whiteout: Don't return information about whiteouts to userspace Valerie Aurora
2009-10-21 19:19                   ` [PATCH 10/41] whiteout: Add vfs_whiteout() and whiteout inode operation Valerie Aurora
2009-10-21 19:19                     ` [PATCH 11/41] whiteout: Set S_OPAQUE inode flag when creating directories Valerie Aurora
2009-10-21 19:19                       ` [PATCH 12/41] union-mount: Allow removal of a directory Valerie Aurora
2009-10-21 19:19                         ` [PATCH 13/41] whiteout: tmpfs whiteout support Valerie Aurora
2009-10-21 19:19                           ` [PATCH 14/41] whiteout: Split of ext2_append_link() from ext2_add_link() Valerie Aurora
2009-10-21 19:19                             ` [PATCH 15/41] whiteout: ext2 whiteout support Valerie Aurora
2009-10-21 19:19                               ` [PATCH 16/41] whiteout: jffs2 " Valerie Aurora
2009-10-21 19:19                                 ` [PATCH 17/41] whiteout: Add path_whiteout() helper Valerie Aurora
2009-10-21 19:19                                   ` [PATCH 18/41] union-mount: Documentation Valerie Aurora
2009-10-21 19:19                                     ` [PATCH 19/41] union-mount: Introduce MNT_UNION and MS_UNION flags Valerie Aurora
2009-10-21 19:19                                       ` [PATCH 20/41] union-mount: Introduce union_mount structure Valerie Aurora
2009-10-21 19:19                                         ` [PATCH 21/41] union-mount: Drive the union cache via dcache Valerie Aurora
2009-10-21 19:19                                           ` [PATCH 22/41] union-mount: Some checks during namespace changes Valerie Aurora
2009-10-21 19:19                                             ` [PATCH 23/41] union-mount: Changes to the namespace handling Valerie Aurora
2009-10-21 19:19                                               ` [PATCH 24/41] union-mount: Make lookup work for union-mounted file systems Valerie Aurora
2009-10-21 19:19                                                 ` [PATCH 25/41] union-mount: stop lookup when directory has S_OPAQUE flag set Valerie Aurora
2009-10-21 19:19                                                   ` [PATCH 26/41] union-mount: stop lookup when finding a whiteout Valerie Aurora
2009-10-21 19:19                                                     ` [PATCH 27/41] union-mount: in-kernel file copy between union mounted filesystems Valerie Aurora
2009-10-21 19:19                                                       ` [PATCH 28/41] union-mount: call do_whiteout() on unlink and rmdir Valerie Aurora
2009-10-21 19:19                                                         ` [PATCH 29/41] union-mount: Always create topmost directory on open Valerie Aurora
2009-10-21 19:19                                                           ` [PATCH 30/41] fallthru: Basic fallthru definitions Valerie Aurora
2009-10-21 19:19                                                             ` [PATCH 31/41] fallthru: Support for fallthru entries in union mount lookup Valerie Aurora
2009-10-21 19:19                                                               ` [PATCH 32/41] fallthru: ext2 fallthru support Valerie Aurora
2009-10-21 19:19                                                                 ` [PATCH 33/41] fallthru: jffs2 " Valerie Aurora
2009-10-21 19:19                                                                   ` [PATCH 34/41] fallthru: tmpfs " Valerie Aurora
2009-10-21 19:19                                                                     ` [PATCH 35/41] union-mount: Copy up directory entries on first readdir() Valerie Aurora
2009-10-21 19:19                                                                       ` [PATCH 36/41] union-mount: Increment read-only users count for read-only layer Valerie Aurora
2009-10-21 19:19                                                                         ` [PATCH 37/41] union-mount: Check read-only/read-write status of layers Valerie Aurora
2009-10-21 19:19                                                                           ` [PATCH 38/41] union-mount: Make pivot_root work with union mounts Valerie Aurora
2009-10-21 19:19                                                                             ` [PATCH 39/41] union-mount: Ignore read-only file system in permission checks Valerie Aurora
2009-10-21 19:19                                                                               ` [PATCH 40/41] union-mount: Make truncate work in all its glorious UNIX variations Valerie Aurora
2009-10-21 19:19                                                                                 ` [PATCH 41/41] union-mount: Add support for rename by __union_copyup() Valerie Aurora
2009-12-01  4:57                                                                                   ` Erez Zadok
2009-12-01  4:50                                                                                 ` [PATCH 40/41] union-mount: Make truncate work in all its glorious UNIX variations Erez Zadok
2009-12-01  4:34                                                                               ` [PATCH 39/41] union-mount: Ignore read-only file system in permission checks Erez Zadok
2009-12-01  4:26                                                                             ` [PATCH 38/41] union-mount: Make pivot_root work with union mounts Erez Zadok
2009-12-01  4:18                                                                       ` [PATCH 35/41] union-mount: Copy up directory entries on first readdir() Erez Zadok
2009-12-01  4:17                                                                     ` [PATCH 34/41] fallthru: tmpfs fallthru support Erez Zadok
2009-12-01  4:17                                                                   ` [PATCH 33/41] fallthru: jffs2 " Erez Zadok
2009-12-01  4:17                                                                 ` [PATCH 32/41] fallthru: ext2 " Erez Zadok
2009-12-01  4:15                                                               ` [PATCH 31/41] fallthru: Support for fallthru entries in union mount lookup Erez Zadok
2009-12-01  4:14                                                             ` [PATCH 30/41] fallthru: Basic fallthru definitions Erez Zadok
2009-12-01  4:14                                                           ` [PATCH 29/41] union-mount: Always create topmost directory on open Erez Zadok
2009-12-01  4:13                                                       ` [PATCH 27/41] union-mount: in-kernel file copy between union mounted filesystems Erez Zadok
2009-12-01  4:11                                                     ` [PATCH 26/41] union-mount: stop lookup when finding a whiteout Erez Zadok
2009-12-01  4:10                                                   ` [PATCH 25/41] union-mount: stop lookup when directory has S_OPAQUE flag set Erez Zadok
2009-12-01  4:10                                                 ` [PATCH 24/41] union-mount: Make lookup work for union-mounted file systems Erez Zadok
2009-11-30  9:15                                               ` [PATCH 23/41] union-mount: Changes to the namespace handling Erez Zadok
2009-11-30  9:04                                             ` [PATCH 22/41] union-mount: Some checks during namespace changes Erez Zadok
2009-11-30  8:57                                           ` [PATCH 21/41] union-mount: Drive the union cache via dcache Erez Zadok
2009-11-30  8:46                                         ` [PATCH 20/41] union-mount: Introduce union_mount structure Erez Zadok
2010-01-26 22:38                                           ` Valerie Aurora
2009-11-30  8:02                                       ` [PATCH 19/41] union-mount: Introduce MNT_UNION and MS_UNION flags Erez Zadok
2010-01-26 20:03                                         ` Valerie Aurora
2009-12-01  5:37                                     ` [PATCH 18/41] union-mount: Documentation Erez Zadok
2009-11-30  7:57                                   ` [PATCH 17/41] whiteout: Add path_whiteout() helper Erez Zadok
2010-01-26 20:02                                     ` Valerie Aurora
2009-10-21 22:50                                 ` [PATCH 16/41] whiteout: jffs2 whiteout support David Woodhouse
2009-10-27  2:21                                   ` Valerie Aurora
2009-11-30  7:51                                 ` Erez Zadok
2010-01-26 19:52                                   ` Valerie Aurora
2009-10-21 21:17                               ` [PATCH 15/41] whiteout: ext2 " Andreas Dilger
2009-10-27  2:14                                 ` Valerie Aurora
2009-11-30  7:45                               ` Erez Zadok
2009-11-30  6:32                             ` [PATCH 14/41] whiteout: Split of ext2_append_link() from ext2_add_link() Erez Zadok
2009-11-30  6:26                           ` [PATCH 13/41] whiteout: tmpfs whiteout support Erez Zadok
2010-01-21  2:02                             ` Valerie Aurora
2009-11-30  6:13                         ` [PATCH 12/41] union-mount: Allow removal of a directory Erez Zadok
2010-01-21  0:52                           ` Valerie Aurora
2009-10-27 14:36                     ` [PATCH 10/41] whiteout: Add vfs_whiteout() and whiteout inode operation Eric Paris
2009-10-27 21:22                       ` Valerie Aurora
2009-11-30  3:04                     ` Erez Zadok
2010-01-21  0:35                       ` Valerie Aurora
2009-11-30  2:53                   ` [PATCH 09/41] whiteout: Don't return information about whiteouts to userspace Erez Zadok
2010-01-21  0:19                     ` Valerie Aurora
2009-11-30  2:44                 ` [PATCH 08/41] Don't replace nameidata path when following links Erez Zadok
2009-11-30  2:33               ` [PATCH 07/41] VFS: Add read-only users count to superblock Erez Zadok
2009-11-30  2:28             ` [PATCH 06/41] VFS: Introduce dput() variant that maintains a kill-list Erez Zadok
2010-01-20 23:31               ` Valerie Aurora [this message]
2009-11-30  2:11           ` [PATCH 05/41] VFS: Make real_lookup() return a struct path Erez Zadok
2009-11-30  2:07         ` [PATCH 04/41] VFS: Remove unnecessary micro-optimization in cached_lookup() Erez Zadok
2009-12-10 21:25           ` Valerie Aurora
2009-11-30  2:02       ` [PATCH 03/41] VFS: Make lookup_hash() return a struct path Erez Zadok
2009-12-10 21:23         ` Valerie Aurora
2009-11-30  6:04       ` Erez Zadok
2009-12-10 21:24         ` Valerie Aurora
2009-11-30  1:43   ` [PATCH 01/41] VFS: BUG() if somebody tries to rehash an already hashed dentry Erez Zadok
2009-12-10 20:20     ` Valerie Aurora
2009-10-22  2:44 ` [RFC PATCH 00/40] Writable overlays (union mounts) hooanon05
2009-10-27  2:23   ` Valerie Aurora

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=20100120233102.GA16090@shell \
    --to=vaurora@redhat.com \
    --cc=apw@canonical.com \
    --cc=arnd@arndb.de \
    --cc=baggins@sith.mimuw.edu.pl \
    --cc=dronnikov@gmail.com \
    --cc=ezk@cs.sunysb.edu \
    --cc=hch@infradead.org \
    --cc=hooanon05@yahoo.co.jp \
    --cc=jblunck@suse.de \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nbd@openwrt.org \
    --cc=sandupopamarius@gmail.com \
    --cc=scott@canonical.com \
    --cc=viro@zeniv.linux.org.uk \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).