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, 2, 3};
39 struct ldlm_handle lockh_1, lockh_2;
44 err = ldlm_namespace_new(obddev, 1, &ns);
48 err = ldlm_local_lock_create(1, NULL, res_id, LDLM_PLAIN, &lockh_1);
49 err = ldlm_local_lock_enqueue(&lockh_1, LCK_CR, NULL, &flags, NULL,
50 ldlm_test_callback, NULL, 0);
54 err = ldlm_local_lock_create(1, NULL, res_id, LDLM_PLAIN, &lockh_2);
55 err = ldlm_local_lock_enqueue(&lockh_2, LCK_EX, NULL, &flags, NULL,
56 ldlm_test_callback, NULL, 0);
59 if (!(flags & LDLM_FL_BLOCK_GRANTED))
62 res = ldlm_resource_get(ns, NULL, res_id, LDLM_PLAIN, 1);
65 ldlm_resource_dump(res);
67 err = ldlm_local_lock_convert(&lockh_1, LCK_NL, &flags);
71 ldlm_resource_dump(res);
77 int ldlm_test_extents(struct obd_device *obddev)
79 struct ldlm_namespace *ns;
80 struct ldlm_resource *res;
81 __u64 res_id[RES_NAME_SIZE] = {0, 0, 0};
82 struct ldlm_extent ext1 = {4, 6}, ext2 = {6, 9}, ext3 = {10, 11};
83 struct ldlm_handle ext1_h, ext2_h, ext3_h;
89 err = ldlm_namespace_new(obddev, 2, &ns);
94 err = ldlm_local_lock_create(2, NULL, res_id, LDLM_EXTENT, &ext1_h);
95 err = ldlm_local_lock_enqueue(&ext1_h, LCK_PR, &ext1, &flags, NULL,
99 if (!(flags & LDLM_FL_LOCK_CHANGED))
103 err = ldlm_local_lock_create(2, NULL, res_id, LDLM_EXTENT, &ext2_h);
104 err = ldlm_local_lock_enqueue(&ext2_h, LCK_PR, &ext2, &flags, NULL,
108 if (!(flags & LDLM_FL_LOCK_CHANGED))
112 err = ldlm_local_lock_create(2, NULL, res_id, LDLM_EXTENT, &ext3_h);
113 err = ldlm_local_lock_enqueue(&ext3_h, LCK_EX, &ext3, &flags, NULL,
117 if (!(flags & LDLM_FL_BLOCK_GRANTED))
119 if (flags & LDLM_FL_LOCK_CHANGED)
122 /* Convert/cancel blocking locks */
124 err = ldlm_local_lock_convert(&ext1_h, LCK_NL, &flags);
129 err = ldlm_local_lock_cancel(&ext2_h);
133 /* Dump the results */
134 res = ldlm_resource_get(ns, NULL, res_id, LDLM_EXTENT, 0);
137 ldlm_resource_dump(res);
144 static int ldlm_test_network(struct obd_device *obddev)
146 struct ldlm_obd *ldlm = &obddev->u.ldlm;
147 struct ptlrpc_request *request;
149 __u64 res_id[RES_NAME_SIZE] = {1, 2, 3};
150 struct ldlm_extent ext = {4, 6};
151 struct ldlm_handle lockh1, lockh2;
155 err = ldlm_cli_namespace_new(obddev, ldlm->ldlm_client,
156 ldlm->ldlm_server_conn, 3, &request);
157 ptlrpc_free_req(request);
158 CERROR("ldlm_cli_namespace_new: %d\n", err);
162 err = ldlm_cli_enqueue(ldlm->ldlm_client, ldlm->ldlm_server_conn, 3,
163 NULL, res_id, LDLM_EXTENT, &ext, LCK_PR, &flags,
164 NULL, 0, &lockh1, &request);
165 ptlrpc_free_req(request);
166 CERROR("ldlm_cli_enqueue: %d\n", err);
169 err = ldlm_cli_enqueue(ldlm->ldlm_client, ldlm->ldlm_server_conn, 3,
170 NULL, res_id, LDLM_EXTENT, &ext, LCK_EX, &flags,
171 NULL, 0, &lockh2, &request);
172 ptlrpc_free_req(request);
173 CERROR("ldlm_cli_enqueue: %d\n", err);
180 int ldlm_test(struct obd_device *obddev)
183 rc = ldlm_test_basics(obddev);
187 rc = ldlm_test_extents(obddev);
191 rc = ldlm_test_network(obddev);