diff options
author | Stefan Brüns <stefan.bruens@rwth-aachen.de> | 2016-12-17 03:55:10 +0100 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2016-12-27 11:24:14 -0500 |
commit | 8d48c92b45aea91e2a2be90f2ed93677e85526f1 (patch) | |
tree | 49ef92c31096aafe1ca76a03fe088d997f7512ad /fs | |
parent | b8948d2aef80717d3d2c4f37ec086ce3ea5ad24f (diff) |
fs/fat: simplify get_fatent for FAT12
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 <stefan.bruens@rwth-aachen.de>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/fat/fat.c | 34 |
1 files 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); |