All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tejun Heo <htejun-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: cornelia.huck-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org,
	greg-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	satyam-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org,
	stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org,
	containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org
Cc: Tejun Heo <htejun-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	"Eric W. Biederman"
	<ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
Subject: [PATCH 08/14] sysfs: Rewrite sysfs_drop_dentry.
Date: Mon, 20 Aug 2007 21:36:30 +0900	[thread overview]
Message-ID: <1187613390255-git-send-email-htejun@gmail.com> (raw)
In-Reply-To: <11876133893720-git-send-email-htejun-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

From: Eric W. Biederman <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>

Currently we find the dentry to drop by looking at sd->s_dentry.
We can just as easily accomplish the same task by looking up the
sysfs inode and finding all of the dentries from there, with the
added bonus that we don't need to play with the sysfs_assoc_lock.

Signed-off-by: Eric W. Biederman <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
Signed-off-by: Tejun Heo <htejun-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 fs/sysfs/dir.c |   53 ++++++++++++++++++++++++++---------------------------
 1 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index a6b0fb0..6250455 100644
--- a/fs/sysfs/dir.c
+++ b/fs/sysfs/dir.c
@@ -565,50 +565,49 @@ void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
  *	Drop dentry for @sd.  @sd must have been unlinked from its
  *	parent on entry to this function such that it can't be looked
  *	up anymore.
- *
- *	@sd->s_dentry which is protected with sysfs_assoc_lock points
- *	to the currently associated dentry but we're not holding a
- *	reference to it and racing with dput().  Grab dcache_lock and
- *	verify dentry before dropping it.  If @sd->s_dentry is NULL or
- *	dput() beats us, no need to bother.
  */
 static void sysfs_drop_dentry(struct sysfs_dirent *sd)
 {
-	struct dentry *dentry = NULL;
 	struct inode *inode;
+	struct dentry *dentry;
+
+	inode = ilookup(sysfs_sb, sd->s_ino);
+	if (!inode)
+		return;
 
-	/* We're not holding a reference to ->s_dentry dentry but the
-	 * field will stay valid as long as sysfs_assoc_lock is held.
+	/* Drop any existing dentries associated with sd.
+	 *
+	 * For the dentry to be properly freed we need to grab a
+	 * reference to the dentry under the dcache lock,  unhash it,
+	 * and then put it.  The playing with the dentry count allows
+	 * dput to immediately free the dentry  if it is not in use.
 	 */
-	spin_lock(&sysfs_assoc_lock);
+repeat:
 	spin_lock(&dcache_lock);
-
-	/* drop dentry if it's there and dput() didn't kill it yet */
-	if (sd->s_dentry && sd->s_dentry->d_inode) {
-		dentry = dget_locked(sd->s_dentry);
+	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
+		if (d_unhashed(dentry))
+			continue;
+		dget_locked(dentry);
 		spin_lock(&dentry->d_lock);
 		__d_drop(dentry);
 		spin_unlock(&dentry->d_lock);
+		spin_unlock(&dcache_lock);
+		dput(dentry);
+		goto repeat;
 	}
-
 	spin_unlock(&dcache_lock);
-	spin_unlock(&sysfs_assoc_lock);
-
-	dput(dentry);
 
 	/* adjust nlink and update timestamp */
-	inode = ilookup(sysfs_sb, sd->s_ino);
-	if (inode) {
-		mutex_lock(&inode->i_mutex);
+	mutex_lock(&inode->i_mutex);
 
-		inode->i_ctime = CURRENT_TIME;
+	inode->i_ctime = CURRENT_TIME;
+	drop_nlink(inode);
+	if (sysfs_type(sd) == SYSFS_DIR)
 		drop_nlink(inode);
-		if (sysfs_type(sd) == SYSFS_DIR)
-			drop_nlink(inode);
 
-		mutex_unlock(&inode->i_mutex);
-		iput(inode);
-	}
+	mutex_unlock(&inode->i_mutex);
+
+	iput(inode);
 }
 
 /**
-- 
1.5.0.3

  parent reply	other threads:[~2007-08-20 12:36 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-20 12:36 [PATCHSET] Sysfs cleanups from Eric W. Biederman Tejun Heo
2007-08-20 12:36 ` [PATCH 01/14] sysfs: fix i_mutex locking in sysfs_get_dentry() Tejun Heo
2007-08-20 12:36   ` Tejun Heo
     [not found] ` <11876133893720-git-send-email-htejun-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2007-08-20 12:36   ` [PATCH 04/14] sysfs: Use kill_anon_super Tejun Heo
2007-08-20 12:36   ` [PATCH 03/14] sysfs: Remove sysfs_instantiate Tejun Heo
2007-08-20 12:36   ` [PATCH 02/14] sysfs: Move all of inode initialization into sysfs_init_inode Tejun Heo
2007-08-20 12:36   ` [PATCH 11/14] sysfs: Remove s_dentry Tejun Heo
2007-08-20 12:36   ` [PATCH 06/14] sysfs: In sysfs_lookup don't open code sysfs_find_dirent Tejun Heo
2007-08-20 12:36   ` [PATCH 09/14] sysfs: Introduce sysfs_rename_mutex Tejun Heo
2007-08-20 12:36   ` [PATCH 05/14] sysfs: Make sysfs_mount static Tejun Heo
2007-08-20 12:36   ` [PATCH 07/14] sysfs: Simplify readdir Tejun Heo
2007-08-20 12:36   ` [PATCH 12/14] sysfs: kill SYSFS_FLAG_REMOVED Tejun Heo
2007-08-20 12:36     ` Tejun Heo
2007-08-20 12:36   ` Tejun Heo [this message]
2007-08-20 12:36   ` [PATCH 13/14] sysfs: Rewrite rename in terms of sysfs dirents Tejun Heo
2007-08-20 12:36   ` [PATCH 14/14] sysfs: Rewrite sysfs_move_dir " Tejun Heo
2007-08-22 14:04   ` [PATCHSET] Sysfs cleanups from Eric W. Biederman Eric W. Biederman
2007-08-22 14:04     ` Eric W. Biederman
2007-08-22 14:45     ` Tejun Heo
2007-08-22 15:51       ` Eric W. Biederman
2007-08-20 12:36 ` [PATCH 10/14] sysfs: simply sysfs_get_dentry Tejun Heo
2007-08-20 12:36   ` Tejun Heo
2007-08-22  9:26 ` [PATCHSET] Sysfs cleanups from Eric W. Biederman Cornelia Huck
2007-08-22  9:39   ` Tejun Heo

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=1187613390255-git-send-email-htejun@gmail.com \
    --to=htejun-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org \
    --cc=cornelia.huck-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org \
    --cc=ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org \
    --cc=greg-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=satyam-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
    --cc=stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org \
    /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.