mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-17 05:43:59 +00:00
- In devfs_open() and devfs_close() grab Giant if the driver sets NEEDGIANT.
We still have to DROP_GIANT and PICKUP_GIANT when NEEDGIANT is not set because vfs is still sometime entered with Giant held.
This commit is contained in:
parent
52bc746a28
commit
7b6b7657d2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=145730
|
@ -368,8 +368,11 @@ devfs_close(ap)
|
|||
DROP_GIANT();
|
||||
error = dsw->d_close(dev, ap->a_fflag, S_IFCHR, td);
|
||||
PICKUP_GIANT();
|
||||
} else
|
||||
} else {
|
||||
mtx_lock(&Giant);
|
||||
error = dsw->d_close(dev, ap->a_fflag, S_IFCHR, td);
|
||||
mtx_unlock(&Giant);
|
||||
}
|
||||
dev_relthread(dev);
|
||||
return (error);
|
||||
}
|
||||
|
@ -815,10 +818,14 @@ devfs_open(ap)
|
|||
else
|
||||
error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
|
||||
PICKUP_GIANT();
|
||||
} else if (dsw->d_fdopen != NULL)
|
||||
error = dsw->d_fdopen(dev, ap->a_mode, td, ap->a_fdidx);
|
||||
else
|
||||
error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
|
||||
} else {
|
||||
mtx_lock(&Giant);
|
||||
if (dsw->d_fdopen != NULL)
|
||||
error = dsw->d_fdopen(dev, ap->a_mode, td, ap->a_fdidx);
|
||||
else
|
||||
error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
|
||||
mtx_unlock(&Giant);
|
||||
}
|
||||
|
||||
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
|
||||
|
||||
|
|
Loading…
Reference in a new issue