- CFS_LIST_HEAD(deathrow);
- struct uuid_nid_data *data;
- int found = 0;
-
- cfs_spin_lock (&g_uuid_lock);
- if (uuid == NULL) {
- cfs_list_splice_init(&g_uuid_list, &deathrow);
- found = 1;
- } else {
- cfs_list_for_each_entry(data, &g_uuid_list, un_list) {
- if (strcmp(data->un_uuid, uuid))
- continue;
- --data->un_count;
- LASSERT(data->un_count >= 0);
- if (data->un_count == 0)
- cfs_list_move(&data->un_list, &deathrow);
- found = 1;
- break;
- }
- }
- cfs_spin_unlock (&g_uuid_lock);
-
- if (!found) {
- if (uuid)
- CERROR("Try to delete a non-existent uuid %s\n", uuid);
- return -EINVAL;
- }
-
- while (!cfs_list_empty(&deathrow)) {
- data = cfs_list_entry(deathrow.next, struct uuid_nid_data,
- un_list);
- cfs_list_del(&data->un_list);
-
- CDEBUG(D_INFO, "del uuid %s %s\n", data->un_uuid,
- libcfs_nid2str(data->un_nid));
-
- OBD_FREE(data->un_uuid, strlen(data->un_uuid) + 1);
- OBD_FREE(data, sizeof(*data));
- }
-
- return 0;
+ struct uuid_nid_data *data;
+ struct list_head deathrow;
+
+ INIT_LIST_HEAD(&deathrow);
+
+ spin_lock(&g_uuid_lock);
+ if (uuid != NULL) {
+ struct obd_uuid tmp;
+
+ obd_str2uuid(&tmp, uuid);
+ list_for_each_entry(data, &g_uuid_list, un_list) {
+ if (obd_uuid_equals(&data->un_uuid, &tmp)) {
+ list_move(&data->un_list, &deathrow);
+ break;
+ }
+ }
+ } else
+ list_splice_init(&g_uuid_list, &deathrow);
+ spin_unlock(&g_uuid_lock);
+
+ if (uuid != NULL && list_empty(&deathrow)) {
+ CDEBUG(D_INFO, "Try to delete a non-existent uuid %s\n", uuid);
+ return -EINVAL;
+ }
+
+ while (!list_empty(&deathrow)) {
+ data = list_entry(deathrow.next, struct uuid_nid_data,
+ un_list);
+ list_del(&data->un_list);
+
+ CDEBUG(D_INFO, "del uuid %s %s/%d\n",
+ obd_uuid2str(&data->un_uuid),
+ libcfs_nid2str(data->un_nids[0]),
+ data->un_nid_count);
+
+ OBD_FREE(data, sizeof(*data));
+ }
+ return 0;
+}
+
+/* check if @nid exists in nid list of @uuid */
+int class_check_uuid(struct obd_uuid *uuid, __u64 nid)
+{
+ struct uuid_nid_data *entry;
+ int found = 0;
+
+ ENTRY;
+
+ CDEBUG(D_INFO, "check if uuid %s has %s.\n",
+ obd_uuid2str(uuid), libcfs_nid2str(nid));
+
+ spin_lock(&g_uuid_lock);
+ list_for_each_entry(entry, &g_uuid_list, un_list) {
+ int i;
+
+ if (!obd_uuid_equals(&entry->un_uuid, uuid))
+ continue;
+
+ /* found the uuid, check if it has @nid */
+ for (i = 0; i < entry->un_nid_count; i++) {
+ if (entry->un_nids[i] == nid) {
+ found = 1;
+ break;
+ }
+ }
+ break;
+ }
+ spin_unlock(&g_uuid_lock);
+ RETURN(found);