Reproducable Infiniband panic

John Baldwin jhb at freebsd.org
Fri Jun 7 17:27:14 UTC 2013


On Friday, June 07, 2013 5:07:34 am Julian Stecklina wrote:
> 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'

Oof it's in another header:

Index: sys/ofed/include/linux/fs.h
===================================================================
--- fs.h	(revision 251494)
+++ fs.h	(working copy)
@@ -73,6 +73,7 @@ struct linux_file {
 	struct dentry	f_dentry_store;
 	struct selinfo	f_selinfo;
 	struct sigio	*f_sigio;
+	struct vnode	*f_vnode;
 };
 
 #define	file		linux_file


-- 
John Baldwin


More information about the freebsd-stable mailing list