Date: Thu, 24 May 2007 23:31:14 +1000 From: "Zver Z." <klim_serega@ufps.chita.ru> To: freebsd-fs@freebsd.org Subject: System crash while trying to unmount manually ejected USB Flash drive Message-ID: <1180013474.1217.14.camel@XATA.RU>
next in thread | raw e-mail | index | archive | help
--=-ETfS36tLs1IuwtALdwwE Content-Type: text/plain Content-Transfer-Encoding: 7bit test patch FreeBSD 6.2, (pycckie ya ploho znay engl, esli shto pishite na mail) _________________________________________________________________________________ It'is current problem) _________________________________________________________________________________ --- /sys/kern/vfs_subr.c Mon Dec 4 17:47:53 2006 +++ vfs_subr.c Thu May 17 20:31:58 2007 @@ -1029,8 +1029,10 @@ * enabled under INVARIANTS */ BO_LOCK(bo); - if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0) - panic("vinvalbuf: dirty bufs"); + if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0) { + printf("bufobj_invalbuf: warning panic not run, error=%d\n", error); + flags = 0; + } } } /* _________________________________________________________________________________ panic whith msdosfs on flash(page fault) _________________________________________________________________________________ --- /sys/fs/msdosfs/msdosfs_vnops.c Mon Mar 13 12:05:13 2006 +++ msdosfs_vnops.c Thu May 17 11:44:23 2007 @@ -1834,7 +1834,9 @@ printf("\tstartcluster %lu, dircluster %lu, diroffset %lu, ", dep->de_StartCluster, dep->de_dirclust, dep->de_diroffset); - printf("on dev %s\n", devtoname(dep->de_dev)); + if (dep->de_dev != NULL) { + printf("on dev %s\n", devtoname(dep->de_dev)); + } return (0); } _________________________________________________________________________________ _________________________________________________________________________________ --- /sys/fs/msdosfs/msdosfs_vfsops.c Wed Dec 20 12:05:30 2006 +++ msdosfs_vfsops.c Wed May 16 21:24:03 2007 @@ -766,8 +766,10 @@ /* If the volume was mounted read/write, mark it clean now. */ if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0) { error = markvoldirty(pmp, 0); - if (error && (flags & FORCECLOSE) == 0) + if (error && (flags & FORCECLOSE) == 0 && (error & ENXIO) == 0) return (error); + if (error & ENXIO) + error = 0; } #ifdef MSDOSFS_DEBUG { _________________________________________________________________________________ _________________________________________________________________________________ --- /sys/ufs/ffs/ffs_vfsops.c Mon May 21 22:06:40 2007 +++ ffs_vfsops.c Mon May 21 22:07:35 2007 @@ -979,10 +979,12 @@ if (fs->fs_ronly == 0) { fs->fs_clean = fs->fs_flags & (FS_UNCLEAN|FS_NEEDSFSCK) ? 0 : 1; error = ffs_sbupdate(ump, MNT_WAIT, 0); - if (error) { + if (error && (error & ENXIO) == 0) { fs->fs_clean = 0; return (error); } + if (error & ENXIO) + error = 0; } DROP_GIANT(); g_topology_lock(); _________________________________________________________________________________ _________________________________________________________________________________ --- /sys/kern/vfs_mount.c Wed Oct 25 01:02:39 2006 +++ vfs_mount.c Thu May 17 11:48:49 2007 @@ -1194,6 +1194,10 @@ (flags & MNT_FORCE)) { error = VFS_UNMOUNT(mp, flags, td); } + if (error & ENXIO) { + printf("dounmount: error=%d\n", error); + error = VFS_UNMOUNT(mp, 0, td); + } vn_finished_write(mp); if (error) { /* Undo cdir/rdir and rootvnode changes made above. */ _________________________________________________________________________________ sorry my english))) --=-ETfS36tLs1IuwtALdwwE Content-Disposition: attachment; filename=vfs_subr.patch Content-Type: text/x-patch; name=vfs_subr.patch; charset=KOI8-R Content-Transfer-Encoding: 7bit --- /sys/kern/vfs_subr.c Mon Dec 4 17:47:53 2006 +++ vfs_subr.c Thu May 17 20:31:58 2007 @@ -1029,8 +1029,10 @@ * enabled under INVARIANTS */ BO_LOCK(bo); - if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0) - panic("vinvalbuf: dirty bufs"); + if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0) { + printf("bufobj_invalbuf: warning panic not run, error=%d\n", error); + flags = 0; + } } } /* --=-ETfS36tLs1IuwtALdwwE Content-Disposition: attachment; filename=vfs_mount.patch Content-Type: text/x-patch; name=vfs_mount.patch; charset=KOI8-R Content-Transfer-Encoding: 7bit --- /sys/kern/vfs_mount.c Wed Oct 25 01:02:39 2006 +++ vfs_mount.c Thu May 17 11:48:49 2007 @@ -1194,6 +1194,10 @@ (flags & MNT_FORCE)) { error = VFS_UNMOUNT(mp, flags, td); } + if (error & ENXIO) { + printf("dounmount: error=%d\n", error); + error = VFS_UNMOUNT(mp, 0, td); + } vn_finished_write(mp); if (error) { /* Undo cdir/rdir and rootvnode changes made above. */ --=-ETfS36tLs1IuwtALdwwE Content-Disposition: attachment; filename=msdosfs_vnops.patch Content-Type: text/x-patch; name=msdosfs_vnops.patch; charset=KOI8-R Content-Transfer-Encoding: 7bit --- /sys/fs/msdosfs/msdosfs_vnops.c Mon Mar 13 12:05:13 2006 +++ msdosfs_vnops.c Thu May 17 11:44:23 2007 @@ -1834,7 +1834,9 @@ printf("\tstartcluster %lu, dircluster %lu, diroffset %lu, ", dep->de_StartCluster, dep->de_dirclust, dep->de_diroffset); - printf("on dev %s\n", devtoname(dep->de_dev)); + if (dep->de_dev != NULL) { + printf("on dev %s\n", devtoname(dep->de_dev)); + } return (0); } --=-ETfS36tLs1IuwtALdwwE Content-Disposition: attachment; filename=msdosfs_vfsops.patch Content-Type: text/x-patch; name=msdosfs_vfsops.patch; charset=KOI8-R Content-Transfer-Encoding: 7bit --- /sys/fs/msdosfs/msdosfs_vfsops.c Wed Dec 20 12:05:30 2006 +++ msdosfs_vfsops.c Wed May 16 21:24:03 2007 @@ -766,8 +766,10 @@ /* If the volume was mounted read/write, mark it clean now. */ if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0) { error = markvoldirty(pmp, 0); - if (error && (flags & FORCECLOSE) == 0) + if (error && (flags & FORCECLOSE) == 0 && (error & ENXIO) == 0) return (error); + if (error & ENXIO) + error = 0; } #ifdef MSDOSFS_DEBUG { --=-ETfS36tLs1IuwtALdwwE Content-Disposition: attachment; filename=ffs_vfsops.patch Content-Type: text/x-patch; name=ffs_vfsops.patch; charset=KOI8-R Content-Transfer-Encoding: 7bit --- /sys/ufs/ffs/ffs_vfsops.c Mon May 21 22:06:40 2007 +++ ffs_vfsops.c Mon May 21 22:07:35 2007 @@ -979,10 +979,12 @@ if (fs->fs_ronly == 0) { fs->fs_clean = fs->fs_flags & (FS_UNCLEAN|FS_NEEDSFSCK) ? 0 : 1; error = ffs_sbupdate(ump, MNT_WAIT, 0); - if (error) { + if (error && (error & ENXIO) == 0) { fs->fs_clean = 0; return (error); } + if (error & ENXIO) + error = 0; } DROP_GIANT(); g_topology_lock(); --=-ETfS36tLs1IuwtALdwwE--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1180013474.1217.14.camel>