fat: Fix fat_ent_update_ptr() for FAT12
This fixes the missing update for bhs/nr_bhs in case the caller accessed from block boundary to first block of boundary. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d3dfa8228f
commit
5e35dd4651
1 changed files with 14 additions and 4 deletions
|
@ -317,10 +317,20 @@ static inline int fat_ent_update_ptr(struct super_block *sb,
|
||||||
/* Is this fatent's blocks including this entry? */
|
/* Is this fatent's blocks including this entry? */
|
||||||
if (!fatent->nr_bhs || bhs[0]->b_blocknr != blocknr)
|
if (!fatent->nr_bhs || bhs[0]->b_blocknr != blocknr)
|
||||||
return 0;
|
return 0;
|
||||||
/* Does this entry need the next block? */
|
if (sbi->fat_bits == 12) {
|
||||||
if (sbi->fat_bits == 12 && (offset + 1) >= sb->s_blocksize) {
|
if ((offset + 1) < sb->s_blocksize) {
|
||||||
if (fatent->nr_bhs != 2 || bhs[1]->b_blocknr != (blocknr + 1))
|
/* This entry is on bhs[0]. */
|
||||||
return 0;
|
if (fatent->nr_bhs == 2) {
|
||||||
|
brelse(bhs[1]);
|
||||||
|
fatent->nr_bhs = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* This entry needs the next block. */
|
||||||
|
if (fatent->nr_bhs != 2)
|
||||||
|
return 0;
|
||||||
|
if (bhs[1]->b_blocknr != (blocknr + 1))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ops->ent_set_ptr(fatent, offset);
|
ops->ent_set_ptr(fatent, offset);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Add table
Reference in a new issue