X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Fstatahead.c;h=01521efae132837c329abd75d8f50a8dfde51e2c;hp=d8d2187bb88d33621ad71fe88a74fa9993b36605;hb=4e0c8aeb94;hpb=6784a15c6ee32019237151a63755103c68ff51dd diff --git a/lustre/llite/statahead.c b/lustre/llite/statahead.c index d8d2187..01521ef 100644 --- a/lustre/llite/statahead.c +++ b/lustre/llite/statahead.c @@ -458,20 +458,20 @@ static void ll_agl_add(struct ll_statahead_info *sai, } if (added > 0) - cfs_waitq_signal(&sai->sai_agl_thread.t_ctl_waitq); + wake_up(&sai->sai_agl_thread.t_ctl_waitq); } static struct ll_statahead_info *ll_sai_alloc(void) { - struct ll_statahead_info *sai; - int i; - ENTRY; + struct ll_statahead_info *sai; + int i; + ENTRY; - OBD_ALLOC_PTR(sai); - if (!sai) - RETURN(NULL); + OBD_ALLOC_PTR(sai); + if (!sai) + RETURN(NULL); - cfs_atomic_set(&sai->sai_refcount, 1); + cfs_atomic_set(&sai->sai_refcount, 1); spin_lock(&sai_generation_lock); sai->sai_generation = ++sai_generation; @@ -479,24 +479,24 @@ static struct ll_statahead_info *ll_sai_alloc(void) sai->sai_generation = ++sai_generation; spin_unlock(&sai_generation_lock); - sai->sai_max = LL_SA_RPC_MIN; - sai->sai_index = 1; - cfs_waitq_init(&sai->sai_waitq); - cfs_waitq_init(&sai->sai_thread.t_ctl_waitq); - cfs_waitq_init(&sai->sai_agl_thread.t_ctl_waitq); + sai->sai_max = LL_SA_RPC_MIN; + sai->sai_index = 1; + init_waitqueue_head(&sai->sai_waitq); + init_waitqueue_head(&sai->sai_thread.t_ctl_waitq); + init_waitqueue_head(&sai->sai_agl_thread.t_ctl_waitq); CFS_INIT_LIST_HEAD(&sai->sai_entries); - CFS_INIT_LIST_HEAD(&sai->sai_entries_received); - CFS_INIT_LIST_HEAD(&sai->sai_entries_stated); - CFS_INIT_LIST_HEAD(&sai->sai_entries_agl); + CFS_INIT_LIST_HEAD(&sai->sai_entries_received); + CFS_INIT_LIST_HEAD(&sai->sai_entries_stated); + CFS_INIT_LIST_HEAD(&sai->sai_entries_agl); - for (i = 0; i < LL_SA_CACHE_SIZE; i++) { - CFS_INIT_LIST_HEAD(&sai->sai_cache[i]); + for (i = 0; i < LL_SA_CACHE_SIZE; i++) { + CFS_INIT_LIST_HEAD(&sai->sai_cache[i]); spin_lock_init(&sai->sai_cache_lock[i]); - } - cfs_atomic_set(&sai->sai_cache_count, 0); + } + cfs_atomic_set(&sai->sai_cache_count, 0); - RETURN(sai); + RETURN(sai); } static inline struct ll_statahead_info * @@ -681,8 +681,9 @@ static void ll_post_statahead(struct ll_statahead_info *sai) if (rc) GOTO(out, rc); - CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n", - child, child->i_ino, child->i_generation); + CDEBUG(D_DLMTRACE, "%s: setting l_data to inode "DFID"(%p)\n", + ll_get_fsname(child->i_sb, NULL, 0), + PFID(ll_inode2fid(child)), child); ll_set_lock_data(ll_i2sbi(dir)->ll_md_exp, child, it, NULL); entry->se_inode = child; @@ -693,15 +694,15 @@ static void ll_post_statahead(struct ll_statahead_info *sai) EXIT; out: - /* The "ll_sa_entry_to_stated()" will drop related ldlm ibits lock - * reference count by calling "ll_intent_drop_lock()" in spite of the - * above operations failed or not. Do not worry about calling - * "ll_intent_drop_lock()" more than once. */ + /* The "ll_sa_entry_to_stated()" will drop related ldlm ibits lock + * reference count by calling "ll_intent_drop_lock()" in spite of the + * above operations failed or not. Do not worry about calling + * "ll_intent_drop_lock()" more than once. */ rc = ll_sa_entry_to_stated(sai, entry, rc < 0 ? SA_ENTRY_INVA : SA_ENTRY_SUCC); if (rc == 0 && entry->se_index == sai->sai_index_wait) - cfs_waitq_signal(&sai->sai_waitq); - ll_sa_entry_put(sai, entry); + wake_up(&sai->sai_waitq); + ll_sa_entry_put(sai, entry); } static int ll_statahead_interpret(struct ptlrpc_request *req, @@ -760,7 +761,7 @@ static int ll_statahead_interpret(struct ptlrpc_request *req, ll_sa_entry_put(sai, entry); if (wakeup) - cfs_waitq_signal(&sai->sai_thread.t_ctl_waitq); + wake_up(&sai->sai_thread.t_ctl_waitq); } EXIT; @@ -950,14 +951,14 @@ static void ll_statahead_one(struct dentry *parent, const char* entry_name, if (dentry != NULL) dput(dentry); - if (rc) { - rc1 = ll_sa_entry_to_stated(sai, entry, - rc < 0 ? SA_ENTRY_INVA : SA_ENTRY_SUCC); - if (rc1 == 0 && entry->se_index == sai->sai_index_wait) - cfs_waitq_signal(&sai->sai_waitq); - } else { - sai->sai_sent++; - } + if (rc) { + rc1 = ll_sa_entry_to_stated(sai, entry, + rc < 0 ? SA_ENTRY_INVA : SA_ENTRY_SUCC); + if (rc1 == 0 && entry->se_index == sai->sai_index_wait) + wake_up(&sai->sai_waitq); + } else { + sai->sai_sent++; + } sai->sai_index++; /* drop one refcount on entry by ll_sa_entry_alloc */ @@ -978,15 +979,15 @@ static int ll_agl_thread(void *arg) struct l_wait_info lwi = { 0 }; ENTRY; - CDEBUG(D_READA, "agl thread started: [pid %d] [parent %.*s]\n", - cfs_curproc_pid(), parent->d_name.len, parent->d_name.name); + CDEBUG(D_READA, "agl thread started: [pid %d] [parent %.*s]\n", + current_pid(), parent->d_name.len, parent->d_name.name); - atomic_inc(&sbi->ll_agl_total); + atomic_inc(&sbi->ll_agl_total); spin_lock(&plli->lli_agl_lock); sai->sai_agl_valid = 1; thread_set_flags(thread, SVC_RUNNING); spin_unlock(&plli->lli_agl_lock); - cfs_waitq_signal(&thread->t_ctl_waitq); + wake_up(&thread->t_ctl_waitq); while (1) { l_wait_event(thread->t_ctl_waitq, @@ -1022,10 +1023,10 @@ static int ll_agl_thread(void *arg) } thread_set_flags(thread, SVC_STOPPED); spin_unlock(&plli->lli_agl_lock); - cfs_waitq_signal(&thread->t_ctl_waitq); + wake_up(&thread->t_ctl_waitq); ll_sai_put(sai); CDEBUG(D_READA, "agl thread stopped: [pid %d] [parent %.*s]\n", - cfs_curproc_pid(), parent->d_name.len, parent->d_name.name); + current_pid(), parent->d_name.len, parent->d_name.name); RETURN(0); } @@ -1034,11 +1035,11 @@ static void ll_start_agl(struct dentry *parent, struct ll_statahead_info *sai) struct ptlrpc_thread *thread = &sai->sai_agl_thread; struct l_wait_info lwi = { 0 }; struct ll_inode_info *plli; - cfs_task_t *task; + struct task_struct *task; ENTRY; CDEBUG(D_READA, "start agl thread: [pid %d] [parent %.*s]\n", - cfs_curproc_pid(), parent->d_name.len, parent->d_name.name); + current_pid(), parent->d_name.len, parent->d_name.name); plli = ll_i2info(parent->d_inode); task = kthread_run(ll_agl_thread, parent, @@ -1057,217 +1058,188 @@ static void ll_start_agl(struct dentry *parent, struct ll_statahead_info *sai) static int ll_statahead_thread(void *arg) { - struct dentry *parent = (struct dentry *)arg; - struct inode *dir = parent->d_inode; - struct ll_inode_info *plli = ll_i2info(dir); - struct ll_inode_info *clli; - struct ll_sb_info *sbi = ll_i2sbi(dir); - struct ll_statahead_info *sai = ll_sai_get(plli->lli_sai); - struct ptlrpc_thread *thread = &sai->sai_thread; - struct ptlrpc_thread *agl_thread = &sai->sai_agl_thread; - struct page *page; - __u64 pos = 0; - int first = 0; - int rc = 0; - struct ll_dir_chain chain; - struct l_wait_info lwi = { 0 }; - ENTRY; + struct dentry *parent = (struct dentry *)arg; + struct inode *dir = parent->d_inode; + struct ll_inode_info *plli = ll_i2info(dir); + struct ll_inode_info *clli; + struct ll_sb_info *sbi = ll_i2sbi(dir); + struct ll_statahead_info *sai = ll_sai_get(plli->lli_sai); + struct ptlrpc_thread *thread = &sai->sai_thread; + struct ptlrpc_thread *agl_thread = &sai->sai_agl_thread; + int first = 0; + int rc = 0; + struct md_op_data *op_data; + struct ll_dir_chain chain; + struct l_wait_info lwi = { 0 }; + struct lu_dirent *ent; + ENTRY; - CDEBUG(D_READA, "statahead thread started: [pid %d] [parent %.*s]\n", - cfs_curproc_pid(), parent->d_name.len, parent->d_name.name); + CDEBUG(D_READA, "statahead thread started: [pid %d] [parent %.*s]\n", + current_pid(), parent->d_name.len, parent->d_name.name); - if (sbi->ll_flags & LL_SBI_AGL_ENABLED) - ll_start_agl(parent, sai); + op_data = ll_prep_md_op_data(NULL, dir, dir, NULL, 0, 0, + LUSTRE_OPC_ANY, dir); + if (IS_ERR(op_data)) + RETURN(PTR_ERR(op_data)); - atomic_inc(&sbi->ll_sa_total); + op_data->op_hash_offset = 0; + op_data->op_max_pages = + ll_i2sbi(dir)->ll_md_brw_size >> PAGE_CACHE_SHIFT; + + if (sbi->ll_flags & LL_SBI_AGL_ENABLED) + ll_start_agl(parent, sai); + + atomic_inc(&sbi->ll_sa_total); spin_lock(&plli->lli_sa_lock); thread_set_flags(thread, SVC_RUNNING); spin_unlock(&plli->lli_sa_lock); - cfs_waitq_signal(&thread->t_ctl_waitq); + wake_up(&thread->t_ctl_waitq); ll_dir_chain_init(&chain); - page = ll_get_dir_page(dir, pos, &chain); - - while (1) { - struct lu_dirpage *dp; - struct lu_dirent *ent; - - if (IS_ERR(page)) { - rc = PTR_ERR(page); - CDEBUG(D_READA, "error reading dir "DFID" at "LPU64 - "/"LPU64": [rc %d] [parent %u]\n", - PFID(ll_inode2fid(dir)), pos, sai->sai_index, - rc, plli->lli_opendir_pid); - GOTO(out, rc); - } - - dp = page_address(page); - for (ent = lu_dirent_start(dp); ent != NULL; - ent = lu_dirent_next(ent)) { - __u64 hash; - int namelen; - char *name; - - hash = le64_to_cpu(ent->lde_hash); - if (unlikely(hash < pos)) - /* - * Skip until we find target hash value. - */ - continue; - - namelen = le16_to_cpu(ent->lde_namelen); - if (unlikely(namelen == 0)) - /* - * Skip dummy record. - */ - continue; - - name = ent->lde_name; - if (name[0] == '.') { - if (namelen == 1) { - /* - * skip "." - */ - continue; - } else if (name[1] == '.' && namelen == 2) { - /* - * skip ".." - */ - continue; - } else if (!sai->sai_ls_all) { - /* - * skip hidden files. - */ - sai->sai_skip_hidden++; - continue; - } - } + for (ent = ll_dir_entry_start(dir, op_data); + ent != NULL && !IS_ERR(ent); + ent = ll_dir_entry_next(dir, op_data, ent)) { + __u64 hash; + int namelen; + char *name; + + hash = le64_to_cpu(ent->lde_hash); + if (unlikely(hash < op_data->op_hash_offset)) + /* + * Skip until we find target hash value. + */ + continue; + + namelen = le16_to_cpu(ent->lde_namelen); + if (unlikely(namelen == 0)) + /* + * Skip dummy record. + */ + continue; + + name = ent->lde_name; + if (name[0] == '.') { + if (namelen == 1) { + /* + * skip "." + */ + continue; + } else if (name[1] == '.' && namelen == 2) { + /* + * skip ".." + */ + continue; + } else if (!sai->sai_ls_all) { + /* + * skip hidden files. + */ + sai->sai_skip_hidden++; + continue; + } + } - /* - * don't stat-ahead first entry. - */ - if (unlikely(++first == 1)) - continue; + /* + * don't stat-ahead first entry. + */ + if (unlikely(++first == 1)) + continue; keep_it: - l_wait_event(thread->t_ctl_waitq, - !sa_sent_full(sai) || - !sa_received_empty(sai) || - !agl_list_empty(sai) || - !thread_is_running(thread), - &lwi); + l_wait_event(thread->t_ctl_waitq, + !sa_sent_full(sai) || + !sa_received_empty(sai) || + !agl_list_empty(sai) || + !thread_is_running(thread), + &lwi); interpret_it: - while (!sa_received_empty(sai)) - ll_post_statahead(sai); - - if (unlikely(!thread_is_running(thread))) { - ll_release_page(page, 0); - GOTO(out, rc = 0); - } - - /* If no window for metadata statahead, but there are - * some AGL entries to be triggered, then try to help - * to process the AGL entries. */ - if (sa_sent_full(sai)) { - spin_lock(&plli->lli_agl_lock); - while (!agl_list_empty(sai)) { - clli = agl_first_entry(sai); - cfs_list_del_init(&clli->lli_agl_list); - spin_unlock(&plli->lli_agl_lock); - ll_agl_trigger(&clli->lli_vfs_inode, - sai); - - if (!sa_received_empty(sai)) - goto interpret_it; - - if (unlikely( - !thread_is_running(thread))) { - ll_release_page(page, 0); - GOTO(out, rc = 0); - } - - if (!sa_sent_full(sai)) - goto do_it; - - spin_lock(&plli->lli_agl_lock); - } - spin_unlock(&plli->lli_agl_lock); + while (!sa_received_empty(sai)) + ll_post_statahead(sai); - goto keep_it; - } - -do_it: - ll_statahead_one(parent, name, namelen); - } - pos = le64_to_cpu(dp->ldp_hash_end); - 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_received_empty(sai) || - sai->sai_sent == sai->sai_replied|| - !thread_is_running(thread), - &lwi); - - while (!sa_received_empty(sai)) - ll_post_statahead(sai); - - if (unlikely(!thread_is_running(thread))) - GOTO(out, rc = 0); - - if (sai->sai_sent == sai->sai_replied && - sa_received_empty(sai)) - break; - } + if (unlikely(!thread_is_running(thread))) + GOTO(out, rc = 0); + /* If no window for metadata statahead, but there are + * some AGL entries to be triggered, then try to help + * to process the AGL entries. */ + if (sa_sent_full(sai)) { spin_lock(&plli->lli_agl_lock); - while (!agl_list_empty(sai) && - thread_is_running(thread)) { + while (!agl_list_empty(sai)) { clli = agl_first_entry(sai); cfs_list_del_init(&clli->lli_agl_list); spin_unlock(&plli->lli_agl_lock); - ll_agl_trigger(&clli->lli_vfs_inode, sai); + ll_agl_trigger(&clli->lli_vfs_inode, + sai); + + if (!sa_received_empty(sai)) + goto interpret_it; + + if (unlikely( + !thread_is_running(thread))) + GOTO(out, rc = 0); + + if (!sa_sent_full(sai)) + goto do_it; + spin_lock(&plli->lli_agl_lock); } spin_unlock(&plli->lli_agl_lock); - GOTO(out, rc = 0); - } 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); - sai->sai_in_readpage = 1; - page = ll_get_dir_page(dir, pos, &chain); - sai->sai_in_readpage = 0; - } else { - LASSERT(le32_to_cpu(dp->ldp_flags) & LDF_COLLIDE); - ll_release_page(page, 1); - /* - * go into overflow page. - */ - } - } - EXIT; + goto keep_it; + } + +do_it: + ll_statahead_one(parent, name, namelen); + } + + if (ent != NULL && !IS_ERR(ent)) + ll_dir_entry_end(dir, op_data, ent); + + /* + * End of directory reached. + */ + while (1) { + l_wait_event(thread->t_ctl_waitq, + !sa_received_empty(sai) || + sai->sai_sent == sai->sai_replied || + !thread_is_running(thread), + &lwi); + + while (!sa_received_empty(sai)) + ll_post_statahead(sai); + + if (unlikely(!thread_is_running(thread))) + GOTO(out, rc = 0); + + if (sai->sai_sent == sai->sai_replied && + sa_received_empty(sai)) + break; + } + spin_lock(&plli->lli_agl_lock); + while (!agl_list_empty(sai) && + thread_is_running(thread)) { + clli = agl_first_entry(sai); + cfs_list_del_init(&clli->lli_agl_list); + spin_unlock(&plli->lli_agl_lock); + ll_agl_trigger(&clli->lli_vfs_inode, sai); + spin_lock(&plli->lli_agl_lock); + } + spin_unlock(&plli->lli_agl_lock); out: + EXIT; + ll_finish_md_op_data(op_data); if (sai->sai_agl_valid) { spin_lock(&plli->lli_agl_lock); thread_set_flags(agl_thread, SVC_STOPPING); spin_unlock(&plli->lli_agl_lock); - cfs_waitq_signal(&agl_thread->t_ctl_waitq); + wake_up(&agl_thread->t_ctl_waitq); - CDEBUG(D_READA, "stop agl thread: [pid %d]\n", - cfs_curproc_pid()); - l_wait_event(agl_thread->t_ctl_waitq, - thread_is_stopped(agl_thread), - &lwi); + CDEBUG(D_READA, "stop agl thread: [pid %d]\n", + current_pid()); + l_wait_event(agl_thread->t_ctl_waitq, + thread_is_stopped(agl_thread), + &lwi); } else { /* Set agl_thread flags anyway. */ thread_set_flags(&sai->sai_agl_thread, SVC_STOPPED); @@ -1286,13 +1258,13 @@ out: } thread_set_flags(thread, SVC_STOPPED); spin_unlock(&plli->lli_sa_lock); - cfs_waitq_signal(&sai->sai_waitq); - cfs_waitq_signal(&thread->t_ctl_waitq); + wake_up(&sai->sai_waitq); + wake_up(&thread->t_ctl_waitq); ll_sai_put(sai); dput(parent); - CDEBUG(D_READA, "statahead thread stopped: [pid %d] [parent %.*s]\n", - cfs_curproc_pid(), parent->d_name.len, parent->d_name.name); - return rc; + CDEBUG(D_READA, "statahead thread stopped: [pid %d] [parent %.*s]\n", + current_pid(), parent->d_name.len, parent->d_name.name); + return rc; } /** @@ -1320,10 +1292,10 @@ void ll_stop_statahead(struct inode *dir, void *key) if (!thread_is_stopped(thread)) { thread_set_flags(thread, SVC_STOPPING); spin_unlock(&lli->lli_sa_lock); - cfs_waitq_signal(&thread->t_ctl_waitq); + wake_up(&thread->t_ctl_waitq); CDEBUG(D_READA, "stop statahead thread: [pid %d]\n", - cfs_curproc_pid()); + current_pid()); l_wait_event(thread->t_ctl_waitq, thread_is_stopped(thread), &lwi); @@ -1360,115 +1332,89 @@ enum { static int is_first_dirent(struct inode *dir, struct dentry *dentry) { - struct ll_dir_chain chain; - struct qstr *target = &dentry->d_name; - struct page *page; - __u64 pos = 0; - int dot_de; - int rc = LS_NONE_FIRST_DE; - ENTRY; - - ll_dir_chain_init(&chain); - page = ll_get_dir_page(dir, pos, &chain); - - while (1) { - struct lu_dirpage *dp; - struct lu_dirent *ent; - - if (IS_ERR(page)) { - struct ll_inode_info *lli = ll_i2info(dir); - - rc = PTR_ERR(page); - CERROR("error reading dir "DFID" at "LPU64": " - "[rc %d] [parent %u]\n", - PFID(ll_inode2fid(dir)), pos, - rc, lli->lli_opendir_pid); - break; - } + struct ll_dir_chain chain; + struct qstr *target = &dentry->d_name; + struct md_op_data *op_data; + int dot_de; + struct lu_dirent *ent; + int rc = LS_NONE_FIRST_DE; + ENTRY; - dp = page_address(page); - for (ent = lu_dirent_start(dp); ent != NULL; - ent = lu_dirent_next(ent)) { - __u64 hash; - int namelen; - char *name; - - hash = le64_to_cpu(ent->lde_hash); - /* The ll_get_dir_page() can return any page containing - * the given hash which may be not the start hash. */ - if (unlikely(hash < pos)) - continue; - - namelen = le16_to_cpu(ent->lde_namelen); - if (unlikely(namelen == 0)) - /* - * skip dummy record. - */ - continue; + ll_dir_chain_init(&chain); - name = ent->lde_name; - if (name[0] == '.') { - if (namelen == 1) - /* - * skip "." - */ - continue; - else if (name[1] == '.' && namelen == 2) - /* - * skip ".." - */ - continue; - else - dot_de = 1; - } else { - dot_de = 0; - } + op_data = ll_prep_md_op_data(NULL, dir, dir, NULL, 0, 0, + LUSTRE_OPC_ANY, dir); + if (IS_ERR(op_data)) + GOTO(out, rc = PTR_ERR(op_data)); + /** + *FIXME choose the start offset of the readdir + */ + op_data->op_stripe_offset = 0; + op_data->op_hash_offset = 0; + op_data->op_max_pages = + ll_i2sbi(dir)->ll_md_brw_size >> PAGE_CACHE_SHIFT; + + for (ent = ll_dir_entry_start(dir, op_data); + ent != NULL && !IS_ERR(ent); + ent = ll_dir_entry_next(dir, op_data, ent)) { + __u64 hash; + int namelen; + char *name; + + hash = le64_to_cpu(ent->lde_hash); + /* The ll_get_dir_page() can return any page containing + * the given hash which may be not the start hash. */ + if (unlikely(hash < op_data->op_hash_offset)) + continue; + + namelen = le16_to_cpu(ent->lde_namelen); + if (unlikely(namelen == 0)) + /* + * skip dummy record. + */ + continue; + + name = ent->lde_name; + if (name[0] == '.') { + if (namelen == 1) + /* + * skip "." + */ + continue; + else if (name[1] == '.' && namelen == 2) + /* + * skip ".." + */ + continue; + else + dot_de = 1; + } else { + dot_de = 0; + } - if (dot_de && target->name[0] != '.') { - CDEBUG(D_READA, "%.*s skip hidden file %.*s\n", - target->len, target->name, - namelen, name); - continue; - } + if (dot_de && target->name[0] != '.') { + CDEBUG(D_READA, "%.*s skip hidden file %.*s\n", + target->len, target->name, + namelen, name); + continue; + } - if (target->len != namelen || - memcmp(target->name, name, namelen) != 0) - rc = LS_NONE_FIRST_DE; - else if (!dot_de) - rc = LS_FIRST_DE; - else - rc = LS_FIRST_DOT_DE; + if (target->len != namelen || + memcmp(target->name, name, namelen) != 0) + rc = LS_NONE_FIRST_DE; + else if (!dot_de) + rc = LS_FIRST_DE; + else + rc = LS_FIRST_DOT_DE; - ll_release_page(page, 0); - GOTO(out, rc); - } - pos = le64_to_cpu(dp->ldp_hash_end); - 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); - page = ll_get_dir_page(dir, pos, &chain); - } else { - /* - * go into overflow page. - */ - LASSERT(le32_to_cpu(dp->ldp_flags) & LDF_COLLIDE); - ll_release_page(page, 1); - } - } + break; + } EXIT; - + if (ent != NULL && !IS_ERR(ent)) + ll_dir_entry_end(dir, op_data, ent); + ll_finish_md_op_data(op_data); out: - ll_dir_chain_fini(&chain); + ll_dir_chain_fini(&chain); return rc; } @@ -1497,13 +1443,13 @@ ll_sai_unplug(struct ll_statahead_info *sai, struct ll_sa_entry *entry) sai->sai_consecutive_miss++; if (sa_low_hit(sai) && thread_is_running(thread)) { atomic_inc(&sbi->ll_sa_wrong); - CDEBUG(D_READA, "Statahead for dir "DFID" hit " - "ratio too low: hit/miss "LPU64"/"LPU64 - ", sent/replied "LPU64"/"LPU64", stopping " - "statahead thread: pid %d\n", - PFID(&lli->lli_fid), sai->sai_hit, - sai->sai_miss, sai->sai_sent, - sai->sai_replied, cfs_curproc_pid()); + CDEBUG(D_READA, "Statahead for dir "DFID" hit " + "ratio too low: hit/miss "LPU64"/"LPU64 + ", sent/replied "LPU64"/"LPU64", stopping " + "statahead thread: pid %d\n", + PFID(&lli->lli_fid), sai->sai_hit, + sai->sai_miss, sai->sai_sent, + sai->sai_replied, current_pid()); spin_lock(&lli->lli_sa_lock); if (!thread_is_stopped(thread)) thread_set_flags(thread, SVC_STOPPING); @@ -1512,7 +1458,7 @@ ll_sai_unplug(struct ll_statahead_info *sai, struct ll_sa_entry *entry) } if (!thread_is_stopped(thread)) - cfs_waitq_signal(&thread->t_ctl_waitq); + wake_up(&thread->t_ctl_waitq); EXIT; } @@ -1529,17 +1475,17 @@ ll_sai_unplug(struct ll_statahead_info *sai, struct ll_sa_entry *entry) int do_statahead_enter(struct inode *dir, struct dentry **dentryp, int only_unplug) { - struct ll_inode_info *lli = ll_i2info(dir); - struct ll_statahead_info *sai = lli->lli_sai; - struct dentry *parent; - struct ll_sa_entry *entry; - struct ptlrpc_thread *thread; - struct l_wait_info lwi = { 0 }; - int rc = 0; - struct ll_inode_info *plli; - ENTRY; + struct ll_inode_info *lli = ll_i2info(dir); + struct ll_statahead_info *sai = lli->lli_sai; + struct dentry *parent; + struct ll_sa_entry *entry; + struct ptlrpc_thread *thread; + struct l_wait_info lwi = { 0 }; + int rc = 0; + struct ll_inode_info *plli; + ENTRY; - LASSERT(lli->lli_opendir_pid == cfs_curproc_pid()); + LASSERT(lli->lli_opendir_pid == current_pid()); if (sai) { thread = &sai->sai_thread; @@ -1615,23 +1561,26 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp, ll_inode2fid(inode), &bits); if (rc == 1) { if ((*dentryp)->d_inode == NULL) { - *dentryp = ll_splice_alias(inode, - *dentryp); - if (IS_ERR(*dentryp)) { + struct dentry *alias; + + alias = ll_splice_alias(inode, + *dentryp); + if (IS_ERR(alias)) { ll_sai_unplug(sai, entry); - RETURN(PTR_ERR(*dentryp)); + RETURN(PTR_ERR(alias)); } + *dentryp = alias; } else if ((*dentryp)->d_inode != inode) { /* revalidate, but inode is recreated */ CDEBUG(D_READA, - "stale dentry %.*s inode %lu/%u, " - "statahead inode %lu/%u\n", - (*dentryp)->d_name.len, - (*dentryp)->d_name.name, - (*dentryp)->d_inode->i_ino, - (*dentryp)->d_inode->i_generation, - inode->i_ino, - inode->i_generation); + "%s: stale dentry %.*s inode " + DFID", statahead inode "DFID + "\n", + ll_get_fsname((*dentryp)->d_inode->i_sb, NULL, 0), + (*dentryp)->d_name.len, + (*dentryp)->d_name.name, + PFID(ll_inode2fid((*dentryp)->d_inode)), + PFID(ll_inode2fid(inode))); ll_sai_unplug(sai, entry); RETURN(-ESTALE); } else { @@ -1682,8 +1631,8 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp, GOTO(out, rc = -EAGAIN); } - CDEBUG(D_READA, "start statahead thread: [pid %d] [parent %.*s]\n", - cfs_curproc_pid(), parent->d_name.len, parent->d_name.name); + CDEBUG(D_READA, "start statahead thread: [pid %d] [parent %.*s]\n", + current_pid(), parent->d_name.len, parent->d_name.name); lli->lli_sai = sai;