diff options
Diffstat (limited to 'drivers/staging/lustre/lustre/llite/statahead.c')
-rw-r--r-- | drivers/staging/lustre/lustre/llite/statahead.c | 85 |
1 files changed, 53 insertions, 32 deletions
diff --git a/drivers/staging/lustre/lustre/llite/statahead.c b/drivers/staging/lustre/lustre/llite/statahead.c index c39cf8d47d6e..06b71bcf97a7 100644 --- a/drivers/staging/lustre/lustre/llite/statahead.c +++ b/drivers/staging/lustre/lustre/llite/statahead.c @@ -202,8 +202,8 @@ ll_sa_entry_alloc(struct ll_statahead_info *sai, __u64 index, char *dname; entry_size = sizeof(struct ll_sa_entry) + (len & ~3) + 4; - OBD_ALLOC(entry, entry_size); - if (unlikely(entry == NULL)) + entry = kzalloc(entry_size, GFP_NOFS); + if (unlikely(!entry)) return ERR_PTR(-ENOMEM); CDEBUG(D_READA, "alloc sa entry %.*s(%p) index %llu\n", @@ -465,7 +465,7 @@ static struct ll_statahead_info *ll_sai_alloc(void) struct ll_statahead_info *sai; int i; - OBD_ALLOC_PTR(sai); + sai = kzalloc(sizeof(*sai), GFP_NOFS); if (!sai) return NULL; @@ -528,7 +528,7 @@ static void ll_sai_put(struct ll_statahead_info *sai) spin_unlock(&lli->lli_sa_lock); if (sai->sai_sent > sai->sai_replied) - CDEBUG(D_READA,"statahead for dir "DFID + CDEBUG(D_READA, "statahead for dir "DFID " does not finish: [sent:%llu] [replied:%llu]\n", PFID(&lli->lli_fid), sai->sai_sent, sai->sai_replied); @@ -637,8 +637,10 @@ static void ll_post_statahead(struct ll_statahead_info *sai) it = &minfo->mi_it; req = entry->se_req; body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY); - if (body == NULL) - GOTO(out, rc = -EFAULT); + if (body == NULL) { + rc = -EFAULT; + goto out; + } child = entry->se_inode; if (child == NULL) { @@ -649,8 +651,10 @@ static void ll_post_statahead(struct ll_statahead_info *sai) /* XXX: No fid in reply, this is probably cross-ref case. * SA can't handle it yet. */ - if (body->valid & OBD_MD_MDS) - GOTO(out, rc = -EAGAIN); + if (body->valid & OBD_MD_MDS) { + rc = -EAGAIN; + goto out; + } } else { /* * revalidate. @@ -665,12 +669,14 @@ static void ll_post_statahead(struct ll_statahead_info *sai) it->d.lustre.it_lock_handle = entry->se_handle; rc = md_revalidate_lock(ll_i2mdexp(dir), it, ll_inode2fid(dir), NULL); - if (rc != 1) - GOTO(out, rc = -EAGAIN); + if (rc != 1) { + rc = -EAGAIN; + goto out; + } rc = ll_prep_inode(&child, req, dir->i_sb, it); if (rc) - GOTO(out, rc); + goto out; CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n", child, child->i_ino, child->i_generation); @@ -711,20 +717,23 @@ static int ll_statahead_interpret(struct ptlrpc_request *req, if (unlikely(lli->lli_sai == NULL || lli->lli_sai->sai_generation != minfo->mi_generation)) { spin_unlock(&lli->lli_sa_lock); - GOTO(out, rc = -ESTALE); + rc = -ESTALE; + goto out; } else { sai = ll_sai_get(lli->lli_sai); if (unlikely(!thread_is_running(&sai->sai_thread))) { sai->sai_replied++; spin_unlock(&lli->lli_sa_lock); - GOTO(out, rc = -EBADFD); + rc = -EBADFD; + goto out; } entry = ll_sa_entry_get_byindex(sai, minfo->mi_cbdata); if (entry == NULL) { sai->sai_replied++; spin_unlock(&lli->lli_sa_lock); - GOTO(out, rc = -EIDRM); + rc = -EIDRM; + goto out; } if (rc != 0) { @@ -793,12 +802,12 @@ static int sa_args_init(struct inode *dir, struct inode *child, struct ldlm_enqueue_info *einfo; struct md_op_data *op_data; - OBD_ALLOC_PTR(einfo); - if (einfo == NULL) + einfo = kzalloc(sizeof(*einfo), GFP_NOFS); + if (!einfo) return -ENOMEM; - OBD_ALLOC_PTR(minfo); - if (minfo == NULL) { + minfo = kzalloc(sizeof(*minfo), GFP_NOFS); + if (!minfo) { OBD_FREE_PTR(einfo); return -ENOMEM; } @@ -878,7 +887,8 @@ static int do_sa_revalidate(struct inode *dir, struct ll_sa_entry *entry, return 1; entry->se_inode = igrab(inode); - rc = md_revalidate_lock(ll_i2mdexp(dir), &it, ll_inode2fid(inode),NULL); + rc = md_revalidate_lock(ll_i2mdexp(dir), &it, ll_inode2fid(inode), + NULL); if (rc == 1) { entry->se_handle = it.d.lustre.it_lock_handle; ll_intent_release(&it); @@ -1084,7 +1094,7 @@ static int ll_statahead_thread(void *arg) CDEBUG(D_READA, "error reading dir "DFID" at %llu/%llu: [rc %d] [parent %u]\n", PFID(ll_inode2fid(dir)), pos, sai->sai_index, rc, plli->lli_opendir_pid); - GOTO(out, rc); + goto out; } dp = page_address(page); @@ -1149,7 +1159,8 @@ interpret_it: if (unlikely(!thread_is_running(thread))) { ll_release_page(page, 0); - GOTO(out, rc = 0); + rc = 0; + goto out; } /* If no window for metadata statahead, but there are @@ -1170,7 +1181,8 @@ interpret_it: if (unlikely( !thread_is_running(thread))) { ll_release_page(page, 0); - GOTO(out, rc = 0); + rc = 0; + goto out; } if (!sa_sent_full(sai)) @@ -1202,8 +1214,10 @@ do_it: while (!sa_received_empty(sai)) ll_post_statahead(sai); - if (unlikely(!thread_is_running(thread))) - GOTO(out, rc = 0); + if (unlikely(!thread_is_running(thread))) { + rc = 0; + goto out; + } if (sai->sai_sent == sai->sai_replied && sa_received_empty(sai)) @@ -1221,7 +1235,8 @@ do_it: } spin_unlock(&plli->lli_agl_lock); - GOTO(out, rc = 0); + rc = 0; + goto out; } else if (1) { /* * chain is exhausted. @@ -1421,7 +1436,7 @@ static int is_first_dirent(struct inode *dir, struct dentry *dentry) rc = LS_FIRST_DOT_DE; ll_release_page(page, 0); - GOTO(out, rc); + goto out; } pos = le64_to_cpu(dp->ldp_hash_end); if (pos == MDS_DIR_END_OFF) { @@ -1625,20 +1640,25 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp, /* I am the "lli_opendir_pid" owner, only me can set "lli_sai". */ rc = is_first_dirent(dir, *dentryp); - if (rc == LS_NONE_FIRST_DE) + if (rc == LS_NONE_FIRST_DE) { /* It is not "ls -{a}l" operation, no need statahead for it. */ - GOTO(out, rc = -EAGAIN); + rc = -EAGAIN; + goto out; + } sai = ll_sai_alloc(); - if (sai == NULL) - GOTO(out, rc = -ENOMEM); + if (sai == NULL) { + rc = -ENOMEM; + goto out; + } sai->sai_ls_all = (rc == LS_FIRST_DOT_DE); sai->sai_inode = igrab(dir); if (unlikely(sai->sai_inode == NULL)) { CWARN("Do not start stat ahead on dying inode "DFID"\n", PFID(&lli->lli_fid)); - GOTO(out, rc = -ESTALE); + rc = -ESTALE; + goto out; } /* get parent reference count here, and put it in ll_statahead_thread */ @@ -1652,7 +1672,8 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp, PFID(&lli->lli_fid), PFID(&nlli->lli_fid)); dput(parent); iput(sai->sai_inode); - GOTO(out, rc = -EAGAIN); + rc = -EAGAIN; + goto out; } CDEBUG(D_READA, "start statahead thread: sai %p, parent %.*s\n", |