diff options
author | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-11-12 08:42:04 -0500 |
---|---|---|
committer | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-11-19 20:05:48 -0500 |
commit | 5731e191f254af9135ad843119804a500528ecf3 (patch) | |
tree | 1ababce01647674af0e9c6bfb36f5ab5e96ab76c /fs/nilfs2 | |
parent | 9cb4e0d2b99e8b0e5e269d898ae6ab1967647c5a (diff) |
nilfs2: add size option of private object to metadata file allocator
This adds an optional "object size" argument to nilfs_mdt_new_common()
function; the argument specifies the size of private object attached
to a newly allocated metadata file inode.
This will afford space to keep local variables for meta data files.
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Diffstat (limited to 'fs/nilfs2')
-rw-r--r-- | fs/nilfs2/gcinode.c | 3 | ||||
-rw-r--r-- | fs/nilfs2/mdt.c | 19 | ||||
-rw-r--r-- | fs/nilfs2/mdt.h | 5 | ||||
-rw-r--r-- | fs/nilfs2/super.c | 2 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.c | 8 |
5 files changed, 24 insertions, 13 deletions
diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c index e6de0a27ab5d..32b04da03829 100644 --- a/fs/nilfs2/gcinode.c +++ b/fs/nilfs2/gcinode.c | |||
@@ -212,9 +212,10 @@ void nilfs_destroy_gccache(struct the_nilfs *nilfs) | |||
212 | static struct inode *alloc_gcinode(struct the_nilfs *nilfs, ino_t ino, | 212 | static struct inode *alloc_gcinode(struct the_nilfs *nilfs, ino_t ino, |
213 | __u64 cno) | 213 | __u64 cno) |
214 | { | 214 | { |
215 | struct inode *inode = nilfs_mdt_new_common(nilfs, NULL, ino, GFP_NOFS); | 215 | struct inode *inode; |
216 | struct nilfs_inode_info *ii; | 216 | struct nilfs_inode_info *ii; |
217 | 217 | ||
218 | inode = nilfs_mdt_new_common(nilfs, NULL, ino, GFP_NOFS, 0); | ||
218 | if (!inode) | 219 | if (!inode) |
219 | return NULL; | 220 | return NULL; |
220 | 221 | ||
diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c index f6326112d647..62074e8d25cb 100644 --- a/fs/nilfs2/mdt.c +++ b/fs/nilfs2/mdt.c | |||
@@ -445,9 +445,17 @@ static const struct file_operations def_mdt_fops; | |||
445 | * longer than those of the super block structs; they may continue for | 445 | * longer than those of the super block structs; they may continue for |
446 | * several consecutive mounts/umounts. This would need discussions. | 446 | * several consecutive mounts/umounts. This would need discussions. |
447 | */ | 447 | */ |
448 | /** | ||
449 | * nilfs_mdt_new_common - allocate a pseudo inode for metadata file | ||
450 | * @nilfs: nilfs object | ||
451 | * @sb: super block instance the metadata file belongs to | ||
452 | * @ino: inode number | ||
453 | * @gfp_mask: gfp mask for data pages | ||
454 | * @objsz: size of the private object attached to inode->i_private | ||
455 | */ | ||
448 | struct inode * | 456 | struct inode * |
449 | nilfs_mdt_new_common(struct the_nilfs *nilfs, struct super_block *sb, | 457 | nilfs_mdt_new_common(struct the_nilfs *nilfs, struct super_block *sb, |
450 | ino_t ino, gfp_t gfp_mask) | 458 | ino_t ino, gfp_t gfp_mask, size_t objsz) |
451 | { | 459 | { |
452 | struct inode *inode = nilfs_alloc_inode_common(nilfs); | 460 | struct inode *inode = nilfs_alloc_inode_common(nilfs); |
453 | 461 | ||
@@ -455,8 +463,9 @@ nilfs_mdt_new_common(struct the_nilfs *nilfs, struct super_block *sb, | |||
455 | return NULL; | 463 | return NULL; |
456 | else { | 464 | else { |
457 | struct address_space * const mapping = &inode->i_data; | 465 | struct address_space * const mapping = &inode->i_data; |
458 | struct nilfs_mdt_info *mi = kzalloc(sizeof(*mi), GFP_NOFS); | 466 | struct nilfs_mdt_info *mi; |
459 | 467 | ||
468 | mi = kzalloc(max(sizeof(*mi), objsz), GFP_NOFS); | ||
460 | if (!mi) { | 469 | if (!mi) { |
461 | nilfs_destroy_inode(inode); | 470 | nilfs_destroy_inode(inode); |
462 | return NULL; | 471 | return NULL; |
@@ -513,11 +522,11 @@ nilfs_mdt_new_common(struct the_nilfs *nilfs, struct super_block *sb, | |||
513 | } | 522 | } |
514 | 523 | ||
515 | struct inode *nilfs_mdt_new(struct the_nilfs *nilfs, struct super_block *sb, | 524 | struct inode *nilfs_mdt_new(struct the_nilfs *nilfs, struct super_block *sb, |
516 | ino_t ino) | 525 | ino_t ino, size_t objsz) |
517 | { | 526 | { |
518 | struct inode *inode = nilfs_mdt_new_common(nilfs, sb, ino, | 527 | struct inode *inode; |
519 | NILFS_MDT_GFP); | ||
520 | 528 | ||
529 | inode = nilfs_mdt_new_common(nilfs, sb, ino, NILFS_MDT_GFP, objsz); | ||
521 | if (!inode) | 530 | if (!inode) |
522 | return NULL; | 531 | return NULL; |
523 | 532 | ||
diff --git a/fs/nilfs2/mdt.h b/fs/nilfs2/mdt.h index 431599733c9b..3eb40e8d50ff 100644 --- a/fs/nilfs2/mdt.h +++ b/fs/nilfs2/mdt.h | |||
@@ -74,9 +74,10 @@ int nilfs_mdt_forget_block(struct inode *, unsigned long); | |||
74 | int nilfs_mdt_mark_block_dirty(struct inode *, unsigned long); | 74 | int nilfs_mdt_mark_block_dirty(struct inode *, unsigned long); |
75 | int nilfs_mdt_fetch_dirty(struct inode *); | 75 | int nilfs_mdt_fetch_dirty(struct inode *); |
76 | 76 | ||
77 | struct inode *nilfs_mdt_new(struct the_nilfs *, struct super_block *, ino_t); | 77 | struct inode *nilfs_mdt_new(struct the_nilfs *, struct super_block *, ino_t, |
78 | size_t); | ||
78 | struct inode *nilfs_mdt_new_common(struct the_nilfs *, struct super_block *, | 79 | struct inode *nilfs_mdt_new_common(struct the_nilfs *, struct super_block *, |
79 | ino_t, gfp_t); | 80 | ino_t, gfp_t, size_t); |
80 | void nilfs_mdt_destroy(struct inode *); | 81 | void nilfs_mdt_destroy(struct inode *); |
81 | void nilfs_mdt_clear(struct inode *); | 82 | void nilfs_mdt_clear(struct inode *); |
82 | void nilfs_mdt_set_entry_size(struct inode *, unsigned, unsigned); | 83 | void nilfs_mdt_set_entry_size(struct inode *, unsigned, unsigned); |
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index b6837f48636f..77f2e47ff81c 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -363,7 +363,7 @@ int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno) | |||
363 | list_add(&sbi->s_list, &nilfs->ns_supers); | 363 | list_add(&sbi->s_list, &nilfs->ns_supers); |
364 | up_write(&nilfs->ns_super_sem); | 364 | up_write(&nilfs->ns_super_sem); |
365 | 365 | ||
366 | sbi->s_ifile = nilfs_mdt_new(nilfs, sbi->s_super, NILFS_IFILE_INO); | 366 | sbi->s_ifile = nilfs_mdt_new(nilfs, sbi->s_super, NILFS_IFILE_INO, 0); |
367 | if (!sbi->s_ifile) | 367 | if (!sbi->s_ifile) |
368 | return -ENOMEM; | 368 | return -ENOMEM; |
369 | 369 | ||
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index ad391a8c3e7e..a80bbb7c5afc 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c | |||
@@ -187,19 +187,19 @@ static int nilfs_load_super_root(struct the_nilfs *nilfs, | |||
187 | inode_size = nilfs->ns_inode_size; | 187 | inode_size = nilfs->ns_inode_size; |
188 | 188 | ||
189 | err = -ENOMEM; | 189 | err = -ENOMEM; |
190 | nilfs->ns_dat = nilfs_mdt_new(nilfs, NULL, NILFS_DAT_INO); | 190 | nilfs->ns_dat = nilfs_mdt_new(nilfs, NULL, NILFS_DAT_INO, 0); |
191 | if (unlikely(!nilfs->ns_dat)) | 191 | if (unlikely(!nilfs->ns_dat)) |
192 | goto failed; | 192 | goto failed; |
193 | 193 | ||
194 | nilfs->ns_gc_dat = nilfs_mdt_new(nilfs, NULL, NILFS_DAT_INO); | 194 | nilfs->ns_gc_dat = nilfs_mdt_new(nilfs, NULL, NILFS_DAT_INO, 0); |
195 | if (unlikely(!nilfs->ns_gc_dat)) | 195 | if (unlikely(!nilfs->ns_gc_dat)) |
196 | goto failed_dat; | 196 | goto failed_dat; |
197 | 197 | ||
198 | nilfs->ns_cpfile = nilfs_mdt_new(nilfs, NULL, NILFS_CPFILE_INO); | 198 | nilfs->ns_cpfile = nilfs_mdt_new(nilfs, NULL, NILFS_CPFILE_INO, 0); |
199 | if (unlikely(!nilfs->ns_cpfile)) | 199 | if (unlikely(!nilfs->ns_cpfile)) |
200 | goto failed_gc_dat; | 200 | goto failed_gc_dat; |
201 | 201 | ||
202 | nilfs->ns_sufile = nilfs_mdt_new(nilfs, NULL, NILFS_SUFILE_INO); | 202 | nilfs->ns_sufile = nilfs_mdt_new(nilfs, NULL, NILFS_SUFILE_INO, 0); |
203 | if (unlikely(!nilfs->ns_sufile)) | 203 | if (unlikely(!nilfs->ns_sufile)) |
204 | goto failed_cpfile; | 204 | goto failed_cpfile; |
205 | 205 | ||