X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fofd%2Fofd_dlm.c;h=972d6ecd2fb4abfb323f62d83314d90e4e927649;hb=1736c1befd27e3dacb424269ad987fe5dd480827;hp=03bd7b606c939782149fe8ce913cbeb2cd2814ea;hpb=2df57a9de0a36a356240655c3c84ff96de4f63ae;p=fs%2Flustre-release.git diff --git a/lustre/ofd/ofd_dlm.c b/lustre/ofd/ofd_dlm.c index 03bd7b6..972d6ec 100644 --- a/lustre/ofd/ofd_dlm.c +++ b/lustre/ofd/ofd_dlm.c @@ -15,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -27,7 +23,7 @@ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -35,8 +31,13 @@ * * lustre/ofd/ofd_dlm.c * - * Author: Mike Pershin - * Author: Alex Zhuravlev + * This file contains OBD Filter Device (OFD) LDLM-related code which is just + * intent handling for glimpse lock. + * + * Author: Andreas Dilger + * Author: Jinshan Xiong + * Author: Alexey Zhuravlev + * Author: Mikhail Pershin */ #define DEBUG_SUBSYSTEM S_FILTER @@ -49,6 +50,22 @@ struct ofd_intent_args { int *liblustre; }; +/** + * OFD interval callback. + * + * The interval_callback_t is part of interval_iterate_reverse() and is called + * for each interval in tree. The OFD interval callback searches for locks + * covering extents beyond the given args->size. This is used to decide if LVB + * data is outdated. + * + * \param[in] n interval node + * \param[in] args intent arguments + * + * \retval INTERVAL_ITER_STOP if the interval is lower than + * file size, caller stops execution + * \retval INTERVAL_ITER_CONT if callback finished successfully + * and caller may continue execution + */ static enum interval_iter ofd_intent_cb(struct interval_node *n, void *args) { struct ldlm_interval *node = (struct ldlm_interval *)n; @@ -87,27 +104,49 @@ static enum interval_iter ofd_intent_cb(struct interval_node *n, void *args) return INTERVAL_ITER_CONT; } +/** + * OFD lock intent policy + * + * This defines ldlm_namespace::ns_policy interface for OFD. + * Intent policy is called when lock has an intent, for OFD that + * means glimpse lock and policy fills Lock Value Block (LVB). + * + * If already granted lock is found it will be placed in \a lockp and + * returned back to caller function. + * + * \param[in] ns namespace + * \param[in,out] lockp pointer to the lock + * \param[in] req_cookie incoming request + * \param[in] mode LDLM mode + * \param[in] flags LDLM flags + * \param[in] data opaque data, not used in OFD policy + * + * \retval ELDLM_LOCK_REPLACED if already granted lock was found + * and placed in \a lockp + * \retval ELDLM_LOCK_ABORTED in other cases except error + * \retval negative value on error + */ int ofd_intent_policy(struct ldlm_namespace *ns, struct ldlm_lock **lockp, - void *req_cookie, ldlm_mode_t mode, __u64 flags, + void *req_cookie, enum ldlm_mode mode, __u64 flags, void *data) { - struct ptlrpc_request *req = req_cookie; - struct ldlm_lock *lock = *lockp, *l = NULL; - struct ldlm_resource *res = lock->l_resource; - ldlm_processing_policy policy; - struct ost_lvb *res_lvb, *reply_lvb; - struct ldlm_reply *rep; - ldlm_error_t err; - int idx, rc, only_liblustre = 1; - struct ldlm_interval_tree *tree; - struct ofd_intent_args arg; - __u32 repsize[3] = { + struct ptlrpc_request *req = req_cookie; + struct ldlm_lock *lock = *lockp, *l = NULL; + struct ldlm_resource *res = lock->l_resource; + ldlm_processing_policy policy; + struct ost_lvb *res_lvb, *reply_lvb; + struct ldlm_reply *rep; + enum ldlm_error err; + int idx, rc, only_liblustre = 1; + struct ldlm_interval_tree *tree; + struct ofd_intent_args arg; + __u32 repsize[3] = { [MSG_PTLRPC_BODY_OFF] = sizeof(struct ptlrpc_body), [DLM_LOCKREPLY_OFF] = sizeof(*rep), [DLM_REPLY_REC_OFF] = sizeof(*reply_lvb) }; - struct ldlm_glimpse_work gl_work; - struct list_head gl_list; + struct ldlm_glimpse_work gl_work; + struct list_head gl_list; ENTRY; INIT_LIST_HEAD(&gl_list); @@ -225,11 +264,11 @@ int ofd_intent_policy(struct ldlm_namespace *ns, struct ldlm_lock **lockp, } /* - * This check is for lock taken in ofd_prepare_destroy() that does + * This check is for lock taken in ofd_destroy_by_fid() that does * not have l_glimpse_ast set. So the logic is: if there is a lock * with no l_glimpse_ast set, this object is being destroyed already. * Hence, if you are grabbing DLM locks on the server, always set - * non-NULL glimpse_ast (e.g., ldlm_request.c:ldlm_glimpse_ast()). + * non-NULL glimpse_ast (e.g., ldlm_request.c::ldlm_glimpse_ast()). */ if (l->l_glimpse_ast == NULL) { /* We are racing with unlink(); just return -ENOENT */