shutdown -p now crashes

Ganbold ganbold at micom.mng.net
Mon Nov 24 01:57:01 PST 2008


Ganbold wrote:
> (kgdb) p *fsrootvp
> $3 = {v_type = VDIR, v_tag = 0xc0864e51 "ufs", v_op = 0xc0926280, 
> v_data = 0xc3e5d000, v_mount = 0xc3e56b30, v_nmntvnodes = {tqe_next = 
> 0xc3d119b4,
>    tqe_prev = 0xc3e56b98}, v_un = {vu_mount = 0x0, vu_socket = 0x0, 
> vu_cdev = 0x0, vu_fifoinfo = 0x0, vu_yield = 0}, v_hashlist = {le_next 
> = 0x0,
>    le_prev = 0xc3d09da0}, v_hash = 2, v_cache_src = {lh_first = 0x0}, 
> v_cache_dst = {tqh_first = 0x0, tqh_last = 0xc3d11af8}, v_dd = 0x0, 
> v_cstart = 0,
>  v_lasta = 0, v_lastw = 0, v_clen = 0, v_lock = {lk_object = {lo_name 
> = 0xc0864e51 "ufs", lo_type = 0xc0864e51 "ufs", lo_flags = 70844416,
>      lo_witness_data = {lod_list = {stqe_next = 0x0}, lod_witness = 
> 0x0}}, lk_interlock = 0xc0956510, lk_flags = 262208, lk_sharecount = 0,
>    lk_waitcount = 0, lk_exclusivecount = 1, lk_prio = 80, lk_timo = 
> 51, lk_lockholder = 0xc3b31d20, lk_newlock = 0x0}, v_interlock = 
> {lock_object = {
>      lo_name = 0xc086fb51 "vnode interlock", lo_type = 0xc086fb51 
> "vnode interlock", lo_flags = 16973824, lo_witness_data = {lod_list = 
> {stqe_next = 0x0},
>        lod_witness = 0x0}}, mtx_lock = 3283295520, mtx_recurse = 0}, 
> v_vnlock = 0xc3d11b20, v_holdcnt = 2, v_usecount = 0, v_iflag = 0, 
> v_vflag = 1,
>  v_writecount = 0, v_freelist = {tqe_next = 0x0, tqe_prev = 0x0}, 
> v_bufobj = {bo_mtx = 0xc3d11b50, bo_clean = {bv_hd = {tqh_first = 
> 0xe3d02594,
>        tqh_last = 0xe3d025cc}, bv_root = 0xe3d02594, bv_cnt = 1}, 
> bo_dirty = {bv_hd = {tqh_first = 0x0, tqh_last = 0xc3d11b9c}, bv_root 
> = 0x0,
>      bv_cnt = 0}, bo_numoutput = 0, bo_flag = 0, bo_ops = 0xc091ae00, 
> bo_bsize = 16384, bo_object = 0xc106183c, bo_synclist = {le_next = 0x0,
>      le_prev = 0x0}, bo_private = 0xc3d11ac8, __bo_vnode = 
> 0xc3d11ac8}, v_pollinfo = 0x0, v_label = 0x0, v_lockf = 0x0}
> (kgdb) p rootvnode
> $4 = (struct vnode *) 0x0
> (kgdb) p *rootvnode
> Cannot access memory at address 0x0
> (kgdb)
>
>

Konstantin,

I have tried your patch. It seems like it is working, tried "shutdown -p 
now"
2 times and my RELENG_7 didn't crash after using zfs/geli external HDD 
via USB.
Attached patches are for RELENG_7 (small modifications made in order to 
apply to RELENG_7).

thanks a lot,

Ganbold


