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.
13 #define DEBUG_SUBSYSTEM S_LDLM
15 #include <linux/lustre_dlm.h>
17 static int ldlm_test_callback(struct ldlm_lock *lock, struct ldlm_lock *new,
18 void *data, __u32 data_len)
20 printk("ldlm_test_callback: lock=%p, new=%p\n", lock, new);
24 int ldlm_test_basics(struct obd_device *obddev)
26 struct ldlm_namespace *ns;
27 struct ldlm_resource *res;
28 __u64 res_id[RES_NAME_SIZE] = {1, 2, 3};
30 struct ldlm_handle lockh_1, lockh_2;
35 err = ldlm_namespace_new(obddev, 1, &ns);
39 err = ldlm_local_lock_create(1, NULL, res_id, LDLM_PLAIN, &lockh_1);
40 err = ldlm_local_lock_enqueue(&lockh_1, LCK_CR, NULL, &flags, NULL,
41 ldlm_test_callback, NULL, 0);
45 err = ldlm_local_lock_create(1, NULL, res_id, LDLM_PLAIN, &lockh_2);
46 err = ldlm_local_lock_enqueue(&lockh_2, LCK_EX, NULL, &flags, NULL,
47 ldlm_test_callback, NULL, 0);
50 if (!(flags & LDLM_FL_BLOCK_GRANTED))
53 res = ldlm_resource_get(ns, NULL, res_id, LDLM_PLAIN, 1);
56 ldlm_resource_dump(res);
58 err = ldlm_local_lock_convert(&lockh_1, LCK_NL, &flags);
62 ldlm_resource_dump(res);
68 int ldlm_test_extents(struct obd_device *obddev)
70 struct ldlm_namespace *ns;
71 struct ldlm_resource *res;
72 __u64 res_id[RES_NAME_SIZE] = {0, 0, 0};
73 struct ldlm_extent ext1 = {4, 6}, ext2 = {6, 9}, ext3 = {10, 11};
74 struct ldlm_handle ext1_h, ext2_h, ext3_h;
80 err = ldlm_namespace_new(obddev, 2, &ns);
85 err = ldlm_local_lock_create(2, NULL, res_id, LDLM_EXTENT, &ext1_h);
86 err = ldlm_local_lock_enqueue(&ext1_h, LCK_PR, &ext1, &flags, NULL,
90 if (!(flags & LDLM_FL_LOCK_CHANGED))
94 err = ldlm_local_lock_create(2, NULL, res_id, LDLM_EXTENT, &ext2_h);
95 err = ldlm_local_lock_enqueue(&ext2_h, LCK_PR, &ext2, &flags, NULL,
99 if (!(flags & LDLM_FL_LOCK_CHANGED))
103 err = ldlm_local_lock_create(2, NULL, res_id, LDLM_EXTENT, &ext3_h);
104 err = ldlm_local_lock_enqueue(&ext3_h, LCK_EX, &ext3, &flags, NULL,
108 if (!(flags & LDLM_FL_BLOCK_GRANTED))
110 if (flags & LDLM_FL_LOCK_CHANGED)
113 /* Convert/cancel blocking locks */
115 err = ldlm_local_lock_convert(&ext1_h, LCK_NL, &flags);
120 err = ldlm_local_lock_cancel(&ext2_h);
124 /* Dump the results */
125 res = ldlm_resource_get(ns, NULL, res_id, LDLM_EXTENT, 0);
128 ldlm_resource_dump(res);
135 static int ldlm_test_network(struct obd_device *obddev,
136 struct ptlrpc_connection *conn)
138 struct ldlm_obd *ldlm = &obddev->u.ldlm;
139 struct ptlrpc_request *request;
141 __u64 res_id[RES_NAME_SIZE] = {1, 2, 3};
142 struct ldlm_extent ext = {4, 6};
143 struct ldlm_handle lockh1, lockh2;
147 err = ldlm_cli_namespace_new(obddev, ldlm->ldlm_client, conn, 3);
148 ptlrpc_free_req(request);
149 CERROR("ldlm_cli_namespace_new: %d\n", err);
153 err = ldlm_cli_enqueue(ldlm->ldlm_client, conn, 3,
154 NULL, res_id, LDLM_EXTENT, &ext, LCK_PR, &flags,
155 NULL, NULL, NULL, 0, &lockh1, &request);
156 ptlrpc_free_req(request);
157 CERROR("ldlm_cli_enqueue: %d\n", err);
160 err = ldlm_cli_enqueue(ldlm->ldlm_client, conn, 3,
161 NULL, res_id, LDLM_EXTENT, &ext, LCK_EX, &flags,
162 NULL, NULL, NULL, 0, &lockh2, &request);
163 ptlrpc_free_req(request);
164 CERROR("ldlm_cli_enqueue: %d\n", err);
171 int ldlm_test(struct obd_device *obddev, struct ptlrpc_connection *conn)
174 rc = ldlm_test_basics(obddev);
178 rc = ldlm_test_extents(obddev);
182 rc = ldlm_test_network(obddev, conn);