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; |
