summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorscw <scw@NetBSD.org>2006-11-25 12:17:30 +0000
committerscw <scw@NetBSD.org>2006-11-25 12:17:30 +0000
commit4f0ca2726e3b071d3e1dc30939ef076628f00564 (patch)
tree5928ae50389632c03c76d179c33fd56007792c7c
parent79017e8016a32dd7d3b6f9e58223953af43cd368 (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.c8
-rw-r--r--sys/fs/msdosfs/msdosfs_fat.c37
-rw-r--r--sys/fs/msdosfs/msdosfs_lookup.c38
-rw-r--r--sys/fs/msdosfs/msdosfs_vfsops.c41
-rw-r--r--sys/fs/msdosfs/msdosfs_vnops.c35
-rw-r--r--sys/fs/msdosfs/msdosfsmount.h38
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) \