diff options
Diffstat (limited to 'fs/logfs/inode.c')
| -rw-r--r-- | fs/logfs/inode.c | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/fs/logfs/inode.c b/fs/logfs/inode.c index f602e230e162..d8c71ece098f 100644 --- a/fs/logfs/inode.c +++ b/fs/logfs/inode.c | |||
| @@ -235,33 +235,21 @@ static struct inode *logfs_alloc_inode(struct super_block *sb) | |||
| 235 | * purpose is to create a new inode that will not trigger the warning if such | 235 | * purpose is to create a new inode that will not trigger the warning if such |
| 236 | * an inode is still in use. An ugly hack, no doubt. Suggections for | 236 | * an inode is still in use. An ugly hack, no doubt. Suggections for |
| 237 | * improvement are welcome. | 237 | * improvement are welcome. |
| 238 | * | ||
| 239 | * AV: that's what ->put_super() is for... | ||
| 238 | */ | 240 | */ |
| 239 | struct inode *logfs_new_meta_inode(struct super_block *sb, u64 ino) | 241 | struct inode *logfs_new_meta_inode(struct super_block *sb, u64 ino) |
| 240 | { | 242 | { |
| 241 | struct inode *inode; | 243 | struct inode *inode; |
| 242 | 244 | ||
| 243 | inode = logfs_alloc_inode(sb); | 245 | inode = new_inode(sb); |
| 244 | if (!inode) | 246 | if (!inode) |
| 245 | return ERR_PTR(-ENOMEM); | 247 | return ERR_PTR(-ENOMEM); |
| 246 | 248 | ||
| 247 | inode->i_mode = S_IFREG; | 249 | inode->i_mode = S_IFREG; |
| 248 | inode->i_ino = ino; | 250 | inode->i_ino = ino; |
| 249 | inode->i_sb = sb; | 251 | inode->i_data.a_ops = &logfs_reg_aops; |
| 250 | 252 | mapping_set_gfp_mask(&inode->i_data, GFP_NOFS); | |
| 251 | /* This is a blatant copy of alloc_inode code. We'd need alloc_inode | ||
| 252 | * to be nonstatic, alas. */ | ||
| 253 | { | ||
| 254 | struct address_space * const mapping = &inode->i_data; | ||
| 255 | |||
| 256 | mapping->a_ops = &logfs_reg_aops; | ||
| 257 | mapping->host = inode; | ||
| 258 | mapping->flags = 0; | ||
| 259 | mapping_set_gfp_mask(mapping, GFP_NOFS); | ||
| 260 | mapping->assoc_mapping = NULL; | ||
| 261 | mapping->backing_dev_info = &default_backing_dev_info; | ||
| 262 | inode->i_mapping = mapping; | ||
| 263 | inode->i_nlink = 1; | ||
| 264 | } | ||
| 265 | 253 | ||
| 266 | return inode; | 254 | return inode; |
| 267 | } | 255 | } |
| @@ -277,7 +265,7 @@ struct inode *logfs_read_meta_inode(struct super_block *sb, u64 ino) | |||
| 277 | 265 | ||
| 278 | err = logfs_read_inode(inode); | 266 | err = logfs_read_inode(inode); |
| 279 | if (err) { | 267 | if (err) { |
| 280 | destroy_meta_inode(inode); | 268 | iput(inode); |
| 281 | return ERR_PTR(err); | 269 | return ERR_PTR(err); |
| 282 | } | 270 | } |
| 283 | logfs_inode_setops(inode); | 271 | logfs_inode_setops(inode); |
| @@ -298,18 +286,8 @@ static int logfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 298 | return ret; | 286 | return ret; |
| 299 | } | 287 | } |
| 300 | 288 | ||
| 301 | void destroy_meta_inode(struct inode *inode) | ||
| 302 | { | ||
| 303 | if (inode) { | ||
| 304 | if (inode->i_data.nrpages) | ||
| 305 | truncate_inode_pages(&inode->i_data, 0); | ||
| 306 | logfs_clear_inode(inode); | ||
| 307 | kmem_cache_free(logfs_inode_cache, logfs_inode(inode)); | ||
| 308 | } | ||
| 309 | } | ||
| 310 | |||
| 311 | /* called with inode_lock held */ | 289 | /* called with inode_lock held */ |
| 312 | static void logfs_drop_inode(struct inode *inode) | 290 | static int logfs_drop_inode(struct inode *inode) |
| 313 | { | 291 | { |
| 314 | struct logfs_super *super = logfs_super(inode->i_sb); | 292 | struct logfs_super *super = logfs_super(inode->i_sb); |
| 315 | struct logfs_inode *li = logfs_inode(inode); | 293 | struct logfs_inode *li = logfs_inode(inode); |
| @@ -317,7 +295,7 @@ static void logfs_drop_inode(struct inode *inode) | |||
| 317 | spin_lock(&logfs_inode_lock); | 295 | spin_lock(&logfs_inode_lock); |
| 318 | list_move(&li->li_freeing_list, &super->s_freeing_list); | 296 | list_move(&li->li_freeing_list, &super->s_freeing_list); |
| 319 | spin_unlock(&logfs_inode_lock); | 297 | spin_unlock(&logfs_inode_lock); |
| 320 | generic_drop_inode(inode); | 298 | return generic_drop_inode(inode); |
| 321 | } | 299 | } |
| 322 | 300 | ||
| 323 | static void logfs_set_ino_generation(struct super_block *sb, | 301 | static void logfs_set_ino_generation(struct super_block *sb, |
| @@ -384,12 +362,21 @@ static int logfs_sync_fs(struct super_block *sb, int wait) | |||
| 384 | return 0; | 362 | return 0; |
| 385 | } | 363 | } |
| 386 | 364 | ||
| 365 | static void logfs_put_super(struct super_block *sb) | ||
| 366 | { | ||
| 367 | struct logfs_super *super = logfs_super(sb); | ||
| 368 | /* kill the meta-inodes */ | ||
| 369 | iput(super->s_master_inode); | ||
| 370 | iput(super->s_segfile_inode); | ||
| 371 | iput(super->s_mapping_inode); | ||
| 372 | } | ||
| 373 | |||
| 387 | const struct super_operations logfs_super_operations = { | 374 | const struct super_operations logfs_super_operations = { |
| 388 | .alloc_inode = logfs_alloc_inode, | 375 | .alloc_inode = logfs_alloc_inode, |
| 389 | .clear_inode = logfs_clear_inode, | ||
| 390 | .delete_inode = logfs_delete_inode, | ||
| 391 | .destroy_inode = logfs_destroy_inode, | 376 | .destroy_inode = logfs_destroy_inode, |
| 377 | .evict_inode = logfs_evict_inode, | ||
| 392 | .drop_inode = logfs_drop_inode, | 378 | .drop_inode = logfs_drop_inode, |
| 379 | .put_super = logfs_put_super, | ||
| 393 | .write_inode = logfs_write_inode, | 380 | .write_inode = logfs_write_inode, |
| 394 | .statfs = logfs_statfs, | 381 | .statfs = logfs_statfs, |
| 395 | .sync_fs = logfs_sync_fs, | 382 | .sync_fs = logfs_sync_fs, |
