/*
* 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/
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 };
do_statahead_interpret(sai);
if (unlikely(!sa_is_running(sai))) {
- ll_put_page(page);
+ ll_release_page(page, 0);
GOTO(out, rc);
}
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) ||
* 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.
*/
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;
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;
}
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);