Author: guido
Date: Mon Dec  7 15:15:08 2009
New Revision: 200214
URL: http://svn.freebsd.org/changeset/base/200214

Log:
  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.

Modified:
  head/sys/fs/ntfs/ntfs.h
  head/sys/fs/ntfs/ntfs_subr.c
  head/sys/fs/ntfs/ntfs_vfsops.c

Modified: head/sys/fs/ntfs/ntfs.h
==============================================================================
--- head/sys/fs/ntfs/ntfs.h     Mon Dec  7 14:47:45 2009        (r200213)
+++ head/sys/fs/ntfs/ntfs.h     Mon Dec  7 15:15:08 2009        (r200214)
@@ -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

Modified: head/sys/fs/ntfs/ntfs_subr.c
==============================================================================
--- head/sys/fs/ntfs/ntfs_subr.c        Mon Dec  7 14:47:45 2009        
(r200213)
+++ head/sys/fs/ntfs/ntfs_subr.c        Mon Dec  7 15:15:08 2009        
(r200214)
@@ -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);
 }

Modified: head/sys/fs/ntfs/ntfs_vfsops.c
==============================================================================
--- head/sys/fs/ntfs/ntfs_vfsops.c      Mon Dec  7 14:47:45 2009        
(r200213)
+++ head/sys/fs/ntfs/ntfs_vfsops.c      Mon Dec  7 15:15:08 2009        
(r200214)
@@ -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));
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to