diff options
Diffstat (limited to 'fs/coda/inode.c')
-rw-r--r-- | fs/coda/inode.c | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/fs/coda/inode.c b/fs/coda/inode.c index 0553f3bd7b1b..b7fa3e3d772f 100644 --- a/fs/coda/inode.c +++ b/fs/coda/inode.c | |||
@@ -150,8 +150,6 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) | |||
150 | int error; | 150 | int error; |
151 | int idx; | 151 | int idx; |
152 | 152 | ||
153 | lock_kernel(); | ||
154 | |||
155 | idx = get_device_index((struct coda_mount_data *) data); | 153 | idx = get_device_index((struct coda_mount_data *) data); |
156 | 154 | ||
157 | /* Ignore errors in data, for backward compatibility */ | 155 | /* Ignore errors in data, for backward compatibility */ |
@@ -161,23 +159,26 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) | |||
161 | printk(KERN_INFO "coda_read_super: device index: %i\n", idx); | 159 | printk(KERN_INFO "coda_read_super: device index: %i\n", idx); |
162 | 160 | ||
163 | vc = &coda_comms[idx]; | 161 | vc = &coda_comms[idx]; |
162 | lock_kernel(); | ||
163 | |||
164 | if (!vc->vc_inuse) { | 164 | if (!vc->vc_inuse) { |
165 | printk("coda_read_super: No pseudo device\n"); | 165 | printk("coda_read_super: No pseudo device\n"); |
166 | unlock_kernel(); | 166 | error = -EINVAL; |
167 | return -EINVAL; | 167 | goto unlock_out; |
168 | } | 168 | } |
169 | 169 | ||
170 | if ( vc->vc_sb ) { | 170 | if (vc->vc_sb) { |
171 | printk("coda_read_super: Device already mounted\n"); | 171 | printk("coda_read_super: Device already mounted\n"); |
172 | unlock_kernel(); | 172 | error = -EBUSY; |
173 | return -EBUSY; | 173 | goto unlock_out; |
174 | } | 174 | } |
175 | 175 | ||
176 | error = bdi_setup_and_register(&vc->bdi, "coda", BDI_CAP_MAP_COPY); | 176 | error = bdi_setup_and_register(&vc->bdi, "coda", BDI_CAP_MAP_COPY); |
177 | if (error) | 177 | if (error) |
178 | goto bdi_err; | 178 | goto unlock_out; |
179 | 179 | ||
180 | vc->vc_sb = sb; | 180 | vc->vc_sb = sb; |
181 | unlock_kernel(); | ||
181 | 182 | ||
182 | sb->s_fs_info = vc; | 183 | sb->s_fs_info = vc; |
183 | sb->s_flags |= MS_NOATIME; | 184 | sb->s_flags |= MS_NOATIME; |
@@ -206,21 +207,23 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) | |||
206 | printk("coda_read_super: rootinode is %ld dev %s\n", | 207 | printk("coda_read_super: rootinode is %ld dev %s\n", |
207 | root->i_ino, root->i_sb->s_id); | 208 | root->i_ino, root->i_sb->s_id); |
208 | sb->s_root = d_alloc_root(root); | 209 | sb->s_root = d_alloc_root(root); |
209 | if (!sb->s_root) | 210 | if (!sb->s_root) { |
211 | error = -EINVAL; | ||
210 | goto error; | 212 | goto error; |
211 | unlock_kernel(); | 213 | } |
212 | return 0; | 214 | return 0; |
213 | 215 | ||
214 | error: | 216 | error: |
215 | bdi_destroy(&vc->bdi); | ||
216 | bdi_err: | ||
217 | if (root) | 217 | if (root) |
218 | iput(root); | 218 | iput(root); |
219 | if (vc) | ||
220 | vc->vc_sb = NULL; | ||
221 | 219 | ||
220 | lock_kernel(); | ||
221 | bdi_destroy(&vc->bdi); | ||
222 | vc->vc_sb = NULL; | ||
223 | sb->s_fs_info = NULL; | ||
224 | unlock_out: | ||
222 | unlock_kernel(); | 225 | unlock_kernel(); |
223 | return -EINVAL; | 226 | return error; |
224 | } | 227 | } |
225 | 228 | ||
226 | static void coda_put_super(struct super_block *sb) | 229 | static void coda_put_super(struct super_block *sb) |
@@ -253,8 +256,6 @@ int coda_setattr(struct dentry *de, struct iattr *iattr) | |||
253 | struct coda_vattr vattr; | 256 | struct coda_vattr vattr; |
254 | int error; | 257 | int error; |
255 | 258 | ||
256 | lock_kernel(); | ||
257 | |||
258 | memset(&vattr, 0, sizeof(vattr)); | 259 | memset(&vattr, 0, sizeof(vattr)); |
259 | 260 | ||
260 | inode->i_ctime = CURRENT_TIME_SEC; | 261 | inode->i_ctime = CURRENT_TIME_SEC; |
@@ -264,13 +265,10 @@ int coda_setattr(struct dentry *de, struct iattr *iattr) | |||
264 | /* Venus is responsible for truncating the container-file!!! */ | 265 | /* Venus is responsible for truncating the container-file!!! */ |
265 | error = venus_setattr(inode->i_sb, coda_i2f(inode), &vattr); | 266 | error = venus_setattr(inode->i_sb, coda_i2f(inode), &vattr); |
266 | 267 | ||
267 | if ( !error ) { | 268 | if (!error) { |
268 | coda_vattr_to_iattr(inode, &vattr); | 269 | coda_vattr_to_iattr(inode, &vattr); |
269 | coda_cache_clear_inode(inode); | 270 | coda_cache_clear_inode(inode); |
270 | } | 271 | } |
271 | |||
272 | unlock_kernel(); | ||
273 | |||
274 | return error; | 272 | return error; |
275 | } | 273 | } |
276 | 274 | ||
@@ -284,12 +282,8 @@ static int coda_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
284 | { | 282 | { |
285 | int error; | 283 | int error; |
286 | 284 | ||
287 | lock_kernel(); | ||
288 | |||
289 | error = venus_statfs(dentry, buf); | 285 | error = venus_statfs(dentry, buf); |
290 | 286 | ||
291 | unlock_kernel(); | ||
292 | |||
293 | if (error) { | 287 | if (error) { |
294 | /* fake something like AFS does */ | 288 | /* fake something like AFS does */ |
295 | buf->f_blocks = 9000000; | 289 | buf->f_blocks = 9000000; |