]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
fat: add i_disksize to represent uninitialized size
authorNamjae Jeon <namjae.jeon@samsung.com>
Thu, 26 Jun 2014 00:43:22 +0000 (10:43 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Fri, 27 Jun 2014 04:21:52 +0000 (14:21 +1000)
Add i_disksize to represent uninitialized allocated size.
And mmu_private represent initialized allocated size.

Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Amit Sahrawat <a.sahrawat@samsung.com>
Cc: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/fat/cache.c
fs/fat/fat.h
fs/fat/file.c
fs/fat/inode.c

index 91ad9e1c94417a813c1661af830bc2ecbc962033..a132666920e66ef15a6d553406f9de03d6ec09fa 100644 (file)
@@ -329,10 +329,10 @@ int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys,
                        return 0;
 
                /*
-                * ->mmu_private can access on only allocation path.
-                * (caller must hold ->i_mutex)
+                * Both ->mmu_private and ->i_disksize can access
+                * on only allocation path. (caller must hold ->i_mutex)
                 */
-               last_block = (MSDOS_I(inode)->mmu_private + (blocksize - 1))
+               last_block = (MSDOS_I(inode)->i_disksize + (blocksize - 1))
                        >> blocksize_bits;
                if (sector >= last_block)
                        return 0;
index e0c4ba39a377b407bb19c50f830443ab4f7f3188..f6bcaa7f1a10029245c6fae1c469a7f58749927d 100644 (file)
@@ -119,7 +119,8 @@ struct msdos_inode_info {
        unsigned int cache_valid_id;
 
        /* NOTE: mmu_private is 64bits, so must hold ->i_mutex to access */
-       loff_t mmu_private;     /* physically allocated size */
+       loff_t mmu_private;     /* physically allocated size (initialized) */
+       loff_t i_disksize;      /* physically allocated size (uninitialized) */
 
        int i_start;            /* first cluster or 0 */
        int i_logstart;         /* logical first cluster */
index 85f79a89e7474658c8c552cfe027e72ff048d542..28be0d8bd871ba7eb845cd50b64496e197cf2736 100644 (file)
@@ -300,8 +300,10 @@ void fat_truncate_blocks(struct inode *inode, loff_t offset)
         * This protects against truncating a file bigger than it was then
         * trying to write into the hole.
         */
-       if (MSDOS_I(inode)->mmu_private > offset)
+       if (MSDOS_I(inode)->i_disksize > offset) {
                MSDOS_I(inode)->mmu_private = offset;
+               MSDOS_I(inode)->i_disksize = offset;
+       }
 
        nr_clusters = (offset + (cluster_size - 1)) >> sbi->cluster_bits;
 
index 756aead10d9618593e3267e697df4915d528fbc9..5b2cb358748da160abaa6267c16c555af3998bff 100644 (file)
@@ -155,6 +155,7 @@ static inline int __fat_get_block(struct inode *inode, sector_t iblock,
 
        *max_blocks = min(mapped_blocks, *max_blocks);
        MSDOS_I(inode)->mmu_private += *max_blocks << sb->s_blocksize_bits;
+       MSDOS_I(inode)->i_disksize = MSDOS_I(inode)->mmu_private;
 
        err = fat_bmap(inode, iblock, &phys, &mapped_blocks, create);
        if (err)
@@ -469,7 +470,6 @@ int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
                error = fat_calc_dir_size(inode);
                if (error < 0)
                        return error;
-               MSDOS_I(inode)->mmu_private = inode->i_size;
 
                set_nlink(inode, fat_subdirs(inode));
        } else { /* not a directory */
@@ -484,8 +484,12 @@ int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
                inode->i_op = &fat_file_inode_operations;
                inode->i_fop = &fat_file_operations;
                inode->i_mapping->a_ops = &fat_aops;
-               MSDOS_I(inode)->mmu_private = inode->i_size;
        }
+
+       MSDOS_I(inode)->mmu_private = inode->i_size;
+       MSDOS_I(inode)->i_disksize = round_up(inode->i_size,
+               inode->i_sb->s_blocksize);
+
        if (de->attr & ATTR_SYS) {
                if (sbi->options.sys_immutable)
                        inode->i_flags |= S_IMMUTABLE;
@@ -1293,6 +1297,7 @@ static int fat_read_root(struct inode *inode)
                           & ~((loff_t)sbi->cluster_size - 1)) >> 9;
        MSDOS_I(inode)->i_logstart = 0;
        MSDOS_I(inode)->mmu_private = inode->i_size;
+       MSDOS_I(inode)->i_disksize = inode->i_size;
 
        fat_save_attrs(inode, ATTR_DIR);
        inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = 0;