spin_lock(&dcache_lock);
lock_dentry(dentry);
__d_drop(dentry);
-#ifdef DCACHE_LUSTRE_INVALID
dentry->d_flags &= ~DCACHE_LUSTRE_INVALID;
-#endif
unlock_dentry(dentry);
d_rehash_cond(dentry, 0);
spin_unlock(&dcache_lock);
int rc;
ENTRY;
-#ifdef DCACHE_LUSTRE_INVALID
if (parent->d_flags & DCACHE_LUSTRE_INVALID) {
-#else
- if (d_unhashed(parent)) {
-#endif
CDEBUG(D_READA, "parent dentry@%p %.*s is "
"invalid, skip statahead\n",
parent, parent->d_name.len, parent->d_name.name);
continue;
}
- if (d_name->len == de->lde_name_len &&
- !strncmp(d_name->name, de->lde_name, d_name->len))
- rc = LS_FIRST_DE + dot_de;
- else
+ if (d_name->len != de->lde_name_len ||
+ strncmp(d_name->name, de->lde_name, d_name->len) != 0)
rc = LS_NONE_FIRST_DE;
+ else if (!dot_de)
+ rc = LS_FIRST_DE;
+ else
+ rc = LS_FIRST_DOT_DE;
+
ll_put_page(page);
RETURN(rc);
}
/* get parent reference count here, and put it in ll_statahead_thread */
parent = dget((*dentryp)->d_parent);
if (unlikely(sai->sai_inode != parent->d_inode)) {
- struct ll_inode_info *nlli = ll_i2info(parent->d_inode);
-
CWARN("Race condition, someone changed %.*s just now: "
"old parent "DFID", new parent "DFID" .\n",
(*dentryp)->d_name.len, (*dentryp)->d_name.name,
- PFID(&lli->lli_fid), PFID(&nlli->lli_fid));
+ PFID(ll_inode_lu_fid(dir)),
+ PFID(ll_inode_lu_fid(parent->d_inode)));
dput(parent);
iput(sai->sai_inode);
OBD_FREE_PTR(sai);
CDEBUG(D_READA, "Statahead for dir "DFID" hit ratio "
"too low: hit/miss %u/%u, sent/replied %u/%u, "
"stopping statahead thread: pid %d\n",
- PFID(&lli->lli_fid), sai->sai_hit,
+ PFID(ll_inode_lu_fid(dir)), sai->sai_hit,
sai->sai_miss, sai->sai_sent,
sai->sai_replied, cfs_curproc_pid());
spin_lock(&lli->lli_lock);
{
struct lov_stripe_md *lsm;
struct osc_creator *oscc = &exp->exp_obd->u.cli.cl_oscc;
- int rc = 0;
+ int del_orphan = 0, rc = 0;
ENTRY;
LASSERT(oa);
}
/* this is the special case where create removes orphans */
- if ((oa->o_valid & OBD_MD_FLFLAGS) &&
+ if (oa->o_valid & OBD_MD_FLFLAGS &&
oa->o_flags == OBD_FL_DELORPHAN) {
spin_lock(&oscc->oscc_lock);
if (oscc->oscc_flags & OSCC_FLAG_SYNC_IN_PROGRESS) {
CDEBUG(D_HA, "%s: oscc recovery started - delete to "LPU64"\n",
oscc->oscc_obd->obd_name, oscc->oscc_next_id - 1);
+ del_orphan = 1;
+
/* delete from next_id on up */
oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
oa->o_id = oscc->oscc_next_id - 1;
spin_unlock(&oscc->oscc_lock);
}
- if (rc == 0)
+ if (rc == 0) {
CDEBUG(D_INFO, "%s: returning objid "LPU64"\n",
obd2cli_tgt(oscc->oscc_obd), lsm->lsm_object_id);
- else if (*ea == NULL)
- obd_free_memmd(exp, &lsm);
+ } else {
+ if (*ea == NULL)
+ obd_free_memmd(exp, &lsm);
+ if (del_orphan != 0 && rc != -EIO)
+ /* Ignore non-IO precreate error for clear orphan */
+ rc = 0;
+ }
RETURN(rc);
}