Module Name: src Committed By: mlelstv Date: Wed Oct 3 07:20:50 UTC 2012
Modified Files: src/sys/fs/adosfs: adosfs.h advfsops.c Log Message: Use getdisksize() to find out geometry, fetch only other magic values from disklabel. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/fs/adosfs/adosfs.h cvs rdiff -u -r1.64 -r1.65 src/sys/fs/adosfs/advfsops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/fs/adosfs/adosfs.h diff -u src/sys/fs/adosfs/adosfs.h:1.11 src/sys/fs/adosfs/adosfs.h:1.12 --- src/sys/fs/adosfs/adosfs.h:1.11 Sun Aug 30 12:36:38 2009 +++ src/sys/fs/adosfs/adosfs.h Wed Oct 3 07:20:50 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: adosfs.h,v 1.11 2009/08/30 12:36:38 phx Exp $ */ +/* $NetBSD: adosfs.h,v 1.12 2012/10/03 07:20:50 mlelstv Exp $ */ /* * Copyright (c) 1994 Christian E. Hopps @@ -116,7 +116,6 @@ struct adosfsmount { struct mount *mp; /* owner mount */ u_int32_t dostype; /* type of volume */ u_long rootb; /* root block number */ - u_long secsperblk; /* sectors per block */ u_long bsize; /* size of blocks */ u_long nwords; /* size of blocks in long words */ u_long dbsize; /* data bytes per block */ Index: src/sys/fs/adosfs/advfsops.c diff -u src/sys/fs/adosfs/advfsops.c:1.64 src/sys/fs/adosfs/advfsops.c:1.65 --- src/sys/fs/adosfs/advfsops.c:1.64 Tue Mar 13 18:40:35 2012 +++ src/sys/fs/adosfs/advfsops.c Wed Oct 3 07:20:50 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: advfsops.c,v 1.64 2012/03/13 18:40:35 elad Exp $ */ +/* $NetBSD: advfsops.c,v 1.65 2012/10/03 07:20:50 mlelstv Exp $ */ /* * Copyright (c) 1994 Christian E. Hopps @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: advfsops.c,v 1.64 2012/03/13 18:40:35 elad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: advfsops.c,v 1.65 2012/10/03 07:20:50 mlelstv Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -48,6 +48,7 @@ __KERNEL_RCSID(0, "$NetBSD: advfsops.c,v #include <sys/malloc.h> #include <sys/pool.h> #include <sys/disklabel.h> +#include <sys/disk.h> #include <miscfs/genfs/genfs.h> #include <miscfs/specfs/specdev.h> /* XXX */ #include <sys/fcntl.h> @@ -166,45 +167,69 @@ adosfs_mountfs(struct vnode *devvp, stru struct buf *bp; struct vnode *rvp; size_t bitmap_sz = 0; - int error, part, i; + int error, i; + uint64_t numsecs; + unsigned secsize; + unsigned long secsperblk, blksperdisk, resvblks; - part = DISKPART(devvp->v_rdev); amp = NULL; if ((error = vinvalbuf(devvp, V_SAVE, l->l_cred, l, 0, 0)) != 0) return (error); /* - * open blkdev and read root block + * open blkdev and read boot and root block */ vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); if ((error = VOP_OPEN(devvp, FREAD, NOCRED)) != 0) { VOP_UNLOCK(devvp); return (error); } - error = VOP_IOCTL(devvp, DIOCGDINFO, &dl, FREAD, NOCRED); - VOP_UNLOCK(devvp); + + error = getdisksize(devvp, &numsecs, &secsize); if (error) goto fail; - parp = &dl.d_partitions[part]; amp = kmem_zalloc(sizeof(struct adosfsmount), KM_SLEEP); - amp->mp = mp; + + /* + * compute filesystem parameters from disklabel + * on arch/amiga the disklabel is computed from the native + * partition tables + * - p_fsize is the filesystem block size + * - p_frag is the number of sectors per filesystem block + * - p_cpg is the number of reserved blocks (boot blocks) + * - p_psize is reduced by the number of preallocated blocks + * at the end of a partition + * + * XXX + * - bsize and secsperblk could be computed from the first sector + * of the root block + * - resvblks (the number of boot blocks) can only be guessed + * by scanning for the root block as its position moves + * with resvblks + */ + error = VOP_IOCTL(devvp, DIOCGDINFO, &dl, FREAD, NOCRED); + VOP_UNLOCK(devvp); + if (error) + goto fail; + parp = &dl.d_partitions[DISKPART(devvp->v_rdev)]; if (dl.d_type == DTYPE_FLOPPY) { - amp->bsize = dl.d_secsize; - amp->secsperblk = 1; - } - else { + amp->bsize = secsize; + secsperblk = 1; + resvblks = 2; + } else if (parp->p_fsize > 0 && parp->p_frag > 0) { amp->bsize = parp->p_fsize * parp->p_frag; - amp->secsperblk = parp->p_frag; - } - - /* invalid fs ? */ - if (amp->secsperblk == 0) { + secsperblk = parp->p_frag; + resvblks = parp->p_cpg; + } else { error = EINVAL; goto fail; } + blksperdisk = numsecs / secsperblk; + + /* The filesytem variant ('dostype') is stored in the boot block */ bp = NULL; if ((error = bread(devvp, (daddr_t)BBOFF, amp->bsize, NOCRED, 0, &bp)) != 0) { @@ -220,20 +245,21 @@ adosfs_mountfs(struct vnode *devvp, stru goto fail; } - amp->rootb = (parp->p_size / amp->secsperblk - 1 + parp->p_cpg) >> 1; - amp->numblks = parp->p_size / amp->secsperblk - parp->p_cpg; + amp->rootb = (blksperdisk - 1 + resvblks) / 2; + amp->numblks = blksperdisk - resvblks; amp->nwords = amp->bsize >> 2; amp->dbsize = amp->bsize - (IS_FFS(amp) ? 0 : OFS_DATA_OFFSET); amp->devvp = devvp; + amp->mp = mp; mp->mnt_data = amp; mp->mnt_stat.f_fsidx.__fsid_val[0] = (long)devvp->v_rdev; mp->mnt_stat.f_fsidx.__fsid_val[1] = makefstype(MOUNT_ADOSFS); mp->mnt_stat.f_fsid = mp->mnt_stat.f_fsidx.__fsid_val[0]; mp->mnt_stat.f_namemax = ADMAXNAMELEN; mp->mnt_fs_bshift = ffs(amp->bsize) - 1; - mp->mnt_dev_bshift = DEV_BSHIFT; /* XXX */ + mp->mnt_dev_bshift = DEV_BSHIFT; mp->mnt_flag |= MNT_LOCAL; /*