-- 
If you think education is expensive, try ignorance. -- Derek Bok, 
president of Harvard
-------------- next part --------------
--- opensolaris_kobj.c~	2008-04-17 09:23:29.000000000 +0800
+++ opensolaris_kobj.c	2008-11-24 14:28:01.000000000 +0800
@@ -67,17 +67,25 @@
 kobj_open_file_vnode(const char *file)
 {
 	struct thread *td = curthread;
+	struct filedesc *fd;
 	struct nameidata nd;
 	int error, flags;
 
-	if (td->td_proc->p_fd->fd_rdir == NULL)
-		td->td_proc->p_fd->fd_rdir = rootvnode;
-	if (td->td_proc->p_fd->fd_cdir == NULL)
-		td->td_proc->p_fd->fd_cdir = rootvnode;
+	fd = td->td_proc->p_fd;
+	FILEDESC_XLOCK(fd);
+	if (fd->fd_rdir == NULL) {
+		fd->fd_rdir = rootvnode;
+		vref(fd->fd_rdir);
+	}
+	if (fd->fd_cdir == NULL) {
+		fd->fd_cdir = rootvnode;
+		vref(fd->fd_cdir);
+	}
+	FILEDESC_XUNLOCK(fd);
 
 	flags = FREAD;
-	NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, file, td);
-	error = vn_open_cred(&nd, &flags, 0, td->td_ucred, NULL);
+	NDINIT(&nd, LOOKUP, MPSAFE, UIO_SYSSPACE, file, td);
+	error = vn_open_cred(&nd, &flags, O_NOFOLLOW, td->td_ucred, NULL);
 	NDFREE(&nd, NDF_ONLY_PNBUF);
 	if (error != 0)
 		return (NULL);
@@ -122,12 +130,15 @@
 	struct thread *td = curthread;
 	struct vattr va;
 	int error;
-
+	int vfslocked;
+ 
+	vfslocked = VFS_LOCK_GIANT(vp->v_mount);
 	vn_lock(vp, LK_SHARED | LK_RETRY, td);
 	error = VOP_GETATTR(vp, &va, td->td_ucred, td);
 	VOP_UNLOCK(vp, 0, td);
 	if (error == 0)
 		*size = (uint64_t)va.va_size;
+	VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
 }
 
@@ -161,6 +172,7 @@
 	struct uio auio;
 	struct iovec aiov;
 	int error;
+	int vfslocked;
 
 	bzero(&aiov, sizeof(aiov));
 	bzero(&auio, sizeof(auio));
@@ -176,9 +188,11 @@
 	auio.uio_resid = size;
 	auio.uio_td = td;
 
+	vfslocked = VFS_LOCK_GIANT(vp->v_mount);
 	vn_lock(vp, LK_SHARED | LK_RETRY, td);
 	error = VOP_READ(vp, &auio, IO_UNIT | IO_SYNC, td->td_ucred);
 	VOP_UNLOCK(vp, 0, td);
+	VFS_UNLOCK_GIANT(vfslocked);
 	return (error != 0 ? -1 : size - auio.uio_resid);
 }
 
@@ -213,8 +227,11 @@
 		struct vnode *vp = file->ptr;
 		struct thread *td = curthread;
 		int flags = FREAD;
-
+		int vfslocked;
+ 
+		vfslocked = VFS_LOCK_GIANT(vp->v_mount);
 		vn_close(vp, flags, td->td_ucred, td);
+		VFS_UNLOCK_GIANT(vfslocked);
 	}
 	kmem_free(file, sizeof(*file));
 }
-------------- next part --------------
--- vnode.h~	2008-04-17 09:23:30.000000000 +0800
+++ vnode.h	2008-11-24 14:33:13.000000000 +0800
@@ -156,6 +156,7 @@
     vnode_t **vpp, enum create crwhy, mode_t umask)
 {
 	struct thread *td = curthread;
+	struct filedesc *fdc;
 	struct nameidata nd;
 	int error;
 
@@ -164,12 +165,20 @@
 	ASSERT(crwhy == CRCREAT);
 	ASSERT(umask == 0);
 
-	if (td->td_proc->p_fd->fd_rdir == NULL)
-		td->td_proc->p_fd->fd_rdir = rootvnode;
-	if (td->td_proc->p_fd->fd_cdir == NULL)
-		td->td_proc->p_fd->fd_cdir = rootvnode;
+	fdc = td->td_proc->p_fd;
+	FILEDESC_XLOCK(fdc);
+	if (fdc->fd_rdir == NULL) {
+		fdc->fd_rdir = rootvnode;
+		vref(fdc->fd_rdir);
+	}
+	if (fdc->fd_cdir == NULL) {
+		fdc->fd_cdir = rootvnode;
+		vref(fdc->fd_rdir);
+	}
+	FILEDESC_XUNLOCK(fdc);
 
-	NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, pnamep, td);
+	NDINIT(&nd, LOOKUP, MPSAFE, UIO_SYSSPACE, pnamep, td);
+	filemode |= O_NOFOLLOW;
 	error = vn_open_cred(&nd, &filemode, createmode, td->td_ucred, NULL);
 	NDFREE(&nd, NDF_ONLY_PNBUF);
 	if (error == 0) {


More information about the freebsd-stable mailing list