[Devel] [PATCH RH7] ploop: Use preallocation for ext4
Kirill Tkhai
ktkhai at virtuozzo.com
Tue May 11 12:57:11 MSK 2021
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 <ktkhai at 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 */
More information about the Devel
mailing list