Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=380e6fbb729a55b73d5d8409551474884e0d93fc
Commit:     380e6fbb729a55b73d5d8409551474884e0d93fc
Parent:     b402d72cf7b338a074e3c12b305ec79284e18845
Author:     Tejun Heo <[EMAIL PROTECTED]>
AuthorDate: Thu Jun 14 04:27:22 2007 +0900
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Wed Jul 11 16:09:08 2007 -0700

    sysfs: implement SYSFS_FLAG_REMOVED flag
    
    Implement SYSFS_FLAG_REMOVED flag which currently is used only to
    improve sanity check in sysfs_deactivate().  The flag will be used to
    make directory entries reclamiable.
    
    Signed-off-by: Tejun Heo <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 fs/sysfs/dir.c        |    4 +++-
 fs/sysfs/inode.c      |    1 +
 include/linux/sysfs.h |    1 +
 3 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index eb9bc0a..f2ea006 100644
--- a/fs/sysfs/dir.c
+++ b/fs/sysfs/dir.c
@@ -171,7 +171,7 @@ void sysfs_deactivate(struct sysfs_dirent *sd)
        DECLARE_COMPLETION_ONSTACK(wait);
        int v;
 
-       BUG_ON(sd->s_sibling);
+       BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED));
        sd->s_sibling = (void *)&wait;
 
        /* atomic_add_return() is a mb(), put_active() will always see
@@ -506,6 +506,7 @@ static void remove_dir(struct dentry * d)
        mutex_lock(&parent->d_inode->i_mutex);
 
        sysfs_unlink_sibling(sd);
+       sd->s_flags |= SYSFS_FLAG_REMOVED;
 
        pr_debug(" o %s removing done (%d)\n",d->d_name.name,
                 atomic_read(&d->d_count));
@@ -540,6 +541,7 @@ static void __sysfs_remove_dir(struct dentry *dentry)
                struct sysfs_dirent *sd = *pos;
 
                if (sysfs_type(sd) && (sysfs_type(sd) & SYSFS_NOT_PINNED)) {
+                       sd->s_flags |= SYSFS_FLAG_REMOVED;
                        *pos = sd->s_sibling;
                        sd->s_sibling = removed;
                        removed = sd;
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c
index ee3a5d9..e2f6ef1 100644
--- a/fs/sysfs/inode.c
+++ b/fs/sysfs/inode.c
@@ -296,6 +296,7 @@ int sysfs_hash_and_remove(struct dentry * dir, const char * 
name)
                if (!sysfs_type(sd))
                        continue;
                if (!strcmp(sd->s_name, name)) {
+                       sd->s_flags |= SYSFS_FLAG_REMOVED;
                        *pos = sd->s_sibling;
                        sd->s_sibling = NULL;
                        found = 1;
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
index 5813550..2a6df64 100644
--- a/include/linux/sysfs.h
+++ b/include/linux/sysfs.h
@@ -84,6 +84,7 @@ struct sysfs_ops {
 #define SYSFS_COPY_NAME                (SYSFS_DIR | SYSFS_KOBJ_LINK)
 
 #define SYSFS_FLAG_MASK                ~SYSFS_TYPE_MASK
+#define SYSFS_FLAG_REMOVED     0x0100
 
 #ifdef CONFIG_SYSFS
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to