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 res = ldlm_resource_get(ns, NULL, res_id, LDLM_PLAIN, 1);
52 /* Get a couple of read locks */
53 err = ldlm_local_lock_enqueue(obddev, 1, NULL, res_id, LDLM_PLAIN,
54 NULL, LCK_CR, &flags, NULL,
55 ldlm_test_callback, NULL, 0, &lockh_1);
59 err = ldlm_local_lock_enqueue(obddev, 1, NULL, res_id, LDLM_PLAIN,
60 NULL, LCK_EX, &flags, NULL,
61 ldlm_test_callback, NULL, 0, &lockh_2);
64 if (!(flags & LDLM_FL_BLOCK_GRANTED))
67 ldlm_resource_dump(res);
69 err = ldlm_local_lock_convert(obddev, &lockh_1, LCK_NL, &flags);
73 ldlm_resource_dump(res);
80 int ldlm_test_extents(struct obd_device *obddev)
82 struct ldlm_namespace *ns;
83 struct ldlm_resource *res;
84 __u64 res_id[RES_NAME_SIZE] = {0, 0, 0};
85 struct ldlm_extent ext1 = {4, 6}, ext2 = {6, 9}, ext3 = {10, 11};
86 struct ldlm_handle ext1_h, ext2_h, ext3_h;
92 err = ldlm_namespace_new(obddev, 2, &ns);
97 err = ldlm_local_lock_enqueue(obddev, 2, NULL, res_id, LDLM_EXTENT,
98 &ext1, LCK_PR, &flags, NULL, NULL, NULL,
102 if (!(flags & LDLM_FL_LOCK_CHANGED))
106 err = ldlm_local_lock_enqueue(obddev, 2, NULL, res_id, LDLM_EXTENT,
107 &ext2, LCK_PR, &flags, NULL, NULL, NULL,
111 if (!(flags & LDLM_FL_LOCK_CHANGED))
115 err = ldlm_local_lock_enqueue(obddev, 2, NULL, res_id, LDLM_EXTENT,
116 &ext3, LCK_EX, &flags, NULL, NULL, NULL,
120 if (!(flags & LDLM_FL_BLOCK_GRANTED))
122 if (flags & LDLM_FL_LOCK_CHANGED)
125 /* Convert/cancel blocking locks */
127 err = ldlm_local_lock_convert(obddev, &ext1_h, LCK_NL, &flags);
132 err = ldlm_local_lock_cancel(obddev, &ext2_h);
136 /* Dump the results */
137 res = ldlm_resource_get(ns, NULL, res_id, LDLM_EXTENT, 0);
140 ldlm_resource_dump(res);
147 static int ldlm_test_network(struct obd_device *obddev)
149 struct ldlm_obd *ldlm = &obddev->u.ldlm;
150 struct ptlrpc_request *request;
152 __u64 res_id[RES_NAME_SIZE] = {1, 2, 3};
153 struct ldlm_extent ext = {4, 6};
154 struct ldlm_handle lockh1, lockh2;
158 err = ldlm_cli_namespace_new(ldlm->ldlm_client, &ldlm->ldlm_server_peer,
160 ptlrpc_free_req(request);
161 CERROR("ldlm_cli_namespace_new: %d\n", err);
165 err = ldlm_cli_enqueue(ldlm->ldlm_client, &ldlm->ldlm_server_peer, 3,
166 NULL, res_id, LDLM_EXTENT, &ext, LCK_PR, &flags,
167 NULL, 0, &lockh1, &request);
168 ptlrpc_free_req(request);
169 CERROR("ldlm_cli_enqueue: %d\n", err);
172 err = ldlm_cli_enqueue(ldlm->ldlm_client, &ldlm->ldlm_server_peer, 3,
173 NULL, res_id, LDLM_EXTENT, &ext, LCK_EX, &flags,
174 NULL, 0, &lockh2, &request);
175 ptlrpc_free_req(request);
176 CERROR("ldlm_cli_enqueue: %d\n", err);
183 int ldlm_test(struct obd_device *obddev)
186 rc = ldlm_test_basics(obddev);
190 rc = ldlm_test_extents(obddev);
194 rc = ldlm_test_network(obddev);