summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorguido <guido@FreeBSD.org>2009-12-07 15:15:08 +0000
committerguido <guido@FreeBSD.org>2009-12-07 15:15:08 +0000
commit8de2ee35f1dc5c1d236cb5441c9be55e77c45d77 (patch)
treeeecafee7c2310019b87164f08f35f52c4882f967 /sys/fs
parent2a4cc74b50f5931f03bb1e2237d31a20bdbebc1a (diff)
downloadFreeBSD-src-8de2ee35f1dc5c1d236cb5441c9be55e77c45d77.zip
FreeBSD-src-8de2ee35f1dc5c1d236cb5441c9be55e77c45d77.tar.gz
Fix ntfs such that it understand media with a non-512-bytes sector size:
1. Fixups are always done on 512 byte chunks (in stead of sectors). This is kind of stupid. 2. Conevrt between NTFS blocknumbers (the blocksize equals the media sector size) and the bread() and getblk() blocknr (which are 512-byte sized) NB: this change should not affect ntfs for 512-byte sector sizes.
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/ntfs/ntfs.h2
-rw-r--r--sys/fs/ntfs/ntfs_subr.c18
-rw-r--r--sys/fs/ntfs/ntfs_vfsops.c2
3 files changed, 15 insertions, 7 deletions
diff --git a/sys/fs/ntfs/ntfs.h b/sys/fs/ntfs/ntfs.h
index 3e88086..4f6431f 100644
--- a/sys/fs/ntfs/ntfs.h
+++ b/sys/fs/ntfs/ntfs.h
@@ -183,6 +183,7 @@ struct attr_indexentry {
};
#define NTFS_FILEMAGIC (u_int32_t)(0x454C4946)
+#define NTFS_BLOCK_SIZE 512
#define NTFS_FRFLAG_DIR 0x0002
struct filerec {
struct fixuphdr fr_fixup;
@@ -257,6 +258,7 @@ struct ntfsmount {
char ** ntm_u28; /* Unicode to 8 bit */
void * ntm_ic_l2u; /* Local to Unicode (iconv) */
void * ntm_ic_u2l; /* Unicode to Local (iconv) */
+ u_int8_t ntm_multiplier; /* NTFS blockno to DEV_BSIZE sectorno */
};
#define ntm_mftcn ntm_bootfile.bf_mftcn
diff --git a/sys/fs/ntfs/ntfs_subr.c b/sys/fs/ntfs/ntfs_subr.c
index f715741..a6c3b85 100644
--- a/sys/fs/ntfs/ntfs_subr.c
+++ b/sys/fs/ntfs/ntfs_subr.c
@@ -278,6 +278,7 @@ ntfs_loadntnode(
bn = ntfs_cntobn(ntmp->ntm_mftcn) +
ntmp->ntm_bpmftrec * ip->i_number;
+ bn *= ntmp->ntm_multiplier;
error = bread(ntmp->ntm_devvp,
bn, ntfs_bntob(ntmp->ntm_bpmftrec),
@@ -581,7 +582,7 @@ ntfs_attrtontvattr(
memcpy(vap->va_datap, (caddr_t) rap + rap->a_r.a_dataoff,
rap->a_r.a_datalen);
}
- ddprintf((", len: %d", vap->va_datalen));
+ ddprintf((", len: %lld", vap->va_datalen));
if (error)
free(vap, M_NTFSNTVATTR);
@@ -1491,11 +1492,13 @@ ntfs_writentvattr_plain(
(u_int32_t) left));
if ((off == 0) && (tocopy == ntfs_cntob(cl)))
{
- bp = getblk(ntmp->ntm_devvp, ntfs_cntobn(cn),
+ bp = getblk(ntmp->ntm_devvp, ntfs_cntobn(cn)
+ * ntmp->ntm_multiplier,
ntfs_cntob(cl), 0, 0, 0);
clrbuf(bp);
} else {
- error = bread(ntmp->ntm_devvp, ntfs_cntobn(cn),
+ error = bread(ntmp->ntm_devvp, ntfs_cntobn(cn)
+ * ntmp->ntm_multiplier,
ntfs_cntob(cl), NOCRED, &bp);
if (error) {
brelse(bp);
@@ -1602,7 +1605,8 @@ ntfs_readntvattr_plain(
(u_int32_t) tocopy,
(u_int32_t) left));
error = bread(ntmp->ntm_devvp,
- ntfs_cntobn(cn),
+ ntfs_cntobn(cn)
+ * ntmp->ntm_multiplier,
ntfs_cntob(cl),
NOCRED, &bp);
if (error) {
@@ -1878,7 +1882,7 @@ ntfs_procfixups(
fhp->fh_magic, magic);
return (EINVAL);
}
- if ((fhp->fh_fnum - 1) * ntmp->ntm_bps != len) {
+ if ((fhp->fh_fnum - 1) * NTFS_BLOCK_SIZE != len) {
printf("ntfs_procfixups: " \
"bad fixups number: %d for %ld bytes block\n",
fhp->fh_fnum, (long)len); /* XXX printf kludge */
@@ -1889,7 +1893,7 @@ ntfs_procfixups(
return (EINVAL);
}
fxp = (u_int16_t *) (buf + fhp->fh_foff);
- cfxp = (u_int16_t *) (buf + ntmp->ntm_bps - 2);
+ cfxp = (u_int16_t *) (buf + NTFS_BLOCK_SIZE - 2);
fixup = *fxp++;
for (i = 1; i < fhp->fh_fnum; i++, fxp++) {
if (*cfxp != fixup) {
@@ -1897,7 +1901,7 @@ ntfs_procfixups(
return (EINVAL);
}
*cfxp = *fxp;
- cfxp = (u_int16_t *) ((caddr_t) cfxp + ntmp->ntm_bps);
+ cfxp = (u_int16_t *) ((caddr_t) cfxp + NTFS_BLOCK_SIZE);
}
return (0);
}
diff --git a/sys/fs/ntfs/ntfs_vfsops.c b/sys/fs/ntfs/ntfs_vfsops.c
index 07dc2dd..ab5eede 100644
--- a/sys/fs/ntfs/ntfs_vfsops.c
+++ b/sys/fs/ntfs/ntfs_vfsops.c
@@ -316,6 +316,8 @@ ntfs_mountfs(devvp, mp, td)
else
ntmp->ntm_bpmftrec = (1 << (-cpr)) / ntmp->ntm_bps;
}
+ ntmp->ntm_multiplier = ntmp->ntm_bps / DEV_BSIZE;
+
dprintf(("ntfs_mountfs(): bps: %d, spc: %d, media: %x, mftrecsz: %d (%d sects)\n",
ntmp->ntm_bps,ntmp->ntm_spc,ntmp->ntm_bootfile.bf_media,
ntmp->ntm_mftrecsz,ntmp->ntm_bpmftrec));
OpenPOWER on IntegriCloud