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.
12 #define DEBUG_SUBSYSTEM S_LDLM
14 #include <linux/lustre_dlm.h>
16 static int ldlm_test_callback(struct ldlm_lock *lock, struct ldlm_lock *new,
17 void *data, __u32 data_len)
19 printk("ldlm_test_callback: lock=%p, new=%p\n", lock, new);
23 int ldlm_test_basics(struct obd_device *obddev)
25 struct ldlm_namespace *ns;
26 struct ldlm_resource *res;
27 __u64 res_id[RES_NAME_SIZE] = {1, 2, 3};
29 struct lustre_handle lockh_1, lockh_2;
32 ns = ldlm_namespace_new(LDLM_NAMESPACE_SERVER);
36 err = ldlm_local_lock_create(ns, NULL, res_id, LDLM_PLAIN, LCK_CR,
38 err = ldlm_local_lock_enqueue(&lockh_1, NULL, 0, &flags,
39 ldlm_test_callback, ldlm_test_callback);
43 err = ldlm_local_lock_create(ns, NULL, res_id, LDLM_PLAIN, LCK_EX,
45 err = ldlm_local_lock_enqueue(&lockh_2, NULL, 0, &flags,
46 ldlm_test_callback, ldlm_test_callback);
49 if (!(flags & LDLM_FL_BLOCK_GRANTED))
52 res = ldlm_resource_get(ns, NULL, res_id, LDLM_PLAIN, 1);
55 ldlm_resource_dump(res);
57 res = ldlm_local_lock_convert(&lockh_1, LCK_NL, &flags);
59 ldlm_reprocess_all(res);
61 ldlm_resource_dump(res);
62 ldlm_namespace_free(ns);
67 int ldlm_test_extents(struct obd_device *obddev)
69 struct ldlm_namespace *ns;
70 struct ldlm_resource *res;
71 struct ldlm_lock *lock;
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 lustre_handle ext1_h, ext2_h, ext3_h;
78 ns = ldlm_namespace_new(LDLM_NAMESPACE_SERVER);
83 err = ldlm_local_lock_create(ns, NULL, res_id, LDLM_EXTENT, LCK_PR,
85 err = ldlm_local_lock_enqueue(&ext1_h, &ext1, sizeof(ext1), &flags,
89 if (!(flags & LDLM_FL_LOCK_CHANGED))
93 err = ldlm_local_lock_create(ns, NULL, res_id, LDLM_EXTENT, LCK_PR,
95 err = ldlm_local_lock_enqueue(&ext2_h, &ext2, sizeof(ext2), &flags,
99 if (!(flags & LDLM_FL_LOCK_CHANGED))
103 err = ldlm_local_lock_create(ns, NULL, res_id, LDLM_EXTENT, LCK_EX,
105 err = ldlm_local_lock_enqueue(&ext3_h, &ext3, sizeof(ext3), &flags,
109 if (!(flags & LDLM_FL_BLOCK_GRANTED))
111 if (flags & LDLM_FL_LOCK_CHANGED)
114 /* Convert/cancel blocking locks */
116 res = ldlm_local_lock_convert(&ext1_h, LCK_NL, &flags);
118 ldlm_reprocess_all(res);
121 lock = lustre_handle2object(&ext2_h);
122 res = ldlm_local_lock_cancel(lock);
124 ldlm_reprocess_all(res);
126 /* Dump the results */
127 res = ldlm_resource_get(ns, NULL, res_id, LDLM_EXTENT, 0);
130 ldlm_resource_dump(res);
131 ldlm_namespace_free(ns);
136 static int ldlm_test_network(struct obd_device *obddev,
137 struct ptlrpc_connection *conn)
139 struct ldlm_obd *ldlm = &obddev->u.ldlm;
141 __u64 res_id[RES_NAME_SIZE] = {1, 2, 3};
142 struct ldlm_extent ext = {4, 6};
143 struct lustre_handle lockh1;
147 err = ldlm_cli_enqueue(ldlm->ldlm_client, conn, NULL,
148 obddev->obd_namespace, NULL, res_id, LDLM_EXTENT,
149 &ext, sizeof(ext), LCK_PR, &flags, NULL, NULL, 0,
151 CERROR("ldlm_cli_enqueue: %d\n", err);
156 int ldlm_test(struct obd_device *obddev, struct ptlrpc_connection *conn)
159 rc = ldlm_test_basics(obddev);
163 rc = ldlm_test_extents(obddev);
167 rc = ldlm_test_network(obddev, conn);