X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fdcache.c;h=029e62120e2d0fd0d430779e62df13a3614419b4;hb=ea766bd959cc2347b223d597b3f8a31e010bed72;hp=ffd04f55ab195e254c20953aa76a8a05d8f88b8f;hpb=7317ae10c0e26c2f3cfe9693e120ba39deae1a62;p=fs%2Flustre-release.git diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index ffd04f5..029e621 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -27,7 +27,7 @@ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, Whamcloud, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -191,7 +191,8 @@ static int ll_ddelete(HAVE_D_DELETE_CONST struct dentry *de) /* Disable this piece of code temproarily because this is called * inside dcache_lock so it's not appropriate to do lots of work - * here. */ + * here. ATTENTION: Before this piece of code enabling, LU-2487 must be + * resolved. */ #if 0 /* if not ldlm lock for this inode, set i_nlink to 0 so that * this inode can be recycled later b=20433 */ @@ -259,31 +260,28 @@ int ll_dops_init(struct dentry *de, int block, int init_sa) void ll_intent_drop_lock(struct lookup_intent *it) { - struct lustre_handle *handle; - if (it->it_op && it->d.lustre.it_lock_mode) { - struct ldlm_lock *lock; - - handle = (struct lustre_handle *)&it->d.lustre.it_lock_handle; - lock = ldlm_handle2lock(handle); - if (lock != NULL) { - /* it can only be allowed to match after layout is - * applied to inode otherwise false layout would be - * seen. Applying layout shoud happen before dropping - * the intent lock. */ - if (it->d.lustre.it_lock_bits & MDS_INODELOCK_LAYOUT) - ldlm_lock_allow_match(lock); - LDLM_LOCK_PUT(lock); - } + struct lustre_handle handle; + + handle.cookie = it->d.lustre.it_lock_handle; CDEBUG(D_DLMTRACE, "releasing lock with cookie "LPX64 - " from it %p\n", handle->cookie, it); - ldlm_lock_decref(handle, it->d.lustre.it_lock_mode); + " from it %p\n", handle.cookie, it); + ldlm_lock_decref(&handle, it->d.lustre.it_lock_mode); /* bug 494: intent_release may be called multiple times, from * this thread and we don't want to double-decref this lock */ it->d.lustre.it_lock_mode = 0; - } + if (it->d.lustre.it_remote_lock_mode != 0) { + handle.cookie = it->d.lustre.it_remote_lock_handle; + + CDEBUG(D_DLMTRACE, "releasing remote lock with cookie" + LPX64" from it %p\n", handle.cookie, it); + ldlm_lock_decref(&handle, + it->d.lustre.it_remote_lock_mode); + it->d.lustre.it_remote_lock_mode = 0; + } + } } void ll_intent_release(struct lookup_intent *it) @@ -331,7 +329,7 @@ void ll_invalidate_aliases(struct inode *inode) libcfs_debug_dumpstack(NULL); } - d_lustre_invalidate(dentry); + d_lustre_invalidate(dentry, 0); } ll_unlock_dcache(inode); @@ -351,7 +349,7 @@ int ll_revalidate_it_finish(struct ptlrpc_request *request, if (it_disposition(it, DISP_LOOKUP_NEG)) RETURN(-ENOENT); - rc = ll_prep_inode(&de->d_inode, request, NULL); + rc = ll_prep_inode(&de->d_inode, request, NULL, it); RETURN(rc); } @@ -563,16 +561,33 @@ out: ll_invalidate_aliases(de->d_inode); } else { __u64 bits = 0; + __u64 matched_bits = 0; CDEBUG(D_DENTRY, "revalidated dentry %.*s (%p) parent %p " "inode %p refc %d\n", de->d_name.len, de->d_name.name, de, de->d_parent, de->d_inode, d_refcount(de)); + ll_set_lock_data(exp, de->d_inode, it, &bits); - if ((bits & MDS_INODELOCK_LOOKUP) && d_lustre_invalid(de)) + + /* Note: We have to match both LOOKUP and PERM lock + * here to make sure the dentry is valid and no one + * changing the permission. + * But if the client connects < 2.4 server, which will + * only grant LOOKUP lock, so we can only Match LOOKUP + * lock for old server */ + if (exp_connect_flags(ll_i2mdexp(de->d_inode)) && + OBD_CONNECT_LVB_TYPE) + matched_bits = + MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM; + else + matched_bits = MDS_INODELOCK_LOOKUP; + + if (((bits & matched_bits) == matched_bits) && + d_lustre_invalid(de)) d_lustre_revalidate(de); - ll_lookup_finish_locks(it, de); - } + ll_lookup_finish_locks(it, de); + } mark: if (it != NULL && it->it_op == IT_GETATTR && rc > 0) @@ -642,6 +657,34 @@ out_sa: goto mark; } +#ifdef HAVE_IOP_ATOMIC_OPEN +/* + * Always trust cached dentries. Update statahead window if necessary. + */ +int ll_revalidate_nd(struct dentry *dentry, unsigned int flags) +{ + struct inode *parent = dentry->d_parent->d_inode; + int unplug = 0; + + ENTRY; + CDEBUG(D_VFSTRACE, "VFS Op:name=%s,flags=%u\n", + dentry->d_name.name, flags); + + if (!(flags & (LOOKUP_PARENT|LOOKUP_OPEN|LOOKUP_CREATE)) && + ll_need_statahead(parent, dentry) > 0) { + if (flags & LOOKUP_RCU) + RETURN(-ECHILD); + + if (dentry->d_inode == NULL) + unplug = 1; + do_statahead_enter(parent, &dentry, unplug); + ll_statahead_mark(parent, dentry); + } + + RETURN(1); +} + +#else /* !HAVE_IOP_ATOMIC_OPEN */ int ll_revalidate_nd(struct dentry *dentry, struct nameidata *nd) { int rc; @@ -709,6 +752,7 @@ out_it: RETURN(rc); } +#endif /* HAVE_IOP_ATOMIC_OPEN */ void ll_d_iput(struct dentry *de, struct inode *inode) {