diff options
Diffstat (limited to 'fs/fifo.c')
| -rw-r--r-- | fs/fifo.c | 9 |
1 files changed, 4 insertions, 5 deletions
| @@ -14,7 +14,7 @@ | |||
| 14 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
| 15 | #include <linux/pipe_fs_i.h> | 15 | #include <linux/pipe_fs_i.h> |
| 16 | 16 | ||
| 17 | static void wait_for_partner(struct inode* inode, unsigned int *cnt) | 17 | static int wait_for_partner(struct inode* inode, unsigned int *cnt) |
| 18 | { | 18 | { |
| 19 | int cur = *cnt; | 19 | int cur = *cnt; |
| 20 | 20 | ||
| @@ -23,6 +23,7 @@ static void wait_for_partner(struct inode* inode, unsigned int *cnt) | |||
| 23 | if (signal_pending(current)) | 23 | if (signal_pending(current)) |
| 24 | break; | 24 | break; |
| 25 | } | 25 | } |
| 26 | return cur == *cnt ? -ERESTARTSYS : 0; | ||
| 26 | } | 27 | } |
| 27 | 28 | ||
| 28 | static void wake_up_partner(struct inode* inode) | 29 | static void wake_up_partner(struct inode* inode) |
| @@ -67,8 +68,7 @@ static int fifo_open(struct inode *inode, struct file *filp) | |||
| 67 | * seen a writer */ | 68 | * seen a writer */ |
| 68 | filp->f_version = pipe->w_counter; | 69 | filp->f_version = pipe->w_counter; |
| 69 | } else { | 70 | } else { |
| 70 | wait_for_partner(inode, &pipe->w_counter); | 71 | if (wait_for_partner(inode, &pipe->w_counter)) |
| 71 | if(signal_pending(current)) | ||
| 72 | goto err_rd; | 72 | goto err_rd; |
| 73 | } | 73 | } |
| 74 | } | 74 | } |
| @@ -90,8 +90,7 @@ static int fifo_open(struct inode *inode, struct file *filp) | |||
| 90 | wake_up_partner(inode); | 90 | wake_up_partner(inode); |
| 91 | 91 | ||
| 92 | if (!pipe->readers) { | 92 | if (!pipe->readers) { |
| 93 | wait_for_partner(inode, &pipe->r_counter); | 93 | if (wait_for_partner(inode, &pipe->r_counter)) |
| 94 | if (signal_pending(current)) | ||
| 95 | goto err_wr; | 94 | goto err_wr; |
| 96 | } | 95 | } |
| 97 | break; | 96 | break; |
