1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2002 Cluster File Systems, Inc.
6 * This code is issued under the GNU General Public License.
7 * See the file COPYING in this distribution
9 * by Cluster File Systems, Inc.
14 #include <linux/version.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <asm/unistd.h>
19 #define DEBUG_SUBSYSTEM S_LDLM
21 #include <linux/obd_support.h>
22 #include <linux/obd_class.h>
24 #include <linux/lustre_dlm.h>
26 static int ldlm_test_callback(struct ldlm_lock *lock, struct ldlm_lock *new,
27 void *data, __u32 data_len)
29 printk("ldlm_test_callback: lock=%p, new=%p\n", lock, new);
33 int ldlm_test_basics(struct obd_device *obddev)
35 struct ldlm_namespace *ns;
36 struct ldlm_resource *res;
37 __u64 res_id[RES_NAME_SIZE] = {1, 4, 3};
44 ns = ldlm_namespace_new(obddev, 1);
48 res = ldlm_resource_get(ns, NULL, res_id, LDLM_PLAIN, 1);
52 /* Get a couple of read locks */
53 flags = LDLM_FL_BLOCKING_AST;
54 err = ldlm_local_lock_enqueue(obddev, 1, NULL, res_id, LDLM_PLAIN,
55 LCK_CR, &flags, NULL, ldlm_test_callback,
60 err = ldlm_local_lock_enqueue(obddev, 1, NULL, res_id, LDLM_PLAIN,
61 LCK_EX, &flags, NULL, ldlm_test_callback,
63 if (err != -ELDLM_BLOCK_GRANTED)
66 ldlm_resource_dump(res);
73 int ldlm_test_extents(struct obd_device *obddev)
75 struct ldlm_namespace *ns;
76 struct ldlm_resource *res;
77 __u64 file_res_id[RES_NAME_SIZE] = {0, 0, 0};
78 __u64 res_ext1[RES_NAME_SIZE] = {4, 6, 3};
79 __u64 res_ext2[RES_NAME_SIZE] = {6, 9, 3};
80 __u64 res_ext3[RES_NAME_SIZE] = {10, 11, 3};
82 struct ldlm_handle file_h, ext1_h, ext2_h, ext3_h;
87 ns = ldlm_namespace_new(obddev, 2);
91 err = ldlm_local_lock_enqueue(obddev, 1, NULL, file_res_id, LDLM_EXTENT,
92 LCK_NL, &flags, NULL, NULL, NULL, 0,
98 err = ldlm_local_lock_enqueue(obddev, 1, &file_h, res_ext1, LDLM_EXTENT,
99 LCK_PR, &flags, NULL, NULL, NULL, 0,
103 if (!(flags & LDLM_FL_RES_CHANGED))
107 err = ldlm_local_lock_enqueue(obddev, 1, &file_h, res_ext2, LDLM_EXTENT,
108 LCK_PR, &flags, NULL, NULL, NULL, 0,
112 if (!(flags & LDLM_FL_RES_CHANGED))
116 err = ldlm_local_lock_enqueue(obddev, 1, &file_h, res_ext3, LDLM_EXTENT,
117 LCK_EX, &flags, NULL, NULL, NULL, 0,
119 if (err != -ELDLM_BLOCK_GRANTED)
121 if (flags & LDLM_FL_RES_CHANGED)
124 /* Convert/cancel blocking locks */
126 err = ldlm_local_lock_convert(obddev, &ext1_h, LCK_NL, &flags);
131 err = ldlm_local_lock_cancel(obddev, &ext1_h);
135 /* Dump the results */
136 res = ldlm_resource_get(ns, NULL, file_res_id, LDLM_EXTENT, 0);
139 ldlm_resource_dump(res);
140 res = ldlm_resource_get(ns, NULL, res_ext1, LDLM_EXTENT, 0);
143 ldlm_resource_dump(res);
144 res = ldlm_resource_get(ns, NULL, res_ext2, LDLM_EXTENT, 0);
147 ldlm_resource_dump(res);
154 int ldlm_test(struct obd_device *obddev)
157 rc = ldlm_test_basics(obddev);
161 rc = ldlm_test_extents(obddev);