X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Fnamei.c;h=b3780e2aa7ddbcd401d48817e4c44ed27bf497db;hp=5051c5e267fc74e9648226e69261583df3ea910d;hb=2b23ad0d183141dc25377f2d37de6e6e36ba1169;hpb=6b557f04e55b14e11b7fce310094e71331c8b204;ds=sidebyside diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index 5051c5e..b3780e2 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -196,114 +196,120 @@ static void ll_invalidate_negative_children(struct inode *dir) } int ll_md_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, - void *data, int flag) + void *data, int flag) { - int rc; - struct lustre_handle lockh; - ENTRY; + struct lustre_handle lockh; + int rc; + ENTRY; - switch (flag) { - case LDLM_CB_BLOCKING: - ldlm_lock2handle(lock, &lockh); + switch (flag) { + case LDLM_CB_BLOCKING: + ldlm_lock2handle(lock, &lockh); rc = ldlm_cli_cancel(&lockh, LCF_ASYNC); - if (rc < 0) { - CDEBUG(D_INODE, "ldlm_cli_cancel: %d\n", rc); - RETURN(rc); - } - break; - case LDLM_CB_CANCELING: { + if (rc < 0) { + CDEBUG(D_INODE, "ldlm_cli_cancel: rc = %d\n", rc); + RETURN(rc); + } + break; + case LDLM_CB_CANCELING: { struct inode *inode = ll_inode_from_resource_lock(lock); - struct ll_inode_info *lli; - __u64 bits = lock->l_policy_data.l_inodebits.bits; - struct lu_fid *fid; - ldlm_mode_t mode = lock->l_req_mode; + __u64 bits = lock->l_policy_data.l_inodebits.bits; /* 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; + /* Invalidate all dentries associated with this inode */ LASSERT(ldlm_is_canceling(lock)); - if (bits & MDS_INODELOCK_XATTR) + if (!fid_res_name_eq(ll_inode2fid(inode), + &lock->l_resource->lr_name)) { + LDLM_ERROR(lock, "data mismatch with object "DFID"(%p)", + PFID(ll_inode2fid(inode)), inode); + LBUG(); + } + + if (bits & MDS_INODELOCK_XATTR) { ll_xattr_cache_destroy(inode); + bits &= ~MDS_INODELOCK_XATTR; + } /* For OPEN locks we differentiate between lock modes * LCK_CR, LCK_CW, LCK_PR - bug 22891 */ + if (bits & MDS_INODELOCK_OPEN) + ll_have_md_lock(inode, &bits, lock->l_req_mode); + + if (bits & MDS_INODELOCK_OPEN) { + fmode_t fmode; + + switch (lock->l_req_mode) { + case LCK_CW: + fmode = FMODE_WRITE; + break; + case LCK_PR: + fmode = FMODE_EXEC; + break; + case LCK_CR: + fmode = FMODE_READ; + break; + default: + LDLM_ERROR(lock, "bad lock mode for OPEN lock"); + LBUG(); + } + + ll_md_real_close(inode, fmode); + + bits &= ~MDS_INODELOCK_OPEN; + } + if (bits & (MDS_INODELOCK_LOOKUP | MDS_INODELOCK_UPDATE | MDS_INODELOCK_LAYOUT | MDS_INODELOCK_PERM)) - ll_have_md_lock(inode, &bits, LCK_MINMODE); - - if (bits & MDS_INODELOCK_OPEN) - ll_have_md_lock(inode, &bits, mode); - - fid = ll_inode2fid(inode); - if (!fid_res_name_eq(fid, &lock->l_resource->lr_name)) - LDLM_ERROR(lock, "data mismatch with object " - DFID" (%p)", PFID(fid), inode); - - if (bits & MDS_INODELOCK_OPEN) { - int flags = 0; - switch (lock->l_req_mode) { - case LCK_CW: - flags = FMODE_WRITE; - break; - case LCK_PR: - flags = FMODE_EXEC; - break; - case LCK_CR: - flags = FMODE_READ; - break; - default: - CERROR("%s: unexpected lock mode for OPEN lock" - " %d, inode "DFID"\n", - ll_get_fsname(inode->i_sb, NULL, 0), - lock->l_req_mode, - PFID(ll_inode2fid(inode))); - } - ll_md_real_close(inode, flags); - } + ll_have_md_lock(inode, &bits, LCK_MINMODE); - lli = ll_i2info(inode); if (bits & MDS_INODELOCK_LAYOUT) { - struct cl_object_conf conf = { { 0 } }; + struct cl_object_conf conf = { + .coc_opc = OBJECT_CONF_INVALIDATE, + .coc_inode = inode, + }; - conf.coc_opc = OBJECT_CONF_INVALIDATE; - conf.coc_inode = inode; rc = ll_layout_conf(inode, &conf); - if (rc) - CDEBUG(D_INODE, "invaliding layout %d.\n", rc); + if (rc < 0) + CDEBUG(D_INODE, "cannot invalidate layout of " + DFID": rc = %d\n", + PFID(ll_inode2fid(inode)), rc); } if (bits & MDS_INODELOCK_UPDATE) { + struct ll_inode_info *lli = ll_i2info(inode); + spin_lock(&lli->lli_lock); - lli->lli_flags &= ~LLIF_MDS_SIZE_LOCK; + lli->lli_flags &= ~LLIF_MDS_SIZE_LOCK; spin_unlock(&lli->lli_lock); } - if (S_ISDIR(inode->i_mode) && - (bits & MDS_INODELOCK_UPDATE)) { + if ((bits & MDS_INODELOCK_UPDATE) && S_ISDIR(inode->i_mode)) { CDEBUG(D_INODE, "invalidating inode "DFID"\n", PFID(ll_inode2fid(inode))); - truncate_inode_pages(inode->i_mapping, 0); + truncate_inode_pages(inode->i_mapping, 0); ll_invalidate_negative_children(inode); } - if (inode->i_sb->s_root && - inode != inode->i_sb->s_root->d_inode && - (bits & (MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM))) + if ((bits & (MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM)) && + inode->i_sb->s_root != NULL && + inode != inode->i_sb->s_root->d_inode) ll_invalidate_aliases(inode); - iput(inode); - break; - } - default: - LBUG(); - } - RETURN(0); + iput(inode); + break; + } + default: + LBUG(); + } + + RETURN(0); } __u32 ll_i2suppgid(struct inode *i)