diff options
Diffstat (limited to 'fs/open.c')
| -rw-r--r-- | fs/open.c | 21 | 
1 files changed, 9 insertions, 12 deletions
| diff --git a/fs/open.c b/fs/open.c index 3d30eb1fc95e..9d64679cec73 100644 --- a/fs/open.c +++ b/fs/open.c @@ -254,17 +254,22 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)  		return -EBADF;  	/* -	 * It's not possible to punch hole or perform collapse range -	 * on append only file +	 * We can only allow pure fallocate on append only files  	 */ -	if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) -	    && IS_APPEND(inode)) +	if ((mode & ~FALLOC_FL_KEEP_SIZE) && IS_APPEND(inode))  		return -EPERM;  	if (IS_IMMUTABLE(inode))  		return -EPERM;  	/* +	 * We can not allow to do any fallocate operation on an active +	 * swapfile +	 */ +	if (IS_SWAPFILE(inode)) +		ret = -ETXTBSY; + +	/*  	 * Revalidate the write permissions, in case security policy has  	 * changed since the files were opened.  	 */ @@ -286,14 +291,6 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)  	if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0))  		return -EFBIG; -	/* -	 * There is no need to overlap collapse range with EOF, in which case -	 * it is effectively a truncate operation -	 */ -	if ((mode & FALLOC_FL_COLLAPSE_RANGE) && -	    (offset + len >= i_size_read(inode))) -		return -EINVAL; -  	if (!file->f_op->fallocate)  		return -EOPNOTSUPP; | 

