Before continuing write requests, we need to check the procedure size grow was
successful. If the size attribute of a file failed to increase, it makes no
sense to continue to push write requests because they will not be able to
succeed until the file size will match.

Signed-off-by: Pavel Butsykin <pbutsy...@virtuozzo.com>
---
 fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c 
b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
index a4064904f963..cd6497080070 100644
--- a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
+++ b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
@@ -648,6 +648,7 @@ static void fuse_size_grow_work(struct work_struct *w)
        struct inode *inode = &di->inode->inode;
        struct pcs_int_request* ireq, *next;
        unsigned long long size = 0;
+       int err;
        LIST_HEAD(to_submit);
 
        spin_lock(&di->lock);
@@ -667,7 +668,19 @@ static void fuse_size_grow_work(struct work_struct *w)
        }
        di->size.required = size;
        spin_unlock(&di->lock);
-       submit_size_grow(inode, size);
+
+       err = submit_size_grow(inode, size);
+       if (err) {
+               LIST_HEAD(to_fail);
+
+               spin_lock(&di->lock);
+               di->size.required = 0;
+               list_splice_tail_init(&di->size.grow_queue, &to_fail);
+               spin_unlock(&di->lock);
+
+               pcs_ireq_queue_fail(&to_fail, err);
+               return;
+       }
 
        spin_lock(&di->lock);
        BUG_ON(di->size.shrink);
-- 
2.15.1

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

Reply via email to