From mboxrd@z Thu Jan 1 00:00:00 1970 From: jbrassow@sourceware.org Date: 8 Sep 2006 15:52:41 -0000 Subject: [Cluster-devel] cluster/cmirror-kernel/src dm-cmirror-client.c Message-ID: <20060908155241.30449.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL4U4 Changes by: jbrassow at sourceware.org 2006-09-08 15:52:41 Modified files: cmirror-kernel/src: dm-cmirror-client.c Log message: - remove speed-bump that was put in for debugging - delete 'marked region requests' when destructor is called The regions have been marked on disk, but the memory struct tracking that mark needs to be freed if a dtr comes along before a 'clear region request'. This can happen when a mirror image fails. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-cmirror-client.c.diff?cvsroot=cluster&only_with_tag=RHEL4U4&r1=1.1.2.19.2.5&r2=1.1.2.19.2.6 --- cluster/cmirror-kernel/src/Attic/dm-cmirror-client.c 2006/09/05 17:48:02 1.1.2.19.2.5 +++ cluster/cmirror-kernel/src/Attic/dm-cmirror-client.c 2006/09/08 15:52:40 1.1.2.19.2.6 @@ -528,7 +528,7 @@ goto out; } else { DMINFO("Continuing request:: %s", - (type == LRT_IS_CLEAN)? "LRT_IS_C LEAN": + (type == LRT_IS_CLEAN)? "LRT_IS_CLEAN": (type == LRT_IN_SYNC)? "LRT_IN_SYNC": (type == LRT_MARK_REGION)? "LRT_MARK_REGION": (type == LRT_GET_RESYNC_WORK)? "LRT_GET_RESYNC_WORK": @@ -732,6 +732,7 @@ static void cluster_dtr(struct dirty_log *log) { struct log_c *lc = (struct log_c *) log->context; + struct region_state *rs, *tmp_rs; if (!list_empty(&clear_region_list)) DMINFO("Leaving while clear region requests remain."); @@ -742,6 +743,20 @@ sock_release(lc->client_sock); + spin_lock(®ion_state_lock); + + list_for_each_entry_safe(rs, tmp_rs, &clear_region_list, rs_list) { + if (lc == rs->rs_lc) + list_del_init(&rs->rs_list); + } + + list_for_each_entry_safe(rs, tmp_rs, &marked_region_list, rs_list) { + if (lc == rs->rs_lc) + list_del_init(&rs->rs_list); + } + + spin_unlock(®ion_state_lock); + if (lc->log_dev) disk_dtr(log); else @@ -758,7 +773,6 @@ static int cluster_postsuspend(struct dirty_log *log) { - int r; struct log_c *lc = (struct log_c *) log->context; while (1) { @@ -876,6 +890,8 @@ rs_new = mempool_alloc(region_state_pool, GFP_KERNEL); + memset(rs_new, 0, sizeof(struct region_state)); + spin_lock(®ion_state_lock); list_for_each_entry_safe(rs, tmp_rs, &clear_region_list, rs_list){ if(lc == rs->rs_lc && region == rs->rs_region){ @@ -950,6 +966,8 @@ rs_new = mempool_alloc(region_state_pool, GFP_ATOMIC); + memset(rs_new, 0, sizeof(struct region_state)); + spin_lock(®ion_state_lock); list_for_each_entry_safe(rs, tmp_rs, &clear_region_list, rs_list){ @@ -968,9 +986,6 @@ list_del_init(&rs->rs_list); list_add(&rs->rs_list, &clear_region_list); clear_region_count++; - if(!(clear_region_count & 0x7F)){ - DMINFO("clear_region_count :: %d", clear_region_count); - } spin_unlock(®ion_state_lock); if (rs_new) mempool_free(rs_new, region_state_pool); @@ -1017,11 +1032,8 @@ while(consult_server(lc, region, LRT_COMPLETE_RESYNC_WORK, &success_tmp)){ DMWARN("unable to notify server of completed resync work"); } - if (!success) { + if (!success) DMERR("Attempting to revert sync status of region #%llu", region); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ/5); - } return; }