if (!S_ISREG(inode->i_mode))
                return -EOPNOTSUPP;
 
-       /* skip punching hole beyond i_size */
-       if (offset >= inode->i_size)
-               return ret;
-
        if (f2fs_has_inline_data(inode)) {
                ret = f2fs_convert_inline_inode(inode);
                if (ret)
                                loff_t offset, loff_t len)
 {
        struct inode *inode = file_inode(file);
-       long ret;
+       long ret = 0;
 
        if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
                return -EOPNOTSUPP;
 
        mutex_lock(&inode->i_mutex);
 
-       if (mode & FALLOC_FL_PUNCH_HOLE)
+       if (mode & FALLOC_FL_PUNCH_HOLE) {
+               if (offset >= inode->i_size)
+                       goto out;
+
                ret = punch_hole(inode, offset, len);
+       }
        else
                ret = expand_inode_data(inode, offset, len, mode);
 
                mark_inode_dirty(inode);
        }
 
+out:
        mutex_unlock(&inode->i_mutex);
 
        trace_f2fs_fallocate(inode, mode, offset, len, ret);