From owner-freebsd-bugs Sat Oct 17 20:40:17 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id UAA01023 for freebsd-bugs-outgoing; Sat, 17 Oct 1998 20:40:17 -0700 (PDT) (envelope-from owner-freebsd-bugs@FreeBSD.ORG) Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id UAA00922 for ; Sat, 17 Oct 1998 20:40:05 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.8.8/8.8.5) id UAA11312; Sat, 17 Oct 1998 20:40:02 -0700 (PDT) Received: from lain.tenchi.ne.jp (dp1-007.kawagoe.linkclub.or.jp [210.155.115.207]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id UAA00501 for ; Sat, 17 Oct 1998 20:36:04 -0700 (PDT) (envelope-from toshi@tenchi.ne.jp) Received: (from toshi@localhost) by lain.tenchi.ne.jp (8.8.8/3.6Wb) id MAA04256; Sun, 18 Oct 1998 12:09:24 +0900 (JST) Message-Id: <199810180309.MAA04256@lain.tenchi.ne.jp> Date: Sun, 18 Oct 1998 12:09:24 +0900 (JST) From: Toshihiko ARAI To: FreeBSD-gnats-submit@FreeBSD.ORG X-Send-Pr-Version: 3.2 Subject: kern/8366: msdosfs re-mount kernel panic. Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 8366 >Category: kern >Synopsis: msdosfs re-mount kernel panic. >Confidential: yes >Severity: critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat Oct 17 20:40:01 PDT 1998 >Last-Modified: >Originator: Toshihiko ARAI >Organization: Tenchi-Muyo! & PIONEER-LDC ML. >Release: FreeBSD 2.2.7-RELEASE i386 >Environment: FreeBSD 2.2.7-RELEASE and 2.2-STABLE i386 and pc98 arch. FAT16, FAT32 msdos filesystem. >Description: msdosfs bugs. case 1: read-only -> writable -> file copy -> panic case 2: read-write -> read-only -> panic >How-To-Repeat: /etc/fstab: /dev/sd0s3 /msdos msdos ro 0 0 case 1 # mount /msdos # mount -u -w /msdos # cp foo.txt /msdos # sync panic: msdosfs_sync: rofs mod rebooting... case 2 writable mounted on /msdos # mount -u -r /msdos panic: vflush: not busy rebooting... >Fix: cd /msdosfs patch < patch-file Index: msdosfs_denode.c =================================================================== RCS file: /usr/tmp/cvsup/cvs/PAO/sys/msdosfs/msdosfs_denode.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 msdosfs_denode.c --- msdosfs_denode.c 1998/07/24 10:22:22 1.1.1.2 +++ msdosfs_denode.c 1998/10/17 06:07:00 @@ -55,7 +55,10 @@ #include #include #include + +#ifndef __FreeBSD_version #include /* defines "time" */ +#endif #include #include Index: msdosfs_lookup.c =================================================================== RCS file: /usr/tmp/cvsup/cvs/PAO/sys/msdosfs/msdosfs_lookup.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 msdosfs_lookup.c --- msdosfs_lookup.c 1998/07/24 10:22:25 1.1.1.2 +++ msdosfs_lookup.c 1998/10/17 05:25:25 @@ -942,9 +942,7 @@ int error; daddr_t bn; int blsize; - u_long boff; - boff = diroffset & ~pmp->pm_crbomask; blsize = pmp->pm_bpcluster; if (dirclust == MSDOSFSROOT && de_blk(pmp, diroffset + blsize) > pmp->pm_rootdirsize) Index: msdosfs_vfsops.c =================================================================== RCS file: /usr/tmp/cvsup/cvs/PAO/sys/msdosfs/msdosfs_vfsops.c,v retrieving revision 1.1.1.3 diff -u -r1.1.1.3 msdosfs_vfsops.c --- msdosfs_vfsops.c 1998/07/24 10:22:29 1.1.1.3 +++ msdosfs_vfsops.c 1998/10/17 05:44:47 @@ -259,7 +259,14 @@ flags = WRITECLOSE; if (mp->mnt_flag & MNT_FORCE) flags |= FORCECLOSE; +#ifndef __FreeBSD_version + if (vfs_busy(mp)) + return EBUSY; +#endif error = vflush(mp, NULLVP, flags); +#ifndef __FreeBSD_version + vfs_unbusy(mp); +#endif } if (!error && (mp->mnt_flag & MNT_RELOAD)) /* not yet implemented */ @@ -269,7 +276,7 @@ #ifdef __FreeBSD_version if ((pmp->pm_flags & MSDOSFSMNT_RONLY) && (mp->mnt_kern_flag & MNTK_WANTRDWR)) { #else - if ((pmp->pm_flags & MSDOSFSMNT_RONLY) && (mp->mnt_flag & MNT_RDONLY) == 0) { + if ((pmp->pm_flags & MSDOSFSMNT_RONLY) && (mp->mnt_flag & MNT_WANTRDWR)) { #endif /* * If upgrade to read-write by non-root, then verify @@ -1134,4 +1141,8 @@ msdosfs_init }; +#ifdef __FreeBSD_version +VFS_SET(msdosfs_vfsops, msdos, 0); +#else VFS_SET(msdosfs_vfsops, msdos, MOUNT_MSDOS, 0); +#endif Index: msdosfs_vnops.c =================================================================== RCS file: /usr/tmp/cvsup/cvs/PAO/sys/msdosfs/msdosfs_vnops.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 msdosfs_vnops.c --- msdosfs_vnops.c 1998/07/24 10:22:31 1.1.1.2 +++ msdosfs_vnops.c 1998/10/17 05:50:11 @@ -1521,7 +1523,9 @@ #endif goto bad; } - if (ip->de_dirclust != MSDOSFSROOT) + if (ip->de_dirclust == MSDOSFSROOT) + ip->de_diroffset = to_diroffset; + else ip->de_diroffset = to_diroffset & pmp->pm_crbomask; } reinsert(ip); @@ -2150,6 +2154,9 @@ static int msdosfs_strategy(ap) struct vop_strategy_args /* { +#ifdef __FreeBSD_version + struct vnode *a_vp; +#endif struct buf *a_bp; } */ *ap; { @@ -2187,7 +2194,11 @@ */ vp = dep->de_devvp; bp->b_dev = vp->v_rdev; +#ifdef __FreeBSD_version + VOP_STRATEGY(vp, bp); +#else VOCALL(vp->v_op, VOFFSET(vop_strategy), ap); +#endif return (0); } @@ -2200,7 +2211,7 @@ struct denode *dep = VTODE(ap->a_vp); printf( - "tag VT_MSDOSFS, startcluster %d, dircluster %ld, diroffset %ld ", + "tag VT_MSDOSFS, startcluster %lu, dircluster %lu, diroffset %lu ", dep->de_StartCluster, dep->de_dirclust, dep->de_diroffset); printf(" dev %d, %d", major(dep->de_dev), minor(dep->de_dev)); #ifdef __FreeBSD_version >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message