diff options
| -rw-r--r-- | fs/autofs4/autofs_i.h | 11 | ||||
| -rw-r--r-- | fs/autofs4/dev-ioctl.c | 2 | ||||
| -rw-r--r-- | fs/autofs4/inode.c | 2 | 
3 files changed, 13 insertions, 2 deletions
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index d8d8e7ba6a1..908e1845541 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h @@ -269,6 +269,17 @@ int autofs4_fill_super(struct super_block *, void *, int);  struct autofs_info *autofs4_new_ino(struct autofs_sb_info *);  void autofs4_clean_ino(struct autofs_info *); +static inline int autofs_prepare_pipe(struct file *pipe) +{ +	if (!pipe->f_op || !pipe->f_op->write) +		return -EINVAL; +	if (!S_ISFIFO(pipe->f_dentry->d_inode->i_mode)) +		return -EINVAL; +	/* We want a packet pipe */ +	pipe->f_flags |= O_DIRECT; +	return 0; +} +  /* Queue management functions */  int autofs4_wait(struct autofs_sb_info *,struct dentry *, enum autofs_notify); diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c index 3dfd615afb6..aa9103f8f01 100644 --- a/fs/autofs4/dev-ioctl.c +++ b/fs/autofs4/dev-ioctl.c @@ -376,7 +376,7 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp,  			err = -EBADF;  			goto out;  		} -		if (!pipe->f_op || !pipe->f_op->write) { +		if (autofs_prepare_pipe(pipe) < 0) {  			err = -EPIPE;  			fput(pipe);  			goto out; diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index 14c7bc02349..6e488ebe778 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c @@ -290,7 +290,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent)  		printk("autofs: could not open pipe file descriptor\n");  		goto fail_dput;  	} -	if (!pipe->f_op || !pipe->f_op->write) +	if (autofs_prepare_pipe(pipe) < 0)  		goto fail_fput;  	sbi->pipe = pipe;  	sbi->pipefd = pipefd;  |