summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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