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>
This commit is contained in:
parent
b8948d2aef
commit
8d48c92b45
34
fs/fat/fat.c
34
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);
|
||||
|
Loading…
Reference in New Issue
Block a user