Port Dima's patch:

> ploop must obey write access convention on slow path.
>
> Normally no one shoult freeze private-fs bcause this may result in weird 
> glitches.
> But in case of vzfs-layout freezefs is possible for a small about of time.
> https://jira.sw.ru/browse/PSBM-20150
>
> Signed-off-by: Dmitry Monakhov <[email protected]>

Signed-off-by: Maxim Patlasov <[email protected]>
---
 drivers/block/ploop/io_direct.c |   17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/block/ploop/io_direct.c b/drivers/block/ploop/io_direct.c
index d6f0f21..0c7e0c4 100644
--- a/drivers/block/ploop/io_direct.c
+++ b/drivers/block/ploop/io_direct.c
@@ -384,6 +384,8 @@ cached_submit(struct ploop_io *io, iblock_t iblk, struct 
ploop_request * preq,
        end_pos = pos + clu_siz;
        used_pos = (io->alloc_head - 1) << (io->plo->cluster_log + 9);
 
+       file_start_write(io->files.file);
+
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)
        if (use_prealloc && end_pos > used_pos && may_fallocate) {
                if (unlikely(io->prealloced_size < clu_siz)) {
@@ -398,7 +400,7 @@ try_again:
                                        prealloc = clu_siz;
                                        goto try_again;
                                } else {
-                                       return err;
+                                       goto end_write;
                                }
                        }
 
@@ -414,14 +416,17 @@ try_again:
                sector_t len = 1 << preq->plo->cluster_log;
                struct extent_map * em = extent_lookup_create(io, sec, len);
 
-               if (unlikely(IS_ERR(em)))
-                       return PTR_ERR(em);
+               if (unlikely(IS_ERR(em))) {
+                       err = PTR_ERR(em);
+                       goto end_write;
+               }
 
                preq->iblock = iblk;
                preq->eng_io = io;
                set_bit(PLOOP_REQ_POST_SUBMIT, &preq->state);
                dio_submit_pad(io, preq, sbl, size, em);
-               return 0;
+               err = 0;
+               goto end_write;
        }
 
        bio_iter_init(&biter, sbl);
@@ -496,6 +501,8 @@ try_again:
                        mod_timer(&io->fsync_timer, jiffies + 
plo->tune.fsync_delay);
                spin_unlock_irq(&plo->lock);
        }
+end_write:
+       file_end_write(io->files.file);
        return err;
 }
 
@@ -506,9 +513,11 @@ dio_post_submit(struct ploop_io *io, struct ploop_request 
* preq)
        loff_t clu_siz = 1 << (preq->plo->cluster_log + 9);
        int err;
 
+       file_start_write(io->files.file);
        err = io->files.file->f_op->fallocate(io->files.file,
                                              FALLOC_FL_CONVERT_UNWRITTEN,
                                              (loff_t)sec << 9, clu_siz);
+       file_end_write(io->files.file);
        if (err) {
                PLOOP_REQ_SET_ERROR(preq, err);
                set_bit(PLOOP_S_ABORT, &preq->plo->state);

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to