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
--- 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));
 }
--- 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) {
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to