]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
fat: permit to return phy block number by fibmap in fallocated region
authorNamjae Jeon <namjae.jeon@samsung.com>
Fri, 3 Jan 2014 03:10:26 +0000 (14:10 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Fri, 3 Jan 2014 03:10:26 +0000 (14:10 +1100)
Make the fibmap call the return the proper physical block number for any
offset request in the fallocated range.

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/inode.c

index c56bd7e4af925f2417ef21312ee9aec0bdae5313..77778227911a6d1b45a554e5e684bf6fc6c7c466 100644 (file)
@@ -312,6 +312,7 @@ int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys,
        const unsigned char blocksize_bits = sb->s_blocksize_bits;
        sector_t last_block;
        int cluster, offset;
+       loff_t i_size = i_size_read(inode);
 
        *phys = 0;
        *mapped_blocks = 0;
@@ -323,10 +324,20 @@ int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys,
                return 0;
        }
 
-       last_block = (i_size_read(inode) + (blocksize - 1)) >> blocksize_bits;
+       last_block = (i_size + (blocksize - 1)) >> blocksize_bits;
        if (sector >= last_block) {
-               if (!create)
+               if (!create) {
+                       /*
+                        * to map cluster in case of read request
+                        * for a block in fallocated region
+                        */
+                       if (MSDOS_I(inode)->i_disksize >
+                           round_up(i_size, sb->s_blocksize)) {
+                               goto out_map_cluster;
+                       }
+
                        return 0;
+               }
 
                /*
                 * Both ->mmu_private and ->i_disksize can access
@@ -339,6 +350,7 @@ int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys,
                        return 0;
        }
 
+out_map_cluster:
        cluster = sector >> (sbi->cluster_bits - sb->s_blocksize_bits);
        offset  = sector & (sbi->sec_per_clus - 1);
        cluster = fat_bmap_cluster(inode, cluster);
index ffa2eccc62a2a522bed1ede8531b75fa01487f12..4b796d5d735f5a65ed9e75b3e676728a318b0da6 100644 (file)
@@ -245,9 +245,9 @@ static sector_t _fat_bmap(struct address_space *mapping, sector_t block)
        sector_t blocknr;
 
        /* fat_get_cluster() assumes the requested blocknr isn't truncated. */
-       down_read(&MSDOS_I(mapping->host)->truncate_lock);
+       mutex_lock(&mapping->host->i_mutex);
        blocknr = generic_block_bmap(mapping, block, fat_get_block);
-       up_read(&MSDOS_I(mapping->host)->truncate_lock);
+       mutex_unlock(&mapping->host->i_mutex);
 
        return blocknr;
 }