summaryrefslogtreecommitdiffstats
path: root/fs/ceph/addr.c
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2016-05-10 07:09:06 -0400
committerIlya Dryomov <idryomov@gmail.com>2016-05-25 19:15:40 -0400
commitf0b33df57a5f03c637f75ead7cb4d978c59cc63d (patch)
treeae28f322669bce6c48ca4469c0e7d97cc0516fb0 /fs/ceph/addr.c
parent6ce026e411c4f36c9e51189d28a5dd9d08095b9d (diff)
ceph: handle -EAGAIN returned by ceph_update_writeable_page()
when ceph_update_writeable_page() return -EAGAIN, caller should lock the page and call ceph_update_writeable_page() again. Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph/addr.c')
-rw-r--r--fs/ceph/addr.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index d128bb65746d..97ee5d1fbb61 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1475,21 +1475,23 @@ static int ceph_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
1475 /* Update time before taking page lock */ 1475 /* Update time before taking page lock */
1476 file_update_time(vma->vm_file); 1476 file_update_time(vma->vm_file);
1477 1477
1478 lock_page(page); 1478 do {
1479 lock_page(page);
1479 1480
1480 if ((off > size) || (page->mapping != inode->i_mapping)) { 1481 if ((off > size) || (page->mapping != inode->i_mapping)) {
1481 unlock_page(page); 1482 unlock_page(page);
1482 ret = VM_FAULT_NOPAGE; 1483 ret = VM_FAULT_NOPAGE;
1483 goto out; 1484 break;
1484 } 1485 }
1486
1487 ret = ceph_update_writeable_page(vma->vm_file, off, len, page);
1488 if (ret >= 0) {
1489 /* success. we'll keep the page locked. */
1490 set_page_dirty(page);
1491 ret = VM_FAULT_LOCKED;
1492 }
1493 } while (ret == -EAGAIN);
1485 1494
1486 ret = ceph_update_writeable_page(vma->vm_file, off, len, page);
1487 if (ret >= 0) {
1488 /* success. we'll keep the page locked. */
1489 set_page_dirty(page);
1490 ret = VM_FAULT_LOCKED;
1491 }
1492out:
1493 if (ret == VM_FAULT_LOCKED || 1495 if (ret == VM_FAULT_LOCKED ||
1494 ci->i_inline_version != CEPH_INLINE_NONE) { 1496 ci->i_inline_version != CEPH_INLINE_NONE) {
1495 int dirty; 1497 int dirty;