X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fliblustre%2Fnamei.c;h=a3d6d6eb81c26a1366d52ce0420b02a1b5ef2b97;hb=b22fb817507ff52c02de38435fe90d758e852105;hp=d43fe75ef394c5bc0570e65b9fc2d24de3a90ed2;hpb=08aa217ce49aba1ded52e0f7adb8a607035123fd;p=fs%2Flustre-release.git diff --git a/lustre/liblustre/namei.c b/lustre/liblustre/namei.c index d43fe75..a3d6d6e 100644 --- a/lustre/liblustre/namei.c +++ b/lustre/liblustre/namei.c @@ -50,6 +50,7 @@ #include #include "llite_lib.h" +#include void ll_intent_drop_lock(struct lookup_intent *it) { @@ -121,19 +122,23 @@ int llu_md_blocking_ast(struct ldlm_lock *lock, switch (flag) { case LDLM_CB_BLOCKING: ldlm_lock2handle(lock, &lockh); - rc = ldlm_cli_cancel(&lockh); + rc = ldlm_cli_cancel(&lockh, 0); if (rc < 0) { CDEBUG(D_INODE, "ldlm_cli_cancel: %d\n", rc); RETURN(rc); } break; case LDLM_CB_CANCELING: { - struct inode *inode = llu_inode_from_lock(lock); + struct inode *inode = llu_inode_from_resource_lock(lock); struct llu_inode_info *lli; struct intnl_stat *st; __u64 bits = lock->l_policy_data.l_inodebits.bits; struct lu_fid *fid; + /* Inode is set to lock->l_resource->lr_lvb_inode + * for mdc - bug 24555 */ + LASSERT(lock->l_ast_data == NULL); + /* Invalidate all dentries associated with this inode */ if (inode == NULL) break; @@ -144,15 +149,10 @@ int llu_md_blocking_ast(struct ldlm_lock *lock, if (bits & MDS_INODELOCK_UPDATE) lli->lli_flags &= ~LLIF_MDS_SIZE_LOCK; - fid = &lli->lli_fid; - if (lock->l_resource->lr_name.name[0] != fid_seq(fid) || - lock->l_resource->lr_name.name[1] != fid_oid(fid) || - lock->l_resource->lr_name.name[2] != fid_ver(fid)) { - LDLM_ERROR(lock,"data mismatch with ino %llu/%llu/%llu", - (long long)fid_seq(fid), - (long long)fid_oid(fid), - (long long)fid_ver(fid)); - } + fid = &lli->lli_fid; + if (!fid_res_name_eq(fid, &lock->l_resource->lr_name)) + LDLM_ERROR(lock, "data mismatch with object " + DFID" (%p)", PFID(fid), inode); if (S_ISDIR(st->st_mode) && (bits & MDS_INODELOCK_UPDATE)) { CDEBUG(D_INODE, "invalidating inode %llu\n", @@ -380,6 +380,21 @@ static int lookup_it_finish(struct ptlrpc_request *request, int offset, RETURN(0); } +struct inode *llu_inode_from_resource_lock(struct ldlm_lock *lock) +{ + struct inode *inode; + lock_res_and_lock(lock); + + if (lock->l_resource->lr_lvb_inode) { + inode = (struct inode *)lock->l_resource->lr_lvb_inode; + I_REF(inode); + } else + inode = NULL; + + unlock_res_and_lock(lock); + return inode; +} + struct inode *llu_inode_from_lock(struct ldlm_lock *lock) { struct inode *inode; @@ -417,13 +432,11 @@ static int llu_lookup_it(struct inode *parent, struct pnode *pnode, icbd.icbd_child = pnode; icbd.icbd_parent = parent; - if (it->it_op & IT_CREAT || - (it->it_op & IT_OPEN && it->it_create_mode & O_CREAT)) { - opc = LUSTRE_OPC_CREATE; - } else { - opc = LUSTRE_OPC_ANY; - } - + if (it->it_op & IT_CREAT) + opc = LUSTRE_OPC_CREATE; + else + opc = LUSTRE_OPC_ANY; + llu_prep_md_op_data(&op_data, parent, NULL, pnode->p_base->pb_name.name, pnode->p_base->pb_name.len, flags, opc);