From owner-freebsd-bugs Thu Aug 5 15:50: 7 1999 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id CA532155C1 for ; Thu, 5 Aug 1999 15:50:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id PAA38047; Thu, 5 Aug 1999 15:50:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from bd.mbn.or.jp (bd.mbn.or.jp [202.217.0.43]) by hub.freebsd.org (Postfix) with ESMTP id 9BE9A1557A for ; Thu, 5 Aug 1999 15:46:37 -0700 (PDT) (envelope-from chi@bd.mbn.or.jp) Received: from chino.localhost (cse5-42.sapporo.mbn.or.jp [202.217.111.66]) by bd.mbn.or.jp (8.9.1/bd.mbn.or.jp-2.0) with ESMTP id HAA24119; Fri, 6 Aug 1999 07:44:49 +0900 (JST) Message-Id: <199908052244.HAA24119@bd.mbn.or.jp> Date: Fri, 6 Aug 1999 07:44:49 +0900 (JST) From: chi@bd.mbn.or.jp Reply-To: chi@bd.mbn.or.jp, akiyama@kme.mei.co.jp To: FreeBSD-gnats-submit@freebsd.org X-Send-Pr-Version: 3.2 Subject: misc/12992: sector size independent patch for msdosfs(640MB MO,etc) Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 12992 >Category: misc >Synopsis: sector size independent patch for msdosfs(640MB MO,etc) >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Thu Aug 5 15:50:00 PDT 1999 >Closed-Date: >Last-Modified: >Originator: Chiharu Shibata >Release: FreeBSD 3.2-RELEASE i386 >Organization: FreeBSD(98) development team >Environment: Using 640MB MO, GIGA-MO, DVD-RAM, and 1.25MB FD of NEC PC-98. >Description: Our msdosfs code only handles 512 bytes/sector media, so we cannot use 640MB MO, 1.3GB MO (aka GIGA-MO) and DVD-RAM whose sector sizes are not 512 bytes/sector. 1.25MB FD of NEC PC-98 has same problem. This is the patch which can handle those non-512 bytes/sector media, useful both FreeBSD and FreeBSD(98). >How-To-Repeat: >Fix: This patch was once reviewed committers ML via Mr. Kato, and comments are reflected. diff -ru /sys/msdosfs/msdosfs_fat.c msdosfs_fat.c --- /sys/msdosfs/msdosfs_fat.c Thu Apr 16 02:46:42 1998 +++ msdosfs_fat.c Wed Jul 28 17:14:11 1999 @@ -113,7 +113,7 @@ bn += pmp->pm_fatblk + pmp->pm_curfat * pmp->pm_FATsecs; if (bnp) - *bnp = bn; + *bnp = bn * pmp->pm_SecBlkRatio; if (sizep) *sizep = size; if (bop) @@ -182,7 +182,8 @@ return (E2BIG); } if (bnp) - *bnp = pmp->pm_rootdirblk + de_cn2bn(pmp, findcn); + *bnp = (pmp->pm_rootdirblk + de_cn2bn(pmp, + findcn)) * pmp->pm_SecBlkRatio; if (cnp) *cnp = MSDOSFSROOT; if (sp) @@ -364,7 +365,8 @@ + ffs(pmp->pm_inusemap[cn / N_INUSEBITS] ^ (u_int)-1) - 1; } - if (bread(pmp->pm_devvp, pmp->pm_fsinfo, 1024, NOCRED, &bpn) != 0) { + if (bread(pmp->pm_devvp, pmp->pm_fsinfo * pmp->pm_SecBlkRatio, + fsi_size(pmp->pm_SecBlkRatio), NOCRED, &bpn) != 0) { /* * Ignore the error, but turn off FSInfo update for the future. */ @@ -394,7 +396,7 @@ * bwrite()'s and really slow things down. */ for (i = 1; i < pmp->pm_FATs; i++) { - fatbn += pmp->pm_FATsecs; + fatbn += (pmp->pm_FATsecs * pmp->pm_SecBlkRatio); /* getblk() never fails */ bpn = getblk(pmp->pm_devvp, fatbn, bp->b_bcount, 0, 0); bcopy(bp->b_data, bpn->b_data, bp->b_bcount); diff -ru /sys/msdosfs/msdosfs_vfsops.c msdosfs_vfsops.c --- /sys/msdosfs/msdosfs_vfsops.c Wed Apr 21 07:43:34 1999 +++ msdosfs_vfsops.c Wed Jul 28 17:14:12 1999 @@ -69,6 +69,17 @@ #include #include +#ifdef PC98 +/* + * XXX - The boot signature formatted by NEC PC-98 DOS looks like a + * garbage or a random value :-{ + * If you want to use that broken-signatured media, define the + * following symbol even though PC/AT. + * (ex. mount PC-98 DOS formatted FD on PC/AT) + */ +#define MSDOSFS_NOCHECKSIG +#endif + MALLOC_DEFINE(M_MSDOSFSMNT, "MSDOSFS mount", "MSDOSFS mount structure"); static MALLOC_DEFINE(M_MSDOSFSFAT, "MSDOSFS FAT", "MSDOSFS file allocation table"); @@ -428,12 +439,10 @@ /* * Read the boot sector of the filesystem, and then check the * boot signature. If not a dos boot sector then error out. + * + * NOTE: 2048 is a maximum sector size in current... */ -#ifdef PC98 - error = bread(devvp, 0, 1024, NOCRED, &bp); -#else - error = bread(devvp, 0, 512, NOCRED, &bp); -#endif + error = bread(devvp, 0, 2048, NOCRED, &bp); if (error) goto error_exit; bp->b_flags |= B_AGE; @@ -445,22 +454,13 @@ #ifndef __FreeBSD__ if (!(argp->flags & MSDOSFSMNT_GEMDOSFS)) { #endif -#ifdef PC98 - if ((bsp->bs50.bsBootSectSig0 != BOOTSIG0 - || bsp->bs50.bsBootSectSig1 != BOOTSIG1) - && (bsp->bs50.bsBootSectSig0 != 0 /* PC98 DOS 3.3x */ - || bsp->bs50.bsBootSectSig1 != 0) - && (bsp->bs50.bsBootSectSig0 != 0x90 /* PC98 DOS 5.0 */ - || bsp->bs50.bsBootSectSig1 != 0x3d) - && (bsp->bs50.bsBootSectSig0 != 0x46 /* PC98 DOS 3.3B */ - || bsp->bs50.bsBootSectSig1 != 0xfa)) { -#else +#ifndef MSDOSFS_NOCHECKSIG if (bsp->bs50.bsBootSectSig0 != BOOTSIG0 || bsp->bs50.bsBootSectSig1 != BOOTSIG1) { -#endif error = EINVAL; goto error_exit; } +#endif #ifndef __FreeBSD__ } #endif @@ -485,6 +485,9 @@ pmp->pm_Heads = getushort(b50->bpbHeads); pmp->pm_Media = b50->bpbMedia; + /* calculate the ratio of sector size to DEV_BSIZE */ + pmp->pm_SecBlkRatio = pmp->pm_BytesPerSec / DEV_BSIZE; + #ifndef __FreeBSD__ if (!(argp->flags & MSDOSFSMNT_GEMDOSFS)) { #endif @@ -676,7 +679,9 @@ if (pmp->pm_fsinfo) { struct fsinfo *fp; - if ((error = bread(devvp, pmp->pm_fsinfo, 1024, NOCRED, &bp)) != 0) + if ((error = bread(devvp, pmp->pm_fsinfo * pmp->pm_SecBlkRatio, + fsi_size(pmp->pm_SecBlkRatio), + NOCRED, &bp)) != 0) goto error_exit; fp = (struct fsinfo *)bp->b_data; if (!bcmp(fp->fsisig1, "RRaA", 4) diff -ru /sys/msdosfs/msdosfsmount.h msdosfsmount.h --- /sys/msdosfs/msdosfsmount.h Tue Feb 24 01:44:37 1998 +++ msdosfsmount.h Wed Jul 28 17:14:12 1999 @@ -68,6 +68,7 @@ mode_t pm_mask; /* mask to and with file protection bits */ struct vnode *pm_devvp; /* vnode for block device mntd */ struct bpb50 pm_bpb; /* BIOS parameter blk for this fs */ + int pm_SecBlkRatio; /* How many DEV_BSIZE blocks fit inside a physical sector */ 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 */ @@ -174,13 +175,15 @@ * Map a cluster number into a filesystem relative block number. */ #define cntobn(pmp, cn) \ - (de_cn2bn((pmp), (cn)-CLUST_FIRST) + (pmp)->pm_firstcluster) + ((de_cn2bn((pmp), (cn)-CLUST_FIRST) + (pmp)->pm_firstcluster) \ + * (pmp)->pm_SecBlkRatio) /* * Calculate block number for directory entry in root dir, offset dirofs */ #define roottobn(pmp, dirofs) \ - (de_blk((pmp), (dirofs)) + (pmp)->pm_rootdirblk) + ((de_blk((pmp), (dirofs)) + (pmp)->pm_rootdirblk) \ + * (pmp)->pm_SecBlkRatio) /* * Calculate block number for directory entry at cluster dirclu, offset @@ -190,6 +193,12 @@ ((dirclu) == MSDOSFSROOT \ ? roottobn((pmp), (dirofs)) \ : cntobn((pmp), (dirclu))) + +/* + * Calculate fsinfo block size + */ +#define fsi_size(sbr) \ + (1024 << ((sbr) >> 2)) int msdosfs_init __P((struct vfsconf *vfsp)); int msdosfs_mountroot __P((void)); >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message