X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Frw.c;h=310cf453f6ef76a234c30f3c87ab4cfa8a009613;hp=cd91daca66328a1624ae6216758c43d72dadae5c;hb=9eeff6d09450e1144b6b9dc1bdbc222ac2af9d67;hpb=8d334f67052ccf77713c780a8040593728977599 diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index cd91dac..310cf45 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -1159,25 +1159,26 @@ out_unlock: int ll_writepage(struct page *vmpage, struct writeback_control *wbc) { - struct inode *inode = vmpage->mapping->host; + struct inode *inode = vmpage->mapping->host; + struct ll_inode_info *lli = ll_i2info(inode); struct lu_env *env; struct cl_io *io; struct cl_page *page; struct cl_object *clob; struct cl_env_nest nest; - int redirtied = 0; + bool redirtied = false; + bool unlocked = false; int result; ENTRY; LASSERT(PageLocked(vmpage)); LASSERT(!PageWriteback(vmpage)); - if (ll_i2dtexp(inode) == NULL) - RETURN(-EINVAL); + LASSERT(ll_i2dtexp(inode) != NULL); - env = cl_env_nested_get(&nest); - if (IS_ERR(env)) - RETURN(PTR_ERR(env)); + env = cl_env_nested_get(&nest); + if (IS_ERR(env)) + GOTO(out, result = PTR_ERR(env)); clob = ll_i2info(inode)->lli_clob; LASSERT(clob != NULL); @@ -1203,14 +1204,17 @@ int ll_writepage(struct page *vmpage, struct writeback_control *wbc) if (!PageError(vmpage)) { redirty_page_for_writepage(wbc, vmpage); result = 0; - redirtied = 1; + redirtied = true; } } cl_page_disown(env, io, page); + unlocked = true; lu_ref_del(&page->cp_reference, "writepage", cfs_current()); cl_page_put(env, page); - } + } else { + result = PTR_ERR(page); + } } cl_io_fini(env, io); @@ -1234,7 +1238,17 @@ int ll_writepage(struct page *vmpage, struct writeback_control *wbc) } cl_env_nested_put(&nest, env); - RETURN(result); + GOTO(out, result); + +out: + if (result < 0) { + if (!lli->lli_async_rc) + lli->lli_async_rc = result; + SetPageError(vmpage); + if (!unlocked) + unlock_page(vmpage); + } + return result; } int ll_writepages(struct address_space *mapping, struct writeback_control *wbc)