diff options
| author | Nick Piggin <npiggin@kernel.dk> | 2011-01-07 01:49:29 -0500 |
|---|---|---|
| committer | Nick Piggin <npiggin@kernel.dk> | 2011-01-07 01:50:20 -0500 |
| commit | ec2447c278ee973d35f38e53ca16ba7f965ae33d (patch) | |
| tree | 5d17a0523c301b8c71c0f198ffe7782c5e9c0ea9 /fs/hostfs | |
| parent | b1e6a015a580ad145689ad1d6b4aa0e03e6c868b (diff) | |
hostfs: simplify locking
Remove dcache_lock locking from hostfs filesystem, and move it into dcache
helpers. All that is required is a coherent path name. Protection from
concurrent modification of the namespace after path name generation is not
provided in current code, because dcache_lock is dropped before the path is
used.
Signed-off-by: Nick Piggin <npiggin@kernel.dk>
Diffstat (limited to 'fs/hostfs')
| -rw-r--r-- | fs/hostfs/hostfs_kern.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index cfe8bc7de511..39dc505ed273 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
| @@ -92,12 +92,10 @@ __uml_setup("hostfs=", hostfs_args, | |||
| 92 | 92 | ||
| 93 | static char *__dentry_name(struct dentry *dentry, char *name) | 93 | static char *__dentry_name(struct dentry *dentry, char *name) |
| 94 | { | 94 | { |
| 95 | char *p = __dentry_path(dentry, name, PATH_MAX); | 95 | char *p = dentry_path_raw(dentry, name, PATH_MAX); |
| 96 | char *root; | 96 | char *root; |
| 97 | size_t len; | 97 | size_t len; |
| 98 | 98 | ||
| 99 | spin_unlock(&dcache_lock); | ||
| 100 | |||
| 101 | root = dentry->d_sb->s_fs_info; | 99 | root = dentry->d_sb->s_fs_info; |
| 102 | len = strlen(root); | 100 | len = strlen(root); |
| 103 | if (IS_ERR(p)) { | 101 | if (IS_ERR(p)) { |
| @@ -123,25 +121,23 @@ static char *dentry_name(struct dentry *dentry) | |||
| 123 | if (!name) | 121 | if (!name) |
| 124 | return NULL; | 122 | return NULL; |
| 125 | 123 | ||
| 126 | spin_lock(&dcache_lock); | ||
| 127 | return __dentry_name(dentry, name); /* will unlock */ | 124 | return __dentry_name(dentry, name); /* will unlock */ |
| 128 | } | 125 | } |
| 129 | 126 | ||
| 130 | static char *inode_name(struct inode *ino) | 127 | static char *inode_name(struct inode *ino) |
| 131 | { | 128 | { |
| 132 | struct dentry *dentry; | 129 | struct dentry *dentry; |
| 133 | char *name = __getname(); | 130 | char *name; |
| 134 | if (!name) | ||
| 135 | return NULL; | ||
| 136 | 131 | ||
| 137 | spin_lock(&dcache_lock); | 132 | dentry = d_find_alias(ino); |
| 138 | if (list_empty(&ino->i_dentry)) { | 133 | if (!dentry) |
| 139 | spin_unlock(&dcache_lock); | ||
| 140 | __putname(name); | ||
| 141 | return NULL; | 134 | return NULL; |
| 142 | } | 135 | |
| 143 | dentry = list_first_entry(&ino->i_dentry, struct dentry, d_alias); | 136 | name = dentry_name(dentry); |
| 144 | return __dentry_name(dentry, name); /* will unlock */ | 137 | |
| 138 | dput(dentry); | ||
| 139 | |||
| 140 | return name; | ||
| 145 | } | 141 | } |
| 146 | 142 | ||
| 147 | static char *follow_link(char *link) | 143 | static char *follow_link(char *link) |
