Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Oct 1998 12:09:24 +0900 (JST)
From:      Toshihiko ARAI <toshi@tenchi.ne.jp>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   kern/8366: msdosfs re-mount kernel panic.
Message-ID:  <199810180309.MAA04256@lain.tenchi.ne.jp>

next in thread | raw e-mail | index | archive | help

>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 <kernel source>/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 <sys/proc.h>
 #include <sys/buf.h>
 #include <sys/vnode.h>
+
+#ifndef __FreeBSD_version
 #include <sys/kernel.h>		/* defines "time" */
+#endif
 
 #include <vm/vm.h>
 #include <vm/vm_extern.h>
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810180309.MAA04256>