aboutsummaryrefslogtreecommitdiffstats
path: root/fs/open.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/open.c')
-rw-r--r--fs/open.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/fs/open.c b/fs/open.c
index 4197b9ed023d..5a2c6ebc22b5 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -223,7 +223,12 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
223 return -EINVAL; 223 return -EINVAL;
224 224
225 /* Return error if mode is not supported */ 225 /* Return error if mode is not supported */
226 if (mode && !(mode & FALLOC_FL_KEEP_SIZE)) 226 if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
227 return -EOPNOTSUPP;
228
229 /* Punch hole must have keep size set */
230 if ((mode & FALLOC_FL_PUNCH_HOLE) &&
231 !(mode & FALLOC_FL_KEEP_SIZE))
227 return -EOPNOTSUPP; 232 return -EOPNOTSUPP;
228 233
229 if (!(file->f_mode & FMODE_WRITE)) 234 if (!(file->f_mode & FMODE_WRITE))
@@ -250,10 +255,10 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
250 if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) 255 if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0))
251 return -EFBIG; 256 return -EFBIG;
252 257
253 if (!inode->i_op->fallocate) 258 if (!file->f_op->fallocate)
254 return -EOPNOTSUPP; 259 return -EOPNOTSUPP;
255 260
256 return inode->i_op->fallocate(inode, mode, offset, len); 261 return file->f_op->fallocate(file, mode, offset, len);
257} 262}
258 263
259SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len) 264SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len)
@@ -785,6 +790,8 @@ struct file *nameidata_to_filp(struct nameidata *nd)
785 790
786 /* Pick up the filp from the open intent */ 791 /* Pick up the filp from the open intent */
787 filp = nd->intent.open.file; 792 filp = nd->intent.open.file;
793 nd->intent.open.file = NULL;
794
788 /* Has the filesystem initialised the file for us? */ 795 /* Has the filesystem initialised the file for us? */
789 if (filp->f_path.dentry == NULL) { 796 if (filp->f_path.dentry == NULL) {
790 path_get(&nd->path); 797 path_get(&nd->path);