aboutsummaryrefslogtreecommitdiffstats
path: root/fs/open.c
diff options
context:
space:
mode:
authorNamjae Jeon <namjae.jeon@samsung.com>2014-02-23 18:58:15 -0500
committerDave Chinner <david@fromorbit.com>2014-02-23 18:58:15 -0500
commit00f5e61998dd17f5375d9dfc01331f104b83f841 (patch)
tree9c315d879a8b18f6245d357090b19bd433ef5f57 /fs/open.c
parent38dbfb59d1175ef458d006556061adeaa8751b72 (diff)
fs: Add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate
This patch is in response of the following post: http://lwn.net/Articles/556136/ "ext4: introduce two new ioctls" Dave chinner suggested that truncate_block_range (which was one of the ioctls name) should be a fallocate operation and not any fs specific ioctl, hence we add this functionality to new flags of fallocate. This new functionality of collapsing range could be used by media editing tools which does non linear editing to quickly purge and edit parts of a media file. This will immensely improve the performance of these operations. The limitation of fs block size aligned offsets can be easily handled by media codecs which are encapsulated in a conatiner as they have to just change the offset to next keyframe value to match the proper alignment. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/open.c')
-rw-r--r--fs/open.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/fs/open.c b/fs/open.c
index 4b3e1edf2fe4..4a923a547d10 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -231,7 +231,8 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
231 return -EINVAL; 231 return -EINVAL;
232 232
233 /* Return error if mode is not supported */ 233 /* Return error if mode is not supported */
234 if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) 234 if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE |
235 FALLOC_FL_COLLAPSE_RANGE))
235 return -EOPNOTSUPP; 236 return -EOPNOTSUPP;
236 237
237 /* Punch hole must have keep size set */ 238 /* Punch hole must have keep size set */
@@ -239,11 +240,20 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
239 !(mode & FALLOC_FL_KEEP_SIZE)) 240 !(mode & FALLOC_FL_KEEP_SIZE))
240 return -EOPNOTSUPP; 241 return -EOPNOTSUPP;
241 242
243 /* Collapse range should only be used exclusively. */
244 if ((mode & FALLOC_FL_COLLAPSE_RANGE) &&
245 (mode & ~FALLOC_FL_COLLAPSE_RANGE))
246 return -EINVAL;
247
242 if (!(file->f_mode & FMODE_WRITE)) 248 if (!(file->f_mode & FMODE_WRITE))
243 return -EBADF; 249 return -EBADF;
244 250
245 /* It's not possible punch hole on append only file */ 251 /*
246 if (mode & FALLOC_FL_PUNCH_HOLE && IS_APPEND(inode)) 252 * It's not possible to punch hole or perform collapse range
253 * on append only file
254 */
255 if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE)
256 && IS_APPEND(inode))
247 return -EPERM; 257 return -EPERM;
248 258
249 if (IS_IMMUTABLE(inode)) 259 if (IS_IMMUTABLE(inode))
@@ -271,6 +281,14 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
271 if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) 281 if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0))
272 return -EFBIG; 282 return -EFBIG;
273 283
284 /*
285 * There is no need to overlap collapse range with EOF, in which case
286 * it is effectively a truncate operation
287 */
288 if ((mode & FALLOC_FL_COLLAPSE_RANGE) &&
289 (offset + len >= i_size_read(inode)))
290 return -EINVAL;
291
274 if (!file->f_op->fallocate) 292 if (!file->f_op->fallocate)
275 return -EOPNOTSUPP; 293 return -EOPNOTSUPP;
276 294