230 break;
231 }
232
233 if (do_wakeup) {
234 smp_mb();
235 if (waitqueue_active(&pipe->wait))
236 wake_up_interruptible_sync(&pipe->wait);
237 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
238 do_wakeup = 0;
239 }
240
241 pipe->waiting_writers++;
242 pipe_wait(pipe);
243 pipe->waiting_writers--;
244 }
245
246 if (pipe->inode) {
247 mutex_unlock(&pipe->inode->i_mutex);
248
249 if (do_wakeup) {
250 smp_mb();
251 if (waitqueue_active(&pipe->wait))
252 wake_up_interruptible(&pipe->wait);
253 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
254 }
255 }
256
257 while (page_nr < spd_pages)
258 spd->spd_release(spd, page_nr++);
259
260 return ret;
261}
262
263static void spd_release_page(struct splice_pipe_desc *spd, unsigned int i)
264{
265 page_cache_release(spd->pages[i]);
266}
267
268static int
269__generic_file_splice_read(struct file *in, loff_t *ppos,
270 struct pipe_inode_info *pipe, size_t len,