Whamcloud - gitweb
tune2fs: rewrite extended attribute block checksums
authorDarrick J. Wong <djwong@us.ibm.com>
Fri, 3 Aug 2012 00:47:44 +0000 (20:47 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 3 Aug 2012 00:47:44 +0000 (20:47 -0400)
When enabling metadata checksums, rewrite separate extended attribute
blocks.

Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
misc/tune2fs.c

index fdbb16a..8bb3bc3 100644 (file)
@@ -611,9 +611,11 @@ static void rewrite_inodes(ext2_filsys fs)
 {
        int length = EXT2_INODE_SIZE(fs->super);
        struct ext2_inode *inode;
+       char            *ea_buf;
        ext2_inode_scan scan;
        errcode_t       retval;
        ext2_ino_t      ino;
+       blk64_t         file_acl_block;
 
        if (fs->super->s_creator_os != EXT2_OS_LINUX)
                return;
@@ -630,6 +632,12 @@ static void rewrite_inodes(ext2_filsys fs)
                exit(1);
        }
 
+       retval = ext2fs_get_mem(fs->blocksize, &ea_buf);
+       if (retval) {
+               com_err("set_csum", retval, "while allocating memory");
+               exit(1);
+       }
+
        do {
                retval = ext2fs_get_next_inode_full(scan, &ino, inode, length);
                if (retval) {
@@ -660,9 +668,27 @@ static void rewrite_inodes(ext2_filsys fs)
                                exit(1);
                        }
                }
+
+               file_acl_block = ext2fs_file_acl_block(fs, inode);
+               if (!file_acl_block)
+                       continue;
+               retval = ext2fs_read_ext_attr3(fs, file_acl_block, ea_buf, ino);
+               if (retval) {
+                       com_err("rewrite_eablock", retval,
+                               "while rewriting extended attribute");
+                       exit(1);
+               }
+               retval = ext2fs_write_ext_attr3(fs, file_acl_block, ea_buf,
+                                               ino);
+               if (retval) {
+                       com_err("rewrite_eablock", retval,
+                               "while rewriting extended attribute");
+                       exit(1);
+               }
        } while (ino);
 
        ext2fs_free_mem(&inode);
+       ext2fs_free_mem(&ea_buf);
        ext2fs_close_inode_scan(scan);
 }