FreeBSD Bugzilla – Attachment 161179 Details for
Bug 203162
when close(fd) on a fifo fails with EINTR, the file descriptor is not really closed
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Ignore signal after a wakeup, if there was a complimentary open, even transient v2
1.patch (text/plain), 1.91 KB, created by
Konstantin Belousov
on 2015-09-18 23:17:43 UTC
(
hide
)
Description:
Ignore signal after a wakeup, if there was a complimentary open, even transient v2
Filename:
MIME Type:
Creator:
Konstantin Belousov
Created:
2015-09-18 23:17:43 UTC
Size:
1.91 KB
patch
obsolete
>diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c >index e544bba..716faa3 100644 >--- a/sys/fs/fifofs/fifo_vnops.c >+++ b/sys/fs/fifofs/fifo_vnops.c >@@ -64,6 +64,8 @@ struct fifoinfo { > struct pipe *fi_pipe; > long fi_readers; > long fi_writers; >+ u_int fi_rgen; >+ u_int fi_wgen; > }; > > static vop_print_t fifo_print; >@@ -137,6 +139,7 @@ fifo_open(ap) > struct thread *td; > struct fifoinfo *fip; > struct pipe *fpipe; >+ u_int gen; > int error, stops_deferred; > > vp = ap->a_vp; >@@ -164,6 +167,7 @@ fifo_open(ap) > PIPE_LOCK(fpipe); > if (ap->a_mode & FREAD) { > fip->fi_readers++; >+ fip->fi_rgen++; > if (fip->fi_readers == 1) { > fpipe->pipe_state &= ~PIPE_EOF; > if (fip->fi_writers > 0) >@@ -179,6 +183,7 @@ fifo_open(ap) > return (ENXIO); > } > fip->fi_writers++; >+ fip->fi_wgen++; > if (fip->fi_writers == 1) { > fpipe->pipe_state &= ~PIPE_EOF; > if (fip->fi_readers > 0) >@@ -187,6 +192,7 @@ fifo_open(ap) > } > if ((ap->a_mode & O_NONBLOCK) == 0) { > if ((ap->a_mode & FREAD) && fip->fi_writers == 0) { >+ gen = fip->fi_wgen; > VOP_UNLOCK(vp, 0); > stops_deferred = sigallowstop(); > error = msleep(&fip->fi_readers, PIPE_MTX(fpipe), >@@ -194,7 +200,7 @@ fifo_open(ap) > if (stops_deferred) > sigdeferstop(); > vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); >- if (error) { >+ if (error != 0 && gen == fip->fi_wgen) { > fip->fi_readers--; > if (fip->fi_readers == 0) { > PIPE_LOCK(fpipe); >@@ -214,6 +220,7 @@ fifo_open(ap) > */ > } > if ((ap->a_mode & FWRITE) && fip->fi_readers == 0) { >+ gen = fip->fi_rgen; > VOP_UNLOCK(vp, 0); > stops_deferred = sigallowstop(); > error = msleep(&fip->fi_writers, PIPE_MTX(fpipe), >@@ -221,7 +228,7 @@ fifo_open(ap) > if (stops_deferred) > sigdeferstop(); > vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); >- if (error) { >+ if (error != 0 && gen == fip->fi_rgen) { > fip->fi_writers--; > if (fip->fi_writers == 0) { > PIPE_LOCK(fpipe);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 203162
:
161126
|
161127
|
161136
|
161150
| 161179