Whamcloud - gitweb
libext2fs: fix tests that set LARGE_FILE
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 11 Dec 2013 01:18:27 +0000 (17:18 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 12 Dec 2013 17:08:48 +0000 (12:08 -0500)
For each site where we test for a large file (> 2GB) and set the
LARGE_FILE feature, use a helper function to make the size test
consistent with the test that's in e2fsck.  This fixes the fsck
complaints when we try to create a 2GB journal (not so hard with 64k
block size) and fixes the incorrect test in fileio.c.

Reviewed-by: Zheng Liu <wenqing.lz@taobao.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
e2fsck/pass1.c
e2fsck/pass2.c
lib/ext2fs/ext2fs.h
lib/ext2fs/fileio.c
lib/ext2fs/mkjournal.c

index 20157fa..a8237af 100644 (file)
@@ -2163,7 +2163,8 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
                }
                pctx->num = 0;
        }
-       if (LINUX_S_ISREG(inode->i_mode) && EXT2_I_SIZE(inode) >= 0x80000000UL)
+       if (LINUX_S_ISREG(inode->i_mode) &&
+           ext2fs_needs_large_file_feature(EXT2_I_SIZE(inode)))
                ctx->large_files++;
        if ((pb.num_blocks != ext2fs_inode_i_blocks(fs, inode)) ||
            ((fs->super->s_feature_ro_compat &
index 65d8de4..b7268e3 100644 (file)
@@ -1225,7 +1225,8 @@ static void deallocate_inode(e2fsck_t ctx, ext2_ino_t ino, char* block_buf)
        if (!ext2fs_inode_has_valid_blocks2(fs, &inode))
                goto clear_inode;
 
-       if (LINUX_S_ISREG(inode.i_mode) && EXT2_I_SIZE(&inode) >= 0x80000000UL)
+       if (LINUX_S_ISREG(inode.i_mode) &&
+           ext2fs_needs_large_file_feature(EXT2_I_SIZE(&inode)))
                ctx->large_files--;
 
        del_block.ctx = ctx;
index b27fb74..9f62cbb 100644 (file)
@@ -632,6 +632,12 @@ typedef struct stat ext2fs_struct_stat;
  * function prototypes
  */
 
+/* The LARGE_FILE feature should be set if we have stored files 2GB+ in size */
+static inline int ext2fs_needs_large_file_feature(unsigned long long file_size)
+{
+       return file_size >= 0x80000000ULL;
+}
+
 /* alloc.c */
 extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
                                  ext2fs_inode_bitmap map, ext2_ino_t *ret);
index 02e6263..6b213b5 100644 (file)
@@ -400,7 +400,7 @@ errcode_t ext2fs_file_set_size2(ext2_file_t file, ext2_off64_t size)
 
        /* If we're writing a large file, set the large_file flag */
        if (LINUX_S_ISREG(file->inode.i_mode) &&
-           EXT2_I_SIZE(&file->inode) > 0x7FFFFFFULL &&
+           ext2fs_needs_large_file_feature(EXT2_I_SIZE(&file->inode)) &&
            (!EXT2_HAS_RO_COMPAT_FEATURE(file->fs->super,
                                         EXT2_FEATURE_RO_COMPAT_LARGE_FILE) ||
             file->fs->super->s_rev_level == EXT2_GOOD_OLD_REV)) {
index c636a97..2afd3b7 100644 (file)
@@ -378,7 +378,7 @@ static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
        inode_size = (unsigned long long)fs->blocksize * num_blocks;
        inode.i_size = inode_size & 0xFFFFFFFF;
        inode.i_size_high = (inode_size >> 32) & 0xFFFFFFFF;
-       if (inode.i_size_high)
+       if (ext2fs_needs_large_file_feature(inode_size))
                fs->super->s_feature_ro_compat |=
                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE;
        ext2fs_iblk_add_blocks(fs, &inode, es.newblocks);