|
@@ -950,7 +950,7 @@ fail_inode:
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-struct file *create_write_pipe(void)
|
|
|
+struct file *create_write_pipe(int flags)
|
|
|
{
|
|
|
int err;
|
|
|
struct inode *inode;
|
|
@@ -983,7 +983,7 @@ struct file *create_write_pipe(void)
|
|
|
goto err_dentry;
|
|
|
f->f_mapping = inode->i_mapping;
|
|
|
|
|
|
- f->f_flags = O_WRONLY;
|
|
|
+ f->f_flags = O_WRONLY | (flags & O_NONBLOCK);
|
|
|
f->f_version = 0;
|
|
|
|
|
|
return f;
|
|
@@ -1007,7 +1007,7 @@ void free_write_pipe(struct file *f)
|
|
|
put_filp(f);
|
|
|
}
|
|
|
|
|
|
-struct file *create_read_pipe(struct file *wrf)
|
|
|
+struct file *create_read_pipe(struct file *wrf, int flags)
|
|
|
{
|
|
|
struct file *f = get_empty_filp();
|
|
|
if (!f)
|
|
@@ -1019,7 +1019,7 @@ struct file *create_read_pipe(struct file *wrf)
|
|
|
f->f_mapping = wrf->f_path.dentry->d_inode->i_mapping;
|
|
|
|
|
|
f->f_pos = 0;
|
|
|
- f->f_flags = O_RDONLY;
|
|
|
+ f->f_flags = O_RDONLY | (flags & O_NONBLOCK);
|
|
|
f->f_op = &read_pipe_fops;
|
|
|
f->f_mode = FMODE_READ;
|
|
|
f->f_version = 0;
|
|
@@ -1033,13 +1033,13 @@ int do_pipe_flags(int *fd, int flags)
|
|
|
int error;
|
|
|
int fdw, fdr;
|
|
|
|
|
|
- if (flags & ~O_CLOEXEC)
|
|
|
+ if (flags & ~(O_CLOEXEC | O_NONBLOCK))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- fw = create_write_pipe();
|
|
|
+ fw = create_write_pipe(flags);
|
|
|
if (IS_ERR(fw))
|
|
|
return PTR_ERR(fw);
|
|
|
- fr = create_read_pipe(fw);
|
|
|
+ fr = create_read_pipe(fw, flags);
|
|
|
error = PTR_ERR(fr);
|
|
|
if (IS_ERR(fr))
|
|
|
goto err_write_pipe;
|