Date: Wed, 12 Feb 97 11:35:32 JST From: Shunsuke Akiyama <akiyama@kme.mei.co.jp> To: FreeBSD-gnats-submit@freebsd.org Subject: kern/2715: MSDOS-FS 1024/2048 byte/sector media support. Message-ID: <9702120235.AA15048@kmegate.kme.mei.co.jp> Resent-Message-ID: <199702120250.SAA12943@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 2715 >Category: kern >Synopsis: MSDOS-FS 1024/2048 byte/sector media support. >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Class: change-request >Submitter-Id: current-users >Arrival-Date: Tue Feb 11 18:50:02 PST 1997 >Last-Modified: >Originator: Shunsuke Akiyama >Organization: Kyushu Matsushita Electric Co., Ltd. >Release: FreeBSD 3.0-970124-SNAP i386 >Environment: FreeBSD 3.0-970124-SNAP/MSDOS-FS >Description: In freebsd-scsi list, John Gumb (john@talisker.demon.co.uk) and Barry Scott (barry@scottb.demon.co.uk) posted their 1024 & 2048 byte/sector media support patches. I've tested their patches and improved for MSDOS-FS support. It's works fine for me and other some FreeBSD environments with Fujitsu M2513A MO drive and 2048 byte/sector media. >How-To-Repeat: N/A >Fix: =================================================================== --- sys/msdosfs/msdosfs_fat.c 1997/01/14 06:47:15 1.11 +++ sys/msdosfs/msdosfs_fat.c 1997/02/11 13:21:57 @@ -116,7 +116,7 @@ * pmp->pm_BytesPerSec; bn += pmp->pm_fatblk; if (bnp) - *bnp = bn; + *bnp = bn * pmp->pm_SecBlkRatio; if (sizep) *sizep = size; if (bop) @@ -185,7 +185,7 @@ return E2BIG; } if (bnp) - *bnp = pmp->pm_rootdirblk + (findcn * pmp->pm_SectPerClust); + *bnp = (pmp->pm_rootdirblk + (findcn * pmp->pm_SectPerClust)) * pmp->pm_SecBlkRatio; if (cnp) *cnp = MSDOSFSROOT; return 0; @@ -340,7 +340,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); =================================================================== --- sys/msdosfs/msdosfs_vfsops.c 1997/02/10 02:16:37 1.15 +++ sys/msdosfs/msdosfs_vfsops.c 1997/02/11 13:21:58 @@ -58,6 +58,9 @@ #include <sys/mount.h> #include <sys/buf.h> #include <sys/file.h> +#include <sys/disklabel.h> +#include <sys/ioctl.h> +#include <sys/errno.h> #include <sys/malloc.h> #include <msdosfs/bpb.h> @@ -273,6 +276,8 @@ struct buf *bp0 = NULL; struct byte_bpb33 *b33; struct byte_bpb50 *b50; + struct partinfo msdosfspart; + int secsize; #ifdef PC98 u_int pc98_wrk; u_int Phy_Sector_Size; @@ -300,14 +305,16 @@ if (error) return error; needclose = 1; -#ifdef HDSUPPORT + /* * Put this in when we support reading dos filesystems from * partitioned harddisks. */ - if (VOP_IOCTL(devvp, DIOCGPART, &msdosfspart, FREAD, NOCRED, p) == 0) { + if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&msdosfspart, FREAD, NOCRED, p) == 0) { + secsize = msdosfspart.disklab->d_secsize; + } else { + secsize = DEV_BSIZE; } -#endif /* * Read the boot sector of the filesystem, and then check the boot @@ -319,7 +326,7 @@ devvp->v_flag &= 0xffff; error = bread(devvp, 0, 1024, NOCRED, &bp0); #else - error = bread(devvp, 0, 512, NOCRED, &bp0); + error = bread(devvp, 0, secsize, NOCRED, &bp0); #endif if (error) goto error_exit; @@ -349,6 +356,9 @@ pmp = malloc(sizeof *pmp, M_MSDOSFSMNT, M_WAITOK); bzero((caddr_t)pmp, sizeof *pmp); pmp->pm_mountp = mp; + + /* calculate the ratio of sector size to DEV_BSIZE */ + pmp->pm_SecBlkRatio = secsize/DEV_BSIZE; /* * Compute several useful quantities from the bpb in the =================================================================== --- sys/msdosfs/msdosfsmount.h 1997/02/10 02:16:44 1.8 +++ sys/msdosfs/msdosfsmount.h 1997/02/11 13:21:58 @@ -60,6 +60,9 @@ 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_fatblk; /* block # of first FAT */ u_long pm_rootdirblk; /* block # of root directory */ u_long pm_rootdirsize; /* size in blocks (not clusters) */ @@ -124,20 +127,20 @@ * Map a cluster number into a filesystem relative block number. */ #define cntobn(pmp, cn) \ - ((((cn)-CLUST_FIRST) * (pmp)->pm_SectPerClust) + (pmp)->pm_firstcluster) + (((((cn)-CLUST_FIRST) * (pmp)->pm_SectPerClust) + (pmp)->pm_firstcluster) * (pmp)->pm_SecBlkRatio) /* * Map a filesystem relative block number back into a cluster number. */ #define bntocn(pmp, bn) \ - ((((bn) - pmp->pm_firstcluster)/ (pmp)->pm_SectPerClust) + CLUST_FIRST) + (((((bn)/((pmp)->pm_SecBlkRatio)) - pmp->pm_firstcluster)/ (pmp)->pm_SectPerClust) + CLUST_FIRST) /* * Calculate block number for directory entry in root dir, offset dirofs */ #define roottobn(pmp, dirofs) \ - (((dirofs) / (pmp)->pm_depclust) * (pmp)->pm_SectPerClust \ - + (pmp)->pm_rootdirblk) + ((((dirofs) / (pmp)->pm_depclust) * (pmp)->pm_SectPerClust \ + + (pmp)->pm_rootdirblk) * (pmp)->pm_SecBlkRatio) /* * Calculate block number for directory entry at cluster dirclu, offset >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9702120235.AA15048>