aboutsummaryrefslogtreecommitdiffstats
path: root/fs/open.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/open.c')
-rw-r--r--fs/open.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/open.c b/fs/open.c
index e52389e1f05b..b47aab39c057 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -233,6 +233,14 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
233 233
234 if (!(file->f_mode & FMODE_WRITE)) 234 if (!(file->f_mode & FMODE_WRITE))
235 return -EBADF; 235 return -EBADF;
236
237 /* It's not possible punch hole on append only file */
238 if (mode & FALLOC_FL_PUNCH_HOLE && IS_APPEND(inode))
239 return -EPERM;
240
241 if (IS_IMMUTABLE(inode))
242 return -EPERM;
243
236 /* 244 /*
237 * Revalidate the write permissions, in case security policy has 245 * Revalidate the write permissions, in case security policy has
238 * changed since the files were opened. 246 * changed since the files were opened.
@@ -790,6 +798,8 @@ struct file *nameidata_to_filp(struct nameidata *nd)
790 798
791 /* Pick up the filp from the open intent */ 799 /* Pick up the filp from the open intent */
792 filp = nd->intent.open.file; 800 filp = nd->intent.open.file;
801 nd->intent.open.file = NULL;
802
793 /* Has the filesystem initialised the file for us? */ 803 /* Has the filesystem initialised the file for us? */
794 if (filp->f_path.dentry == NULL) { 804 if (filp->f_path.dentry == NULL) {
795 path_get(&nd->path); 805 path_get(&nd->path);