In case of kaio we should call preallocation directly,
since it is not called from generic code.

https://jira.sw.ru/browse/PSBM-129303

Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 drivers/block/ploop/io_kaio.c |   33 ++++++++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/drivers/block/ploop/io_kaio.c b/drivers/block/ploop/io_kaio.c
index 112fd92acb40..44df242d8128 100644
--- a/drivers/block/ploop/io_kaio.c
+++ b/drivers/block/ploop/io_kaio.c
@@ -35,6 +35,7 @@ int ploop_kaio_upgrade(struct address_space * mapping);
 
 static int __kaio_truncate(struct ploop_io * io, struct file * file, u64 pos);
 static int kaio_truncate(struct ploop_io * io, struct file * file, __u32 a_h);
+static int kaio_file_expand(struct ploop_io *io, struct file *file, u64 pos);
 
 static void __kaio_queue_fsync_req(struct ploop_request * preq, int prio)
 {
@@ -545,8 +546,8 @@ static int kaio_fsync_thread(void * data)
                                preq->prealloc_size = isize;
                                goto ready;
                        }
-                       err = __kaio_truncate(io, io->files.file,
-                                             preq->prealloc_size);
+                       err = kaio_file_expand(io, io->files.file,
+                                              preq->prealloc_size);
                        if (err)
                                PLOOP_REQ_SET_ERROR(preq, -EIO);
                } else {
@@ -928,7 +929,7 @@ static int kaio_alloc_sync(struct ploop_io * io, loff_t 
pos, loff_t len)
                size = io->prealloced_size;
 
        if (size > i_size_read(io->files.inode))
-               err = __kaio_truncate(io, io->files.file, size);
+               err = kaio_file_expand(io, io->files.file, size);
 
        if (!err) {
                WARN_ON(io->alloc_head > a_h);
@@ -1171,6 +1172,32 @@ static int kaio_truncate(struct ploop_io * io, struct 
file * file,
                               (u64)alloc_head << (io->plo->cluster_log + 9));
 }
 
+static int kaio_file_allocate(struct ploop_io *io, struct file *file, u64 pos)
+{
+       u64 isize;
+       int ret;
+
+       if (file->f_mapping != io->files.mapping)
+               return -EINVAL;
+
+       isize = i_size_read(io->files.inode);
+       WARN_ON_ONCE(pos < isize);
+
+       ret = file->f_op->fallocate(file, 0, isize, pos - isize);
+       if (ret)
+               return ret;
+
+       return vfs_fsync(file, 0);
+}
+
+static int kaio_file_expand(struct ploop_io *io, struct file *file, u64 pos)
+{
+       if (file_inode(file)->i_sb->s_magic == FUSE_SUPER_MAGIC)
+               return __kaio_truncate(io, file, pos);
+
+       return kaio_file_allocate(io, file, pos);
+}
+
 static void kaio_unplug(struct ploop_io * io)
 {
        /* Need more thinking how to implement unplug */


_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to