Whamcloud - gitweb
LU-359 llite: no close error if application has known failure
[fs/lustre-release.git] / lustre / llite / rw.c
index cd91dac..310cf45 100644 (file)
@@ -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)