]> git.neil.brown.name Git - history.git/commitdiff
sysfs: fix BUG()s on directory creation and removal.
authorPatrick Mochel <mochel@osdl.org>
Tue, 11 Mar 2003 09:30:19 +0000 (03:30 -0600)
committerPatrick Mochel <mochel@osdl.org>
Tue, 11 Mar 2003 09:30:19 +0000 (03:30 -0600)
- Don't d_delete() files when removing a directory - they must still be
  hashed when dput() reaps them, and it will __d_drop() them anyway.

- Don't d_invalidate() the directory on removal.

- do simple_rmdir() after d_delete() on directory.

- Remove extra dput(), which was causing refcount to go negative, causing
  an oops when someone tried to create the directory again.

- Make sure we don't d_delete() or do extra dput() on file when updating,
  either.

fs/sysfs/dir.c
fs/sysfs/inode.c

index c3f40c2c317f124de97f17b0c78c61c1f784f9a3..1ca3a06db1df1586649d824ac9d49d58d73b79dd 100644 (file)
@@ -98,7 +98,6 @@ void sysfs_remove_dir(struct kobject * kobj)
                         * Unlink and unhash.
                         */
                        spin_unlock(&dcache_lock);
-                       d_delete(d);
                        simple_unlink(dentry->d_inode,d);
                        dput(d);
                        spin_lock(&dcache_lock);
@@ -108,16 +107,11 @@ void sysfs_remove_dir(struct kobject * kobj)
        }
        spin_unlock(&dcache_lock);
        up(&dentry->d_inode->i_sem);
-       d_invalidate(dentry);
-       simple_rmdir(parent->d_inode,dentry);
        d_delete(dentry);
+       simple_rmdir(parent->d_inode,dentry);
 
        pr_debug(" o %s removing done (%d)\n",dentry->d_name.name,
                 atomic_read(&dentry->d_count));
-       /**
-        * Drop reference from initial sysfs_get_dentry().
-        */
-       dput(dentry);
 
        /**
         * Drop reference from dget() on entrance.
index 1c87b5507fa1e9506fa8a13820b7f281f2f50181..09c99fb77ff62bb918c46d8a22bc150eb9617065 100644 (file)
@@ -93,19 +93,14 @@ void sysfs_hash_and_remove(struct dentry * dir, const char * name)
                /* make sure dentry is really there */
                if (victim->d_inode && 
                    (victim->d_parent->d_inode == dir->d_inode)) {
-                       simple_unlink(dir->d_inode,victim);
-                       d_delete(victim);
-
                        pr_debug("sysfs: Removing %s (%d)\n", victim->d_name.name,
                                 atomic_read(&victim->d_count));
-                       /*
-                        * Drop reference from initial sysfs_get_dentry().
-                        */
-                       dput(victim);
+
+                       simple_unlink(dir->d_inode,victim);
+
                }
-               
-               /**
-                * Drop the reference acquired from sysfs_get_dentry() above.
+               /*
+                * Drop reference from sysfs_get_dentry() above.
                 */
                dput(victim);
        }