Date: Mon, 03 Oct 2011 20:57:04 +1100 From: Lawrence Stewart <lstewart@freebsd.org> To: lev@freebsd.org Cc: fs@freebsd.org Subject: Re: code in GEOM thread could not use vnode API (Was: alq_open_flags() panics in _mtx_lock_flags()) Message-ID: <4E8986F0.3050007@freebsd.org> In-Reply-To: <349860851.20111003113417@serebryakov.spb.ru> References: <1258376930.20111002193223@serebryakov.spb.ru> <228926402.20111002231459@serebryakov.spb.ru> <349860851.20111003113417@serebryakov.spb.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
[trimming current@ and geom@] On 10/03/11 18:34, Lev Serebryakov wrote: > Hello, Current. > You wrote 2 октября 2011 г., 23:14:59: > >> It seems, that error only occurs when I call alq API from geom >> threads (from g_events, for example). Module, which is not GEOM >> class, could use this API without any problem! > >> Is it normal, that GEOM could not use vnode API? Is it normal, that >> this leads to panic, and not some diagnostic messages, even with >> WITNESS and other diagnostic options turned on? > > not holding (explicitly release before call) topology lock doesn't > help. I know nothing about VFS, but wonder if it's something to do with the credentials you pass in? Alternatively, the way we do the VFS related calls in alq_open_flags() could be at fault... does anyone see anything wrong with the following (from sys/kern/kern_alq.c): ########## int alq_open_flags(struct alq **alqp, const char *file, struct ucred *cred, int cmode, int size, int flags) { struct thread *td; struct nameidata nd; struct alq *alq; int oflags; int error; int vfslocked; KASSERT((size > 0), ("%s: size <= 0", __func__)); *alqp = NULL; td = curthread; NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, file, td); oflags = FWRITE | O_NOFOLLOW | O_CREAT; error = vn_open_cred(&nd, &oflags, cmode, 0, cred, NULL); if (error) return (error); vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); /* We just unlock so we hold a reference */ VOP_UNLOCK(nd.ni_vp, 0); VFS_UNLOCK_GIANT(vfslocked); <more code after this> ########## Lev, are you able to share your code with us? Cheers, Lawrence
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4E8986F0.3050007>