diff options
author | Yan, Zheng <zyan@redhat.com> | 2016-05-10 07:09:06 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-05-25 19:15:40 -0400 |
commit | f0b33df57a5f03c637f75ead7cb4d978c59cc63d (patch) | |
tree | ae28f322669bce6c48ca4469c0e7d97cc0516fb0 /fs/ceph/addr.c | |
parent | 6ce026e411c4f36c9e51189d28a5dd9d08095b9d (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.c | 28 |
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 | } | ||
1492 | out: | ||
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; |