Date: Sun, 7 Jun 2009 15:34:52 +0400 From: georg@dts.su To: freebsd-questions@freebsd.org, freebsd-fs@freebsd.org Subject: Re[8]: fatal trap 12 Message-ID: <49009886.20090607153452@dts.su> In-Reply-To: <20090606175033.GJ1927@deviant.kiev.zoral.com.ua> References: <20090606161600.GB61928@dchagin.static.corbina.ru> <20090606175033.GJ1927@deviant.kiev.zoral.com.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
Hello. After patch, whan make kernel I have this: /usr/src/sys/kern/vfs_vnops.c:750:37: error: macro "vn_lock" requires 3 arg= uments, but only 2 given /usr/src/sys/kern/vfs_vnops.c: In function 'vn_ioctl': /usr/src/sys/kern/vfs_vnops.c:750: error: 'vn_lock' undeclared (first use i= n this function) /usr/src/sys/kern/vfs_vnops.c:750: error: (Each undeclared identifier is re= ported only once /usr/src/sys/kern/vfs_vnops.c:750: error: for each function it appears in.) /usr/src/sys/kern/vfs_vnops.c:769: error: too few arguments to function 'VO= P_UNLOCK' *** Error code 1 This problem with crashes I have after cPanel update perl to version 5.10.0... Can some body tell me - is this global problem of FreeBSD or it only with my installation? > [Please, remove the questions@ on the reply, this is the topic for > fs@]. > On Sat, Jun 06, 2009 at 08:16:00PM +0400, Chagin Dmitry wrote: >> ----- Forwarded message from georg@dts.su ----- >>=20 >> Date: Sat, 6 Jun 2009 10:58:11 +0400 >> From: georg@dts.su >> To: freebsd-questions@freebsd.org >> Subject: Re[2]: fatal trap 12 >>=20 >> Hello, Freebsd-questions. >>=20 >> After one of new crash I have this: >>=20 >> GNU gdb 6.1.1 [FreeBSD] >> Copyright 2004 Free Software Foundation, Inc. >> GDB is free software, covered by the GNU General Public License, and you= are >> welcome to change it and/or distribute copies of it under certain condit= ions. >> Type "show copying" to see the conditions. >> There is absolutely no warranty for GDB. Type "show warranty" for detai= ls. >> This GDB was configured as "amd64-marcel-freebsd"... >>=20 >> Unread portion of the kernel message buffer: >>=20 >>=20 >> Fatal trap 12: page fault while in kernel mode >> cpuid =3D 2; apic id =3D 02 >> fault virtual address =3D 0x0 >> fault code =3D supervisor read data, page not present >> instruction pointer =3D 0x8:0xffffffff804c4eb8 >> stack pointer =3D 0x10:0xffffff807a0478f0 >> frame pointer =3D 0x10:0xffffff807a047930 >> code segment =3D base 0x0, limit 0xfffff, type 0x1b >> =3D DPL 0, pres 1, long 1, def32 0, gran 1 >> processor eflags =3D interrupt enabled, resume, IOPL =3D 0 >> current process =3D 32668 (perl5.10.0) >> Physical memory: 4082 MB >> Dumping 1647 MB: 1632 1616 1600 1584 1568 1552 1536 1520 1504 1488 1472 = 1456 1440 1424 1408 1392 1376 1360 1344 1328 1312 1296 1280 1264 1248 1232 = 1216 1200 1184 1168 1152 1136 1120 1104 1088 1072 1056 1040 1024 1008 992 9= 76 960 944 928 912 896 880 864 848 832 816 800 784 768 752 736 720 704 688 = 672 656 640 624 608 592 576 560 544 528 512 496 480 464 448 432 416 400 384= 368 352 336 320 304 288 272 256 240 224 208 192 176 160 144 128 112 96 80 = 64 48 32 16 >>=20 >> Reading symbols from /boot/kernel/accf_http.ko...Reading symbols from /b= oot/kernel/accf_http.ko.symbols...done. >> done. >> Loaded symbols for /boot/kernel/accf_http.ko >> #0 doadump () at pcpu.h:195 >> 195 __asm __volatile("movq %%gs:0,%0" : "=3Dr" (td)); >> (kgdb) list *0xffffffff804c4eb8 >> 0xffffffff804c4eb8 is in pfs_ioctl (/usr/src/sys/fs/pseudofs/pseudofs_vn= ops.c:265). >> 260 static int >> 261 pfs_ioctl(struct vop_ioctl_args *va) >> 262 { >> 263 struct vnode *vn =3D va->a_vp; >> 264 struct pfs_vdata *pvd =3D vn->v_data; >> 265 struct pfs_node *pn =3D pvd->pvd_pn; >> 266 struct proc *proc; >> 267 int error; >> 268 >> 269 PFS_TRACE(("%s: %lx", pn->pn_name, va->a_command)); >> (kgdb) backtrace >> #0 doadump () at pcpu.h:195 >> #1 0xffffffff801c8dac in db_fncall (dummy1=3DVariable "dummy1" is not a= vailable. >> ) at /usr/src/sys/ddb/db_command.c:516 >> #2 0xffffffff801c92df in db_command (last_cmdp=3D0xffffffff80b30c88, cm= d_table=3D0x0, dopager=3D1) at /usr/src/sys/ddb/db_command.c:413 >> #3 0xffffffff801c94f0 in db_command_loop () at /usr/src/sys/ddb/db_comm= and.c:466 >> #4 0xffffffff801cb0d9 in db_trap (type=3DVariable "type" is not availab= le. >> ) at /usr/src/sys/ddb/db_main.c:228 >> #5 0xffffffff80554e55 in kdb_trap (type=3D12, code=3D0, tf=3D0xffffff80= 7a047840) at /usr/src/sys/kern/subr_kdb.c:524 >> #6 0xffffffff807fae80 in trap_fatal (frame=3D0xffffff807a047840, eva=3D= Variable "eva" is not available. >> ) at /usr/src/sys/amd64/amd64/trap.c:752 >> #7 0xffffffff807fb254 in trap_pfault (frame=3D0xffffff807a047840, userm= ode=3D0) at /usr/src/sys/amd64/amd64/trap.c:673 >> #8 0xffffffff807fbc02 in trap (frame=3D0xffffff807a047840) at /usr/src/= sys/amd64/amd64/trap.c:444 >> #9 0xffffffff807df35e in calltrap () at /usr/src/sys/amd64/amd64/except= ion.S:209 >> #10 0xffffffff804c4eb8 in pfs_ioctl (va=3D0xffffff807a047a10) at /usr/sr= c/sys/fs/pseudofs/pseudofs_vnops.c:264 >> #11 0xffffffff805bb1d3 in vn_ioctl (fp=3DVariable "fp" is not available. >> ) at vnode_if.h:437 >> #12 0xffffffff80562d02 in kern_ioctl (td=3D0xffffff0006682000, fd=3D3, c= om=3D1076655123, data=3D0xffffff00ad2b7d40 "") at file.h:269 >> #13 0xffffffff80563029 in ioctl (td=3D0xffffff0006682000, uap=3D0xffffff= 807a047bf0) at /usr/src/sys/kern/sys_generic.c:571 >> #14 0xffffffff807fb4d6 in syscall (frame=3D0xffffff807a047c80) at /usr/s= rc/sys/amd64/amd64/trap.c:900 >> #15 0xffffffff807df56b in Xfast_syscall () at /usr/src/sys/amd64/amd64/e= xception.S:330 >> #16 0x0000000800c9c0ec in ?? () >> Previous frame inner to this frame (corrupt stack?) >> (kgdb) >>=20 >>=20 >> Can You help me? What can I do? Server crash periodicaly... > The issue is that VOP_IOCTL interface takes unlocked vnode, which > may be reclaimed at any moment. The right thing to do is to fix > this before 8.0 freezed KPI. Please, try the patch below. > diff --git > a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c > b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c > index a7f47b2..018e6bd 100644 > --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c > +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c > @@ -258,7 +258,7 @@ zfs_ioctl(vnode_t *vp, u_long com, intptr_t data, int= flag, cred_t *cred, > int *rvalp, caller_context_t *ct) > { > offset_t off; > - int error; > + int error, locked; > zfsvfs_t *zfsvfs; > znode_t *zp; > =20 > @@ -276,6 +276,8 @@ zfs_ioctl(vnode_t *vp, u_long com, intptr_t data, int= flag, cred_t *cred, > =20 > case _FIO_SEEK_DATA: > case _FIO_SEEK_HOLE: > + locked =3D VOP_ISLOCKED(vp); > + VOP_UNLOCK(vp, 0); > if (ddi_copyin((void *)data, &off, sizeof (off), flag)) > return (EFAULT); > =20 > @@ -287,10 +289,15 @@ zfs_ioctl(vnode_t *vp, u_long com, intptr_t data, i= nt flag, cred_t *cred, > /* offset parameter is in/out */ > error =3D zfs_holey(vp, com, &off); > ZFS_EXIT(zfsvfs); > - if (error) > + if (error) { > + vn_lock(vp, locked | LK_RETRY); > return (error); > - if (ddi_copyout(&off, (void *)data, sizeof (off), flag)) > + } > + if (ddi_copyout(&off, (void *)data, sizeof (off), flag)) { > + vn_lock(vp, locked | LK_RETRY); > return (EFAULT); > + } > + vn_lock(vp, locked | LK_RETRY); > return (0); > } > return (ENOTTY); > diff --git a/sys/fs/coda/coda_vnops.c b/sys/fs/coda/coda_vnops.c > index c5c6cb1..0bf84c4 100644 > --- a/sys/fs/coda/coda_vnops.c > +++ b/sys/fs/coda/coda_vnops.c > @@ -420,7 +420,7 @@ coda_ioctl(struct vop_ioctl_args *ap) > struct ucred *cred =3D ap->a_cred; > struct thread *td =3D ap->a_td; > /* locals */ > - int error; > + int error, locked; > struct vnode *tvp; > struct nameidata ndp; > struct PioctlData *iap =3D (struct PioctlData *)data; > @@ -440,6 +440,8 @@ coda_ioctl(struct vop_ioctl_args *ap) > "ctlvp"));); > return (EOPNOTSUPP); > } > + locked =3D VOP_ISLOCKED(vp); > + VOP_UNLOCK(vp, 0); > =20 > /* > * Look up the pathname. > @@ -455,7 +457,7 @@ coda_ioctl(struct vop_ioctl_args *ap) > MARK_INT_FAIL(CODA_IOCTL_STATS); > CODADEBUG(CODA_IOCTL, myprintf(("coda_ioctl error: lookup= " > "returns %d\n", error));); > - return (error); > + goto out; > } > =20 > /* > @@ -469,11 +471,13 @@ coda_ioctl(struct vop_ioctl_args *ap) > CODADEBUG(CODA_IOCTL, > myprintf(("coda_ioctl error: %s not a coda object\n", > iap->path));); > - return (EINVAL); > + error =3D EINVAL; > + goto out; > } > if (iap->vi.in_size > VC_MAXDATASIZE) { > NDFREE(&ndp, 0); > - return (EINVAL); > + error =3D EINVAL; > + goto out; > } > error =3D venus_ioctl(vtomi(tvp), &((VTOC(tvp))->c_fid), com, fla= g, > data, cred, td->td_proc); > @@ -484,6 +488,8 @@ coda_ioctl(struct vop_ioctl_args *ap) > error));); > vrele(tvp); > NDFREE(&ndp, NDF_ONLY_PNBUF); > + out: > + vn_lock(vp, locked | LK_RETRY); > return (error); > } > =20 > diff --git a/sys/fs/deadfs/dead_vnops.c b/sys/fs/deadfs/dead_vnops.c > index 7a07b38..22029a7 100644 > --- a/sys/fs/deadfs/dead_vnops.c > +++ b/sys/fs/deadfs/dead_vnops.c > @@ -180,8 +180,8 @@ dead_ioctl(ap) > struct proc *a_p; > } */ *ap; > { > - /* XXX: Doesn't this just recurse back here ? */ > - return (VOP_IOCTL_AP(ap)); > + > + return (EIO); > } > =20 > /* > diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c > index 66963bc..8d20297 100644 > --- a/sys/fs/fifofs/fifo_vnops.c > +++ b/sys/fs/fifofs/fifo_vnops.c > @@ -89,8 +89,6 @@ struct fifoinfo { > static vop_print_t fifo_print; > static vop_open_t fifo_open; > static vop_close_t fifo_close; > -static vop_ioctl_t fifo_ioctl; > -static vop_kqfilter_t fifo_kqfilter; > static vop_pathconf_t fifo_pathconf; > static vop_advlock_t fifo_advlock; > =20 > @@ -116,8 +114,8 @@ struct vop_vector fifo_specops =3D { > .vop_close =3D fifo_close, > .vop_create =3D VOP_PANIC, > .vop_getattr =3D VOP_EBADF, > - .vop_ioctl =3D fifo_ioctl, > - .vop_kqfilter =3D fifo_kqfilter, > + .vop_ioctl =3D VOP_PANIC, > + .vop_kqfilter =3D VOP_PANIC, > .vop_link =3D VOP_PANIC, > .vop_mkdir =3D VOP_PANIC, > .vop_mknod =3D VOP_PANIC, > @@ -300,42 +298,6 @@ fail1: > return (0); > } > =20 > -/* > - * Now unused vnode ioctl routine. > - */ > -/* ARGSUSED */ > -static int > -fifo_ioctl(ap) > - struct vop_ioctl_args /* { > - struct vnode *a_vp; > - u_long a_command; > - caddr_t a_data; > - int a_fflag; > - struct ucred *a_cred; > - struct thread *a_td; > - } */ *ap; > -{ > - > - printf("WARNING: fifo_ioctl called unexpectedly\n"); > - return (ENOTTY); > -} > - > -/* > - * Now unused vnode kqfilter routine. > - */ > -/* ARGSUSED */ > -static int > -fifo_kqfilter(ap) > - struct vop_kqfilter_args /* { > - struct vnode *a_vp; > - struct knote *a_kn; > - } */ *ap; > -{ > - > - printf("WARNING: fifo_kqfilter called unexpectedly\n"); > - return (EINVAL); > -} > - > static void > filt_fifordetach(struct knote *kn) > { > diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c > index 8505cac..6f5d555 100644 > --- a/sys/fs/unionfs/union_vnops.c > +++ b/sys/fs/unionfs/union_vnops.c > @@ -913,12 +913,10 @@ unionfs_ioctl(struct vop_ioctl_args *ap) > =20 > KASSERT_UNIONFS_VNODE(ap->a_vp); > =20 - vn_lock(ap->>a_vp, LK_EXCLUSIVE | LK_RETRY); > unp =3D VTOUNIONFS(ap->a_vp); > unionfs_get_node_status(unp, ap->a_td, &unsp); > ovp =3D (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowe= rvp); > unionfs_tryrem_node_status(unp, unsp); > - VOP_UNLOCK(ap->a_vp, 0); > =20 > if (ovp =3D=3D NULLVP) > return (EBADF); > diff --git a/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c > b/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c > index 6d8d4eb..9b2c4b0 100644 > --- a/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c > +++ b/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c > @@ -1163,17 +1163,20 @@ _xfs_ioctl( > struct thread *a_td; > } */ *ap) > { > -/* struct vnode *vp =3D ap->a_vp; */ > + struct vnode *vp =3D ap->a_vp; > /* struct thread *p =3D ap->a_td; */ > /* struct file *fp; */ > - int error; > + int error, locked; > =20 > - xfs_vnode_t *xvp =3D VPTOXFSVP(ap->a_vp); > + xfs_vnode_t *xvp =3D VPTOXFSVP(vp); > =20 > printf("_xfs_ioctl cmd 0x%lx data %p\n",ap->a_command,ap->a_data); > =20 > + locked =3D VOP_ISLOCKED(vp); > + VOP_UNLOCK(vp, 0); > // XVOP_IOCTL(xvp,(void *)NULL,(void > *)NULL,ap->a_fflag,ap->a_command,ap->a_data,error); > error =3D > xfs_ioctl(xvp->v_bh.bh_first,NULL,NULL,ap->a_fflag,ap->a_command,ap->a_da= ta); > + vn_lock(vp, locked | LK_RETRY); > =20 > return error; > } > diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c > index 702faae..e48f81f 100644 > --- a/sys/kern/vfs_vnops.c > +++ b/sys/kern/vfs_vnops.c > @@ -817,13 +817,12 @@ vn_ioctl(fp, com, data, active_cred, td) > =20 > vfslocked =3D VFS_LOCK_GIANT(vp->v_mount); > error =3D ENOTTY; > + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); > switch (vp->v_type) { > case VREG: > case VDIR: > if (com =3D=3D FIONREAD) { > - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); > error =3D VOP_GETATTR(vp, &vattr, active_cred); > - VOP_UNLOCK(vp, 0); > if (!error) > *(int *)data =3D vattr.va_size - fp->f_of= fset; > } > @@ -837,6 +836,7 @@ vn_ioctl(fp, com, data, active_cred, td) > default: > break; > } > + VOP_UNLOCK(vp, 0); > VFS_UNLOCK_GIANT(vfslocked); > return (error); > } > diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src > index 81c0dff..81ef11c 100644 > --- a/sys/kern/vnode_if.src > +++ b/sys/kern/vnode_if.src > @@ -209,7 +209,7 @@ vop_write { > }; > =20 > =20 > -%% ioctl vp U U U > +%% ioctl vp L L L > =20 > vop_ioctl { > IN struct vnode *vp; --=20 Regards Yura mailto:georg@dts.su
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?49009886.20090607153452>