From: "Serge E. Hallyn" <serue@us.ibm.com>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Greg Kroah-Hartman <gregkh@suse.de>,
Kay Sievers <kay.sievers@vrfy.org>, Greg KH <greg@kroah.com>,
linux-kernel@vger.kernel.org, Tejun Heo <tj@kernel.org>,
Cornelia Huck <cornelia.huck@de.ibm.com>,
linux-fsdevel@vger.kernel.org,
Eric Dumazet <eric.dumazet@gmail.com>,
Benjamin LaHaise <bcrl@lhnet.ca>,
"Eric W. Biederman" <ebiederm@aristanetworks.com>
Subject: Re: [PATCH 11/13] sysfs: Gut sysfs_addrm_start and sysfs_addrm_finish
Date: Tue, 3 Nov 2009 22:32:49 -0600 [thread overview]
Message-ID: <20091104043249.GG27639@us.ibm.com> (raw)
In-Reply-To: <1257249429-12384-11-git-send-email-ebiederm@xmission.com>
Quoting Eric W. Biederman (ebiederm@xmission.com):
> From: Eric W. Biederman <ebiederm@aristanetworks.com>
>
> With lazy inode updates and dentry operations bringing everything
> into sync on demand there is no longer any need to immediately
> update the vfs or grab i_mutex to protect those updates as we
> make changes to sysfs.
>
> Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
Acked-by: Serge Hallyn <serue@us.ibm.com>
> ---
> fs/sysfs/dir.c | 91 ++---------------------------------------------------
> fs/sysfs/sysfs.h | 2 -
> 2 files changed, 4 insertions(+), 89 deletions(-)
>
> diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
> index 25d052a..a05b027 100644
> --- a/fs/sysfs/dir.c
> +++ b/fs/sysfs/dir.c
> @@ -386,12 +386,6 @@ struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type)
> return NULL;
> }
>
> -static int sysfs_ilookup_test(struct inode *inode, void *arg)
> -{
> - struct sysfs_dirent *sd = arg;
> - return inode->i_ino == sd->s_ino;
> -}
> -
> /**
> * sysfs_addrm_start - prepare for sysfs_dirent add/remove
> * @acxt: pointer to sysfs_addrm_cxt to be used
> @@ -399,47 +393,20 @@ static int sysfs_ilookup_test(struct inode *inode, void *arg)
> *
> * This function is called when the caller is about to add or
> * remove sysfs_dirent under @parent_sd. This function acquires
> - * sysfs_mutex, grabs inode for @parent_sd if available and lock
> - * i_mutex of it. @acxt is used to keep and pass context to
> + * sysfs_mutex. @acxt is used to keep and pass context to
> * other addrm functions.
> *
> * LOCKING:
> * Kernel thread context (may sleep). sysfs_mutex is locked on
> - * return. i_mutex of parent inode is locked on return if
> - * available.
> + * return.
> */
> void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
> struct sysfs_dirent *parent_sd)
> {
> - struct inode *inode;
> -
> memset(acxt, 0, sizeof(*acxt));
> acxt->parent_sd = parent_sd;
>
> - /* Lookup parent inode. inode initialization is protected by
> - * sysfs_mutex, so inode existence can be determined by
> - * looking up inode while holding sysfs_mutex.
> - */
> mutex_lock(&sysfs_mutex);
> -
> - inode = ilookup5(sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test,
> - parent_sd);
> - if (inode) {
> - WARN_ON(inode->i_state & I_NEW);
> -
> - /* parent inode available */
> - acxt->parent_inode = inode;
> -
> - /* sysfs_mutex is below i_mutex in lock hierarchy.
> - * First, trylock i_mutex. If fails, unlock
> - * sysfs_mutex and lock them in order.
> - */
> - if (!mutex_trylock(&inode->i_mutex)) {
> - mutex_unlock(&sysfs_mutex);
> - mutex_lock(&inode->i_mutex);
> - mutex_lock(&sysfs_mutex);
> - }
> - }
> }
>
> /**
> @@ -471,11 +438,6 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
>
> sd->s_parent = sysfs_get(acxt->parent_sd);
>
> - if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode)
> - inc_nlink(acxt->parent_inode);
> -
> - acxt->cnt++;
> -
> sysfs_link_sibling(sd);
>
> /* Update timestamps on the parent */
> @@ -579,40 +541,6 @@ void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
> sd->s_flags |= SYSFS_FLAG_REMOVED;
> sd->s_sibling = acxt->removed;
> acxt->removed = sd;
> -
> - if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode)
> - drop_nlink(acxt->parent_inode);
> -
> - acxt->cnt++;
> -}
> -
> -/**
> - * sysfs_dec_nlink - Decrement link count for the specified sysfs_dirent
> - * @sd: target sysfs_dirent
> - *
> - * Decrement nlink for @sd. @sd must have been unlinked from its
> - * parent on entry to this function such that it can't be looked
> - * up anymore.
> - */
> -static void sysfs_dec_nlink(struct sysfs_dirent *sd)
> -{
> - struct inode *inode;
> -
> - inode = ilookup(sysfs_sb, sd->s_ino);
> - if (!inode)
> - return;
> -
> - /* adjust nlink and update timestamp */
> - mutex_lock(&inode->i_mutex);
> -
> - inode->i_ctime = CURRENT_TIME;
> - drop_nlink(inode);
> - if (sysfs_type(sd) == SYSFS_DIR)
> - drop_nlink(inode);
> -
> - mutex_unlock(&inode->i_mutex);
> -
> - iput(inode);
> }
>
> /**
> @@ -621,25 +549,15 @@ static void sysfs_dec_nlink(struct sysfs_dirent *sd)
> *
> * Finish up sysfs_dirent add/remove. Resources acquired by
> * sysfs_addrm_start() are released and removed sysfs_dirents are
> - * cleaned up. Timestamps on the parent inode are updated.
> + * cleaned up.
> *
> * LOCKING:
> - * All mutexes acquired by sysfs_addrm_start() are released.
> + * sysfs_mutex is released.
> */
> void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt)
> {
> /* release resources acquired by sysfs_addrm_start() */
> mutex_unlock(&sysfs_mutex);
> - if (acxt->parent_inode) {
> - struct inode *inode = acxt->parent_inode;
> -
> - /* if added/removed, update timestamps on the parent */
> - if (acxt->cnt)
> - inode->i_ctime = inode->i_mtime = CURRENT_TIME;
> -
> - mutex_unlock(&inode->i_mutex);
> - iput(inode);
> - }
>
> /* kill removed sysfs_dirents */
> while (acxt->removed) {
> @@ -648,7 +566,6 @@ void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt)
> acxt->removed = sd->s_sibling;
> sd->s_sibling = NULL;
>
> - sysfs_dec_nlink(sd);
> sysfs_deactivate(sd);
> unmap_bin_file(sd);
> sysfs_put(sd);
> diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h
> index 12ccc07..90b3501 100644
> --- a/fs/sysfs/sysfs.h
> +++ b/fs/sysfs/sysfs.h
> @@ -89,9 +89,7 @@ static inline unsigned int sysfs_type(struct sysfs_dirent *sd)
> */
> struct sysfs_addrm_cxt {
> struct sysfs_dirent *parent_sd;
> - struct inode *parent_inode;
> struct sysfs_dirent *removed;
> - int cnt;
> };
>
> /*
> --
> 1.6.5.2.143.g8cc62
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2009-11-04 4:32 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-03 11:53 [PATCH 0/13] sysfs lazification Eric W. Biederman
2009-11-03 11:56 ` [PATCH 01/13] sysfs: Update sysfs_setxattr so it updates secdata under the sysfs_mutex Eric W. Biederman
2009-11-03 13:48 ` Serge E. Hallyn
2009-11-03 21:09 ` Eric W. Biederman
2009-11-03 21:31 ` Serge E. Hallyn
2009-11-03 22:13 ` Eric W. Biederman
2009-11-07 2:27 ` Tejun Heo
2009-11-03 11:56 ` [PATCH 02/13] sysfs: Rename sysfs_d_iput to sysfs_dentry_iput Eric W. Biederman
2009-11-04 4:33 ` Serge E. Hallyn
2009-11-03 11:56 ` [PATCH 03/13] sysfs: Use dentry_ops instead of directly playing with the dcache Eric W. Biederman
2009-11-03 22:27 ` Serge E. Hallyn
2009-11-03 11:57 ` [PATCH 04/13] sysfs: Simplify sysfs_chmod_file semantics Eric W. Biederman
2009-11-04 2:43 ` Serge E. Hallyn
2009-11-04 3:42 ` Eric W. Biederman
2009-11-04 4:55 ` Serge E. Hallyn
2009-11-03 11:57 ` [PATCH 05/13] sysfs: Simplify iattr time assignments Eric W. Biederman
2009-11-04 2:57 ` Serge E. Hallyn
2009-11-03 11:57 ` [PATCH 06/13] sysfs: Fix locking and factor out sysfs_sd_setattr Eric W. Biederman
2009-11-04 3:16 ` Serge E. Hallyn
2009-11-04 3:49 ` Eric W. Biederman
2009-11-04 12:56 ` Eric W. Biederman
2009-11-03 11:57 ` [PATCH 07/13] sysfs: Update s_iattr on link and unlink Eric W. Biederman
2009-11-04 3:54 ` Serge E. Hallyn
2009-11-04 4:11 ` Eric W. Biederman
2009-11-04 4:58 ` Serge E. Hallyn
2009-11-03 11:57 ` [PATCH 08/13] sysfs: Nicely indent sysfs_symlink_inode_operations Eric W. Biederman
2009-11-04 4:33 ` Serge E. Hallyn
2009-11-03 11:57 ` [PATCH 09/13] sysfs: Implement sysfs_getattr & sysfs_permission Eric W. Biederman
2009-11-04 4:20 ` Serge E. Hallyn
2009-11-04 5:50 ` Eric W. Biederman
2009-11-04 14:24 ` Serge E. Hallyn
2009-11-07 2:06 ` Tejun Heo
2009-11-08 6:04 ` Eric W. Biederman
2009-11-03 11:57 ` [PATCH 10/13] sysfs: In sysfs_chmod_file lazily propagate the mode change Eric W. Biederman
2009-11-04 4:23 ` Serge E. Hallyn
2009-11-03 11:57 ` [PATCH 11/13] sysfs: Gut sysfs_addrm_start and sysfs_addrm_finish Eric W. Biederman
2009-11-04 4:32 ` Serge E. Hallyn [this message]
2009-11-07 2:08 ` Tejun Heo
2009-11-03 11:57 ` [PATCH 12/13] sysfs: Propagate renames to the vfs on demand Eric W. Biederman
2009-11-04 21:49 ` Serge E. Hallyn
2009-11-04 21:59 ` Eric W. Biederman
2009-11-07 2:11 ` Tejun Heo
2009-11-07 2:16 ` Eric W. Biederman
2009-11-07 2:20 ` Tejun Heo
2009-11-07 2:34 ` Eric W. Biederman
2009-11-07 11:12 ` Miklos Szeredi
2009-11-07 11:57 ` Eric W. Biederman
2009-11-09 14:14 ` Serge E. Hallyn
2009-11-09 22:34 ` Eric Biederman
2009-11-03 11:57 ` [PATCH 13/13] sysfs: Factor out sysfs_rename from sysfs_rename_dir and sysfs_move_dir Eric W. Biederman
2009-11-04 22:19 ` Serge E. Hallyn
2009-11-04 22:23 ` Eric W. Biederman
2009-11-04 22:37 ` Serge E. Hallyn
2009-11-05 4:51 ` Eric W. Biederman
2009-11-04 12:04 ` [PATCH 14/13] sysfs: sysfs_setattr remove unnecessary permission check Eric W. Biederman
2009-11-04 14:25 ` Serge E. Hallyn
2009-11-07 2:18 ` Tejun Heo
2009-11-04 12:05 ` [PATCH 15/13] sysfs: Protect sysfs_refresh_inode with inode mutex Eric W. Biederman
2009-11-04 14:27 ` Serge E. Hallyn
2009-11-04 20:51 ` Eric W. Biederman
2009-11-07 2:26 ` Tejun Heo
2009-11-08 7:04 ` Eric W. Biederman
2009-11-06 22:48 ` [PATCH 0/13] sysfs lazification Greg KH
2009-11-08 7:06 ` Eric W. Biederman
2009-11-17 9:11 ` Eric W. Biederman
2009-11-17 15:41 ` Greg KH
2009-11-17 15:56 ` Eric W. Biederman
2009-11-08 7:25 ` [PATCH 0/15] sysfs lazification final Eric W. Biederman
2009-11-08 7:26 ` [PATCH 01/15] sysfs: Update sysfs_setxattr so it updates secdata under the sysfs_mutex Eric W. Biederman
2009-11-08 7:27 ` [PATCH 02/15] sysfs: Rename sysfs_d_iput to sysfs_dentry_iput Eric W. Biederman
2009-11-08 7:27 ` [PATCH 03/15] sysfs: Use dentry_ops instead of directly playing with the dcache Eric W. Biederman
2009-11-08 7:27 ` [PATCH 04/15] sysfs: Simplify sysfs_chmod_file semantics Eric W. Biederman
2009-11-08 7:27 ` [PATCH 05/15] sysfs: Simplify iattr time assignments Eric W. Biederman
2009-11-08 7:27 ` [PATCH 06/15] sysfs: Fix locking and factor out sysfs_sd_setattr Eric W. Biederman
2009-11-09 14:26 ` Serge E. Hallyn
2009-11-20 20:13 ` Greg KH
2009-11-20 21:39 ` Eric W. Biederman
2009-11-21 0:07 ` Eric W. Biederman
2009-11-21 5:12 ` Greg KH
2009-11-08 7:27 ` [PATCH 07/15] sysfs: Update s_iattr on link and unlink Eric W. Biederman
2009-11-08 7:27 ` [PATCH 08/15] sysfs: Nicely indent sysfs_symlink_inode_operations Eric W. Biederman
2009-11-08 7:27 ` [PATCH 09/15] sysfs: Implement sysfs_getattr & sysfs_permission Eric W. Biederman
2009-11-08 7:27 ` [PATCH 10/15] sysfs: In sysfs_chmod_file lazily propagate the mode change Eric W. Biederman
2009-11-08 7:27 ` [PATCH 11/15] sysfs: Gut sysfs_addrm_start and sysfs_addrm_finish Eric W. Biederman
2009-11-08 7:27 ` [PATCH 12/15] sysfs: Propagate renames to the vfs on demand Eric W. Biederman
2009-11-08 7:27 ` [PATCH 13/15] sysfs: Factor out sysfs_rename from sysfs_rename_dir and sysfs_move_dir Eric W. Biederman
2009-11-08 7:27 ` [PATCH 14/15] sysfs: sysfs_setattr remove unnecessary permission check Eric W. Biederman
2009-11-08 7:27 ` [PATCH 15/15] sysfs: Protect sysfs_refresh_inode with inode mutex Eric W. Biederman
2009-11-09 3:57 ` [PATCH 0/15] sysfs lazification final Tejun Heo
2009-11-30 21:33 ` Greg KH
2009-11-30 21:53 ` Greg KH
2009-12-01 0:12 ` Eric W. Biederman
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=20091104043249.GG27639@us.ibm.com \
--to=serue@us.ibm.com \
--cc=bcrl@lhnet.ca \
--cc=cornelia.huck@de.ibm.com \
--cc=ebiederm@aristanetworks.com \
--cc=ebiederm@xmission.com \
--cc=eric.dumazet@gmail.com \
--cc=greg@kroah.com \
--cc=gregkh@suse.de \
--cc=kay.sievers@vrfy.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.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 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).