diff options
author | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2011-04-30 05:56:12 -0400 |
---|---|---|
committer | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2011-05-10 09:21:45 -0400 |
commit | 56eb55388580ebd51f3bbd9af40ebb56849356af (patch) | |
tree | 7d1ed80fa05150c40a75d5755981c8d949ae634b | |
parent | 6c6de1aa65189c37cc3c9af78da756c06a99899b (diff) |
nilfs2: zero fill unused portion of super root block
The super root block is newly-allocated each time it is written back
to disk, so unused portion of the block should be cleared.
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
-rw-r--r-- | fs/nilfs2/inode.c | 10 | ||||
-rw-r--r-- | fs/nilfs2/segment.c | 7 |
2 files changed, 15 insertions, 2 deletions
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 2cc8c087b2d5..699170e0f308 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c | |||
@@ -596,6 +596,16 @@ void nilfs_write_inode_common(struct inode *inode, | |||
596 | raw_inode->i_flags = cpu_to_le32(ii->i_flags); | 596 | raw_inode->i_flags = cpu_to_le32(ii->i_flags); |
597 | raw_inode->i_generation = cpu_to_le32(inode->i_generation); | 597 | raw_inode->i_generation = cpu_to_le32(inode->i_generation); |
598 | 598 | ||
599 | if (NILFS_ROOT_METADATA_FILE(inode->i_ino)) { | ||
600 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; | ||
601 | |||
602 | /* zero-fill unused portion in the case of super root block */ | ||
603 | raw_inode->i_xattr = 0; | ||
604 | raw_inode->i_pad = 0; | ||
605 | memset((void *)raw_inode + sizeof(*raw_inode), 0, | ||
606 | nilfs->ns_inode_size - sizeof(*raw_inode)); | ||
607 | } | ||
608 | |||
599 | if (has_bmap) | 609 | if (has_bmap) |
600 | nilfs_bmap_write(ii->i_bmap, raw_inode); | 610 | nilfs_bmap_write(ii->i_bmap, raw_inode); |
601 | else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) | 611 | else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 8006d0cd4440..8a2b428b1838 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
@@ -889,12 +889,14 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci, | |||
889 | { | 889 | { |
890 | struct buffer_head *bh_sr; | 890 | struct buffer_head *bh_sr; |
891 | struct nilfs_super_root *raw_sr; | 891 | struct nilfs_super_root *raw_sr; |
892 | unsigned isz = nilfs->ns_inode_size; | 892 | unsigned isz, srsz; |
893 | 893 | ||
894 | bh_sr = NILFS_LAST_SEGBUF(&sci->sc_segbufs)->sb_super_root; | 894 | bh_sr = NILFS_LAST_SEGBUF(&sci->sc_segbufs)->sb_super_root; |
895 | raw_sr = (struct nilfs_super_root *)bh_sr->b_data; | 895 | raw_sr = (struct nilfs_super_root *)bh_sr->b_data; |
896 | isz = nilfs->ns_inode_size; | ||
897 | srsz = NILFS_SR_BYTES(isz); | ||
896 | 898 | ||
897 | raw_sr->sr_bytes = cpu_to_le16(NILFS_SR_BYTES(isz)); | 899 | raw_sr->sr_bytes = cpu_to_le16(srsz); |
898 | raw_sr->sr_nongc_ctime | 900 | raw_sr->sr_nongc_ctime |
899 | = cpu_to_le64(nilfs_doing_gc() ? | 901 | = cpu_to_le64(nilfs_doing_gc() ? |
900 | nilfs->ns_nongc_ctime : sci->sc_seg_ctime); | 902 | nilfs->ns_nongc_ctime : sci->sc_seg_ctime); |
@@ -906,6 +908,7 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci, | |||
906 | NILFS_SR_CPFILE_OFFSET(isz), 1); | 908 | NILFS_SR_CPFILE_OFFSET(isz), 1); |
907 | nilfs_write_inode_common(nilfs->ns_sufile, (void *)raw_sr + | 909 | nilfs_write_inode_common(nilfs->ns_sufile, (void *)raw_sr + |
908 | NILFS_SR_SUFILE_OFFSET(isz), 1); | 910 | NILFS_SR_SUFILE_OFFSET(isz), 1); |
911 | memset((void *)raw_sr + srsz, 0, nilfs->ns_blocksize - srsz); | ||
909 | } | 912 | } |
910 | 913 | ||
911 | static void nilfs_redirty_inodes(struct list_head *head) | 914 | static void nilfs_redirty_inodes(struct list_head *head) |