View | Details | Raw Unified | Return to bug 203162 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/fs/fifofs/fifo_vnops.c (-2 / +9 lines)
Lines 64-69 struct fifoinfo { Link Here
64
	struct pipe *fi_pipe;
64
	struct pipe *fi_pipe;
65
	long	fi_readers;
65
	long	fi_readers;
66
	long	fi_writers;
66
	long	fi_writers;
67
	long	fi_rgen;
68
	long	fi_wgen;
67
};
69
};
68
70
69
static vop_print_t	fifo_print;
71
static vop_print_t	fifo_print;
Lines 137-142 fifo_open(ap) Link Here
137
	struct thread *td;
139
	struct thread *td;
138
	struct fifoinfo *fip;
140
	struct fifoinfo *fip;
139
	struct pipe *fpipe;
141
	struct pipe *fpipe;
142
	long gen;
140
	int error, stops_deferred;
143
	int error, stops_deferred;
141
144
142
	vp = ap->a_vp;
145
	vp = ap->a_vp;
Lines 164-169 fifo_open(ap) Link Here
164
	PIPE_LOCK(fpipe);
167
	PIPE_LOCK(fpipe);
165
	if (ap->a_mode & FREAD) {
168
	if (ap->a_mode & FREAD) {
166
		fip->fi_readers++;
169
		fip->fi_readers++;
170
		fip->fi_rgen++;
167
		if (fip->fi_readers == 1) {
171
		if (fip->fi_readers == 1) {
168
			fpipe->pipe_state &= ~PIPE_EOF;
172
			fpipe->pipe_state &= ~PIPE_EOF;
169
			if (fip->fi_writers > 0)
173
			if (fip->fi_writers > 0)
Lines 179-184 fifo_open(ap) Link Here
179
			return (ENXIO);
183
			return (ENXIO);
180
		}
184
		}
181
		fip->fi_writers++;
185
		fip->fi_writers++;
186
		fip->fi_wgen++;
182
		if (fip->fi_writers == 1) {
187
		if (fip->fi_writers == 1) {
183
			fpipe->pipe_state &= ~PIPE_EOF;
188
			fpipe->pipe_state &= ~PIPE_EOF;
184
			if (fip->fi_readers > 0)
189
			if (fip->fi_readers > 0)
Lines 187-192 fifo_open(ap) Link Here
187
	}
192
	}
188
	if ((ap->a_mode & O_NONBLOCK) == 0) {
193
	if ((ap->a_mode & O_NONBLOCK) == 0) {
189
		if ((ap->a_mode & FREAD) && fip->fi_writers == 0) {
194
		if ((ap->a_mode & FREAD) && fip->fi_writers == 0) {
195
			gen = fip->fi_wgen;
190
			VOP_UNLOCK(vp, 0);
196
			VOP_UNLOCK(vp, 0);
191
			stops_deferred = sigallowstop();
197
			stops_deferred = sigallowstop();
192
			error = msleep(&fip->fi_readers, PIPE_MTX(fpipe),
198
			error = msleep(&fip->fi_readers, PIPE_MTX(fpipe),
Lines 194-200 fifo_open(ap) Link Here
194
			if (stops_deferred)
200
			if (stops_deferred)
195
				sigdeferstop();
201
				sigdeferstop();
196
			vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
202
			vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
197
			if (error) {
203
			if (error != 0 && gen == fip->fi_wgen) {
198
				fip->fi_readers--;
204
				fip->fi_readers--;
199
				if (fip->fi_readers == 0) {
205
				if (fip->fi_readers == 0) {
200
					PIPE_LOCK(fpipe);
206
					PIPE_LOCK(fpipe);
Lines 214-219 fifo_open(ap) Link Here
214
			 */
220
			 */
215
		}
221
		}
216
		if ((ap->a_mode & FWRITE) && fip->fi_readers == 0) {
222
		if ((ap->a_mode & FWRITE) && fip->fi_readers == 0) {
223
			gen = fip->fi_rgen;
217
			VOP_UNLOCK(vp, 0);
224
			VOP_UNLOCK(vp, 0);
218
			stops_deferred = sigallowstop();
225
			stops_deferred = sigallowstop();
219
			error = msleep(&fip->fi_writers, PIPE_MTX(fpipe),
226
			error = msleep(&fip->fi_writers, PIPE_MTX(fpipe),
Lines 221-227 fifo_open(ap) Link Here
221
			if (stops_deferred)
228
			if (stops_deferred)
222
				sigdeferstop();
229
				sigdeferstop();
223
			vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
230
			vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
224
			if (error) {
231
			if (error != 0 && gen == fip->fi_rgen) {
225
				fip->fi_writers--;
232
				fip->fi_writers--;
226
				if (fip->fi_writers == 0) {
233
				if (fip->fi_writers == 0) {
227
					PIPE_LOCK(fpipe);
234
					PIPE_LOCK(fpipe);

Return to bug 203162