diff options
| author | scw <scw@NetBSD.org> | 2006-11-25 12:17:30 +0000 |
|---|---|---|
| committer | scw <scw@NetBSD.org> | 2006-11-25 12:17:30 +0000 |
| commit | 4f0ca2726e3b071d3e1dc30939ef076628f00564 (patch) | |
| tree | 5928ae50389632c03c76d179c33fd56007792c7c | |
| parent | 79017e8016a32dd7d3b6f9e58223953af43cd368 (diff) | |
Support FAT filesystems on non-DEV_BSIZE media.
Based on the patches provided in PR kern/17398 by Trevin Beattie.
| -rw-r--r-- | sys/fs/msdosfs/msdosfs_denode.c | 8 | ||||
| -rw-r--r-- | sys/fs/msdosfs/msdosfs_fat.c | 37 | ||||
| -rw-r--r-- | sys/fs/msdosfs/msdosfs_lookup.c | 38 | ||||
| -rw-r--r-- | sys/fs/msdosfs/msdosfs_vfsops.c | 41 | ||||
| -rw-r--r-- | sys/fs/msdosfs/msdosfs_vnops.c | 35 | ||||
| -rw-r--r-- | sys/fs/msdosfs/msdosfsmount.h | 38 |
6 files changed, 123 insertions, 74 deletions
diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c index 7e0af0af6db..e91fcbe2727 100644 --- a/sys/fs/msdosfs/msdosfs_denode.c +++ b/sys/fs/msdosfs/msdosfs_denode.c @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_denode.c,v 1.16 2006/11/16 01:33:35 christos Exp $ */ +/* $NetBSD: msdosfs_denode.c,v 1.17 2006/11/25 12:17:30 scw Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.16 2006/11/16 01:33:35 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.17 2006/11/25 12:17:30 scw Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -456,8 +456,8 @@ detrunc(struct denode *dep, u_long length, int flags, kauth_cred_t cred, if ((boff = length & pmp->pm_crbomask) != 0) { if (isadir) { bn = cntobn(pmp, eofentry); - error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, - NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), + pmp->pm_bpcluster, NOCRED, &bp); if (error) { brelse(bp); #ifdef MSDOSFS_DEBUG diff --git a/sys/fs/msdosfs/msdosfs_fat.c b/sys/fs/msdosfs/msdosfs_fat.c index 19e5620ebf3..f755753d0e3 100644 --- a/sys/fs/msdosfs/msdosfs_fat.c +++ b/sys/fs/msdosfs/msdosfs_fat.c @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_fat.c,v 1.11 2006/09/22 17:45:21 xtraeme Exp $ */ +/* $NetBSD: msdosfs_fat.c,v 1.12 2006/11/25 12:17:30 scw Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_fat.c,v 1.11 2006/09/22 17:45:21 xtraeme Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_fat.c,v 1.12 2006/11/25 12:17:30 scw Exp $"); /* * kernel include files. @@ -171,7 +171,7 @@ int pcbmap(dep, findcn, bnp, cnp, sp) struct denode *dep; u_long findcn; /* file relative cluster to get */ - daddr_t *bnp; /* returned filesys relative blk number */ + daddr_t *bnp; /* returned filesys rel sector number */ u_long *cnp; /* returned cluster number */ int *sp; /* returned block size */ { @@ -260,7 +260,8 @@ pcbmap(dep, findcn, bnp, cnp, sp) if (bn != bp_bn) { if (bp) brelse(bp); - error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), bsize, + NOCRED, &bp); if (error) { brelse(bp); return (error); @@ -394,7 +395,13 @@ updatefats(pmp, bp, fatbn) + ffs(pmp->pm_inusemap[cn / N_INUSEBITS] ^ (u_int)-1) - 1; } - if (bread(pmp->pm_devvp, pmp->pm_fsinfo, 1024, NOCRED, &bpn) != 0) { + /* + * XXX If the fsinfo block is stored on media with + * 2KB or larger sectors, is the fsinfo structure + * padded at the end or in the middle? + */ + if (bread(pmp->pm_devvp, de_bn2kb(pmp, pmp->pm_fsinfo), + pmp->pm_BytesPerSec, NOCRED, &bpn) != 0) { /* * Ignore the error, but turn off FSInfo update for the future. */ @@ -426,7 +433,8 @@ updatefats(pmp, bp, fatbn) for (i = 1; i < pmp->pm_FATs; i++) { fatbn += pmp->pm_FATsecs; /* getblk() never fails */ - bpn = getblk(pmp->pm_devvp, fatbn, bp->b_bcount, 0, 0); + bpn = getblk(pmp->pm_devvp, de_bn2kb(pmp, fatbn), + bp->b_bcount, 0, 0); memcpy(bpn->b_data, bp->b_data, bp->b_bcount); if (pmp->pm_flags & MSDOSFSMNT_WAITONFAT) bwrite(bpn); @@ -575,7 +583,8 @@ fatentry(function, pmp, cn, oldcontents, newcontents) byteoffset = FATOFS(pmp, cn); fatblock(pmp, byteoffset, &bn, &bsize, &bo); - if ((error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp)) != 0) { + if ((error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), bsize, NOCRED, + &bp)) != 0) { brelse(bp); return (error); } @@ -658,7 +667,8 @@ fatchain(pmp, start, count, fillwith) while (count > 0) { byteoffset = FATOFS(pmp, start); fatblock(pmp, byteoffset, &bn, &bsize, &bo); - error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), bsize, NOCRED, + &bp); if (error) { brelse(bp); return (error); @@ -899,7 +909,8 @@ freeclusterchain(pmp, cluster) if (lbn != bn) { if (bp) updatefats(pmp, bp, lbn); - error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), bsize, + NOCRED, &bp); if (error) { brelse(bp); return (error); @@ -973,7 +984,8 @@ fillinusemap(pmp) if (bp) brelse(bp); fatblock(pmp, byteoffset, &bn, &bsize, NULL); - error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), bsize, + NOCRED, &bp); if (error) { brelse(bp); return (error); @@ -1102,8 +1114,9 @@ extendfile(dep, count, bpp, ncp, flags) if ((flags & DE_CLEAR) && (dep->de_Attributes & ATTR_DIRECTORY)) { while (got-- > 0) { - bp = getblk(pmp->pm_devvp, cntobn(pmp, cn++), - pmp->pm_bpcluster, 0, 0); + bp = getblk(pmp->pm_devvp, + de_bn2kb(pmp, cntobn(pmp, cn++)), + pmp->pm_bpcluster, 0, 0); clrbuf(bp); if (bpp) { *bpp = bp; diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c index c2355eb630b..308c7aea85f 100644 --- a/sys/fs/msdosfs/msdosfs_lookup.c +++ b/sys/fs/msdosfs/msdosfs_lookup.c @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_lookup.c,v 1.9 2006/05/14 21:31:52 elad Exp $ */ +/* $NetBSD: msdosfs_lookup.c,v 1.10 2006/11/25 12:17:30 scw Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_lookup.c,v 1.9 2006/05/14 21:31:52 elad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_lookup.c,v 1.10 2006/11/25 12:17:30 scw Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -225,7 +225,8 @@ msdosfs_lookup(v) break; return (error); } - error = bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, NOCRED, + &bp); if (error) { brelse(bp); return (error); @@ -657,7 +658,8 @@ createde(dep, ddep, depp, cnp) clusoffset = ddep->de_fndoffset; if (dirclust != MSDOSFSROOT) clusoffset &= pmp->pm_crbomask; - if ((error = bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp)) != 0) { + if ((error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, NOCRED, + &bp)) != 0) { brelse(bp); goto err_norollback; } @@ -694,8 +696,8 @@ createde(dep, ddep, depp, cnp) if (error) goto rollback; - error = bread(pmp->pm_devvp, bn, blsize, - NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), + blsize, NOCRED, &bp); if (error) { brelse(bp); goto rollback; @@ -747,7 +749,8 @@ createde(dep, ddep, depp, cnp) &bn, NULL, &blsize); if (rberror) goto err_norollback; - if ((rberror = bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp)) != 0) { + if ((rberror = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, NOCRED, + &bp)) != 0) { brelse(bp); goto err_norollback; } @@ -774,8 +777,8 @@ createde(dep, ddep, depp, cnp) if (rberror) goto err_norollback; - rberror = bread(pmp->pm_devvp, bn, blsize, - NOCRED, &bp); + rberror = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), + blsize, NOCRED, &bp); if (rberror) { brelse(bp); goto err_norollback; @@ -824,7 +827,8 @@ dosdirempty(dep) return (1); /* it's empty */ return (0); } - error = bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, NOCRED, + &bp); if (error) { brelse(bp); return (0); @@ -917,7 +921,7 @@ doscheckpath(source, target) break; } scn = dep->de_StartCluster; - error = bread(pmp->pm_devvp, cntobn(pmp, scn), + error = bread(pmp->pm_devvp, de_bn2kb(pmp, cntobn(pmp, scn)), pmp->pm_bpcluster, NOCRED, &bp); if (error) break; @@ -984,7 +988,8 @@ readep(pmp, dirclust, diroffset, bpp, epp) && de_blk(pmp, diroffset + blsize) > pmp->pm_rootdirsize) blsize = de_bn2off(pmp, pmp->pm_rootdirsize) & pmp->pm_crbomask; bn = detobn(pmp, dirclust, diroffset); - if ((error = bread(pmp->pm_devvp, bn, blsize, NOCRED, bpp)) != 0) { + if ((error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, NOCRED, + bpp)) != 0) { brelse(*bpp); *bpp = NULL; return (error); @@ -1043,7 +1048,8 @@ removede(pdep, dep) error = pcbmap(pdep, de_cluster(pmp, offset), &bn, 0, &blsize); if (error) return error; - error = bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, NOCRED, + &bp); if (error) { brelse(bp); return error; @@ -1119,7 +1125,8 @@ uniqdosname(dep, cnp, cp) return 0; return error; } - error = bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, + NOCRED, &bp); if (error) { brelse(bp); return error; @@ -1170,7 +1177,8 @@ findwin95(dep) for (cn = 0;; cn++) { if (pcbmap(dep, cn, &bn, 0, &blsize)) return 0; - if (bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp)) { + if (bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, NOCRED, + &bp)) { brelse(bp); return 0; } diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c index 66a20c326ec..b39c8fcb799 100644 --- a/sys/fs/msdosfs/msdosfs_vfsops.c +++ b/sys/fs/msdosfs/msdosfs_vfsops.c @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vfsops.c,v 1.39 2006/11/16 01:33:35 christos Exp $ */ +/* $NetBSD: msdosfs_vfsops.c,v 1.40 2006/11/25 12:17:30 scw Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.39 2006/11/16 01:33:35 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.40 2006/11/25 12:17:30 scw Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -438,20 +438,20 @@ msdosfs_mountfs(devvp, mp, l, argp) bp = NULL; /* both used in error_exit */ pmp = NULL; + /* + * We need the disklabel to calculate the size of a FAT entry + * later on. Also make sure the partition contains a filesystem + * of type FS_MSDOS. This doesn't work for floppies, so we have + * to check for them too. + * + * There might still be parts of the msdos fs driver which assume + * that the size of a disk block will always be 512 bytes. + * Let's root them out... + */ + error = VOP_IOCTL(devvp, DIOCGPART, &dpart, FREAD, NOCRED, l); + if (error) + goto error_exit; if (argp->flags & MSDOSFSMNT_GEMDOSFS) { - /* - * We need the disklabel to calculate the size of a FAT entry - * later on. Also make sure the partition contains a filesystem - * of type FS_MSDOS. This doesn't work for floppies, so we have - * to check for them too. - * - * At least some parts of the msdos fs driver seem to assume - * that the size of a disk block will always be 512 bytes. - * Let's check it... - */ - error = VOP_IOCTL(devvp, DIOCGPART, &dpart, FREAD, NOCRED, l); - if (error) - goto error_exit; tmp = dpart.part->p_fstype; dtype = dpart.disklab->d_type; bsize = dpart.disklab->d_secsize; @@ -465,7 +465,8 @@ msdosfs_mountfs(devvp, mp, l, argp) * Read the boot sector of the filesystem, and then check the * boot signature. If not a dos boot sector then error out. */ - if ((error = bread(devvp, 0, 512, NOCRED, &bp)) != 0) + if ((error = bread(devvp, 0, dpart.disklab->d_secsize, NOCRED, + &bp)) != 0) goto error_exit; bp->b_flags |= B_AGE; bsp = (union bootsector *)bp->b_data; @@ -672,7 +673,13 @@ msdosfs_mountfs(devvp, mp, l, argp) if (pmp->pm_fsinfo) { struct fsinfo *fp; - if ((error = bread(devvp, pmp->pm_fsinfo, 1024, NOCRED, &bp)) != 0) + /* + * XXX If the fsinfo block is stored on media with + * 2KB or larger sectors, is the fsinfo structure + * padded at the end or in the middle? + */ + if ((error = bread(devvp, de_bn2kb(pmp, pmp->pm_fsinfo), + pmp->pm_BytesPerSec, NOCRED, &bp)) != 0) goto error_exit; fp = (struct fsinfo *)bp->b_data; if (!memcmp(fp->fsisig1, "RRaA", 4) diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c index 01392389fa1..8e5b313f4d5 100644 --- a/sys/fs/msdosfs/msdosfs_vnops.c +++ b/sys/fs/msdosfs/msdosfs_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vnops.c,v 1.33 2006/11/16 01:33:35 christos Exp $ */ +/* $NetBSD: msdosfs_vnops.c,v 1.34 2006/11/25 12:17:30 scw Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.33 2006/11/16 01:33:35 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.34 2006/11/25 12:17:30 scw Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -516,7 +516,7 @@ msdosfs_read(v) if (diff < n) n = (long) diff; - /* convert cluster # to block # */ + /* convert cluster # to sector # */ error = pcbmap(dep, lbn, &lbn, 0, &blsize); if (error) return (error); @@ -526,7 +526,8 @@ msdosfs_read(v) * do i/o with the vnode for the filesystem instead of the * vnode for the directory. */ - error = bread(pmp->pm_devvp, lbn, blsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, lbn), blsize, + NOCRED, &bp); n = MIN(n, pmp->pm_bpcluster - bp->b_resid); if (error) { brelse(bp); @@ -651,9 +652,8 @@ msdosfs_write(v) error = uiomove(win, bytelen, uio); flags = UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0; ubc_release(win, flags); - if (error) { + if (error) break; - } /* * flush what we just wrote if necessary. @@ -1120,8 +1120,8 @@ abortit: panic("msdosfs_rename: updating .. in root directory?"); } else bn = cntobn(pmp, cn); - error = bread(pmp->pm_devvp, bn, pmp->pm_bpcluster, - NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), + pmp->pm_bpcluster, NOCRED, &bp); if (error) { /* XXX should really panic here, fs is corrupt */ brelse(bp); @@ -1236,7 +1236,7 @@ msdosfs_mkdir(v) */ bn = cntobn(pmp, newcluster); /* always succeeds */ - bp = getblk(pmp->pm_devvp, bn, pmp->pm_bpcluster, 0, 0); + bp = getblk(pmp->pm_devvp, de_bn2kb(pmp, bn), pmp->pm_bpcluster, 0, 0); memset(bp->b_data, 0, pmp->pm_bpcluster); memcpy(bp->b_data, &dosdirtemplate, sizeof dosdirtemplate); denp = (struct direntry *)bp->b_data; @@ -1479,8 +1479,8 @@ msdosfs_readdir(v) if (dep->de_StartCluster == MSDOSFSROOT || (FAT32(pmp) && dep->de_StartCluster == pmp->pm_rootdirblk)) { #if 0 - printf("msdosfs_readdir(): going after . or .. in root dir, offset %d\n", - offset); + printf("msdosfs_readdir(): going after . or .. in root dir, " + "offset %" PRIu64 "\n", offset); #endif bias = 2 * sizeof(struct direntry); if (offset < bias) { @@ -1534,7 +1534,8 @@ msdosfs_readdir(v) n = MIN(n, diff); if ((error = pcbmap(dep, lbn, &bn, &cn, &blsize)) != 0) break; - error = bread(pmp->pm_devvp, bn, blsize, NOCRED, &bp); + error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), blsize, + NOCRED, &bp); if (error) { brelse(bp); return (error); @@ -1696,6 +1697,7 @@ msdosfs_bmap(v) int *a_runp; } */ *ap = v; struct denode *dep = VTODE(ap->a_vp); + int status; if (ap->a_vpp != NULL) *ap->a_vpp = dep->de_devvp; @@ -1707,7 +1709,12 @@ msdosfs_bmap(v) */ *ap->a_runp = 0; } - return (pcbmap(dep, ap->a_bn, ap->a_bnp, 0, 0)); + status = pcbmap(dep, ap->a_bn, ap->a_bnp, 0, 0); + /* + * We need to scale *ap->a_bnp by sector_size/DEV_BSIZE + */ + *ap->a_bnp = de_bn2kb(dep->de_pmp, *ap->a_bnp); + return status; } int @@ -1738,6 +1745,8 @@ msdosfs_strategy(v) bp->b_blkno = -1; if (bp->b_blkno == -1) clrbuf(bp); + else + bp->b_blkno = de_bn2kb(dep->de_pmp, bp->b_blkno); } if (bp->b_blkno == -1) { biodone(bp); diff --git a/sys/fs/msdosfs/msdosfsmount.h b/sys/fs/msdosfs/msdosfsmount.h index 51583b601b6..26c367a7e6c 100644 --- a/sys/fs/msdosfs/msdosfsmount.h +++ b/sys/fs/msdosfs/msdosfsmount.h @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfsmount.h,v 1.11 2005/12/03 17:34:43 christos Exp $ */ +/* $NetBSD: msdosfsmount.h,v 1.12 2006/11/25 12:17:30 scw Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -110,16 +110,16 @@ struct msdosfsmount { struct vnode *pm_devvp; /* vnode for block device mntd */ struct bpb50 pm_bpb; /* BIOS parameter blk for this fs */ u_long pm_FATsecs; /* actual number of fat sectors */ - u_long pm_fatblk; /* block # of first FAT */ - u_long pm_rootdirblk; /* block # (cluster # for FAT32) of root directory number */ - u_long pm_rootdirsize; /* size in blocks (not clusters) */ - u_long pm_firstcluster; /* block number of first cluster */ + u_long pm_fatblk; /* sector # of first FAT */ + u_long pm_rootdirblk; /* sector # (cluster # for FAT32) of root directory number */ + u_long pm_rootdirsize; /* size in sectors (not clusters) */ + u_long pm_firstcluster; /* sector number of first cluster */ u_long pm_nmbrofclusters; /* # of clusters in filesystem */ u_long pm_maxcluster; /* maximum cluster number */ u_long pm_freeclustercount; /* number of free clusters */ u_long pm_cnshift; /* shift file offset right this amount to get a cluster number */ u_long pm_crbomask; /* and a file offset with this mask to get cluster rel offset */ - u_long pm_bnshift; /* shift file offset right this amount to get a block number */ + u_long pm_bnshift; /* shift file offset right this amount to get a sector number */ u_long pm_bpcluster; /* bytes per cluster */ u_long pm_fmod; /* ~0 if fs is modified, this can rollover to 0 */ u_long pm_fatblocksize; /* size of fat blocks in bytes */ @@ -164,18 +164,30 @@ struct msdosfsmount { + ((dirofs) & (pmp)->pm_crbomask))) /* - * Convert block number to cluster number + * Convert sector number to cluster number */ #define de_bn2cn(pmp, bn) \ ((bn) >> ((pmp)->pm_cnshift - (pmp)->pm_bnshift)) /* - * Convert cluster number to block number + * Convert cluster number to sector number */ #define de_cn2bn(pmp, cn) \ ((cn) << ((pmp)->pm_cnshift - (pmp)->pm_bnshift)) /* + * Convert sector number to kernel block number + */ +#define de_bn2kb(pmp, bn) \ + ((bn) << ((pmp)->pm_bnshift - DEV_BSHIFT)) + +/* + * Convert kernel block number to sector number + */ +#define de_kb2bn(pmp, kb) \ + ((kb) >> ((pmp)->pm_bnshift - DEV_BSHIFT)) + +/* * Convert file offset to cluster number */ #define de_cluster(pmp, off) \ @@ -188,7 +200,7 @@ struct msdosfsmount { (((size) + (pmp)->pm_bpcluster - 1) >> (pmp)->pm_cnshift) /* - * Convert file offset to block number + * Convert file offset to sector number */ #define de_blk(pmp, off) \ (de_cn2bn(pmp, de_cluster((pmp), (off)))) @@ -200,24 +212,24 @@ struct msdosfsmount { ((cn) << (pmp)->pm_cnshift) /* - * Convert block number to file offset + * Convert sector number to file offset */ #define de_bn2off(pmp, bn) \ ((bn) << (pmp)->pm_bnshift) /* - * Map a cluster number into a filesystem relative block number. + * Map a cluster number into a filesystem relative sector number. */ #define cntobn(pmp, cn) \ (de_cn2bn((pmp), (cn)-CLUST_FIRST) + (pmp)->pm_firstcluster) /* - * Calculate block number for directory entry in root dir, offset dirofs + * Calculate sector number for directory entry in root dir, offset dirofs */ #define roottobn(pmp, dirofs) \ (de_blk((pmp), (dirofs)) + (pmp)->pm_rootdirblk) /* - * Calculate block number for directory entry at cluster dirclu, offset + * Calculate sector number for directory entry at cluster dirclu, offset * dirofs */ #define detobn(pmp, dirclu, dirofs) \ |
