From owner-svn-src-head@FreeBSD.ORG Mon Dec 7 15:15:09 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0BE73106566B; Mon, 7 Dec 2009 15:15:09 +0000 (UTC) (envelope-from guido@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EF9838FC15; Mon, 7 Dec 2009 15:15:08 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id nB7FF8M3057494; Mon, 7 Dec 2009 15:15:08 GMT (envelope-from guido@svn.freebsd.org) Received: (from guido@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nB7FF8GN057493; Mon, 7 Dec 2009 15:15:08 GMT (envelope-from guido@svn.freebsd.org) Message-Id: <200912071515.nB7FF8GN057493@svn.freebsd.org> From: Guido van Rooij Date: Mon, 7 Dec 2009 15:15:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r200214 - head/sys/fs/ntfs X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Dec 2009 15:15:09 -0000 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));