diff options
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 21 |
1 files changed, 9 insertions, 12 deletions
@@ -254,17 +254,22 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | |||
254 | return -EBADF; | 254 | return -EBADF; |
255 | 255 | ||
256 | /* | 256 | /* |
257 | * It's not possible to punch hole or perform collapse range | 257 | * We can only allow pure fallocate on append only files |
258 | * on append only file | ||
259 | */ | 258 | */ |
260 | if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) | 259 | if ((mode & ~FALLOC_FL_KEEP_SIZE) && IS_APPEND(inode)) |
261 | && IS_APPEND(inode)) | ||
262 | return -EPERM; | 260 | return -EPERM; |
263 | 261 | ||
264 | if (IS_IMMUTABLE(inode)) | 262 | if (IS_IMMUTABLE(inode)) |
265 | return -EPERM; | 263 | return -EPERM; |
266 | 264 | ||
267 | /* | 265 | /* |
266 | * We can not allow to do any fallocate operation on an active | ||
267 | * swapfile | ||
268 | */ | ||
269 | if (IS_SWAPFILE(inode)) | ||
270 | ret = -ETXTBSY; | ||
271 | |||
272 | /* | ||
268 | * Revalidate the write permissions, in case security policy has | 273 | * Revalidate the write permissions, in case security policy has |
269 | * changed since the files were opened. | 274 | * changed since the files were opened. |
270 | */ | 275 | */ |
@@ -286,14 +291,6 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | |||
286 | if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) | 291 | if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) |
287 | return -EFBIG; | 292 | return -EFBIG; |
288 | 293 | ||
289 | /* | ||
290 | * There is no need to overlap collapse range with EOF, in which case | ||
291 | * it is effectively a truncate operation | ||
292 | */ | ||
293 | if ((mode & FALLOC_FL_COLLAPSE_RANGE) && | ||
294 | (offset + len >= i_size_read(inode))) | ||
295 | return -EINVAL; | ||
296 | |||
297 | if (!file->f_op->fallocate) | 294 | if (!file->f_op->fallocate) |
298 | return -EOPNOTSUPP; | 295 | return -EOPNOTSUPP; |
299 | 296 | ||