[Cluster-devel] cluster/cmirror-kernel/src dm-cmirror-client.c ...
jbrassow at sourceware.org
jbrassow at sourceware.org
Tue Jun 27 20:19:57 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Branch: STABLE
Changes by: jbrassow at sourceware.org 2006-06-27 20:19:53
Modified files:
cmirror-kernel/src: dm-cmirror-client.c dm-cmirror-common.h
dm-cmirror-server.c dm-cmirror-xfr.h
dm-log.h
Log message:
- bring logging functions inline with upstream API
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-cmirror-client.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1.4.1&r2=1.1.4.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-cmirror-common.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1.4.1&r2=1.1.4.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-cmirror-server.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1.4.1&r2=1.1.4.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-cmirror-xfr.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1.4.1&r2=1.1.4.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-log.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1.4.1&r2=1.1.4.2
--- cluster/cmirror-kernel/src/Attic/dm-cmirror-client.c 2006/06/27 18:36:09 1.1.4.1
+++ cluster/cmirror-kernel/src/Attic/dm-cmirror-client.c 2006/06/27 20:19:53 1.1.4.2
@@ -58,7 +58,7 @@
static int mark_req2ser=0;
static int insync_req2ser=0;
-static void *region_state_alloc(int gfp_mask, void *pool_data){
+static void *region_state_alloc(gfp_t gfp_mask, void *pool_data){
return kmalloc(sizeof(struct region_state), gfp_mask);
}
@@ -810,20 +810,6 @@
return rtn;
}
-static int cluster_is_remote_recovering(struct dirty_log *log, region_t region)
-{
- int rtn;
- struct log_c *lc = (struct log_c *) log->context;
-
-/* take out optimization
- if(atomic_read(&lc->in_sync) == 1){
- return 0;
- }
-*/
- rtn = consult_server(lc, region, LRT_IS_REMOTE_RECOVERING, NULL);
- return rtn;
-}
-
static int cluster_in_sync(struct dirty_log *log, region_t region, int block)
{
int rtn;
@@ -1128,6 +1114,36 @@
return lc->failure_response;
}
+static int cluster_is_remote_recovering(struct dirty_log *log, region_t region)
+{
+ int rtn;
+ struct log_c *lc = (struct log_c *) log->context;
+
+/* take out optimization
+ if(atomic_read(&lc->in_sync) == 1){
+ return 0;
+ }
+*/
+ rtn = consult_server(lc, region, LRT_IS_REMOTE_RECOVERING, NULL);
+ return rtn;
+}
+
+static int cluster_set_default_mirror(struct dirty_log *log, int mirror)
+{
+ int rtn;
+ struct log_c *lc = (struct log_c *) log->context;
+ rtn = consult_server(lc, (region_t)mirror, LRT_SET_DEFAULT_MIRROR, NULL);
+ return rtn;
+}
+
+static int cluster_get_default_mirror(struct dirty_log *log)
+{
+ int rtn;
+ struct log_c *lc = (struct log_c *) log->context;
+ rtn = consult_server(lc, 0, LRT_GET_DEFAULT_MIRROR, NULL);
+ return rtn;
+}
+
static int clog_stop(void *data){
struct log_c *lc;
@@ -1255,16 +1271,18 @@
.resume = cluster_resume,
.get_region_size = cluster_get_region_size,
.is_clean = cluster_is_clean,
- .is_remote_recovering = cluster_is_remote_recovering,
.in_sync = cluster_in_sync,
.flush = cluster_flush,
.mark_region = cluster_mark_region,
.clear_region = cluster_clear_region,
.get_resync_work = cluster_get_resync_work,
- .complete_resync_work = cluster_complete_resync_work,
+ .set_region_sync = cluster_complete_resync_work,
.get_sync_count = cluster_get_sync_count,
.status = cluster_status,
.get_failure_response = cluster_get_failure_response,
+ .is_remote_recovering = cluster_is_remote_recovering,
+ .set_default_mirror = cluster_set_default_mirror,
+ .get_default_mirror = cluster_get_default_mirror,
};
static struct dirty_log_type _clustered_disk_type = {
@@ -1277,16 +1295,18 @@
.resume = cluster_resume,
.get_region_size = cluster_get_region_size,
.is_clean = cluster_is_clean,
- .is_remote_recovering = cluster_is_remote_recovering,
.in_sync = cluster_in_sync,
.flush = cluster_flush,
.mark_region = cluster_mark_region,
.clear_region = cluster_clear_region,
.get_resync_work = cluster_get_resync_work,
- .complete_resync_work = cluster_complete_resync_work,
+ .set_region_sync = cluster_complete_resync_work,
.get_sync_count = cluster_get_sync_count,
.status = cluster_status,
.get_failure_response = cluster_get_failure_response,
+ .is_remote_recovering = cluster_is_remote_recovering,
+ .set_default_mirror = cluster_set_default_mirror,
+ .get_default_mirror = cluster_get_default_mirror,
};
#define CMIRROR_RELEASE_NAME "0.1.0"
--- cluster/cmirror-kernel/src/Attic/dm-cmirror-common.h 2006/06/27 18:36:09 1.1.4.1
+++ cluster/cmirror-kernel/src/Attic/dm-cmirror-common.h 2006/06/27 20:19:53 1.1.4.2
@@ -82,6 +82,7 @@
uint32_t version;
sector_t nr_regions;
char uuid[MAX_NAME_LEN];
+ int default_mirror;
};
struct log_c {
--- cluster/cmirror-kernel/src/Attic/dm-cmirror-server.c 2006/06/27 18:36:09 1.1.4.1
+++ cluster/cmirror-kernel/src/Attic/dm-cmirror-server.c 2006/06/27 20:19:53 1.1.4.2
@@ -49,7 +49,7 @@
static int debug_disk_write = 0;
extern struct list_head log_list_head;
-static void *region_user_alloc(int gfp_mask, void *pool_data){
+static void *region_user_alloc(gfp_t gfp_mask, void *pool_data){
return kmalloc(sizeof(struct region_user), gfp_mask);
}
@@ -89,6 +89,7 @@
disk->version = cpu_to_le32(core->version);
disk->nr_regions = cpu_to_le64(core->nr_regions);
memcpy(disk->uuid, core->uuid, MAX_NAME_LEN);
+ disk->default_mirror = cpu_to_le32(core->default_mirror);
}
static void header_from_disk(struct log_header *core, struct log_header *disk)
@@ -97,6 +98,7 @@
core->version = le32_to_cpu(disk->version);
core->nr_regions = le64_to_cpu(disk->nr_regions);
memcpy(core->uuid, disk->uuid, MAX_NAME_LEN);
+ core->default_mirror = cpu_to_le32(disk->default_mirror);
}
int read_header(struct log_c *log)
@@ -449,19 +451,6 @@
return 0;
}
-static int server_is_remote_recovering(struct log_c *lc, struct log_request *lr)
-{
- struct region_user *ru;
-
- if ((ru = find_ru_by_region(lc, lr->u.lr_region)) &&
- (ru->ru_rw == RU_RECOVER))
- lr->u.lr_int_rtn = 1;
- else
- lr->u.lr_int_rtn = 0;
-
- return 0;
-}
-
static int server_in_sync(struct log_c *lc, struct log_request *lr)
{
if(likely(log_test_bit(lc->sync_bits, lr->u.lr_region)))
@@ -586,7 +575,7 @@
}
} else if (log_test_bit(lc->sync_bits, lr->u.lr_region)) {
DMERR("complete_resync_work region going out-of-sync: disk failure");
- /* gone for now: lc->sync_count--; */
+ lc->sync_count--;
log_clear_bit(lc, lc->sync_bits, lr->u.lr_region);
}
@@ -610,6 +599,37 @@
}
+static int server_is_remote_recovering(struct log_c *lc, struct log_request *lr)
+{
+ struct region_user *ru;
+
+ if ((ru = find_ru_by_region(lc, lr->u.lr_region)) &&
+ (ru->ru_rw == RU_RECOVER))
+ lr->u.lr_int_rtn = 1;
+ else
+ lr->u.lr_int_rtn = 0;
+
+ return 0;
+}
+
+static int server_set_default_mirror(struct log_c *lc, struct log_request *lr)
+{
+ lc->disk_header->default_mirror = (int)lr->u.lr_region;
+ if (write_header(lc))
+ DMERR("Failed to commit default mirror to disk log");
+
+ lr->u.lr_int_rtn = 0;
+
+ return 0;
+}
+
+static int server_get_default_mirror(struct log_c *lc, struct log_request *lr)
+{
+ lr->u.lr_int_rtn = lc->disk_header->default_mirror;
+
+ return 0;
+}
+
static struct log_c *get_log_context(char *uuid){
struct log_c *lc, *r = NULL;
@@ -816,9 +836,6 @@
case LRT_IS_CLEAN:
error = server_is_clean(lc, &lr);
break;
- case LRT_IS_REMOTE_RECOVERING:
- error = server_is_remote_recovering(lc, &lr);
- break;
case LRT_IN_SYNC:
error = server_in_sync(lc, &lr);
break;
@@ -853,6 +870,15 @@
case LRT_GET_SYNC_COUNT:
error = server_get_sync_count(lc, &lr);
break;
+ case LRT_IS_REMOTE_RECOVERING:
+ error = server_is_remote_recovering(lc, &lr);
+ break;
+ case LRT_SET_DEFAULT_MIRROR:
+ error = server_set_default_mirror(lc, &lr);
+ break;
+ case LRT_GET_DEFAULT_MIRROR:
+ error = server_get_default_mirror(lc, &lr);
+ break;
default:
DMWARN("unknown request type received");
return 0; /* do not send a reply */
--- cluster/cmirror-kernel/src/Attic/dm-cmirror-xfr.h 2006/06/27 18:36:09 1.1.4.1
+++ cluster/cmirror-kernel/src/Attic/dm-cmirror-xfr.h 2006/06/27 20:19:53 1.1.4.2
@@ -23,6 +23,9 @@
#define LRT_MASTER_ASSIGN 11
#define LRT_MASTER_LEAVING 12
+#define LRT_SET_DEFAULT_MIRROR 13
+#define LRT_GET_DEFAULT_MIRROR 14
+
#define CLUSTER_LOG_PORT 51005
struct log_request {
--- cluster/cmirror-kernel/src/Attic/dm-log.h 2006/06/27 18:36:09 1.1.4.1
+++ cluster/cmirror-kernel/src/Attic/dm-log.h 2006/06/27 20:19:53 1.1.4.2
@@ -56,16 +56,6 @@
int (*is_clean)(struct dirty_log *log, region_t region);
/*
- * Returns: 0, 1
- *
- * This is necessary for cluster mirroring. It provides
- * a way to detect recovery on another node, so we
- * aren't writing concurrently. This function is likely
- * to block (when a cluster log is used).
- */
- int (*is_remote_recovering)(struct dirty_log *log, region_t region);
-
- /*
* Returns: 0, 1, -EWOULDBLOCK, < 0
*
* A predicate function to check the area given by
@@ -108,12 +98,12 @@
int (*get_resync_work)(struct dirty_log *log, region_t *region);
/*
- * This notifies the log that the resync of an area has
- * been completed. The log should then mark this region
- * as CLEAN.
+ * This notifies the log that the resync status of a region
+ * has changed. It also clears the region from the recovering
+ * list (if present).
*/
- void (*complete_resync_work)(struct dirty_log *log,
- region_t region, int success);
+ void (*set_region_sync)(struct dirty_log *log,
+ region_t region, int in_sync);
/*
* Returns the number of regions that are in sync.
@@ -131,6 +121,31 @@
* of a device failure.
*/
int (*get_failure_response)(struct dirty_log *log);
+
+ /*
+ * Returns: 0, 1
+ *
+ * This is necessary for cluster mirroring. It provides
+ * a way to detect recovery on another node, so we
+ * aren't writing concurrently. This function is likely
+ * to block (when a cluster log is used).
+ */
+ int (*is_remote_recovering)(struct dirty_log *log, region_t region);
+
+ /*
+ * Returns: 0 on success, <0 on failure
+ *
+ * This function is necessary for cluster mirroring.
+ * If a node detects the primary device has failed,
+ * the others must have a way of knowing what its
+ * successor is.
+ */
+ int (*set_default_mirror)(struct dirty_log *log, int mirror);
+
+ /*
+ * Returns: >=0 on success, <0 on failure
+ */
+ int (*get_default_mirror)(struct dirty_log *log);
};
int dm_register_dirty_log_type(struct dirty_log_type *type);
More information about the Cluster-devel
mailing list