Reproducable Infiniband panic
Julian Stecklina
jsteckli at os.inf.tu-dresden.de
Fri Jun 7 09:07:35 UTC 2013
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
More information about the freebsd-stable
mailing list