From: jxiong Date: Thu, 16 Aug 2007 00:28:40 +0000 (+0000) Subject: b=13149 X-Git-Tag: v1_7_91~49 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=bb90c167ded69f34aac9791fd249d3ce468097cb b=13149 r=nathan,adilger Fix the logic in class_del_uuid(). It will return the wrong result when an entry has been referenced over once. --- diff --git a/lustre/obdclass/lustre_peer.c b/lustre/obdclass/lustre_peer.c index 59dfd96..54c9de6 100644 --- a/lustre/obdclass/lustre_peer.c +++ b/lustre/obdclass/lustre_peer.c @@ -138,43 +138,45 @@ int class_add_uuid(const char *uuid, __u64 nid) int class_del_uuid(const char *uuid) { struct list_head deathrow; - struct uuid_nid_data *data, *n; + struct uuid_nid_data *data; + int found = 0; CFS_INIT_LIST_HEAD (&deathrow); spin_lock (&g_uuid_lock); - - list_for_each_entry_safe(data, n, &g_uuid_list, un_list) { - if (uuid == NULL) { - list_del (&data->un_list); - list_add (&data->un_list, &deathrow); - } else if (strcmp(data->un_uuid, uuid) == 0) { + if (uuid == NULL) { + list_splice_init(&g_uuid_list, &deathrow); + found = 1; + } else { + list_for_each_entry(data, &g_uuid_list, un_list) { + if (strcmp(data->un_uuid, uuid)) + continue; --data->un_count; - if (data->un_count <= 0) { - list_del (&data->un_list); - list_add (&data->un_list, &deathrow); - } + LASSERT(data->un_count >= 0); + if (data->un_count == 0) + list_move(&data->un_list, &deathrow); + found = 1; break; } } spin_unlock (&g_uuid_lock); - if (list_empty (&deathrow)) { + if (!found) { if (uuid) - CERROR("delete non-existent uuid %s\n", uuid); + CERROR("Try to delete a non-existent uuid %s\n", uuid); return -EINVAL; } - do { + while (!list_empty(&deathrow)) { data = list_entry(deathrow.next, struct uuid_nid_data, un_list); + list_del(&data->un_list); - 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)); - } while (!list_empty (&deathrow)); + } return 0; }