mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 14:48:06 +00:00
ceph: make write_begin wait propagate ERESTARTSYS
Currently, if the wait_event_interruptible is interrupted, we return EAGAIN unconditionally and loop, such that we aren't, in fact, interruptible. So, propagate ERESTARTSYS if we get it. Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
ec4318bcb4
commit
8f883c24de
1 changed files with 8 additions and 2 deletions
|
@ -919,6 +919,10 @@ static int context_is_writeable_or_written(struct inode *inode,
|
||||||
/*
|
/*
|
||||||
* We are only allowed to write into/dirty the page if the page is
|
* We are only allowed to write into/dirty the page if the page is
|
||||||
* clean, or already dirty within the same snap context.
|
* clean, or already dirty within the same snap context.
|
||||||
|
*
|
||||||
|
* called with page locked.
|
||||||
|
* return success with page locked,
|
||||||
|
* or any failure (incl -EAGAIN) with page unlocked.
|
||||||
*/
|
*/
|
||||||
static int ceph_update_writeable_page(struct file *file,
|
static int ceph_update_writeable_page(struct file *file,
|
||||||
loff_t pos, unsigned len,
|
loff_t pos, unsigned len,
|
||||||
|
@ -961,9 +965,11 @@ retry_locked:
|
||||||
snapc = ceph_get_snap_context((void *)page->private);
|
snapc = ceph_get_snap_context((void *)page->private);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
ceph_queue_writeback(inode);
|
ceph_queue_writeback(inode);
|
||||||
wait_event_interruptible(ci->i_cap_wq,
|
r = wait_event_interruptible(ci->i_cap_wq,
|
||||||
context_is_writeable_or_written(inode, snapc));
|
context_is_writeable_or_written(inode, snapc));
|
||||||
ceph_put_snap_context(snapc);
|
ceph_put_snap_context(snapc);
|
||||||
|
if (r == -ERESTARTSYS)
|
||||||
|
return r;
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1035,7 +1041,7 @@ static int ceph_write_begin(struct file *file, struct address_space *mapping,
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/* get a page*/
|
/* get a page */
|
||||||
page = grab_cache_page_write_begin(mapping, index, 0);
|
page = grab_cache_page_write_begin(mapping, index, 0);
|
||||||
if (!page)
|
if (!page)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
Loading…
Add table
Reference in a new issue