diff options
| -rw-r--r-- | drivers/md/dm-log-userspace-base.c | 23 | ||||
| -rw-r--r-- | drivers/md/dm-log-userspace-transfer.c | 6 | ||||
| -rw-r--r-- | drivers/md/dm-log-userspace-transfer.h | 2 | ||||
| -rw-r--r-- | include/linux/dm-log-userspace.h | 13 |
4 files changed, 31 insertions, 13 deletions
diff --git a/drivers/md/dm-log-userspace-base.c b/drivers/md/dm-log-userspace-base.c index c49da0a41c8e..6e186b1a062d 100644 --- a/drivers/md/dm-log-userspace-base.c +++ b/drivers/md/dm-log-userspace-base.c | |||
| @@ -21,6 +21,7 @@ struct log_c { | |||
| 21 | struct dm_target *ti; | 21 | struct dm_target *ti; |
| 22 | uint32_t region_size; | 22 | uint32_t region_size; |
| 23 | region_t region_count; | 23 | region_t region_count; |
| 24 | uint64_t luid; | ||
| 24 | char uuid[DM_UUID_LEN]; | 25 | char uuid[DM_UUID_LEN]; |
| 25 | 26 | ||
| 26 | char *usr_argv_str; | 27 | char *usr_argv_str; |
| @@ -63,7 +64,7 @@ static int userspace_do_request(struct log_c *lc, const char *uuid, | |||
| 63 | * restored. | 64 | * restored. |
| 64 | */ | 65 | */ |
| 65 | retry: | 66 | retry: |
| 66 | r = dm_consult_userspace(uuid, request_type, data, | 67 | r = dm_consult_userspace(uuid, lc->luid, request_type, data, |
| 67 | data_size, rdata, rdata_size); | 68 | data_size, rdata, rdata_size); |
| 68 | 69 | ||
| 69 | if (r != -ESRCH) | 70 | if (r != -ESRCH) |
| @@ -74,14 +75,15 @@ retry: | |||
| 74 | set_current_state(TASK_INTERRUPTIBLE); | 75 | set_current_state(TASK_INTERRUPTIBLE); |
| 75 | schedule_timeout(2*HZ); | 76 | schedule_timeout(2*HZ); |
| 76 | DMWARN("Attempting to contact userspace log server..."); | 77 | DMWARN("Attempting to contact userspace log server..."); |
| 77 | r = dm_consult_userspace(uuid, DM_ULOG_CTR, lc->usr_argv_str, | 78 | r = dm_consult_userspace(uuid, lc->luid, DM_ULOG_CTR, |
| 79 | lc->usr_argv_str, | ||
| 78 | strlen(lc->usr_argv_str) + 1, | 80 | strlen(lc->usr_argv_str) + 1, |
| 79 | NULL, NULL); | 81 | NULL, NULL); |
| 80 | if (!r) | 82 | if (!r) |
| 81 | break; | 83 | break; |
| 82 | } | 84 | } |
| 83 | DMINFO("Reconnected to userspace log server... DM_ULOG_CTR complete"); | 85 | DMINFO("Reconnected to userspace log server... DM_ULOG_CTR complete"); |
| 84 | r = dm_consult_userspace(uuid, DM_ULOG_RESUME, NULL, | 86 | r = dm_consult_userspace(uuid, lc->luid, DM_ULOG_RESUME, NULL, |
| 85 | 0, NULL, NULL); | 87 | 0, NULL, NULL); |
| 86 | if (!r) | 88 | if (!r) |
| 87 | goto retry; | 89 | goto retry; |
| @@ -153,6 +155,9 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti, | |||
| 153 | return -ENOMEM; | 155 | return -ENOMEM; |
| 154 | } | 156 | } |
| 155 | 157 | ||
| 158 | /* The ptr value is sufficient for local unique id */ | ||
| 159 | lc->luid = (uint64_t)lc; | ||
| 160 | |||
| 156 | lc->ti = ti; | 161 | lc->ti = ti; |
| 157 | 162 | ||
| 158 | if (strlen(argv[0]) > (DM_UUID_LEN - 1)) { | 163 | if (strlen(argv[0]) > (DM_UUID_LEN - 1)) { |
| @@ -172,7 +177,7 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti, | |||
| 172 | } | 177 | } |
| 173 | 178 | ||
| 174 | /* Send table string */ | 179 | /* Send table string */ |
| 175 | r = dm_consult_userspace(lc->uuid, DM_ULOG_CTR, | 180 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_CTR, |
| 176 | ctr_str, str_size, NULL, NULL); | 181 | ctr_str, str_size, NULL, NULL); |
| 177 | 182 | ||
| 178 | if (r == -ESRCH) { | 183 | if (r == -ESRCH) { |
| @@ -182,7 +187,7 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti, | |||
| 182 | 187 | ||
| 183 | /* Since the region size does not change, get it now */ | 188 | /* Since the region size does not change, get it now */ |
| 184 | rdata_size = sizeof(rdata); | 189 | rdata_size = sizeof(rdata); |
| 185 | r = dm_consult_userspace(lc->uuid, DM_ULOG_GET_REGION_SIZE, | 190 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_GET_REGION_SIZE, |
| 186 | NULL, 0, (char *)&rdata, &rdata_size); | 191 | NULL, 0, (char *)&rdata, &rdata_size); |
| 187 | 192 | ||
| 188 | if (r) { | 193 | if (r) { |
| @@ -211,7 +216,7 @@ static void userspace_dtr(struct dm_dirty_log *log) | |||
| 211 | int r; | 216 | int r; |
| 212 | struct log_c *lc = log->context; | 217 | struct log_c *lc = log->context; |
| 213 | 218 | ||
| 214 | r = dm_consult_userspace(lc->uuid, DM_ULOG_DTR, | 219 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_DTR, |
| 215 | NULL, 0, | 220 | NULL, 0, |
| 216 | NULL, NULL); | 221 | NULL, NULL); |
| 217 | 222 | ||
| @@ -226,7 +231,7 @@ static int userspace_presuspend(struct dm_dirty_log *log) | |||
| 226 | int r; | 231 | int r; |
| 227 | struct log_c *lc = log->context; | 232 | struct log_c *lc = log->context; |
| 228 | 233 | ||
| 229 | r = dm_consult_userspace(lc->uuid, DM_ULOG_PRESUSPEND, | 234 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_PRESUSPEND, |
| 230 | NULL, 0, | 235 | NULL, 0, |
| 231 | NULL, NULL); | 236 | NULL, NULL); |
| 232 | 237 | ||
| @@ -238,7 +243,7 @@ static int userspace_postsuspend(struct dm_dirty_log *log) | |||
| 238 | int r; | 243 | int r; |
| 239 | struct log_c *lc = log->context; | 244 | struct log_c *lc = log->context; |
| 240 | 245 | ||
| 241 | r = dm_consult_userspace(lc->uuid, DM_ULOG_POSTSUSPEND, | 246 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_POSTSUSPEND, |
| 242 | NULL, 0, | 247 | NULL, 0, |
| 243 | NULL, NULL); | 248 | NULL, NULL); |
| 244 | 249 | ||
| @@ -251,7 +256,7 @@ static int userspace_resume(struct dm_dirty_log *log) | |||
| 251 | struct log_c *lc = log->context; | 256 | struct log_c *lc = log->context; |
| 252 | 257 | ||
| 253 | lc->in_sync_hint = 0; | 258 | lc->in_sync_hint = 0; |
| 254 | r = dm_consult_userspace(lc->uuid, DM_ULOG_RESUME, | 259 | r = dm_consult_userspace(lc->uuid, lc->luid, DM_ULOG_RESUME, |
| 255 | NULL, 0, | 260 | NULL, 0, |
| 256 | NULL, NULL); | 261 | NULL, NULL); |
| 257 | 262 | ||
diff --git a/drivers/md/dm-log-userspace-transfer.c b/drivers/md/dm-log-userspace-transfer.c index 8ce74d95ae4d..ba0edad2d048 100644 --- a/drivers/md/dm-log-userspace-transfer.c +++ b/drivers/md/dm-log-userspace-transfer.c | |||
| @@ -147,7 +147,8 @@ static void cn_ulog_callback(void *data) | |||
| 147 | 147 | ||
| 148 | /** | 148 | /** |
| 149 | * dm_consult_userspace | 149 | * dm_consult_userspace |
| 150 | * @uuid: log's uuid (must be DM_UUID_LEN in size) | 150 | * @uuid: log's universal unique identifier (must be DM_UUID_LEN in size) |
| 151 | * @luid: log's local unique identifier | ||
| 151 | * @request_type: found in include/linux/dm-log-userspace.h | 152 | * @request_type: found in include/linux/dm-log-userspace.h |
| 152 | * @data: data to tx to the server | 153 | * @data: data to tx to the server |
| 153 | * @data_size: size of data in bytes | 154 | * @data_size: size of data in bytes |
| @@ -163,7 +164,7 @@ static void cn_ulog_callback(void *data) | |||
| 163 | * | 164 | * |
| 164 | * Returns: 0 on success, -EXXX on failure | 165 | * Returns: 0 on success, -EXXX on failure |
| 165 | **/ | 166 | **/ |
| 166 | int dm_consult_userspace(const char *uuid, int request_type, | 167 | int dm_consult_userspace(const char *uuid, uint64_t luid, int request_type, |
| 167 | char *data, size_t data_size, | 168 | char *data, size_t data_size, |
| 168 | char *rdata, size_t *rdata_size) | 169 | char *rdata, size_t *rdata_size) |
| 169 | { | 170 | { |
| @@ -190,6 +191,7 @@ resend: | |||
| 190 | 191 | ||
| 191 | memset(tfr, 0, DM_ULOG_PREALLOCED_SIZE - overhead_size); | 192 | memset(tfr, 0, DM_ULOG_PREALLOCED_SIZE - overhead_size); |
| 192 | memcpy(tfr->uuid, uuid, DM_UUID_LEN); | 193 | memcpy(tfr->uuid, uuid, DM_UUID_LEN); |
| 194 | tfr->luid = luid; | ||
| 193 | tfr->seq = dm_ulog_seq++; | 195 | tfr->seq = dm_ulog_seq++; |
| 194 | 196 | ||
| 195 | /* | 197 | /* |
diff --git a/drivers/md/dm-log-userspace-transfer.h b/drivers/md/dm-log-userspace-transfer.h index c26d8e4e2710..04ee874f9153 100644 --- a/drivers/md/dm-log-userspace-transfer.h +++ b/drivers/md/dm-log-userspace-transfer.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | int dm_ulog_tfr_init(void); | 12 | int dm_ulog_tfr_init(void); |
| 13 | void dm_ulog_tfr_exit(void); | 13 | void dm_ulog_tfr_exit(void); |
| 14 | int dm_consult_userspace(const char *uuid, int request_type, | 14 | int dm_consult_userspace(const char *uuid, uint64_t luid, int request_type, |
| 15 | char *data, size_t data_size, | 15 | char *data, size_t data_size, |
| 16 | char *rdata, size_t *rdata_size); | 16 | char *rdata, size_t *rdata_size); |
| 17 | 17 | ||
diff --git a/include/linux/dm-log-userspace.h b/include/linux/dm-log-userspace.h index 642e3017b51f..8a1f972c0fe9 100644 --- a/include/linux/dm-log-userspace.h +++ b/include/linux/dm-log-userspace.h | |||
| @@ -371,7 +371,18 @@ | |||
| 371 | (DM_ULOG_REQUEST_MASK & (request_type)) | 371 | (DM_ULOG_REQUEST_MASK & (request_type)) |
| 372 | 372 | ||
| 373 | struct dm_ulog_request { | 373 | struct dm_ulog_request { |
| 374 | char uuid[DM_UUID_LEN]; /* Ties a request to a specific mirror log */ | 374 | /* |
| 375 | * The local unique identifier (luid) and the universally unique | ||
| 376 | * identifier (uuid) are used to tie a request to a specific | ||
| 377 | * mirror log. A single machine log could probably make due with | ||
| 378 | * just the 'luid', but a cluster-aware log must use the 'uuid' and | ||
| 379 | * the 'luid'. The uuid is what is required for node to node | ||
| 380 | * communication concerning a particular log, but the 'luid' helps | ||
| 381 | * differentiate between logs that are being swapped and have the | ||
| 382 | * same 'uuid'. (Think "live" and "inactive" device-mapper tables.) | ||
| 383 | */ | ||
| 384 | uint64_t luid; | ||
| 385 | char uuid[DM_UUID_LEN]; | ||
| 375 | char padding[7]; /* Padding because DM_UUID_LEN = 129 */ | 386 | char padding[7]; /* Padding because DM_UUID_LEN = 129 */ |
| 376 | 387 | ||
| 377 | int32_t error; /* Used to report back processing errors */ | 388 | int32_t error; /* Used to report back processing errors */ |
