Date: Fri, 07 Jun 2013 11:07:34 +0200 From: Julian Stecklina <jsteckli@os.inf.tu-dresden.de> To: John Baldwin <jhb@freebsd.org>, freebsd-stable@freebsd.org Subject: Re: Reproducable Infiniband panic Message-ID: <51B1A2D6.4030901@os.inf.tu-dresden.de> In-Reply-To: <201306061457.52278.jhb@freebsd.org> References: <51B07705.207@os.inf.tu-dresden.de> <51B0949B.1050606@FreeBSD.org> <201306061457.52278.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 06/06/2013 08:57 PM, John Baldwin wrote: > On Thursday, June 06, 2013 9:54:35 am Andriy Gapon wrote: [...] >> The problem seems to be in incorrect interaction between devfs_close_f and >> linux_file_dtor. The latter expects curthread->td_fpop to have a valid reasonable >> value. But the former sets curthread->td_fpop to fp only around vnops.fo_close() >> call and then restores it back to some (what?) previous value before calling >> devfs_fpdrop->devfs_destroy_cdevpriv. In this case the previous value is NULL. > > It is normally NULL in this case. Why does linux_file_dtor even look at > td_fpop? > > Ah. I think it should not do that and make the data it uses in the dtor more > self-contained: > > Index: sys/ofed/include/linux/linux_compat.c > =================================================================== > --- linux_compat.c (revision 251465) > +++ linux_compat.c (working copy) > @@ -212,7 +212,7 @@ linux_file_dtor(void *cdp) > struct linux_file *filp; > > filp = cdp; > - filp->f_op->release(curthread->td_fpop->f_vnode, filp); > + filp->f_op->release(filp->f_vnode, filp); > kfree(filp); > } > > @@ -232,6 +232,7 @@ linux_dev_open(struct cdev *dev, int oflags, int d > filp->f_dentry = &filp->f_dentry_store; > filp->f_op = ldev->ops; > filp->f_flags = file->f_flag; > + filp->f_vnode = file->f_vnode; > if (filp->f_op->open) { > error = -filp->f_op->open(file->f_vnode, filp); > if (error) { > Doesn't compile for me. Did you forget to add the f_vnode member to struct linux_file? sys/ofed/include/linux/linux_compat.c: In function 'linux_file_dtor': sys/ofed/include/linux/linux_compat.c:214: error: 'struct linux_file' has no member named 'f_vnode' sys/ofed/include/linux/linux_compat.c: In function 'linux_dev_open': sys/ofed/include/linux/linux_compat.c:234: error: 'struct linux_file' has no member named 'f_vnode' Julian
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51B1A2D6.4030901>