diff options
Diffstat (limited to 'fs/fat/cache.c')
| -rw-r--r-- | fs/fat/cache.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/fat/cache.c b/fs/fat/cache.c index 77c24fcf712a..1acc941245fb 100644 --- a/fs/fat/cache.c +++ b/fs/fat/cache.c | |||
| @@ -295,7 +295,8 @@ static int fat_bmap_cluster(struct inode *inode, int cluster) | |||
| 295 | return dclus; | 295 | return dclus; |
| 296 | } | 296 | } |
| 297 | 297 | ||
| 298 | int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys) | 298 | int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys, |
| 299 | unsigned long *mapped_blocks) | ||
| 299 | { | 300 | { |
| 300 | struct super_block *sb = inode->i_sb; | 301 | struct super_block *sb = inode->i_sb; |
| 301 | struct msdos_sb_info *sbi = MSDOS_SB(sb); | 302 | struct msdos_sb_info *sbi = MSDOS_SB(sb); |
| @@ -303,9 +304,12 @@ int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys) | |||
| 303 | int cluster, offset; | 304 | int cluster, offset; |
| 304 | 305 | ||
| 305 | *phys = 0; | 306 | *phys = 0; |
| 307 | *mapped_blocks = 0; | ||
| 306 | if ((sbi->fat_bits != 32) && (inode->i_ino == MSDOS_ROOT_INO)) { | 308 | if ((sbi->fat_bits != 32) && (inode->i_ino == MSDOS_ROOT_INO)) { |
| 307 | if (sector < (sbi->dir_entries >> sbi->dir_per_block_bits)) | 309 | if (sector < (sbi->dir_entries >> sbi->dir_per_block_bits)) { |
| 308 | *phys = sector + sbi->dir_start; | 310 | *phys = sector + sbi->dir_start; |
| 311 | *mapped_blocks = 1; | ||
| 312 | } | ||
| 309 | return 0; | 313 | return 0; |
| 310 | } | 314 | } |
| 311 | last_block = (MSDOS_I(inode)->mmu_private + (sb->s_blocksize - 1)) | 315 | last_block = (MSDOS_I(inode)->mmu_private + (sb->s_blocksize - 1)) |
| @@ -318,7 +322,11 @@ int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys) | |||
| 318 | cluster = fat_bmap_cluster(inode, cluster); | 322 | cluster = fat_bmap_cluster(inode, cluster); |
| 319 | if (cluster < 0) | 323 | if (cluster < 0) |
| 320 | return cluster; | 324 | return cluster; |
| 321 | else if (cluster) | 325 | else if (cluster) { |
| 322 | *phys = fat_clus_to_blknr(sbi, cluster) + offset; | 326 | *phys = fat_clus_to_blknr(sbi, cluster) + offset; |
| 327 | *mapped_blocks = sbi->sec_per_clus - offset; | ||
| 328 | if (*mapped_blocks > last_block - sector) | ||
| 329 | *mapped_blocks = last_block - sector; | ||
| 330 | } | ||
| 323 | return 0; | 331 | return 0; |
| 324 | } | 332 | } |
