summaryrefslogtreecommitdiffstats
path: root/fs/ceph/addr.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2017-04-04 08:39:46 -0400
committerIlya Dryomov <idryomov@gmail.com>2017-05-04 09:19:22 +0200
commit26544c623e741ac6445f8b1ae369ee32ae1794ad (patch)
tree72810f59f5735dad3b29c5a127ae2a823fc1ff1d /fs/ceph/addr.c
parent6fc1fe5e4cfc8939ee59a570b087946042a30140 (diff)
downloadlinux-stable-26544c623e741ac6445f8b1ae369ee32ae1794ad.tar.gz
linux-stable-26544c623e741ac6445f8b1ae369ee32ae1794ad.tar.bz2
linux-stable-26544c623e741ac6445f8b1ae369ee32ae1794ad.zip
ceph: when seeing write errors on an inode, switch to sync writes
Currently, we don't have a real feedback mechanism in place for when we start seeing buffered writeback errors. If writeback is failing, there is nothing that prevents an application from continuing to dirty pages that aren't being cleaned. In the event that we're seeing write errors of any sort occur on an inode, have the callback set a flag to force further writes to be synchronous. When the next write succeeds, clear the flag to allow buffered writeback to continue. Since this is just a hint to the write submission mechanism, we only take the i_ceph_lock when a lockless check shows that the flag needs to be changed. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: "Yan, Zhengā€¯ <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph/addr.c')
-rw-r--r--fs/ceph/addr.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 6cdf94459ac4..e253102b43cd 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -670,8 +670,12 @@ static void writepages_finish(struct ceph_osd_request *req)
bool remove_page;
dout("writepages_finish %p rc %d\n", inode, rc);
- if (rc < 0)
+ if (rc < 0) {
mapping_set_error(mapping, rc);
+ ceph_set_error_write(ci);
+ } else {
+ ceph_clear_error_write(ci);
+ }
/*
* We lost the cache cap, need to truncate the page before