Whamcloud - gitweb
LU-1866 osd: ancillary work for initial OI scrub
[fs/lustre-release.git] / lustre / include / lustre_dlm.h
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2010, 2012, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  */
36
37 /** \defgroup LDLM Lustre Distributed Lock Manager
38  *
39  * Lustre DLM is based on VAX DLM.
40  * Its two main roles are:
41  *   - To provide locking assuring consistency of data on all Lustre nodes.
42  *   - To allow clients to cache state protected by a lock by holding the
43  *     lock until a conflicting lock is requested or it is expired by the LRU.
44  *
45  * @{
46  */
47
48 #ifndef _LUSTRE_DLM_H__
49 #define _LUSTRE_DLM_H__
50
51 #if defined(__linux__)
52 #include <linux/lustre_dlm.h>
53 #elif defined(__APPLE__)
54 #include <darwin/lustre_dlm.h>
55 #elif defined(__WINNT__)
56 #include <winnt/lustre_dlm.h>
57 #else
58 #error Unsupported operating system.
59 #endif
60
61 #include <lustre_lib.h>
62 #include <lustre_net.h>
63 #include <lustre_import.h>
64 #include <lustre_handles.h>
65 #include <interval_tree.h> /* for interval_node{}, ldlm_extent */
66 #include <lu_ref.h>
67
68 struct obd_ops;
69 struct obd_device;
70
71 #define OBD_LDLM_DEVICENAME  "ldlm"
72
73 #define LDLM_DEFAULT_LRU_SIZE (100 * cfs_num_online_cpus())
74 #define LDLM_DEFAULT_MAX_ALIVE (cfs_time_seconds(36000))
75 #define LDLM_CTIME_AGE_LIMIT (10)
76 #define LDLM_DEFAULT_PARALLEL_AST_LIMIT 1024
77
78 /**
79  * LDLM non-error return states
80  */
81 typedef enum {
82         ELDLM_OK = 0,
83
84         ELDLM_LOCK_CHANGED = 300,
85         ELDLM_LOCK_ABORTED = 301,
86         ELDLM_LOCK_REPLACED = 302,
87         ELDLM_NO_LOCK_DATA = 303,
88         ELDLM_LOCK_WOULDBLOCK = 304,
89
90         ELDLM_NAMESPACE_EXISTS = 400,
91         ELDLM_BAD_NAMESPACE    = 401
92 } ldlm_error_t;
93
94 /**
95  * LDLM namespace type.
96  * The "client" type is actually an indication that this is a narrow local view
97  * into complete namespace on the server. Such namespaces cannot make any
98  * decisions about lack of conflicts or do any autonomous lock granting without
99  * first speaking to a server.
100  */
101 typedef enum {
102         LDLM_NAMESPACE_SERVER = 1 << 0,
103         LDLM_NAMESPACE_CLIENT = 1 << 1
104 } ldlm_side_t;
105
106 /**
107  * Declaration of flags sent through the wire.
108  **/
109 #define LDLM_FL_LOCK_CHANGED   0x000001 /* extent, mode, or resource changed */
110
111 /**
112  * If the server returns one of these flags, then the lock was put on that list.
113  * If the client sends one of these flags (during recovery ONLY!), it wants the
114  * lock added to the specified list, no questions asked.
115  */
116 #define LDLM_FL_BLOCK_GRANTED  0x000002
117 #define LDLM_FL_BLOCK_CONV     0x000004
118 #define LDLM_FL_BLOCK_WAIT     0x000008
119
120 /* Used to be LDLM_FL_CBPENDING 0x000010 moved to non-wire flags */
121
122 #define LDLM_FL_AST_SENT       0x000020 /* blocking or cancel packet was
123                                          * queued for sending. */
124 /* Used to be LDLM_FL_WAIT_NOREPROC 0x000040   moved to non-wire flags */
125 /* Used to be LDLM_FL_CANCEL        0x000080   moved to non-wire flags */
126
127 /**
128  * Lock is being replayed.  This could probably be implied by the fact that one
129  * of BLOCK_{GRANTED,CONV,WAIT} is set, but that is pretty dangerous.
130  */
131 #define LDLM_FL_REPLAY         0x000100
132
133 #define LDLM_FL_INTENT_ONLY    0x000200 /* Don't grant lock, just do intent. */
134
135 /* Used to be LDLM_FL_LOCAL_ONLY 0x000400  moved to non-wire flags */
136 /* Used to be LDLM_FL_FAILED     0x000800  moved to non-wire flags */
137
138 #define LDLM_FL_HAS_INTENT     0x001000 /* lock request has intent */
139
140 /* Used to be LDLM_FL_CANCELING  0x002000  moved to non-wire flags */
141 /* Used to be LDLM_FL_LOCAL      0x004000  moved to non-wire flags */
142
143 #define LDLM_FL_DISCARD_DATA   0x010000 /* discard (no writeback) on cancel */
144
145 #define LDLM_FL_NO_TIMEOUT     0x020000 /* Blocked by group lock - wait
146                                          * indefinitely */
147
148 /** file & record locking */
149 #define LDLM_FL_BLOCK_NOWAIT   0x040000 /* Server told not to wait if blocked.
150                                          * For AGL, OST will not send glimpse
151                                          * callback. */
152 #define LDLM_FL_TEST_LOCK      0x080000 // return blocking lock
153
154 /* Used to be LDLM_FL_LVB_READY  0x100000 moved to non-wire flags */
155 /* Used to be LDLM_FL_KMS_IGNORE 0x200000 moved to non-wire flags */
156 /* Used to be LDLM_FL_NO_LRU     0x400000 moved to non-wire flags */
157
158 /* Immediatelly cancel such locks when they block some other locks. Send
159  * cancel notification to original lock holder, but expect no reply. This is
160  * for clients (like liblustre) that cannot be expected to reliably response
161  * to blocking AST. */
162 #define LDLM_FL_CANCEL_ON_BLOCK 0x800000
163
164 /* Flags flags inherited from parent lock when doing intents. */
165 #define LDLM_INHERIT_FLAGS     (LDLM_FL_CANCEL_ON_BLOCK)
166
167 /* Used to be LDLM_FL_CP_REQD        0x1000000 moved to non-wire flags */
168 /* Used to be LDLM_FL_CLEANED        0x2000000 moved to non-wire flags */
169 /* Used to be LDLM_FL_ATOMIC_CB      0x4000000 moved to non-wire flags */
170 /* Used to be LDLM_FL_BL_AST         0x10000000 moved to non-wire flags */
171 /* Used to be LDLM_FL_BL_DONE        0x20000000 moved to non-wire flags */
172
173 /* measure lock contention and return -EUSERS if locking contention is high */
174 #define LDLM_FL_DENY_ON_CONTENTION 0x40000000
175
176 /* These are flags that are mapped into the flags and ASTs of blocking locks */
177 #define LDLM_AST_DISCARD_DATA  0x80000000 /* Add FL_DISCARD to blocking ASTs */
178
179 /* Flags sent in AST lock_flags to be mapped into the receiving lock. */
180 #define LDLM_AST_FLAGS         (LDLM_FL_DISCARD_DATA)
181
182 /*
183  * --------------------------------------------------------------------------
184  * NOTE! Starting from this point, that is, LDLM_FL_* flags with values above
185  * 0x80000000 will not be sent over the wire.
186  * --------------------------------------------------------------------------
187  */
188
189 /**
190  * Declaration of flags not sent through the wire.
191  **/
192
193 /**
194  * Used for marking lock as a target for -EINTR while cp_ast sleep
195  * emulation + race with upcoming bl_ast.
196  */
197 #define LDLM_FL_FAIL_LOC       0x100000000ULL
198
199 /**
200  * Used while processing the unused list to know that we have already
201  * handled this lock and decided to skip it.
202  */
203 #define LDLM_FL_SKIPPED        0x200000000ULL
204 /* this lock is being destroyed */
205 #define LDLM_FL_CBPENDING      0x400000000ULL
206 /* not a real flag, not saved in lock */
207 #define LDLM_FL_WAIT_NOREPROC  0x800000000ULL
208 /* cancellation callback already run */
209 #define LDLM_FL_CANCEL         0x1000000000ULL
210 #define LDLM_FL_LOCAL_ONLY     0x2000000000ULL
211 /* don't run the cancel callback under ldlm_cli_cancel_unused */
212 #define LDLM_FL_FAILED         0x4000000000ULL
213 /* lock cancel has already been sent */
214 #define LDLM_FL_CANCELING      0x8000000000ULL
215 /* local lock (ie, no srv/cli split) */
216 #define LDLM_FL_LOCAL          0x10000000000ULL
217 /* XXX FIXME: This is being added to b_size as a low-risk fix to the fact that
218  * the LVB filling happens _after_ the lock has been granted, so another thread
219  * can match it before the LVB has been updated.  As a dirty hack, we set
220  * LDLM_FL_LVB_READY only after we've done the LVB poop.
221  * this is only needed on LOV/OSC now, where LVB is actually used and callers
222  * must set it in input flags.
223  *
224  * The proper fix is to do the granting inside of the completion AST, which can
225  * be replaced with a LVB-aware wrapping function for OSC locks.  That change is
226  * pretty high-risk, though, and would need a lot more testing. */
227 #define LDLM_FL_LVB_READY      0x20000000000ULL
228 /* A lock contributes to the known minimum size (KMS) calculation until it has
229  * finished the part of its cancelation that performs write back on its dirty
230  * pages.  It can remain on the granted list during this whole time.  Threads
231  * racing to update the KMS after performing their writeback need to know to
232  * exclude each other's locks from the calculation as they walk the granted
233  * list. */
234 #define LDLM_FL_KMS_IGNORE     0x40000000000ULL
235 /* completion AST to be executed */
236 #define LDLM_FL_CP_REQD        0x80000000000ULL
237 /* cleanup_resource has already handled the lock */
238 #define LDLM_FL_CLEANED        0x100000000000ULL
239 /* optimization hint: LDLM can run blocking callback from current context
240  * w/o involving separate thread. in order to decrease cs rate */
241 #define LDLM_FL_ATOMIC_CB      0x200000000000ULL
242
243 /* It may happen that a client initiates two operations, e.g. unlink and
244  * mkdir, such that the server sends a blocking AST for conflicting
245  * locks to this client for the first operation, whereas the second
246  * operation has canceled this lock and is waiting for rpc_lock which is
247  * taken by the first operation. LDLM_FL_BL_AST is set by
248  * ldlm_callback_handler() in the lock to prevent the Early Lock Cancel
249  * (ELC) code from cancelling it.
250  *
251  * LDLM_FL_BL_DONE is to be set by ldlm_cancel_callback() when lock
252  * cache is dropped to let ldlm_callback_handler() return EINVAL to the
253  * server. It is used when ELC RPC is already prepared and is waiting
254  * for rpc_lock, too late to send a separate CANCEL RPC. */
255 #define LDLM_FL_BL_AST          0x400000000000ULL
256 #define LDLM_FL_BL_DONE         0x800000000000ULL
257 /* Don't put lock into the LRU list, so that it is not canceled due to aging.
258  * Used by MGC locks, they are cancelled only at unmount or by callback. */
259 #define LDLM_FL_NO_LRU          0x1000000000000ULL
260
261 /**
262  * The blocking callback is overloaded to perform two functions.  These flags
263  * indicate which operation should be performed.
264  */
265 #define LDLM_CB_BLOCKING    1
266 #define LDLM_CB_CANCELING   2
267
268 /**
269  * \name Lock Compatibility Matrix.
270  *
271  * A lock has both a type (extent, flock, inode bits, or plain) and a mode.
272  * Lock types are described in their respective implementation files:
273  * ldlm_{extent,flock,inodebits,plain}.c.
274  *
275  * There are six lock modes along with a compatibility matrix to indicate if
276  * two locks are compatible.
277  *
278  * - EX: Exclusive mode. Before a new file is created, MDS requests EX lock
279  *   on the parent.
280  * - PW: Protective Write (normal write) mode. When a client requests a write
281  *   lock from an OST, a lock with PW mode will be issued.
282  * - PR: Protective Read (normal read) mode. When a client requests a read from
283  *   an OST, a lock with PR mode will be issued. Also, if the client opens a
284  *   file for execution, it is granted a lock with PR mode.
285  * - CW: Concurrent Write mode. The type of lock that the MDS grants if a client
286  *   requests a write lock during a file open operation.
287  * - CR Concurrent Read mode. When a client performs a path lookup, MDS grants
288  *   an inodebit lock with the CR mode on the intermediate path component.
289  * - NL Null mode.
290  *
291  * <PRE>
292  *       NL  CR  CW  PR  PW  EX
293  *  NL    1   1   1   1   1   1
294  *  CR    1   1   1   1   1   0
295  *  CW    1   1   1   0   0   0
296  *  PR    1   1   0   1   0   0
297  *  PW    1   1   0   0   0   0
298  *  EX    1   0   0   0   0   0
299  * </PRE>
300  */
301 /** @{ */
302 #define LCK_COMPAT_EX  LCK_NL
303 #define LCK_COMPAT_PW  (LCK_COMPAT_EX | LCK_CR)
304 #define LCK_COMPAT_PR  (LCK_COMPAT_PW | LCK_PR)
305 #define LCK_COMPAT_CW  (LCK_COMPAT_PW | LCK_CW)
306 #define LCK_COMPAT_CR  (LCK_COMPAT_CW | LCK_PR | LCK_PW)
307 #define LCK_COMPAT_NL  (LCK_COMPAT_CR | LCK_EX | LCK_GROUP)
308 #define LCK_COMPAT_GROUP  (LCK_GROUP | LCK_NL)
309 #define LCK_COMPAT_COS (LCK_COS)
310 /** @} Lock Compatibility Matrix */
311
312 extern ldlm_mode_t lck_compat_array[];
313
314 static inline void lockmode_verify(ldlm_mode_t mode)
315 {
316        LASSERT(mode > LCK_MINMODE && mode < LCK_MAXMODE);
317 }
318
319 static inline int lockmode_compat(ldlm_mode_t exist_mode, ldlm_mode_t new_mode)
320 {
321        return (lck_compat_array[exist_mode] & new_mode);
322 }
323
324 /*
325  *
326  * cluster name spaces
327  *
328  */
329
330 #define DLM_OST_NAMESPACE 1
331 #define DLM_MDS_NAMESPACE 2
332
333 /* XXX
334    - do we just separate this by security domains and use a prefix for
335      multiple namespaces in the same domain?
336    -
337 */
338
339 /**
340  * Locking rules for LDLM:
341  *
342  * lr_lock
343  *
344  * lr_lock
345  *     waiting_locks_spinlock
346  *
347  * lr_lock
348  *     led_lock
349  *
350  * lr_lock
351  *     ns_lock
352  *
353  * lr_lvb_mutex
354  *     lr_lock
355  *
356  */
357
358 struct ldlm_pool;
359 struct ldlm_lock;
360 struct ldlm_resource;
361 struct ldlm_namespace;
362
363 /**
364  * Operations on LDLM pools.
365  * LDLM pool is a pool of locks in the namespace without any implicitly
366  * specified limits.
367  * Locks in the pool are organized in LRU.
368  * Local memory pressure or server instructions (e.g. mempressure on server)
369  * can trigger freeing of locks from the pool
370  */
371 struct ldlm_pool_ops {
372         /** Recalculate pool \a pl usage */
373         int (*po_recalc)(struct ldlm_pool *pl);
374         /** Cancel at least \a nr locks from pool \a pl */
375         int (*po_shrink)(struct ldlm_pool *pl, int nr,
376                          unsigned int gfp_mask);
377         int (*po_setup)(struct ldlm_pool *pl, int limit);
378 };
379
380 /** One second for pools thread check interval. Each pool has own period. */
381 #define LDLM_POOLS_THREAD_PERIOD (1)
382
383 /** ~6% margin for modest pools. See ldlm_pool.c for details. */
384 #define LDLM_POOLS_MODEST_MARGIN_SHIFT (4)
385
386 /** Default recalc period for server side pools in sec. */
387 #define LDLM_POOL_SRV_DEF_RECALC_PERIOD (1)
388
389 /** Default recalc period for client side pools in sec. */
390 #define LDLM_POOL_CLI_DEF_RECALC_PERIOD (10)
391
392 /**
393  * LDLM pool structure to track granted locks.
394  * For purposes of determining when to release locks on e.g. memory pressure.
395  * This feature is commonly referred to as lru_resize.
396  */
397 struct ldlm_pool {
398         /** Pool proc directory. */
399         cfs_proc_dir_entry_t    *pl_proc_dir;
400         /** Pool name, must be long enough to hold compound proc entry name. */
401         char                    pl_name[100];
402         /** Lock for protecting SLV/CLV updates. */
403         spinlock_t              pl_lock;
404         /** Number of allowed locks in in pool, both, client and server side. */
405         cfs_atomic_t            pl_limit;
406         /** Number of granted locks in */
407         cfs_atomic_t            pl_granted;
408         /** Grant rate per T. */
409         cfs_atomic_t            pl_grant_rate;
410         /** Cancel rate per T. */
411         cfs_atomic_t            pl_cancel_rate;
412         /** Server lock volume (SLV). Protected by pl_lock. */
413         __u64                   pl_server_lock_volume;
414         /** Current biggest client lock volume. Protected by pl_lock. */
415         __u64                   pl_client_lock_volume;
416         /** Lock volume factor. SLV on client is calculated as following:
417          *  server_slv * lock_volume_factor. */
418         cfs_atomic_t            pl_lock_volume_factor;
419         /** Time when last SLV from server was obtained. */
420         time_t                  pl_recalc_time;
421         /** Recalculation period for pool. */
422         time_t                  pl_recalc_period;
423         /** Recalculation and shrink operations. */
424         struct ldlm_pool_ops    *pl_ops;
425         /** Number of planned locks for next period. */
426         int                     pl_grant_plan;
427         /** Pool statistics. */
428         struct lprocfs_stats    *pl_stats;
429 };
430
431 typedef int (*ldlm_res_policy)(struct ldlm_namespace *, struct ldlm_lock **,
432                                void *req_cookie, ldlm_mode_t mode, __u64 flags,
433                                void *data);
434
435 typedef int (*ldlm_cancel_for_recovery)(struct ldlm_lock *lock);
436
437 /**
438  * LVB operations.
439  * LVB is Lock Value Block. This is a special opaque (to LDLM) value that could
440  * be associated with an LDLM lock and transferred from client to server and
441  * back.
442  *
443  * Currently LVBs are used by:
444  *  - OSC-OST code to maintain current object size/times
445  *  - layout lock code to return the layout when the layout lock is granted
446  */
447 struct ldlm_valblock_ops {
448         int (*lvbo_init)(struct ldlm_resource *res);
449         int (*lvbo_update)(struct ldlm_resource *res,
450                            struct ptlrpc_request *r,
451                            int increase);
452         int (*lvbo_free)(struct ldlm_resource *res);
453         /* Return size of lvb data appropriate RPC size can be reserved */
454         int (*lvbo_size)(struct ldlm_lock *lock);
455         /* Called to fill in lvb data to RPC buffer @buf */
456         int (*lvbo_fill)(struct ldlm_lock *lock, void *buf, int buflen);
457 };
458
459 /**
460  * LDLM pools related, type of lock pool in the namespace.
461  * Greedy means release cached locks aggressively
462  */
463 typedef enum {
464         LDLM_NAMESPACE_GREEDY = 1 << 0,
465         LDLM_NAMESPACE_MODEST = 1 << 1
466 } ldlm_appetite_t;
467
468 /**
469  * Default values for the "max_nolock_size", "contention_time" and
470  * "contended_locks" namespace tunables.
471  */
472 #define NS_DEFAULT_MAX_NOLOCK_BYTES 0
473 #define NS_DEFAULT_CONTENTION_SECONDS 2
474 #define NS_DEFAULT_CONTENDED_LOCKS 32
475
476 struct ldlm_ns_bucket {
477         /** back pointer to namespace */
478         struct ldlm_namespace      *nsb_namespace;
479         /**
480          * Estimated lock callback time.  Used by adaptive timeout code to
481          * avoid spurious client evictions due to unresponsiveness when in
482          * fact the network or overall system load is at fault
483          */
484         struct adaptive_timeout     nsb_at_estimate;
485 };
486
487 enum {
488         /** LDLM namespace lock stats */
489         LDLM_NSS_LOCKS          = 0,
490         LDLM_NSS_LAST
491 };
492
493 typedef enum {
494         /** invalide type */
495         LDLM_NS_TYPE_UNKNOWN    = 0,
496         /** mdc namespace */
497         LDLM_NS_TYPE_MDC,
498         /** mds namespace */
499         LDLM_NS_TYPE_MDT,
500         /** osc namespace */
501         LDLM_NS_TYPE_OSC,
502         /** ost namespace */
503         LDLM_NS_TYPE_OST,
504         /** mgc namespace */
505         LDLM_NS_TYPE_MGC,
506         /** mgs namespace */
507         LDLM_NS_TYPE_MGT,
508 } ldlm_ns_type_t;
509
510 /**
511  * LDLM Namespace.
512  *
513  * Namespace serves to contain locks related to a particular service.
514  * There are two kinds of namespaces:
515  * - Server namespace has knowledge of all locks and is therefore authoritative
516  *   to make decisions like what locks could be granted and what conflicts
517  *   exist during new lock enqueue.
518  * - Client namespace only has limited knowledge about locks in the namespace,
519  *   only seeing locks held by the client.
520  *
521  * Every Lustre service has one server namespace present on the server serving
522  * that service. Every client connected to the service has a client namespace
523  * for it.
524  * Every lock obtained by client in that namespace is actually represented by
525  * two in-memory locks. One on the server and one on the client. The locks are
526  * linked by a special cookie by which one node can tell to the other which lock
527  * it actually means during communications. Such locks are called remote locks.
528  * The locks held by server only without any reference to a client are called
529  * local locks.
530  */
531 struct ldlm_namespace {
532         /** Backward link to OBD, required for LDLM pool to store new SLV. */
533         struct obd_device       *ns_obd;
534
535         /** Flag indicating if namespace is on client instead of server */
536         ldlm_side_t             ns_client;
537
538         /** Resource hash table for namespace. */
539         cfs_hash_t              *ns_rs_hash;
540
541         /** serialize */
542         spinlock_t              ns_lock;
543
544         /** big refcount (by bucket) */
545         cfs_atomic_t            ns_bref;
546
547         /**
548          * Namespace connect flags supported by server (may be changed via
549          * /proc, LRU resize may be disabled/enabled).
550          */
551         __u64                   ns_connect_flags;
552
553         /** Client side original connect flags supported by server. */
554         __u64                   ns_orig_connect_flags;
555
556         /**
557          * Position in global namespace list linking all namespaces on
558          * the node.
559          */
560         cfs_list_t              ns_list_chain;
561
562         /**
563          * List of unused locks for this namespace. This list is also called
564          * LRU lock list.
565          * Unused locks are locks with zero reader/writer reference counts.
566          * This list is only used on clients for lock caching purposes.
567          * When we want to release some locks voluntarily or if server wants
568          * us to release some locks due to e.g. memory pressure, we take locks
569          * to release from the head of this list.
570          * Locks are linked via l_lru field in \see struct ldlm_lock.
571          */
572         cfs_list_t              ns_unused_list;
573         /** Number of locks in the LRU list above */
574         int                     ns_nr_unused;
575
576         /**
577          * Maximum number of locks permitted in the LRU. If 0, means locks
578          * are managed by pools and there is no preset limit, rather it is all
579          * controlled by available memory on this client and on server.
580          */
581         unsigned int            ns_max_unused;
582         /** Maximum allowed age (last used time) for locks in the LRU */
583         unsigned int            ns_max_age;
584         /**
585          * Server only: number of times we evicted clients due to lack of reply
586          * to ASTs.
587          */
588         unsigned int            ns_timeouts;
589         /**
590          * Number of seconds since the file change time after which the
591          * MDT will return an UPDATE lock along with a LOOKUP lock.
592          * This allows the client to start caching negative dentries
593          * for a directory and may save an RPC for a later stat.
594          */
595         unsigned int            ns_ctime_age_limit;
596
597         /**
598          * Used to rate-limit ldlm_namespace_dump calls.
599          * \see ldlm_namespace_dump. Increased by 10 seconds every time
600          * it is called.
601          */
602         cfs_time_t              ns_next_dump;
603
604         /** "policy" function that does actual lock conflict determination */
605         ldlm_res_policy         ns_policy;
606
607         /**
608          * LVB operations for this namespace.
609          * \see struct ldlm_valblock_ops
610          */
611         struct ldlm_valblock_ops *ns_lvbo;
612
613         /**
614          * Used by filter code to store pointer to OBD of the service.
615          * Should be dropped in favor of \a ns_obd
616          */
617         void                    *ns_lvbp;
618
619         /**
620          * Wait queue used by __ldlm_namespace_free. Gets woken up every time
621          * a resource is removed.
622          */
623         cfs_waitq_t             ns_waitq;
624         /** LDLM pool structure for this namespace */
625         struct ldlm_pool        ns_pool;
626         /** Definition of how eagerly unused locks will be released from LRU */
627         ldlm_appetite_t         ns_appetite;
628
629         /**
630          * If more than \a ns_contended_locks are found, the resource is
631          * considered to be contended. Lock enqueues might specify that no
632          * contended locks should be granted
633          */
634         unsigned                ns_contended_locks;
635
636         /**
637          * The resources in this namespace remember contended state during
638          * \a ns_contention_time, in seconds.
639          */
640         unsigned                ns_contention_time;
641
642         /**
643          * Limit size of contended extent locks, in bytes.
644          * If extended lock is requested for more then this many bytes and
645          * caller instructs us not to grant contended locks, we would disregard
646          * such a request.
647          */
648         unsigned                ns_max_nolock_size;
649
650         /** Limit of parallel AST RPC count. */
651         unsigned                ns_max_parallel_ast;
652
653         /** Callback to cancel locks before replaying it during recovery. */
654         ldlm_cancel_for_recovery ns_cancel_for_recovery;
655
656         /** LDLM lock stats */
657         struct lprocfs_stats    *ns_stats;
658
659         /**
660          * Flag to indicate namespace is being freed. Used to determine if
661          * recalculation of LDLM pool statistics should be skipped.
662          */
663         unsigned                ns_stopping:1;
664 };
665
666 /**
667  * Returns 1 if namespace \a ns is a client namespace.
668  */
669 static inline int ns_is_client(struct ldlm_namespace *ns)
670 {
671         LASSERT(ns != NULL);
672         LASSERT(!(ns->ns_client & ~(LDLM_NAMESPACE_CLIENT |
673                                     LDLM_NAMESPACE_SERVER)));
674         LASSERT(ns->ns_client == LDLM_NAMESPACE_CLIENT ||
675                 ns->ns_client == LDLM_NAMESPACE_SERVER);
676         return ns->ns_client == LDLM_NAMESPACE_CLIENT;
677 }
678
679 /**
680  * Returns 1 if namespace \a ns is a server namespace.
681  */
682 static inline int ns_is_server(struct ldlm_namespace *ns)
683 {
684         LASSERT(ns != NULL);
685         LASSERT(!(ns->ns_client & ~(LDLM_NAMESPACE_CLIENT |
686                                     LDLM_NAMESPACE_SERVER)));
687         LASSERT(ns->ns_client == LDLM_NAMESPACE_CLIENT ||
688                 ns->ns_client == LDLM_NAMESPACE_SERVER);
689         return ns->ns_client == LDLM_NAMESPACE_SERVER;
690 }
691
692 /**
693  * Returns 1 if namespace \a ns supports early lock cancel (ELC).
694  */
695 static inline int ns_connect_cancelset(struct ldlm_namespace *ns)
696 {
697         LASSERT(ns != NULL);
698         return !!(ns->ns_connect_flags & OBD_CONNECT_CANCELSET);
699 }
700
701 /**
702  * Returns 1 if this namespace supports lru_resize.
703  */
704 static inline int ns_connect_lru_resize(struct ldlm_namespace *ns)
705 {
706         LASSERT(ns != NULL);
707         return !!(ns->ns_connect_flags & OBD_CONNECT_LRU_RESIZE);
708 }
709
710 static inline void ns_register_cancel(struct ldlm_namespace *ns,
711                                       ldlm_cancel_for_recovery arg)
712 {
713         LASSERT(ns != NULL);
714         ns->ns_cancel_for_recovery = arg;
715 }
716
717 struct ldlm_lock;
718
719 /** Type for blocking callback function of a lock. */
720 typedef int (*ldlm_blocking_callback)(struct ldlm_lock *lock,
721                                       struct ldlm_lock_desc *new, void *data,
722                                       int flag);
723 /** Type for completion callback function of a lock. */
724 typedef int (*ldlm_completion_callback)(struct ldlm_lock *lock, __u64 flags,
725                                         void *data);
726 /** Type for glimpse callback function of a lock. */
727 typedef int (*ldlm_glimpse_callback)(struct ldlm_lock *lock, void *data);
728 /** Type for weight callback function of a lock. */
729 typedef unsigned long (*ldlm_weigh_callback)(struct ldlm_lock *lock);
730
731 /** Work list for sending GL ASTs to multiple locks. */
732 struct ldlm_glimpse_work {
733         struct ldlm_lock        *gl_lock; /* lock to glimpse */
734         cfs_list_t               gl_list; /* linkage to other gl work structs */
735         __u32                    gl_flags;/* see LDLM_GL_WORK_* below */
736         union ldlm_gl_desc      *gl_desc; /* glimpse descriptor to be packed in
737                                            * glimpse callback request */
738 };
739
740 /** The ldlm_glimpse_work is allocated on the stack and should not be freed. */
741 #define LDLM_GL_WORK_NOFREE 0x1
742
743 /** Interval node data for each LDLM_EXTENT lock. */
744 struct ldlm_interval {
745         struct interval_node    li_node;  /* node for tree management */
746         cfs_list_t              li_group; /* the locks which have the same
747                                            * policy - group of the policy */
748 };
749 #define to_ldlm_interval(n) container_of(n, struct ldlm_interval, li_node)
750
751 /**
752  * Interval tree for extent locks.
753  * The interval tree must be accessed under the resource lock.
754  * Interval trees are used for granted extent locks to speed up conflicts
755  * lookup. See ldlm/interval_tree.c for more details.
756  */
757 struct ldlm_interval_tree {
758         /** Tree size. */
759         int                     lit_size;
760         ldlm_mode_t             lit_mode;  /* lock mode */
761         struct interval_node    *lit_root; /* actual ldlm_interval */
762 };
763
764 /** Whether to track references to exports by LDLM locks. */
765 #define LUSTRE_TRACKS_LOCK_EXP_REFS (0)
766
767 /** Cancel flags. */
768 typedef enum {
769         LCF_ASYNC      = 0x1, /* Cancel locks asynchronously. */
770         LCF_LOCAL      = 0x2, /* Cancel locks locally, not notifing server */
771         LCF_BL_AST     = 0x4, /* Cancel locks marked as LDLM_FL_BL_AST
772                                * in the same RPC */
773 } ldlm_cancel_flags_t;
774
775 struct ldlm_flock {
776         __u64 start;
777         __u64 end;
778         __u64 owner;
779         __u64 blocking_owner;
780         struct obd_export *blocking_export;
781         /* Protected by the hash lock */
782         __u32 blocking_refs;
783         __u32 pid;
784 };
785
786 typedef union {
787         struct ldlm_extent l_extent;
788         struct ldlm_flock l_flock;
789         struct ldlm_inodebits l_inodebits;
790 } ldlm_policy_data_t;
791
792 void ldlm_convert_policy_to_wire(ldlm_type_t type,
793                                  const ldlm_policy_data_t *lpolicy,
794                                  ldlm_wire_policy_data_t *wpolicy);
795 void ldlm_convert_policy_to_local(struct obd_export *exp, ldlm_type_t type,
796                                   const ldlm_wire_policy_data_t *wpolicy,
797                                   ldlm_policy_data_t *lpolicy);
798
799 enum lvb_type {
800         LVB_T_NONE      = 0,
801         LVB_T_OST       = 1,
802         LVB_T_LQUOTA    = 2,
803         LVB_T_LAYOUT    = 3,
804 };
805
806 /**
807  * LDLM lock structure
808  *
809  * Represents a single LDLM lock and its state in memory. Each lock is
810  * associated with a single ldlm_resource, the object which is being
811  * locked. There may be multiple ldlm_locks on a single resource,
812  * depending on the lock type and whether the locks are conflicting or
813  * not.
814  */
815 struct ldlm_lock {
816         /**
817          * Local lock handle.
818          * When remote side wants to tell us about a lock, they address
819          * it by this opaque handle.  The handle does not hold a
820          * reference on the ldlm_lock, so it can be safely passed to
821          * other threads or nodes. When the lock needs to be accessed
822          * from the handle, it is looked up again in the lock table, and
823          * may no longer exist.
824          *
825          * Must be first in the structure.
826          */
827         struct portals_handle   l_handle;
828         /**
829          * Lock reference count.
830          * This is how many users have pointers to actual structure, so that
831          * we do not accidentally free lock structure that is in use.
832          */
833         cfs_atomic_t            l_refc;
834         /**
835          * Internal spinlock protects l_resource.  We should hold this lock
836          * first before taking res_lock.
837          */
838         spinlock_t              l_lock;
839         /**
840          * Pointer to actual resource this lock is in.
841          * ldlm_lock_change_resource() can change this.
842          */
843         struct ldlm_resource    *l_resource;
844         /**
845          * List item for client side LRU list.
846          * Protected by ns_lock in struct ldlm_namespace.
847          */
848         cfs_list_t              l_lru;
849         /**
850          * Linkage to resource's lock queues according to current lock state.
851          * (could be granted, waiting or converting)
852          * Protected by lr_lock in struct ldlm_resource.
853          */
854         cfs_list_t              l_res_link;
855         /**
856          * Tree node for ldlm_extent.
857          */
858         struct ldlm_interval    *l_tree_node;
859         /**
860          * Per export hash of locks.
861          * Protected by per-bucket exp->exp_lock_hash locks.
862          */
863         cfs_hlist_node_t        l_exp_hash;
864         /**
865          * Per export hash of flock locks.
866          * Protected by per-bucket exp->exp_flock_hash locks.
867          */
868         cfs_hlist_node_t        l_exp_flock_hash;
869         /**
870          * Requested mode.
871          * Protected by lr_lock.
872          */
873         ldlm_mode_t             l_req_mode;
874         /**
875          * Granted mode, also protected by lr_lock.
876          */
877         ldlm_mode_t             l_granted_mode;
878         /** Lock completion handler pointer. Called when lock is granted. */
879         ldlm_completion_callback l_completion_ast;
880         /**
881          * Lock blocking AST handler pointer.
882          * It plays two roles:
883          * - as a notification of an attempt to queue a conflicting lock (once)
884          * - as a notification when the lock is being cancelled.
885          *
886          * As such it's typically called twice: once for the initial conflict
887          * and then once more when the last user went away and the lock is
888          * cancelled (could happen recursively).
889          */
890         ldlm_blocking_callback  l_blocking_ast;
891         /**
892          * Lock glimpse handler.
893          * Glimpse handler is used to obtain LVB updates from a client by
894          * server
895          */
896         ldlm_glimpse_callback   l_glimpse_ast;
897
898         /** XXX apparently unused "weight" handler. To be removed? */
899         ldlm_weigh_callback     l_weigh_ast;
900
901         /**
902          * Lock export.
903          * This is a pointer to actual client export for locks that were granted
904          * to clients. Used server-side.
905          */
906         struct obd_export       *l_export;
907         /**
908          * Lock connection export.
909          * Pointer to server export on a client.
910          */
911         struct obd_export       *l_conn_export;
912
913         /**
914          * Remote lock handle.
915          * If the lock is remote, this is the handle of the other side lock
916          * (l_handle)
917          */
918         struct lustre_handle    l_remote_handle;
919
920         /**
921          * Representation of private data specific for a lock type.
922          * Examples are: extent range for extent lock or bitmask for ibits locks
923          */
924         ldlm_policy_data_t      l_policy_data;
925
926         /**
927          * Lock state flags.
928          * Like whenever we receive any blocking requests for this lock, etc.
929          * Protected by lr_lock.
930          */
931         __u64                   l_flags;
932         /**
933          * Lock r/w usage counters.
934          * Protected by lr_lock.
935          */
936         __u32                   l_readers;
937         __u32                   l_writers;
938         /**
939          * If the lock is granted, a process sleeps on this waitq to learn when
940          * it's no longer in use.  If the lock is not granted, a process sleeps
941          * on this waitq to learn when it becomes granted.
942          */
943         cfs_waitq_t             l_waitq;
944
945         /**
946          * Seconds. It will be updated if there is any activity related to
947          * the lock, e.g. enqueue the lock or send blocking AST.
948          */
949         cfs_time_t              l_last_activity;
950
951         /**
952          * Time last used by e.g. being matched by lock match.
953          * Jiffies. Should be converted to time if needed.
954          */
955         cfs_time_t              l_last_used;
956
957         /** Originally requested extent for the extent lock. */
958         struct ldlm_extent      l_req_extent;
959
960         unsigned int            l_failed:1,
961         /**
962          * Set for locks that were removed from class hash table and will be
963          * destroyed when last reference to them is released. Set by
964          * ldlm_lock_destroy_internal().
965          *
966          * Protected by lock and resource locks.
967          */
968                                 l_destroyed:1,
969         /*
970          * it's set in lock_res_and_lock() and unset in unlock_res_and_lock().
971          *
972          * NB: compared with check_res_locked(), checking this bit is cheaper.
973          * Also, spin_is_locked() is deprecated for kernel code; one reason is
974          * because it works only for SMP so user needs to add extra macros like
975          * LASSERT_SPIN_LOCKED for uniprocessor kernels.
976          */
977                                 l_res_locked:1,
978         /*
979          * It's set once we call ldlm_add_waiting_lock_res_locked()
980          * to start the lock-timeout timer and it will never be reset.
981          *
982          * Protected by lock_res_and_lock().
983          */
984                                 l_waited:1,
985         /** Flag whether this is a server namespace lock. */
986                                 l_ns_srv:1;
987
988         /*
989          * Client-side-only members.
990          */
991
992         enum lvb_type         l_lvb_type;
993
994         /**
995          * Temporary storage for a LVB received during an enqueue operation.
996          */
997         __u32                   l_lvb_len;
998         void                    *l_lvb_data;
999
1000         /** Private storage for lock user. Opaque to LDLM. */
1001         void                    *l_ast_data;
1002
1003         /*
1004          * Server-side-only members.
1005          */
1006
1007         /**
1008          * Connection cookie for the client originating the operation.
1009          * Used by Commit on Share (COS) code. Currently only used for
1010          * inodebits locks on MDS.
1011          */
1012         __u64                   l_client_cookie;
1013
1014         /**
1015          * List item for locks waiting for cancellation from clients.
1016          * The lists this could be linked into are:
1017          * waiting_locks_list (protected by waiting_locks_spinlock),
1018          * then if the lock timed out, it is moved to
1019          * expired_lock_thread.elt_expired_locks for further processing.
1020          * Protected by elt_lock.
1021          */
1022         cfs_list_t              l_pending_chain;
1023
1024         /**
1025          * Set when lock is sent a blocking AST. Time in seconds when timeout
1026          * is reached and client holding this lock could be evicted.
1027          * This timeout could be further extended by e.g. certain IO activity
1028          * under this lock.
1029          * \see ost_rw_prolong_locks
1030          */
1031         cfs_time_t              l_callback_timeout;
1032
1033         /** Local PID of process which created this lock. */
1034         __u32                   l_pid;
1035
1036         /**
1037          * Number of times blocking AST was sent for this lock.
1038          * This is for debugging. Valid values are 0 and 1, if there is an
1039          * attempt to send blocking AST more than once, an assertion would be
1040          * hit. \see ldlm_work_bl_ast_lock
1041          */
1042         int                     l_bl_ast_run;
1043         /** List item ldlm_add_ast_work_item() for case of blocking ASTs. */
1044         cfs_list_t              l_bl_ast;
1045         /** List item ldlm_add_ast_work_item() for case of completion ASTs. */
1046         cfs_list_t              l_cp_ast;
1047         /** For ldlm_add_ast_work_item() for "revoke" AST used in COS. */
1048         cfs_list_t              l_rk_ast;
1049
1050         /**
1051          * Pointer to a conflicting lock that caused blocking AST to be sent
1052          * for this lock
1053          */
1054         struct ldlm_lock        *l_blocking_lock;
1055
1056         /**
1057          * Protected by lr_lock, linkages to "skip lists".
1058          * For more explanations of skip lists see ldlm/ldlm_inodebits.c
1059          */
1060         cfs_list_t              l_sl_mode;
1061         cfs_list_t              l_sl_policy;
1062
1063         /** Reference tracking structure to debug leaked locks. */
1064         struct lu_ref           l_reference;
1065 #if LUSTRE_TRACKS_LOCK_EXP_REFS
1066         /* Debugging stuff for bug 20498, for tracking export references. */
1067         /** number of export references taken */
1068         int                     l_exp_refs_nr;
1069         /** link all locks referencing one export */
1070         cfs_list_t              l_exp_refs_link;
1071         /** referenced export object */
1072         struct obd_export       *l_exp_refs_target;
1073 #endif
1074         /**
1075          * export blocking dlm lock list, protected by
1076          * l_export->exp_bl_list_lock.
1077          * Lock order of waiting_lists_spinlock, exp_bl_list_lock and res lock
1078          * is: res lock -> exp_bl_list_lock -> wanting_lists_spinlock.
1079          */
1080         cfs_list_t              l_exp_list;
1081 };
1082
1083 /**
1084  * LDLM resource description.
1085  * Basically, resource is a representation for a single object.
1086  * Object has a name which is currently 4 64-bit integers. LDLM user is
1087  * responsible for creation of a mapping between objects it wants to be
1088  * protected and resource names.
1089  *
1090  * A resource can only hold locks of a single lock type, though there may be
1091  * multiple ldlm_locks on a single resource, depending on the lock type and
1092  * whether the locks are conflicting or not.
1093  */
1094 struct ldlm_resource {
1095         struct ldlm_ns_bucket   *lr_ns_bucket;
1096
1097         /**
1098          * List item for list in namespace hash.
1099          * protected by ns_lock
1100          */
1101         cfs_hlist_node_t        lr_hash;
1102
1103         /** Spinlock to protect locks under this resource. */
1104         spinlock_t              lr_lock;
1105
1106         /**
1107          * protected by lr_lock
1108          * @{ */
1109         /** List of locks in granted state */
1110         cfs_list_t              lr_granted;
1111         /** List of locks waiting to change their granted mode (converted) */
1112         cfs_list_t              lr_converting;
1113         /**
1114          * List of locks that could not be granted due to conflicts and
1115          * that are waiting for conflicts to go away */
1116         cfs_list_t              lr_waiting;
1117         /** @} */
1118
1119         /* XXX No longer needed? Remove ASAP */
1120         ldlm_mode_t             lr_most_restr;
1121
1122         /** Type of locks this resource can hold. Only one type per resource. */
1123         ldlm_type_t             lr_type; /* LDLM_{PLAIN,EXTENT,FLOCK,IBITS} */
1124
1125         /** Resource name */
1126         struct ldlm_res_id      lr_name;
1127         /** Reference count for this resource */
1128         cfs_atomic_t            lr_refcount;
1129
1130         /**
1131          * Interval trees (only for extent locks) for all modes of this resource
1132          */
1133         struct ldlm_interval_tree lr_itree[LCK_MODE_NUM];
1134
1135         /**
1136          * Server-side-only lock value block elements.
1137          * To serialize lvbo_init.
1138          */
1139         struct mutex            lr_lvb_mutex;
1140         __u32                   lr_lvb_len;
1141         /** protected by lr_lock */
1142         void                    *lr_lvb_data;
1143
1144         /** When the resource was considered as contended. */
1145         cfs_time_t              lr_contention_time;
1146         /** List of references to this resource. For debugging. */
1147         struct lu_ref           lr_reference;
1148
1149         struct inode            *lr_lvb_inode;
1150 };
1151
1152 static inline bool ldlm_has_layout(struct ldlm_lock *lock)
1153 {
1154         return lock->l_resource->lr_type == LDLM_IBITS &&
1155                 lock->l_policy_data.l_inodebits.bits & MDS_INODELOCK_LAYOUT;
1156 }
1157
1158 static inline char *
1159 ldlm_ns_name(struct ldlm_namespace *ns)
1160 {
1161         return ns->ns_rs_hash->hs_name;
1162 }
1163
1164 static inline struct ldlm_namespace *
1165 ldlm_res_to_ns(struct ldlm_resource *res)
1166 {
1167         return res->lr_ns_bucket->nsb_namespace;
1168 }
1169
1170 static inline struct ldlm_namespace *
1171 ldlm_lock_to_ns(struct ldlm_lock *lock)
1172 {
1173         return ldlm_res_to_ns(lock->l_resource);
1174 }
1175
1176 static inline char *
1177 ldlm_lock_to_ns_name(struct ldlm_lock *lock)
1178 {
1179         return ldlm_ns_name(ldlm_lock_to_ns(lock));
1180 }
1181
1182 static inline struct adaptive_timeout *
1183 ldlm_lock_to_ns_at(struct ldlm_lock *lock)
1184 {
1185         return &lock->l_resource->lr_ns_bucket->nsb_at_estimate;
1186 }
1187
1188 static inline int ldlm_lvbo_init(struct ldlm_resource *res)
1189 {
1190         struct ldlm_namespace *ns = ldlm_res_to_ns(res);
1191
1192         if (ns->ns_lvbo != NULL && ns->ns_lvbo->lvbo_init != NULL)
1193                 return ns->ns_lvbo->lvbo_init(res);
1194
1195         return 0;
1196 }
1197
1198 static inline int ldlm_lvbo_size(struct ldlm_lock *lock)
1199 {
1200         struct ldlm_namespace *ns = ldlm_lock_to_ns(lock);
1201
1202         if (ns->ns_lvbo != NULL && ns->ns_lvbo->lvbo_size != NULL)
1203                 return ns->ns_lvbo->lvbo_size(lock);
1204
1205         return 0;
1206 }
1207
1208 static inline int ldlm_lvbo_fill(struct ldlm_lock *lock, void *buf, int len)
1209 {
1210         struct ldlm_namespace *ns = ldlm_lock_to_ns(lock);
1211
1212         if (ns->ns_lvbo != NULL) {
1213                 LASSERT(ns->ns_lvbo->lvbo_fill != NULL);
1214                 return ns->ns_lvbo->lvbo_fill(lock, buf, len);
1215         }
1216         return 0;
1217 }
1218
1219 struct ldlm_ast_work {
1220         struct ldlm_lock      *w_lock;
1221         int                    w_blocking;
1222         struct ldlm_lock_desc  w_desc;
1223         cfs_list_t             w_list;
1224         int                    w_flags;
1225         void                  *w_data;
1226         int                    w_datalen;
1227 };
1228
1229 /**
1230  * Common ldlm_enqueue parameters
1231  */
1232 struct ldlm_enqueue_info {
1233         __u32 ei_type;   /** Type of the lock being enqueued. */
1234         __u32 ei_mode;   /** Mode of the lock being enqueued. */
1235         void *ei_cb_bl;  /** blocking lock callback */
1236         void *ei_cb_cp;  /** lock completion callback */
1237         void *ei_cb_gl;  /** lock glimpse callback */
1238         void *ei_cb_wg;  /** lock weigh callback */
1239         void *ei_cbdata; /** Data to be passed into callbacks. */
1240 };
1241
1242 extern struct obd_ops ldlm_obd_ops;
1243
1244 extern char *ldlm_lockname[];
1245 extern char *ldlm_typename[];
1246 extern char *ldlm_it2str(int it);
1247
1248 /**
1249  * Just a fancy CDEBUG call with log level preset to LDLM_DEBUG.
1250  * For the cases where we do not have actual lock to print along
1251  * with a debugging message that is ldlm-related
1252  */
1253 #define LDLM_DEBUG_NOLOCK(format, a...)                 \
1254         CDEBUG(D_DLMTRACE, "### " format "\n" , ##a)
1255
1256 /**
1257  * Support function for lock information printing into debug logs.
1258  * \see LDLM_DEBUG
1259  */
1260 #ifdef LIBCFS_DEBUG
1261 #define ldlm_lock_debug(msgdata, mask, cdls, lock, fmt, a...) do {      \
1262         CFS_CHECK_STACK(msgdata, mask, cdls);                           \
1263                                                                         \
1264         if (((mask) & D_CANTMASK) != 0 ||                               \
1265             ((libcfs_debug & (mask)) != 0 &&                            \
1266              (libcfs_subsystem_debug & DEBUG_SUBSYSTEM) != 0))          \
1267                 _ldlm_lock_debug(lock, msgdata, fmt, ##a);              \
1268 } while(0)
1269
1270 void _ldlm_lock_debug(struct ldlm_lock *lock,
1271                       struct libcfs_debug_msg_data *data,
1272                       const char *fmt, ...)
1273         __attribute__ ((format (printf, 3, 4)));
1274
1275 /**
1276  * Rate-limited version of lock printing function.
1277  */
1278 #define LDLM_DEBUG_LIMIT(mask, lock, fmt, a...) do {                         \
1279         static cfs_debug_limit_state_t _ldlm_cdls;                           \
1280         LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, mask, &_ldlm_cdls);              \
1281         ldlm_lock_debug(&msgdata, mask, &_ldlm_cdls, lock, "### " fmt , ##a);\
1282 } while (0)
1283
1284 #define LDLM_ERROR(lock, fmt, a...) LDLM_DEBUG_LIMIT(D_ERROR, lock, fmt, ## a)
1285 #define LDLM_WARN(lock, fmt, a...)  LDLM_DEBUG_LIMIT(D_WARNING, lock, fmt, ## a)
1286
1287 /** Non-rate-limited lock printing function for debugging purposes. */
1288 #define LDLM_DEBUG(lock, fmt, a...)   do {                                  \
1289         if (likely(lock != NULL)) {                                         \
1290                 LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_DLMTRACE, NULL);      \
1291                 ldlm_lock_debug(&msgdata, D_DLMTRACE, NULL, lock,           \
1292                                 "### " fmt , ##a);                          \
1293         } else {                                                            \
1294                 LDLM_DEBUG_NOLOCK("no dlm lock: " fmt, ##a);                \
1295         }                                                                   \
1296 } while (0)
1297 #else /* !LIBCFS_DEBUG */
1298 # define LDLM_DEBUG_LIMIT(mask, lock, fmt, a...) ((void)0)
1299 # define LDLM_DEBUG(lock, fmt, a...) ((void)0)
1300 # define LDLM_ERROR(lock, fmt, a...) ((void)0)
1301 #endif
1302
1303 typedef int (*ldlm_processing_policy)(struct ldlm_lock *lock, __u64 *flags,
1304                                       int first_enq, ldlm_error_t *err,
1305                                       cfs_list_t *work_list);
1306
1307 /**
1308  * Return values for lock iterators.
1309  * Also used during deciding of lock grants and cancellations.
1310  */
1311 #define LDLM_ITER_CONTINUE 1 /* keep iterating */
1312 #define LDLM_ITER_STOP     2 /* stop iterating */
1313
1314 typedef int (*ldlm_iterator_t)(struct ldlm_lock *, void *);
1315 typedef int (*ldlm_res_iterator_t)(struct ldlm_resource *, void *);
1316
1317 /** \defgroup ldlm_iterator Lock iterators
1318  *
1319  * LDLM provides for a way to iterate through every lock on a resource or
1320  * namespace or every resource in a namespace.
1321  * @{ */
1322 int ldlm_resource_foreach(struct ldlm_resource *res, ldlm_iterator_t iter,
1323                           void *closure);
1324 void ldlm_namespace_foreach(struct ldlm_namespace *ns, ldlm_iterator_t iter,
1325                             void *closure);
1326 int ldlm_resource_iterate(struct ldlm_namespace *, const struct ldlm_res_id *,
1327                           ldlm_iterator_t iter, void *data);
1328 /** @} ldlm_iterator */
1329
1330 int ldlm_replay_locks(struct obd_import *imp);
1331
1332 /* ldlm_flock.c */
1333 int ldlm_flock_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data);
1334
1335 /* ldlm_extent.c */
1336 __u64 ldlm_extent_shift_kms(struct ldlm_lock *lock, __u64 old_kms);
1337
1338 struct ldlm_callback_suite {
1339         ldlm_completion_callback lcs_completion;
1340         ldlm_blocking_callback   lcs_blocking;
1341         ldlm_glimpse_callback    lcs_glimpse;
1342         ldlm_weigh_callback      lcs_weigh;
1343 };
1344
1345 /* ldlm_lockd.c */
1346 #ifdef HAVE_SERVER_SUPPORT
1347 /** \defgroup ldlm_srv_ast Server AST handlers
1348  * These are AST handlers used by server code.
1349  * Their property is that they are just preparing RPCs to be sent to clients.
1350  * @{
1351  */
1352 int ldlm_server_blocking_ast(struct ldlm_lock *, struct ldlm_lock_desc *,
1353                              void *data, int flag);
1354 int ldlm_server_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data);
1355 int ldlm_server_glimpse_ast(struct ldlm_lock *lock, void *data);
1356 int ldlm_glimpse_locks(struct ldlm_resource *res, cfs_list_t *gl_work_list);
1357 /** @} ldlm_srv_ast */
1358
1359 /** \defgroup ldlm_handlers Server LDLM handlers
1360  * These are handler functions that should be called by "frontends" such as
1361  * MDT or OST to pass through LDLM requests to LDLM for handling
1362  * @{
1363  */
1364 int ldlm_handle_enqueue(struct ptlrpc_request *req, ldlm_completion_callback,
1365                         ldlm_blocking_callback, ldlm_glimpse_callback);
1366 int ldlm_handle_enqueue0(struct ldlm_namespace *ns, struct ptlrpc_request *req,
1367                          const struct ldlm_request *dlm_req,
1368                          const struct ldlm_callback_suite *cbs);
1369 int ldlm_handle_convert(struct ptlrpc_request *req);
1370 int ldlm_handle_convert0(struct ptlrpc_request *req,
1371                          const struct ldlm_request *dlm_req);
1372 int ldlm_handle_cancel(struct ptlrpc_request *req);
1373 int ldlm_request_cancel(struct ptlrpc_request *req,
1374                         const struct ldlm_request *dlm_req, int first);
1375 /** @} ldlm_handlers */
1376
1377 void ldlm_revoke_export_locks(struct obd_export *exp);
1378 #endif
1379 int ldlm_del_waiting_lock(struct ldlm_lock *lock);
1380 int ldlm_refresh_waiting_lock(struct ldlm_lock *lock, int timeout);
1381 int ldlm_get_ref(void);
1382 void ldlm_put_ref(void);
1383 int ldlm_init_export(struct obd_export *exp);
1384 void ldlm_destroy_export(struct obd_export *exp);
1385 struct ldlm_lock *ldlm_request_lock(struct ptlrpc_request *req);
1386
1387 /* ldlm_lock.c */
1388 #ifdef HAVE_SERVER_SUPPORT
1389 ldlm_processing_policy ldlm_get_processing_policy(struct ldlm_resource *res);
1390 #endif
1391 void ldlm_register_intent(struct ldlm_namespace *ns, ldlm_res_policy arg);
1392 void ldlm_lock2handle(const struct ldlm_lock *lock,
1393                       struct lustre_handle *lockh);
1394 struct ldlm_lock *__ldlm_handle2lock(const struct lustre_handle *, __u64 flags);
1395 void ldlm_cancel_callback(struct ldlm_lock *);
1396 int ldlm_lock_remove_from_lru(struct ldlm_lock *);
1397 int ldlm_lock_set_data(struct lustre_handle *, void *);
1398
1399 /**
1400  * Obtain a lock reference by its handle.
1401  */
1402 static inline struct ldlm_lock *ldlm_handle2lock(const struct lustre_handle *h)
1403 {
1404         return __ldlm_handle2lock(h, 0);
1405 }
1406
1407 #define LDLM_LOCK_REF_DEL(lock) \
1408         lu_ref_del(&lock->l_reference, "handle", cfs_current())
1409
1410 static inline struct ldlm_lock *
1411 ldlm_handle2lock_long(const struct lustre_handle *h, __u64 flags)
1412 {
1413         struct ldlm_lock *lock;
1414
1415         lock = __ldlm_handle2lock(h, flags);
1416         if (lock != NULL)
1417                 LDLM_LOCK_REF_DEL(lock);
1418         return lock;
1419 }
1420
1421 /**
1422  * Update Lock Value Block Operations (LVBO) on a resource taking into account
1423  * data from reqest \a r
1424  */
1425 static inline int ldlm_res_lvbo_update(struct ldlm_resource *res,
1426                                        struct ptlrpc_request *r, int increase)
1427 {
1428         if (ldlm_res_to_ns(res)->ns_lvbo &&
1429             ldlm_res_to_ns(res)->ns_lvbo->lvbo_update) {
1430                 return ldlm_res_to_ns(res)->ns_lvbo->lvbo_update(res, r,
1431                                                                  increase);
1432         }
1433         return 0;
1434 }
1435
1436 int ldlm_error2errno(ldlm_error_t error);
1437 ldlm_error_t ldlm_errno2error(int err_no); /* don't call it `errno': this
1438                                             * confuses user-space. */
1439 #if LUSTRE_TRACKS_LOCK_EXP_REFS
1440 void ldlm_dump_export_locks(struct obd_export *exp);
1441 #endif
1442
1443 /**
1444  * Release a temporary lock reference obtained by ldlm_handle2lock() or
1445  * __ldlm_handle2lock().
1446  */
1447 #define LDLM_LOCK_PUT(lock)                     \
1448 do {                                            \
1449         LDLM_LOCK_REF_DEL(lock);                \
1450         /*LDLM_DEBUG((lock), "put");*/          \
1451         ldlm_lock_put(lock);                    \
1452 } while (0)
1453
1454 /**
1455  * Release a lock reference obtained by some other means (see
1456  * LDLM_LOCK_PUT()).
1457  */
1458 #define LDLM_LOCK_RELEASE(lock)                 \
1459 do {                                            \
1460         /*LDLM_DEBUG((lock), "put");*/          \
1461         ldlm_lock_put(lock);                    \
1462 } while (0)
1463
1464 #define LDLM_LOCK_GET(lock)                     \
1465 ({                                              \
1466         ldlm_lock_get(lock);                    \
1467         /*LDLM_DEBUG((lock), "get");*/          \
1468         lock;                                   \
1469 })
1470
1471 #define ldlm_lock_list_put(head, member, count)                     \
1472 ({                                                                  \
1473         struct ldlm_lock *_lock, *_next;                            \
1474         int c = count;                                              \
1475         cfs_list_for_each_entry_safe(_lock, _next, head, member) {  \
1476                 if (c-- == 0)                                       \
1477                         break;                                      \
1478                 cfs_list_del_init(&_lock->member);                  \
1479                 LDLM_LOCK_RELEASE(_lock);                           \
1480         }                                                           \
1481         LASSERT(c <= 0);                                            \
1482 })
1483
1484 struct ldlm_lock *ldlm_lock_get(struct ldlm_lock *lock);
1485 void ldlm_lock_put(struct ldlm_lock *lock);
1486 void ldlm_lock_destroy(struct ldlm_lock *lock);
1487 void ldlm_lock2desc(struct ldlm_lock *lock, struct ldlm_lock_desc *desc);
1488 void ldlm_lock_addref(struct lustre_handle *lockh, __u32 mode);
1489 int  ldlm_lock_addref_try(struct lustre_handle *lockh, __u32 mode);
1490 void ldlm_lock_decref(struct lustre_handle *lockh, __u32 mode);
1491 void ldlm_lock_decref_and_cancel(struct lustre_handle *lockh, __u32 mode);
1492 void ldlm_lock_fail_match_locked(struct ldlm_lock *lock);
1493 void ldlm_lock_fail_match(struct ldlm_lock *lock);
1494 void ldlm_lock_allow_match(struct ldlm_lock *lock);
1495 void ldlm_lock_allow_match_locked(struct ldlm_lock *lock);
1496 ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, __u64 flags,
1497                             const struct ldlm_res_id *, ldlm_type_t type,
1498                             ldlm_policy_data_t *, ldlm_mode_t mode,
1499                             struct lustre_handle *, int unref);
1500 ldlm_mode_t ldlm_revalidate_lock_handle(struct lustre_handle *lockh,
1501                                         __u64 *bits);
1502 struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode,
1503                                         __u32 *flags);
1504 void ldlm_lock_downgrade(struct ldlm_lock *lock, int new_mode);
1505 void ldlm_lock_cancel(struct ldlm_lock *lock);
1506 void ldlm_reprocess_all(struct ldlm_resource *res);
1507 void ldlm_reprocess_all_ns(struct ldlm_namespace *ns);
1508 void ldlm_lock_dump_handle(int level, struct lustre_handle *);
1509 void ldlm_unlink_lock_skiplist(struct ldlm_lock *req);
1510
1511 /* resource.c */
1512 struct ldlm_namespace *
1513 ldlm_namespace_new(struct obd_device *obd, char *name,
1514                    ldlm_side_t client, ldlm_appetite_t apt,
1515                    ldlm_ns_type_t ns_type);
1516 int ldlm_namespace_cleanup(struct ldlm_namespace *ns, __u64 flags);
1517 void ldlm_namespace_free(struct ldlm_namespace *ns,
1518                          struct obd_import *imp, int force);
1519 void ldlm_namespace_register(struct ldlm_namespace *ns, ldlm_side_t client);
1520 void ldlm_namespace_unregister(struct ldlm_namespace *ns, ldlm_side_t client);
1521 void ldlm_namespace_move_locked(struct ldlm_namespace *ns, ldlm_side_t client);
1522 struct ldlm_namespace *ldlm_namespace_first_locked(ldlm_side_t client);
1523 void ldlm_namespace_get(struct ldlm_namespace *ns);
1524 void ldlm_namespace_put(struct ldlm_namespace *ns);
1525 int ldlm_proc_setup(void);
1526 #ifdef LPROCFS
1527 void ldlm_proc_cleanup(void);
1528 #else
1529 static inline void ldlm_proc_cleanup(void) {}
1530 #endif
1531
1532 /* resource.c - internal */
1533 struct ldlm_resource *ldlm_resource_get(struct ldlm_namespace *ns,
1534                                         struct ldlm_resource *parent,
1535                                         const struct ldlm_res_id *,
1536                                         ldlm_type_t type, int create);
1537 struct ldlm_resource *ldlm_resource_getref(struct ldlm_resource *res);
1538 int ldlm_resource_putref(struct ldlm_resource *res);
1539 void ldlm_resource_add_lock(struct ldlm_resource *res,
1540                             cfs_list_t *head,
1541                             struct ldlm_lock *lock);
1542 void ldlm_resource_unlink_lock(struct ldlm_lock *lock);
1543 void ldlm_res2desc(struct ldlm_resource *res, struct ldlm_resource_desc *desc);
1544 void ldlm_dump_all_namespaces(ldlm_side_t client, int level);
1545 void ldlm_namespace_dump(int level, struct ldlm_namespace *);
1546 void ldlm_resource_dump(int level, struct ldlm_resource *);
1547 int ldlm_lock_change_resource(struct ldlm_namespace *, struct ldlm_lock *,
1548                               const struct ldlm_res_id *);
1549
1550 #define LDLM_RESOURCE_ADDREF(res) do {                                  \
1551         lu_ref_add_atomic(&(res)->lr_reference, __FUNCTION__, cfs_current());  \
1552 } while (0)
1553
1554 #define LDLM_RESOURCE_DELREF(res) do {                                  \
1555         lu_ref_del(&(res)->lr_reference, __FUNCTION__, cfs_current());  \
1556 } while (0)
1557
1558 /* ldlm_request.c */
1559 int ldlm_expired_completion_wait(void *data);
1560 /** \defgroup ldlm_local_ast Default AST handlers for local locks
1561  * These AST handlers are typically used for server-side local locks and are
1562  * also used by client-side lock handlers to perform minimum level base
1563  * processing.
1564  * @{ */
1565 int ldlm_blocking_ast_nocheck(struct ldlm_lock *lock);
1566 int ldlm_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
1567                       void *data, int flag);
1568 int ldlm_glimpse_ast(struct ldlm_lock *lock, void *reqp);
1569 int ldlm_completion_ast_async(struct ldlm_lock *lock, __u64 flags, void *data);
1570 int ldlm_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data);
1571 /** @} ldlm_local_ast */
1572
1573 /** \defgroup ldlm_cli_api API to operate on locks from actual LDLM users.
1574  * These are typically used by client and server (*_local versions)
1575  * to obtain and release locks.
1576  * @{ */
1577 int ldlm_cli_enqueue(struct obd_export *exp, struct ptlrpc_request **reqp,
1578                      struct ldlm_enqueue_info *einfo,
1579                      const struct ldlm_res_id *res_id,
1580                      ldlm_policy_data_t const *policy, __u64 *flags,
1581                      void *lvb, __u32 lvb_len, enum lvb_type lvb_type,
1582                      struct lustre_handle *lockh, int async);
1583 int ldlm_prep_enqueue_req(struct obd_export *exp,
1584                           struct ptlrpc_request *req,
1585                           cfs_list_t *cancels,
1586                           int count);
1587 int ldlm_prep_elc_req(struct obd_export *exp,
1588                       struct ptlrpc_request *req,
1589                       int version, int opc, int canceloff,
1590                       cfs_list_t *cancels, int count);
1591 int ldlm_cli_enqueue_fini(struct obd_export *exp, struct ptlrpc_request *req,
1592                           ldlm_type_t type, __u8 with_policy, ldlm_mode_t mode,
1593                           __u64 *flags, void *lvb, __u32 lvb_len,
1594                           struct lustre_handle *lockh, int rc);
1595 int ldlm_cli_enqueue_local(struct ldlm_namespace *ns,
1596                            const struct ldlm_res_id *res_id,
1597                            ldlm_type_t type, ldlm_policy_data_t *policy,
1598                            ldlm_mode_t mode, __u64 *flags,
1599                            ldlm_blocking_callback blocking,
1600                            ldlm_completion_callback completion,
1601                            ldlm_glimpse_callback glimpse,
1602                            void *data, __u32 lvb_len, enum lvb_type lvb_type,
1603                            const __u64 *client_cookie,
1604                            struct lustre_handle *lockh);
1605 int ldlm_server_ast(struct lustre_handle *lockh, struct ldlm_lock_desc *new,
1606                     void *data, __u32 data_len);
1607 int ldlm_cli_convert(struct lustre_handle *, int new_mode, __u32 *flags);
1608 int ldlm_cli_update_pool(struct ptlrpc_request *req);
1609 int ldlm_cli_cancel(struct lustre_handle *lockh);
1610 int ldlm_cli_cancel_unused(struct ldlm_namespace *, const struct ldlm_res_id *,
1611                            ldlm_cancel_flags_t flags, void *opaque);
1612 int ldlm_cli_cancel_unused_resource(struct ldlm_namespace *ns,
1613                                     const struct ldlm_res_id *res_id,
1614                                     ldlm_policy_data_t *policy,
1615                                     ldlm_mode_t mode,
1616                                     ldlm_cancel_flags_t flags,
1617                                     void *opaque);
1618 int ldlm_cli_cancel_req(struct obd_export *exp, cfs_list_t *head,
1619                         int count, ldlm_cancel_flags_t flags);
1620 int ldlm_cancel_resource_local(struct ldlm_resource *res,
1621                                cfs_list_t *cancels,
1622                                ldlm_policy_data_t *policy,
1623                                ldlm_mode_t mode, int lock_flags,
1624                                ldlm_cancel_flags_t cancel_flags, void *opaque);
1625 int ldlm_cli_cancel_list_local(cfs_list_t *cancels, int count,
1626                                ldlm_cancel_flags_t flags);
1627 int ldlm_cli_cancel_list(cfs_list_t *head, int count,
1628                          struct ptlrpc_request *req, ldlm_cancel_flags_t flags);
1629 /** @} ldlm_cli_api */
1630
1631 /* mds/handler.c */
1632 /* This has to be here because recursive inclusion sucks. */
1633 int intent_disposition(struct ldlm_reply *rep, int flag);
1634 void intent_set_disposition(struct ldlm_reply *rep, int flag);
1635
1636
1637 /* ioctls for trying requests */
1638 #define IOC_LDLM_TYPE                   'f'
1639 #define IOC_LDLM_MIN_NR                 40
1640
1641 #define IOC_LDLM_TEST                   _IOWR('f', 40, long)
1642 #define IOC_LDLM_DUMP                   _IOWR('f', 41, long)
1643 #define IOC_LDLM_REGRESS_START          _IOWR('f', 42, long)
1644 #define IOC_LDLM_REGRESS_STOP           _IOWR('f', 43, long)
1645 #define IOC_LDLM_MAX_NR                 43
1646
1647 /**
1648  * "Modes" of acquiring lock_res, necessary to tell lockdep that taking more
1649  * than one lock_res is dead-lock safe.
1650  */
1651 enum lock_res_type {
1652         LRT_NORMAL,
1653         LRT_NEW
1654 };
1655
1656 /** Lock resource. */
1657 static inline void lock_res(struct ldlm_resource *res)
1658 {
1659         spin_lock(&res->lr_lock);
1660 }
1661
1662 /** Lock resource with a way to instruct lockdep code about nestedness-safe. */
1663 static inline void lock_res_nested(struct ldlm_resource *res,
1664                                    enum lock_res_type mode)
1665 {
1666         spin_lock_nested(&res->lr_lock, mode);
1667 }
1668
1669 /** Unlock resource. */
1670 static inline void unlock_res(struct ldlm_resource *res)
1671 {
1672         spin_unlock(&res->lr_lock);
1673 }
1674
1675 /** Check if resource is already locked, assert if not. */
1676 static inline void check_res_locked(struct ldlm_resource *res)
1677 {
1678         LASSERT_SPIN_LOCKED(&res->lr_lock);
1679 }
1680
1681 struct ldlm_resource * lock_res_and_lock(struct ldlm_lock *lock);
1682 void unlock_res_and_lock(struct ldlm_lock *lock);
1683
1684 /* ldlm_pool.c */
1685 /** \defgroup ldlm_pools Various LDLM pool related functions
1686  * There are not used outside of ldlm.
1687  * @{
1688  */
1689 void ldlm_pools_recalc(ldlm_side_t client);
1690 int ldlm_pools_init(void);
1691 void ldlm_pools_fini(void);
1692
1693 int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns,
1694                    int idx, ldlm_side_t client);
1695 int ldlm_pool_shrink(struct ldlm_pool *pl, int nr,
1696                      unsigned int gfp_mask);
1697 void ldlm_pool_fini(struct ldlm_pool *pl);
1698 int ldlm_pool_setup(struct ldlm_pool *pl, int limit);
1699 int ldlm_pool_recalc(struct ldlm_pool *pl);
1700 __u32 ldlm_pool_get_lvf(struct ldlm_pool *pl);
1701 __u64 ldlm_pool_get_slv(struct ldlm_pool *pl);
1702 __u64 ldlm_pool_get_clv(struct ldlm_pool *pl);
1703 __u32 ldlm_pool_get_limit(struct ldlm_pool *pl);
1704 void ldlm_pool_set_slv(struct ldlm_pool *pl, __u64 slv);
1705 void ldlm_pool_set_clv(struct ldlm_pool *pl, __u64 clv);
1706 void ldlm_pool_set_limit(struct ldlm_pool *pl, __u32 limit);
1707 void ldlm_pool_add(struct ldlm_pool *pl, struct ldlm_lock *lock);
1708 void ldlm_pool_del(struct ldlm_pool *pl, struct ldlm_lock *lock);
1709 /** @} */
1710
1711 #endif
1712 /** @} LDLM */