Whamcloud - gitweb
LU-620 llite: add delete_from_page_cache and remove_from_page_cache check
[fs/lustre-release.git] / lustre / llite / statahead.c
index 0385649..0d83b1e 100644 (file)
@@ -28,6 +28,9 @@
 /*
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2011 Whamcloud, Inc.
+ *
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -764,10 +767,9 @@ static int ll_statahead_thread(void *arg)
         cfs_waitq_signal(&thread->t_ctl_waitq);
         CDEBUG(D_READA, "start doing statahead for %s\n", parent->d_name.name);
 
-        sai->sai_pid = cfs_curproc_pid();
         lli->lli_sa_pos = 0;
         ll_dir_chain_init(&chain);
-        page = ll_get_dir_page(NULL, dir, pos, 0, &chain);
+        page = ll_get_dir_page(NULL, dir, pos, &chain);
 
         while (1) {
                 struct l_wait_info lwi = { 0 };
@@ -843,7 +845,7 @@ keep_de:
                                 do_statahead_interpret(sai);
 
                         if (unlikely(!sa_is_running(sai))) {
-                                ll_put_page(page);
+                                ll_release_page(page, 0);
                                 GOTO(out, rc);
                         }
 
@@ -855,16 +857,16 @@ keep_de:
 
                         rc = ll_statahead_one(parent, name, namelen);
                         if (rc < 0) {
-                                ll_put_page(page);
+                                ll_release_page(page, 0);
                                 GOTO(out, rc);
                         }
                 }
                 pos = le64_to_cpu(dp->ldp_hash_end);
-                ll_put_page(page);
                 if (pos == MDS_DIR_END_OFF) {
                         /*
                          * End of directory reached.
                          */
+                        ll_release_page(page, 0);
                         while (1) {
                                 l_wait_event(thread->t_ctl_waitq,
                                              !sa_is_running(sai) ||
@@ -882,9 +884,13 @@ keep_de:
                          * chain is exhausted.
                          * Normal case: continue to the next page.
                          */
+                        ll_release_page(page, le32_to_cpu(dp->ldp_flags) &
+                                              LDF_COLLIDE);
                         lli->lli_sa_pos = pos;
-                        page = ll_get_dir_page(NULL, dir, pos, 1, &chain);
+                        page = ll_get_dir_page(NULL, dir, pos, &chain);
                 } else {
+                        LASSERT(le32_to_cpu(dp->ldp_flags) & LDF_COLLIDE);
+                        ll_release_page(page, 1);
                         /*
                          * go into overflow page.
                          */
@@ -982,7 +988,7 @@ static int is_first_dirent(struct inode *dir, struct dentry *dentry)
 
         lli->lli_sa_pos = 0;
         ll_dir_chain_init(&chain);
-        page = ll_get_dir_page(NULL, dir, pos, 0, &chain);
+        page = ll_get_dir_page(NULL, dir, pos, &chain);
 
         while (1) {
                 struct lu_dirpage *dp;
@@ -1045,27 +1051,31 @@ static int is_first_dirent(struct inode *dir, struct dentry *dentry)
                         else
                                 rc = LS_FIRST_DOT_DE;
 
-                        ll_put_page(page);
+                        ll_release_page(page, 0);
                         GOTO(out, rc);
                 }
                 pos = le64_to_cpu(dp->ldp_hash_end);
-                ll_put_page(page);
                 if (pos == MDS_DIR_END_OFF) {
                         /*
                          * End of directory reached.
                          */
+                        ll_release_page(page, 0);
                         break;
                 } else if (1) {
                         /*
                          * chain is exhausted
                          * Normal case: continue to the next page.
                          */
+                        ll_release_page(page, le32_to_cpu(dp->ldp_flags) &
+                                              LDF_COLLIDE);
                         lli->lli_sa_pos = pos;
-                        page = ll_get_dir_page(NULL, dir, pos, 1, &chain);
+                        page = ll_get_dir_page(NULL, dir, pos, &chain);
                 } else {
                         /*
                          * go into overflow page.
                          */
+                        LASSERT(le32_to_cpu(dp->ldp_flags) & LDF_COLLIDE);
+                        ll_release_page(page, 1);
                 }
         }
         EXIT;
@@ -1198,7 +1208,7 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp, int lookup)
         }
 
         lli->lli_sai = sai;
-        rc = cfs_kernel_thread(ll_statahead_thread, parent, 0);
+        rc = cfs_create_thread(ll_statahead_thread, parent, 0);
         if (rc < 0) {
                 CERROR("can't start ll_sa thread, rc: %d\n", rc);
                 dput(parent);