Pass the file descriptor index down to vn_open.
If the method vector was replaced and we got the "special return code" smile and trust that whatever happened below DTRT.
This commit is contained in:
parent
b80d7fd8a0
commit
e457974b5d
@ -685,8 +685,20 @@ kern_open(struct thread *td, char *path, enum uio_seg pathseg, int flags,
|
||||
* the descriptor while we are blocked in vn_open()
|
||||
*/
|
||||
fhold(fp);
|
||||
error = vn_open(&nd, &flags, cmode, -1);
|
||||
error = vn_open(&nd, &flags, cmode, indx);
|
||||
if (error) {
|
||||
|
||||
/*
|
||||
* If the vn_open replaced the method vector, something
|
||||
* wonderous happened deep below and we just pass it up
|
||||
* pretending we know what we do.
|
||||
*/
|
||||
if (error == ENXIO && fp->f_ops != &badfileops) {
|
||||
fdrop(fp, td);
|
||||
td->td_retval[0] = indx;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* release our own reference
|
||||
*/
|
||||
|
@ -685,8 +685,20 @@ kern_open(struct thread *td, char *path, enum uio_seg pathseg, int flags,
|
||||
* the descriptor while we are blocked in vn_open()
|
||||
*/
|
||||
fhold(fp);
|
||||
error = vn_open(&nd, &flags, cmode, -1);
|
||||
error = vn_open(&nd, &flags, cmode, indx);
|
||||
if (error) {
|
||||
|
||||
/*
|
||||
* If the vn_open replaced the method vector, something
|
||||
* wonderous happened deep below and we just pass it up
|
||||
* pretending we know what we do.
|
||||
*/
|
||||
if (error == ENXIO && fp->f_ops != &badfileops) {
|
||||
fdrop(fp, td);
|
||||
td->td_retval[0] = indx;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* release our own reference
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user