Changeset View
Changeset View
Standalone View
Standalone View
head/usr.sbin/makefs/msdos/msdosfs_fat.c
Show First 20 Lines • Show All 214 Lines • ▼ Show 20 Lines | for (; i < findcn; i++) { | ||||
} | } | ||||
prevcn = cn; | prevcn = cn; | ||||
if (bo >= bsize) { | if (bo >= bsize) { | ||||
if (bp) | if (bp) | ||||
brelse(bp); | brelse(bp); | ||||
return (EIO); | return (EIO); | ||||
} | } | ||||
if (FAT32(pmp)) | if (FAT32(pmp)) | ||||
cn = getulong((char *)bp->b_data + bo); | cn = getulong(bp->b_data + bo); | ||||
else | else | ||||
cn = getushort((char *)bp->b_data + bo); | cn = getushort(bp->b_data + bo); | ||||
if (FAT12(pmp) && (prevcn & 1)) | if (FAT12(pmp) && (prevcn & 1)) | ||||
cn >>= 4; | cn >>= 4; | ||||
cn &= pmp->pm_fatmask; | cn &= pmp->pm_fatmask; | ||||
/* | /* | ||||
* Force the special cluster numbers | * Force the special cluster numbers | ||||
* to be the same for all cluster sizes | * to be the same for all cluster sizes | ||||
* to let the rest of msdosfs handle | * to let the rest of msdosfs handle | ||||
▲ Show 20 Lines • Show All 263 Lines • ▼ Show 20 Lines | #endif | ||||
error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); | error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); | ||||
if (error) { | if (error) { | ||||
brelse(bp); | brelse(bp); | ||||
return (error); | return (error); | ||||
} | } | ||||
if (function & FAT_GET) { | if (function & FAT_GET) { | ||||
if (FAT32(pmp)) | if (FAT32(pmp)) | ||||
readcn = getulong((char *)bp->b_data + bo); | readcn = getulong(bp->b_data + bo); | ||||
else | else | ||||
readcn = getushort((char *)bp->b_data + bo); | readcn = getushort(bp->b_data + bo); | ||||
if (FAT12(pmp) & (cn & 1)) | if (FAT12(pmp) & (cn & 1)) | ||||
readcn >>= 4; | readcn >>= 4; | ||||
readcn &= pmp->pm_fatmask; | readcn &= pmp->pm_fatmask; | ||||
/* map reserved FAT entries to same values for all FATs */ | /* map reserved FAT entries to same values for all FATs */ | ||||
if ((readcn | ~pmp->pm_fatmask) >= CLUST_RSRVD) | if ((readcn | ~pmp->pm_fatmask) >= CLUST_RSRVD) | ||||
readcn |= ~pmp->pm_fatmask; | readcn |= ~pmp->pm_fatmask; | ||||
*oldcontents = readcn; | *oldcontents = readcn; | ||||
} | } | ||||
if (function & FAT_SET) { | if (function & FAT_SET) { | ||||
switch (pmp->pm_fatmask) { | switch (pmp->pm_fatmask) { | ||||
case FAT12_MASK: | case FAT12_MASK: | ||||
readcn = getushort((char *)bp->b_data + bo); | readcn = getushort(bp->b_data + bo); | ||||
if (cn & 1) { | if (cn & 1) { | ||||
readcn &= 0x000f; | readcn &= 0x000f; | ||||
readcn |= newcontents << 4; | readcn |= newcontents << 4; | ||||
} else { | } else { | ||||
readcn &= 0xf000; | readcn &= 0xf000; | ||||
readcn |= newcontents & 0xfff; | readcn |= newcontents & 0xfff; | ||||
} | } | ||||
putushort((char *)bp->b_data + bo, readcn); | putushort(bp->b_data + bo, readcn); | ||||
break; | break; | ||||
case FAT16_MASK: | case FAT16_MASK: | ||||
putushort((char *)bp->b_data + bo, newcontents); | putushort(bp->b_data + bo, newcontents); | ||||
break; | break; | ||||
case FAT32_MASK: | case FAT32_MASK: | ||||
/* | /* | ||||
* According to spec we have to retain the | * According to spec we have to retain the | ||||
* high order bits of the FAT entry. | * high order bits of the FAT entry. | ||||
*/ | */ | ||||
readcn = getulong((char *)bp->b_data + bo); | readcn = getulong(bp->b_data + bo); | ||||
readcn &= ~FAT32_MASK; | readcn &= ~FAT32_MASK; | ||||
readcn |= newcontents & FAT32_MASK; | readcn |= newcontents & FAT32_MASK; | ||||
putulong((char *)bp->b_data + bo, readcn); | putulong(bp->b_data + bo, readcn); | ||||
break; | break; | ||||
} | } | ||||
updatefats(pmp, bp, bn); | updatefats(pmp, bp, bn); | ||||
bp = NULL; | bp = NULL; | ||||
pmp->pm_fmod = 1; | pmp->pm_fmod = 1; | ||||
} | } | ||||
if (bp) | if (bp) | ||||
brelse(bp); | brelse(bp); | ||||
Show All 33 Lines | if (error) { | ||||
brelse(bp); | brelse(bp); | ||||
return (error); | return (error); | ||||
} | } | ||||
while (count > 0) { | while (count > 0) { | ||||
start++; | start++; | ||||
newc = --count > 0 ? start : fillwith; | newc = --count > 0 ? start : fillwith; | ||||
switch (pmp->pm_fatmask) { | switch (pmp->pm_fatmask) { | ||||
case FAT12_MASK: | case FAT12_MASK: | ||||
readcn = getushort((char *)bp->b_data + bo); | readcn = getushort(bp->b_data + bo); | ||||
if (start & 1) { | if (start & 1) { | ||||
readcn &= 0xf000; | readcn &= 0xf000; | ||||
readcn |= newc & 0xfff; | readcn |= newc & 0xfff; | ||||
} else { | } else { | ||||
readcn &= 0x000f; | readcn &= 0x000f; | ||||
readcn |= newc << 4; | readcn |= newc << 4; | ||||
} | } | ||||
putushort((char *)bp->b_data + bo, readcn); | putushort(bp->b_data + bo, readcn); | ||||
bo++; | bo++; | ||||
if (!(start & 1)) | if (!(start & 1)) | ||||
bo++; | bo++; | ||||
break; | break; | ||||
case FAT16_MASK: | case FAT16_MASK: | ||||
putushort((char *)bp->b_data + bo, newc); | putushort(bp->b_data + bo, newc); | ||||
bo += 2; | bo += 2; | ||||
break; | break; | ||||
case FAT32_MASK: | case FAT32_MASK: | ||||
readcn = getulong((char *)bp->b_data + bo); | readcn = getulong(bp->b_data + bo); | ||||
readcn &= ~pmp->pm_fatmask; | readcn &= ~pmp->pm_fatmask; | ||||
readcn |= newc & pmp->pm_fatmask; | readcn |= newc & pmp->pm_fatmask; | ||||
putulong((char *)bp->b_data + bo, readcn); | putulong(bp->b_data + bo, readcn); | ||||
bo += 4; | bo += 4; | ||||
break; | break; | ||||
} | } | ||||
if (bo >= bsize) | if (bo >= bsize) | ||||
break; | break; | ||||
} | } | ||||
updatefats(pmp, bp, bn); | updatefats(pmp, bp, bn); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 208 Lines • ▼ Show 20 Lines | if (lbn != bn) { | ||||
brelse(bp); | brelse(bp); | ||||
return (error); | return (error); | ||||
} | } | ||||
lbn = bn; | lbn = bn; | ||||
} | } | ||||
usemap_free(pmp, cluster); | usemap_free(pmp, cluster); | ||||
switch (pmp->pm_fatmask) { | switch (pmp->pm_fatmask) { | ||||
case FAT12_MASK: | case FAT12_MASK: | ||||
readcn = getushort((char *)bp->b_data + bo); | readcn = getushort(bp->b_data + bo); | ||||
if (cluster & 1) { | if (cluster & 1) { | ||||
cluster = readcn >> 4; | cluster = readcn >> 4; | ||||
readcn &= 0x000f; | readcn &= 0x000f; | ||||
readcn |= MSDOSFSFREE << 4; | readcn |= MSDOSFSFREE << 4; | ||||
} else { | } else { | ||||
cluster = readcn; | cluster = readcn; | ||||
readcn &= 0xf000; | readcn &= 0xf000; | ||||
readcn |= MSDOSFSFREE & 0xfff; | readcn |= MSDOSFSFREE & 0xfff; | ||||
} | } | ||||
putushort((char *)bp->b_data + bo, readcn); | putushort(bp->b_data + bo, readcn); | ||||
break; | break; | ||||
case FAT16_MASK: | case FAT16_MASK: | ||||
cluster = getushort((char *)bp->b_data + bo); | cluster = getushort(bp->b_data + bo); | ||||
putushort((char *)bp->b_data + bo, MSDOSFSFREE); | putushort(bp->b_data + bo, MSDOSFSFREE); | ||||
break; | break; | ||||
case FAT32_MASK: | case FAT32_MASK: | ||||
cluster = getulong((char *)bp->b_data + bo); | cluster = getulong(bp->b_data + bo); | ||||
putulong((char *)bp->b_data + bo, | putulong(bp->b_data + bo, | ||||
(MSDOSFSFREE & FAT32_MASK) | (cluster & ~FAT32_MASK)); | (MSDOSFSFREE & FAT32_MASK) | (cluster & ~FAT32_MASK)); | ||||
break; | break; | ||||
} | } | ||||
cluster &= pmp->pm_fatmask; | cluster &= pmp->pm_fatmask; | ||||
if ((cluster | ~pmp->pm_fatmask) >= CLUST_RSRVD) | if ((cluster | ~pmp->pm_fatmask) >= CLUST_RSRVD) | ||||
cluster |= pmp->pm_fatmask; | cluster |= pmp->pm_fatmask; | ||||
} | } | ||||
if (bp) | if (bp) | ||||
Show All 35 Lines | if (bo == 0 || bp == NULL) { | ||||
fatblock(pmp, byteoffset, &bn, &bsize, NULL); | fatblock(pmp, byteoffset, &bn, &bsize, NULL); | ||||
error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); | error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); | ||||
if (error != 0) { | if (error != 0) { | ||||
brelse(bp); | brelse(bp); | ||||
return (error); | return (error); | ||||
} | } | ||||
} | } | ||||
if (FAT32(pmp)) | if (FAT32(pmp)) | ||||
readcn = getulong((char *)bp->b_data + bo); | readcn = getulong(bp->b_data + bo); | ||||
else | else | ||||
readcn = getushort((char *)bp->b_data + bo); | readcn = getushort(bp->b_data + bo); | ||||
if (FAT12(pmp) && (cn & 1)) | if (FAT12(pmp) && (cn & 1)) | ||||
readcn >>= 4; | readcn >>= 4; | ||||
readcn &= pmp->pm_fatmask; | readcn &= pmp->pm_fatmask; | ||||
if (readcn == CLUST_FREE) | if (readcn == CLUST_FREE) | ||||
usemap_free(pmp, cn); | usemap_free(pmp, cn); | ||||
} | } | ||||
if (bp != NULL) | if (bp != NULL) | ||||
▲ Show 20 Lines • Show All 129 Lines • Show Last 20 Lines |