diff options
Diffstat (limited to 'fs/pipe.c')
| -rw-r--r-- | fs/pipe.c | 104 |
1 files changed, 52 insertions, 52 deletions
| @@ -158,7 +158,7 @@ pipe_readv(struct file *filp, const struct iovec *_iov, | |||
| 158 | 158 | ||
| 159 | do_wakeup = 0; | 159 | do_wakeup = 0; |
| 160 | ret = 0; | 160 | ret = 0; |
| 161 | mutex_lock(PIPE_MUTEX(*inode)); | 161 | mutex_lock(&inode->i_mutex); |
| 162 | info = inode->i_pipe; | 162 | info = inode->i_pipe; |
| 163 | for (;;) { | 163 | for (;;) { |
| 164 | int bufs = info->nrbufs; | 164 | int bufs = info->nrbufs; |
| @@ -202,9 +202,9 @@ pipe_readv(struct file *filp, const struct iovec *_iov, | |||
| 202 | } | 202 | } |
| 203 | if (bufs) /* More to do? */ | 203 | if (bufs) /* More to do? */ |
| 204 | continue; | 204 | continue; |
| 205 | if (!PIPE_WRITERS(*inode)) | 205 | if (!inode->i_pipe->writers) |
| 206 | break; | 206 | break; |
| 207 | if (!PIPE_WAITING_WRITERS(*inode)) { | 207 | if (!inode->i_pipe->waiting_writers) { |
| 208 | /* syscall merging: Usually we must not sleep | 208 | /* syscall merging: Usually we must not sleep |
| 209 | * if O_NONBLOCK is set, or if we got some data. | 209 | * if O_NONBLOCK is set, or if we got some data. |
| 210 | * But if a writer sleeps in kernel space, then | 210 | * But if a writer sleeps in kernel space, then |
| @@ -222,16 +222,16 @@ pipe_readv(struct file *filp, const struct iovec *_iov, | |||
| 222 | break; | 222 | break; |
| 223 | } | 223 | } |
| 224 | if (do_wakeup) { | 224 | if (do_wakeup) { |
| 225 | wake_up_interruptible_sync(PIPE_WAIT(*inode)); | 225 | wake_up_interruptible_sync(&inode->i_pipe->wait); |
| 226 | kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT); | 226 | kill_fasync(&inode->i_pipe->fasync_writers, SIGIO, POLL_OUT); |
| 227 | } | 227 | } |
| 228 | pipe_wait(inode->i_pipe); | 228 | pipe_wait(inode->i_pipe); |
| 229 | } | 229 | } |
| 230 | mutex_unlock(PIPE_MUTEX(*inode)); | 230 | mutex_unlock(&inode->i_mutex); |
| 231 | /* Signal writers asynchronously that there is more room. */ | 231 | /* Signal writers asynchronously that there is more room. */ |
| 232 | if (do_wakeup) { | 232 | if (do_wakeup) { |
| 233 | wake_up_interruptible(PIPE_WAIT(*inode)); | 233 | wake_up_interruptible(&inode->i_pipe->wait); |
| 234 | kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT); | 234 | kill_fasync(&inode->i_pipe->fasync_writers, SIGIO, POLL_OUT); |
| 235 | } | 235 | } |
| 236 | if (ret > 0) | 236 | if (ret > 0) |
| 237 | file_accessed(filp); | 237 | file_accessed(filp); |
| @@ -264,10 +264,10 @@ pipe_writev(struct file *filp, const struct iovec *_iov, | |||
| 264 | 264 | ||
| 265 | do_wakeup = 0; | 265 | do_wakeup = 0; |
| 266 | ret = 0; | 266 | ret = 0; |
| 267 | mutex_lock(PIPE_MUTEX(*inode)); | 267 | mutex_lock(&inode->i_mutex); |
| 268 | info = inode->i_pipe; | 268 | info = inode->i_pipe; |
| 269 | 269 | ||
| 270 | if (!PIPE_READERS(*inode)) { | 270 | if (!inode->i_pipe->readers) { |
| 271 | send_sig(SIGPIPE, current, 0); | 271 | send_sig(SIGPIPE, current, 0); |
| 272 | ret = -EPIPE; | 272 | ret = -EPIPE; |
| 273 | goto out; | 273 | goto out; |
| @@ -306,7 +306,7 @@ pipe_writev(struct file *filp, const struct iovec *_iov, | |||
| 306 | 306 | ||
| 307 | for (;;) { | 307 | for (;;) { |
| 308 | int bufs; | 308 | int bufs; |
| 309 | if (!PIPE_READERS(*inode)) { | 309 | if (!inode->i_pipe->readers) { |
| 310 | send_sig(SIGPIPE, current, 0); | 310 | send_sig(SIGPIPE, current, 0); |
| 311 | if (!ret) ret = -EPIPE; | 311 | if (!ret) ret = -EPIPE; |
| 312 | break; | 312 | break; |
| @@ -367,19 +367,19 @@ pipe_writev(struct file *filp, const struct iovec *_iov, | |||
| 367 | break; | 367 | break; |
| 368 | } | 368 | } |
| 369 | if (do_wakeup) { | 369 | if (do_wakeup) { |
| 370 | wake_up_interruptible_sync(PIPE_WAIT(*inode)); | 370 | wake_up_interruptible_sync(&inode->i_pipe->wait); |
| 371 | kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN); | 371 | kill_fasync(&inode->i_pipe->fasync_readers, SIGIO, POLL_IN); |
| 372 | do_wakeup = 0; | 372 | do_wakeup = 0; |
| 373 | } | 373 | } |
| 374 | PIPE_WAITING_WRITERS(*inode)++; | 374 | inode->i_pipe->waiting_writers++; |
| 375 | pipe_wait(inode->i_pipe); | 375 | pipe_wait(inode->i_pipe); |
| 376 | PIPE_WAITING_WRITERS(*inode)--; | 376 | inode->i_pipe->waiting_writers--; |
| 377 | } | 377 | } |
| 378 | out: | 378 | out: |
| 379 | mutex_unlock(PIPE_MUTEX(*inode)); | 379 | mutex_unlock(&inode->i_mutex); |
| 380 | if (do_wakeup) { | 380 | if (do_wakeup) { |
| 381 | wake_up_interruptible(PIPE_WAIT(*inode)); | 381 | wake_up_interruptible(&inode->i_pipe->wait); |
| 382 | kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN); | 382 | kill_fasync(&inode->i_pipe->fasync_readers, SIGIO, POLL_IN); |
| 383 | } | 383 | } |
| 384 | if (ret > 0) | 384 | if (ret > 0) |
| 385 | file_update_time(filp); | 385 | file_update_time(filp); |
| @@ -416,7 +416,7 @@ pipe_ioctl(struct inode *pino, struct file *filp, | |||
| 416 | 416 | ||
| 417 | switch (cmd) { | 417 | switch (cmd) { |
| 418 | case FIONREAD: | 418 | case FIONREAD: |
| 419 | mutex_lock(PIPE_MUTEX(*inode)); | 419 | mutex_lock(&inode->i_mutex); |
| 420 | info = inode->i_pipe; | 420 | info = inode->i_pipe; |
| 421 | count = 0; | 421 | count = 0; |
| 422 | buf = info->curbuf; | 422 | buf = info->curbuf; |
| @@ -425,7 +425,7 @@ pipe_ioctl(struct inode *pino, struct file *filp, | |||
| 425 | count += info->bufs[buf].len; | 425 | count += info->bufs[buf].len; |
| 426 | buf = (buf+1) & (PIPE_BUFFERS-1); | 426 | buf = (buf+1) & (PIPE_BUFFERS-1); |
| 427 | } | 427 | } |
| 428 | mutex_unlock(PIPE_MUTEX(*inode)); | 428 | mutex_unlock(&inode->i_mutex); |
| 429 | return put_user(count, (int __user *)arg); | 429 | return put_user(count, (int __user *)arg); |
| 430 | default: | 430 | default: |
| 431 | return -EINVAL; | 431 | return -EINVAL; |
| @@ -441,14 +441,14 @@ pipe_poll(struct file *filp, poll_table *wait) | |||
| 441 | struct pipe_inode_info *info = inode->i_pipe; | 441 | struct pipe_inode_info *info = inode->i_pipe; |
| 442 | int nrbufs; | 442 | int nrbufs; |
| 443 | 443 | ||
| 444 | poll_wait(filp, PIPE_WAIT(*inode), wait); | 444 | poll_wait(filp, &inode->i_pipe->wait, wait); |
| 445 | 445 | ||
| 446 | /* Reading only -- no need for acquiring the semaphore. */ | 446 | /* Reading only -- no need for acquiring the semaphore. */ |
| 447 | nrbufs = info->nrbufs; | 447 | nrbufs = info->nrbufs; |
| 448 | mask = 0; | 448 | mask = 0; |
| 449 | if (filp->f_mode & FMODE_READ) { | 449 | if (filp->f_mode & FMODE_READ) { |
| 450 | mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0; | 450 | mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0; |
| 451 | if (!PIPE_WRITERS(*inode) && filp->f_version != PIPE_WCOUNTER(*inode)) | 451 | if (!inode->i_pipe->writers && filp->f_version != inode->i_pipe->w_counter) |
| 452 | mask |= POLLHUP; | 452 | mask |= POLLHUP; |
| 453 | } | 453 | } |
| 454 | 454 | ||
| @@ -458,7 +458,7 @@ pipe_poll(struct file *filp, poll_table *wait) | |||
| 458 | * Most Unices do not set POLLERR for FIFOs but on Linux they | 458 | * Most Unices do not set POLLERR for FIFOs but on Linux they |
| 459 | * behave exactly like pipes for poll(). | 459 | * behave exactly like pipes for poll(). |
| 460 | */ | 460 | */ |
| 461 | if (!PIPE_READERS(*inode)) | 461 | if (!inode->i_pipe->readers) |
| 462 | mask |= POLLERR; | 462 | mask |= POLLERR; |
| 463 | } | 463 | } |
| 464 | 464 | ||
| @@ -468,17 +468,17 @@ pipe_poll(struct file *filp, poll_table *wait) | |||
| 468 | static int | 468 | static int |
| 469 | pipe_release(struct inode *inode, int decr, int decw) | 469 | pipe_release(struct inode *inode, int decr, int decw) |
| 470 | { | 470 | { |
| 471 | mutex_lock(PIPE_MUTEX(*inode)); | 471 | mutex_lock(&inode->i_mutex); |
| 472 | PIPE_READERS(*inode) -= decr; | 472 | inode->i_pipe->readers -= decr; |
| 473 | PIPE_WRITERS(*inode) -= decw; | 473 | inode->i_pipe->writers -= decw; |
| 474 | if (!PIPE_READERS(*inode) && !PIPE_WRITERS(*inode)) { | 474 | if (!inode->i_pipe->readers && !inode->i_pipe->writers) { |
| 475 | free_pipe_info(inode); | 475 | free_pipe_info(inode); |
| 476 | } else { | 476 | } else { |
| 477 | wake_up_interruptible(PIPE_WAIT(*inode)); | 477 | wake_up_interruptible(&inode->i_pipe->wait); |
| 478 | kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN); | 478 | kill_fasync(&inode->i_pipe->fasync_readers, SIGIO, POLL_IN); |
| 479 | kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT); | 479 | kill_fasync(&inode->i_pipe->fasync_writers, SIGIO, POLL_OUT); |
| 480 | } | 480 | } |
| 481 | mutex_unlock(PIPE_MUTEX(*inode)); | 481 | mutex_unlock(&inode->i_mutex); |
| 482 | 482 | ||
| 483 | return 0; | 483 | return 0; |
| 484 | } | 484 | } |
| @@ -489,9 +489,9 @@ pipe_read_fasync(int fd, struct file *filp, int on) | |||
| 489 | struct inode *inode = filp->f_dentry->d_inode; | 489 | struct inode *inode = filp->f_dentry->d_inode; |
| 490 | int retval; | 490 | int retval; |
| 491 | 491 | ||
| 492 | mutex_lock(PIPE_MUTEX(*inode)); | 492 | mutex_lock(&inode->i_mutex); |
| 493 | retval = fasync_helper(fd, filp, on, PIPE_FASYNC_READERS(*inode)); | 493 | retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_readers); |
| 494 | mutex_unlock(PIPE_MUTEX(*inode)); | 494 | mutex_unlock(&inode->i_mutex); |
| 495 | 495 | ||
| 496 | if (retval < 0) | 496 | if (retval < 0) |
| 497 | return retval; | 497 | return retval; |
| @@ -506,9 +506,9 @@ pipe_write_fasync(int fd, struct file *filp, int on) | |||
| 506 | struct inode *inode = filp->f_dentry->d_inode; | 506 | struct inode *inode = filp->f_dentry->d_inode; |
| 507 | int retval; | 507 | int retval; |
| 508 | 508 | ||
| 509 | mutex_lock(PIPE_MUTEX(*inode)); | 509 | mutex_lock(&inode->i_mutex); |
| 510 | retval = fasync_helper(fd, filp, on, PIPE_FASYNC_WRITERS(*inode)); | 510 | retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_writers); |
| 511 | mutex_unlock(PIPE_MUTEX(*inode)); | 511 | mutex_unlock(&inode->i_mutex); |
| 512 | 512 | ||
| 513 | if (retval < 0) | 513 | if (retval < 0) |
| 514 | return retval; | 514 | return retval; |
| @@ -523,14 +523,14 @@ pipe_rdwr_fasync(int fd, struct file *filp, int on) | |||
| 523 | struct inode *inode = filp->f_dentry->d_inode; | 523 | struct inode *inode = filp->f_dentry->d_inode; |
| 524 | int retval; | 524 | int retval; |
| 525 | 525 | ||
| 526 | mutex_lock(PIPE_MUTEX(*inode)); | 526 | mutex_lock(&inode->i_mutex); |
| 527 | 527 | ||
| 528 | retval = fasync_helper(fd, filp, on, PIPE_FASYNC_READERS(*inode)); | 528 | retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_readers); |
| 529 | 529 | ||
| 530 | if (retval >= 0) | 530 | if (retval >= 0) |
| 531 | retval = fasync_helper(fd, filp, on, PIPE_FASYNC_WRITERS(*inode)); | 531 | retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_writers); |
| 532 | 532 | ||
| 533 | mutex_unlock(PIPE_MUTEX(*inode)); | 533 | mutex_unlock(&inode->i_mutex); |
| 534 | 534 | ||
| 535 | if (retval < 0) | 535 | if (retval < 0) |
| 536 | return retval; | 536 | return retval; |
| @@ -569,9 +569,9 @@ pipe_read_open(struct inode *inode, struct file *filp) | |||
| 569 | { | 569 | { |
| 570 | /* We could have perhaps used atomic_t, but this and friends | 570 | /* We could have perhaps used atomic_t, but this and friends |
| 571 | below are the only places. So it doesn't seem worthwhile. */ | 571 | below are the only places. So it doesn't seem worthwhile. */ |
| 572 | mutex_lock(PIPE_MUTEX(*inode)); | 572 | mutex_lock(&inode->i_mutex); |
| 573 | PIPE_READERS(*inode)++; | 573 | inode->i_pipe->readers++; |
| 574 | mutex_unlock(PIPE_MUTEX(*inode)); | 574 | mutex_unlock(&inode->i_mutex); |
| 575 | 575 | ||
| 576 | return 0; | 576 | return 0; |
| 577 | } | 577 | } |
| @@ -579,9 +579,9 @@ pipe_read_open(struct inode *inode, struct file *filp) | |||
| 579 | static int | 579 | static int |
| 580 | pipe_write_open(struct inode *inode, struct file *filp) | 580 | pipe_write_open(struct inode *inode, struct file *filp) |
| 581 | { | 581 | { |
| 582 | mutex_lock(PIPE_MUTEX(*inode)); | 582 | mutex_lock(&inode->i_mutex); |
| 583 | PIPE_WRITERS(*inode)++; | 583 | inode->i_pipe->writers++; |
| 584 | mutex_unlock(PIPE_MUTEX(*inode)); | 584 | mutex_unlock(&inode->i_mutex); |
| 585 | 585 | ||
| 586 | return 0; | 586 | return 0; |
| 587 | } | 587 | } |
| @@ -589,12 +589,12 @@ pipe_write_open(struct inode *inode, struct file *filp) | |||
| 589 | static int | 589 | static int |
| 590 | pipe_rdwr_open(struct inode *inode, struct file *filp) | 590 | pipe_rdwr_open(struct inode *inode, struct file *filp) |
| 591 | { | 591 | { |
| 592 | mutex_lock(PIPE_MUTEX(*inode)); | 592 | mutex_lock(&inode->i_mutex); |
| 593 | if (filp->f_mode & FMODE_READ) | 593 | if (filp->f_mode & FMODE_READ) |
| 594 | PIPE_READERS(*inode)++; | 594 | inode->i_pipe->readers++; |
| 595 | if (filp->f_mode & FMODE_WRITE) | 595 | if (filp->f_mode & FMODE_WRITE) |
| 596 | PIPE_WRITERS(*inode)++; | 596 | inode->i_pipe->writers++; |
| 597 | mutex_unlock(PIPE_MUTEX(*inode)); | 597 | mutex_unlock(&inode->i_mutex); |
| 598 | 598 | ||
| 599 | return 0; | 599 | return 0; |
| 600 | } | 600 | } |
| @@ -731,7 +731,7 @@ static struct inode * get_pipe_inode(void) | |||
| 731 | if (!inode->i_pipe) | 731 | if (!inode->i_pipe) |
| 732 | goto fail_iput; | 732 | goto fail_iput; |
| 733 | 733 | ||
| 734 | PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 1; | 734 | inode->i_pipe->readers = inode->i_pipe->writers = 1; |
| 735 | inode->i_fop = &rdwr_pipe_fops; | 735 | inode->i_fop = &rdwr_pipe_fops; |
| 736 | 736 | ||
| 737 | /* | 737 | /* |
