summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Mochel <mochel@osdl.org>2002-11-21 01:50:58 -0600
committerPatrick Mochel <mochel@osdl.org>2002-11-21 01:50:58 -0600
commit35551cf5753fe89869f24fc06f6b787b02a10acc (patch)
tree7a1d6af75ffb6f43452b9e3e47c48dca2542c0b0
parent24fbb9949b3a3e6008981532a49d0774619854a4 (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.c16
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);
}