From 8d48c92b45aea91e2a2be90f2ed93677e85526f1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20Br=C3=83=C2=BCns?= Date: Sat, 17 Dec 2016 03:55:10 +0100 Subject: [PATCH] fs/fat: simplify get_fatent for FAT12 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Instead of shuffling bits from two adjacent 16 bit words, use one 16 bit word with the appropriate byte offset in the buffer. Signed-off-by: Stefan Brüns --- fs/fat/fat.c | 34 +++++----------------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 73c3dd7f85..fe899d0442 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -181,7 +181,6 @@ static __u32 get_fatent(fsdata *mydata, __u32 entry) __u32 bufnum; __u32 off16, offset; __u32 ret = 0x00; - __u16 val1, val2; if (CHECK_CLUST(entry, mydata->fatsize)) { printf("Error: Invalid FAT entry: 0x%08x\n", entry); @@ -243,35 +242,12 @@ static __u32 get_fatent(fsdata *mydata, __u32 entry) ret = FAT2CPU16(((__u16 *) mydata->fatbuf)[offset]); break; case 12: - off16 = (offset * 3) / 4; + off16 = (offset * 3) / 2; + ret = FAT2CPU16(*(__u16 *)(mydata->fatbuf + off16)); - switch (offset & 0x3) { - case 0: - ret = FAT2CPU16(((__u16 *) mydata->fatbuf)[off16]); - ret &= 0xfff; - break; - case 1: - val1 = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16]); - val1 &= 0xf000; - val2 = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16 + 1]); - val2 &= 0x00ff; - ret = (val2 << 4) | (val1 >> 12); - break; - case 2: - val1 = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16]); - val1 &= 0xff00; - val2 = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16 + 1]); - val2 &= 0x000f; - ret = (val2 << 8) | (val1 >> 8); - break; - case 3: - ret = FAT2CPU16(((__u16 *)mydata->fatbuf)[off16]); - ret = (ret & 0xfff0) >> 4; - break; - default: - break; - } - break; + if (offset & 0x1) + ret >>= 4; + ret &= 0xfff; } debug("FAT%d: ret: 0x%08x, entry: 0x%08x, offset: 0x%04x\n", mydata->fatsize, ret, entry, offset); -- 2.25.1