| From 9ebce595f63a407c5cec98f98f9da8459b73740a Mon Sep 17 00:00:00 2001 |
| From: Maxim Patlasov <mpatlasov@virtuozzo.com> |
| Date: Tue, 19 Jul 2016 18:12:26 -0700 |
| Subject: fuse: fuse_flush must check mapping->flags for errors |
| |
| From: Maxim Patlasov <mpatlasov@virtuozzo.com> |
| |
| commit 9ebce595f63a407c5cec98f98f9da8459b73740a upstream. |
| |
| fuse_flush() calls write_inode_now() that triggers writeback, but actual |
| writeback will happen later, on fuse_sync_writes(). If an error happens, |
| fuse_writepage_end() will set error bit in mapping->flags. So, we have to |
| check mapping->flags after fuse_sync_writes(). |
| |
| Signed-off-by: Maxim Patlasov <mpatlasov@virtuozzo.com> |
| Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> |
| Fixes: 4d99ff8f12eb ("fuse: Turn writeback cache on") |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/fuse/file.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/fs/fuse/file.c |
| +++ b/fs/fuse/file.c |
| @@ -417,6 +417,15 @@ static int fuse_flush(struct file *file, |
| fuse_sync_writes(inode); |
| mutex_unlock(&inode->i_mutex); |
| |
| + if (test_bit(AS_ENOSPC, &file->f_mapping->flags) && |
| + test_and_clear_bit(AS_ENOSPC, &file->f_mapping->flags)) |
| + err = -ENOSPC; |
| + if (test_bit(AS_EIO, &file->f_mapping->flags) && |
| + test_and_clear_bit(AS_EIO, &file->f_mapping->flags)) |
| + err = -EIO; |
| + if (err) |
| + return err; |
| + |
| req = fuse_get_req_nofail_nopages(fc, file); |
| memset(&inarg, 0, sizeof(inarg)); |
| inarg.fh = ff->fh; |