aboutsummaryrefslogtreecommitdiff
path: root/fs/open.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-03-10 13:16:01 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-10 13:16:01 -0800
commit4afcc10a65bb1f30c4fa1dec2634df74160a8054 (patch)
treedaeb6aefe8f60a717cdf50648e7a2a7eac89d4f8 /fs/open.c
parentb5562c9a55996735e219b154c1e0f19ec10ce67a (diff)
parentd891eedbc3b1b0fade8a9ce60cc0eba1cccb59e5 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: fs/dcache: allow d_obtain_alias() to return unhashed dentries Check for immutable/append flag in fallocate path sysctl: the include of rcupdate.h is only needed in the kernel fat: fix d_revalidate oopsen on NFS exports jfs: fix d_revalidate oopsen on NFS exports ocfs2: fix d_revalidate oopsen on NFS exports gfs2: fix d_revalidate oopsen on NFS exports fuse: fix d_revalidate oopsen on NFS exports ceph: fix d_revalidate oopsen on NFS exports reiserfs xattr ->d_revalidate() shouldn't care about RCU /proc/self is never going to be invalidated...
Diffstat (limited to 'fs/open.c')
-rw-r--r--fs/open.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/open.c b/fs/open.c
index 5a2c6ebc22b..b47aab39c05 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)
if (!(file->f_mode & FMODE_WRITE))
return -EBADF;
+
+ /* It's not possible punch hole on append only file */
+ if (mode & FALLOC_FL_PUNCH_HOLE && IS_APPEND(inode))
+ return -EPERM;
+
+ if (IS_IMMUTABLE(inode))
+ return -EPERM;
+
/*
* Revalidate the write permissions, in case security policy has
* changed since the files were opened.