diff options
| author | Patrick Mochel <mochel@osdl.org> | 2002-07-29 21:11:50 -0700 |
|---|---|---|
| committer | Patrick Mochel <mochel@osdl.org> | 2002-07-29 21:11:50 -0700 |
| commit | 5add6eb0a426df8b1bea751f2cf19b9acac3878d (patch) | |
| tree | 94e8497dd096079a97eced591f8d11415ea218e1 /fs | |
| parent | 9a8e1340d3386b4abe4ee16c0f5509179b2a1665 (diff) | |
driverfs: Do hashed lookup of dentry's when deleting a driverfs file (instead of searching the list we keep)
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/driverfs/inode.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/fs/driverfs/inode.c b/fs/driverfs/inode.c index 83c4666128d6..20e761b40da1 100644 --- a/fs/driverfs/inode.c +++ b/fs/driverfs/inode.c @@ -724,26 +724,29 @@ int driverfs_create_symlink(struct driver_dir_entry * parent, */ void driverfs_remove_file(struct driver_dir_entry * dir, const char * name) { - struct list_head * node; + struct dentry * dentry; + struct qstr qstr; if (!dir->dentry) return; down(&dir->dentry->d_inode->i_sem); + qstr.name = name; + qstr.len = strlen(name); + qstr.hash = full_name_hash(name,qstr.len); + dentry = lookup_hash(&qstr,dir->dentry); - node = dir->files.next; - while (node != &dir->files) { - struct driver_file_entry * entry = NULL; - - entry = list_entry(node,struct driver_file_entry,node); - if (!strcmp(entry->name,name)) { - list_del_init(node); - driverfs_unlink(entry->dentry->d_parent->d_inode,entry->dentry); - dput(entry->dentry); + if (!IS_ERR(dentry)) { + struct driver_file_entry * entry = dentry->d_fsdata; + + /* make sure dentry is really there */ + if (dentry->d_inode && + (dentry->d_parent->d_inode == dir->dentry->d_inode)) { + list_del_init(&entry->node); + driverfs_unlink(dir->dentry->d_inode,dentry); + dput(dir->dentry); put_mount(); - break; } - node = node->next; } up(&dir->dentry->d_inode->i_sem); } |
