Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e35dd46 authored by OGAWA Hirofumi's avatar OGAWA Hirofumi Committed by Linus Torvalds
Browse files

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: default avatarOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d3dfa822
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -317,10 +317,20 @@ static inline int fat_ent_update_ptr(struct super_block *sb,
	/* Is this fatent's blocks including this entry? */
	if (!fatent->nr_bhs || bhs[0]->b_blocknr != blocknr)
		return 0;
	/* Does this entry need the next block? */
	if (sbi->fat_bits == 12 && (offset + 1) >= sb->s_blocksize) {
		if (fatent->nr_bhs != 2 || bhs[1]->b_blocknr != (blocknr + 1))
	if (sbi->fat_bits == 12) {
		if ((offset + 1) < sb->s_blocksize) {
			/* This entry is on bhs[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);
	return 1;