[PATCH] mutex subsystem, semaphore to mutex: VFS, ->i_sem
This patch converts the inode semaphore to a mutex. I have tested it on XFS and compiled as much as one can consider on an ia64. Anyway your luck with it might be different. Modified-by: Ingo Molnar <mingo@elte.hu> (finished the conversion) Signed-off-by: Jes Sorensen <jes@sgi.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:

committed by
Ingo Molnar

parent
794ee1baee
commit
1b1dcc1b57
44
fs/pipe.c
44
fs/pipe.c
@@ -44,10 +44,10 @@ void pipe_wait(struct inode * inode)
|
||||
* is considered a noninteractive wait:
|
||||
*/
|
||||
prepare_to_wait(PIPE_WAIT(*inode), &wait, TASK_INTERRUPTIBLE|TASK_NONINTERACTIVE);
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
schedule();
|
||||
finish_wait(PIPE_WAIT(*inode), &wait);
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
}
|
||||
|
||||
static inline int
|
||||
@@ -136,7 +136,7 @@ pipe_readv(struct file *filp, const struct iovec *_iov,
|
||||
|
||||
do_wakeup = 0;
|
||||
ret = 0;
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
info = inode->i_pipe;
|
||||
for (;;) {
|
||||
int bufs = info->nrbufs;
|
||||
@@ -200,7 +200,7 @@ pipe_readv(struct file *filp, const struct iovec *_iov,
|
||||
}
|
||||
pipe_wait(inode);
|
||||
}
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
/* Signal writers asynchronously that there is more room. */
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible(PIPE_WAIT(*inode));
|
||||
@@ -237,7 +237,7 @@ pipe_writev(struct file *filp, const struct iovec *_iov,
|
||||
|
||||
do_wakeup = 0;
|
||||
ret = 0;
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
info = inode->i_pipe;
|
||||
|
||||
if (!PIPE_READERS(*inode)) {
|
||||
@@ -341,7 +341,7 @@ pipe_writev(struct file *filp, const struct iovec *_iov,
|
||||
PIPE_WAITING_WRITERS(*inode)--;
|
||||
}
|
||||
out:
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible(PIPE_WAIT(*inode));
|
||||
kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
|
||||
@@ -381,7 +381,7 @@ pipe_ioctl(struct inode *pino, struct file *filp,
|
||||
|
||||
switch (cmd) {
|
||||
case FIONREAD:
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
info = inode->i_pipe;
|
||||
count = 0;
|
||||
buf = info->curbuf;
|
||||
@@ -390,7 +390,7 @@ pipe_ioctl(struct inode *pino, struct file *filp,
|
||||
count += info->bufs[buf].len;
|
||||
buf = (buf+1) & (PIPE_BUFFERS-1);
|
||||
}
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
return put_user(count, (int __user *)arg);
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -433,7 +433,7 @@ pipe_poll(struct file *filp, poll_table *wait)
|
||||
static int
|
||||
pipe_release(struct inode *inode, int decr, int decw)
|
||||
{
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
PIPE_READERS(*inode) -= decr;
|
||||
PIPE_WRITERS(*inode) -= decw;
|
||||
if (!PIPE_READERS(*inode) && !PIPE_WRITERS(*inode)) {
|
||||
@@ -443,7 +443,7 @@ pipe_release(struct inode *inode, int decr, int decw)
|
||||
kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
|
||||
kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT);
|
||||
}
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -454,9 +454,9 @@ pipe_read_fasync(int fd, struct file *filp, int on)
|
||||
struct inode *inode = filp->f_dentry->d_inode;
|
||||
int retval;
|
||||
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
retval = fasync_helper(fd, filp, on, PIPE_FASYNC_READERS(*inode));
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
@@ -471,9 +471,9 @@ pipe_write_fasync(int fd, struct file *filp, int on)
|
||||
struct inode *inode = filp->f_dentry->d_inode;
|
||||
int retval;
|
||||
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
retval = fasync_helper(fd, filp, on, PIPE_FASYNC_WRITERS(*inode));
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
@@ -488,14 +488,14 @@ pipe_rdwr_fasync(int fd, struct file *filp, int on)
|
||||
struct inode *inode = filp->f_dentry->d_inode;
|
||||
int retval;
|
||||
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
|
||||
retval = fasync_helper(fd, filp, on, PIPE_FASYNC_READERS(*inode));
|
||||
|
||||
if (retval >= 0)
|
||||
retval = fasync_helper(fd, filp, on, PIPE_FASYNC_WRITERS(*inode));
|
||||
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
@@ -534,9 +534,9 @@ pipe_read_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
/* We could have perhaps used atomic_t, but this and friends
|
||||
below are the only places. So it doesn't seem worthwhile. */
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
PIPE_READERS(*inode)++;
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -544,9 +544,9 @@ pipe_read_open(struct inode *inode, struct file *filp)
|
||||
static int
|
||||
pipe_write_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
PIPE_WRITERS(*inode)++;
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -554,12 +554,12 @@ pipe_write_open(struct inode *inode, struct file *filp)
|
||||
static int
|
||||
pipe_rdwr_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
down(PIPE_SEM(*inode));
|
||||
mutex_lock(PIPE_MUTEX(*inode));
|
||||
if (filp->f_mode & FMODE_READ)
|
||||
PIPE_READERS(*inode)++;
|
||||
if (filp->f_mode & FMODE_WRITE)
|
||||
PIPE_WRITERS(*inode)++;
|
||||
up(PIPE_SEM(*inode));
|
||||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user