diff options
| author | Patrick Mochel <mochel@osdl.org> | 2002-11-21 01:50:58 -0600 |
|---|---|---|
| committer | Patrick Mochel <mochel@osdl.org> | 2002-11-21 01:50:58 -0600 |
| commit | 35551cf5753fe89869f24fc06f6b787b02a10acc (patch) | |
| tree | 7a1d6af75ffb6f43452b9e3e47c48dca2542c0b0 | |
| parent | 24fbb9949b3a3e6008981532a49d0774619854a4 (diff) | |
sysfs: fix file deletion again.
After looking into again, I realize that I was again getting file and
directory deletion a little wrong. This patch should go back to mimmicking
the VFS again.
- The extra dget() in sysfs_mknod() and sysfs_symlink() has been readded.
This is identical to the way ramfs does creation.
- We do d_delete() after simple_unlink() and simple_rmdir(), instead of
d_invalidate() before it. This is how vfs_rmdir() and vfs_unlink() do it,
and the way we used to.
| -rw-r--r-- | fs/sysfs/inode.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index 73633052e993..2b914285eeaf 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c @@ -96,9 +96,10 @@ static int sysfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t if (!dentry->d_inode) { inode = sysfs_get_inode(dir->i_sb, mode, dev); - if (inode) + if (inode) { d_instantiate(dentry, inode); - else + dget(dentry); + } else error = -ENOSPC; } else error = -EEXIST; @@ -135,9 +136,10 @@ static int sysfs_symlink(struct inode * dir, struct dentry *dentry, const char * if (inode) { int l = strlen(symname)+1; error = page_symlink(inode, symname, l); - if (!error) + if (!error) { d_instantiate(dentry, inode); - else + dget(dentry); + } else iput(inode); } return error; @@ -571,8 +573,8 @@ static void 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)) { - d_invalidate(victim); simple_unlink(dir->d_inode,victim); + d_delete(victim); } } up(&dir->d_inode->i_sem); @@ -631,15 +633,15 @@ void sysfs_remove_dir(struct kobject * kobj) struct dentry * d = list_entry(node,struct dentry,d_child); /* make sure dentry is still there */ if (d->d_inode) { - d_invalidate(d); simple_unlink(dentry->d_inode,d); + d_delete(dentry); } } up(&dentry->d_inode->i_sem); d_invalidate(dentry); simple_rmdir(parent->d_inode,dentry); - + d_delete(dentry); up(&parent->d_inode->i_sem); dput(parent); } |
