[dm-devel] [PATCH] reworked dm-switch target
Mikulas Patocka
mpatocka at redhat.com
Wed Aug 22 01:04:48 UTC 2012
/* a sample program that makes a table of million entries and uploads it
via dm message */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
#include <libdevmapper.h>
#define N_DEVICES 3
#define TABLE_SIZE 1000000
#define MSG_SIZE_LIMIT 45000
#define MSG_SIZE_RESERVED 20
static int table[TABLE_SIZE];
static char buffer[MSG_SIZE_LIMIT];
static void print_hex(char **s, unsigned hex)
{
char *p = *s;
int b;
for (b = 0; hex >> 4 >> b; b += 4) ;
do {
char c = (hex >> b) & 0xf;
if (c <= 9) c += '0';
else c += 'A' - 10;
*p++ = c;
} while ((b -= 4) >= 0);
*s = p;
}
int main(void)
{
int i, index;
int val;
val = time(NULL) % N_DEVICES;
for (i = 0; i < TABLE_SIZE; i++) {
table[i] = val;
if (++val >= N_DEVICES) val = 0;
}
index = 0;
while (index < TABLE_SIZE) {
struct dm_task *dmt;
char *ptr;
strcpy(buffer, "set-table ");
ptr = strchr(buffer, 0);
print_hex(&ptr, index);
while (index < TABLE_SIZE && ptr - buffer < MSG_SIZE_LIMIT - MSG_SIZE_RESERVED) {
*ptr++ = ':';
print_hex(&ptr, table[index]);
*ptr++ = ' ';
index++;
}
if (ptr - buffer > MSG_SIZE_LIMIT) {
fprintf(stderr, "buffer overflow\n");
exit(1);
}
ptr[-1] = 0;
dmt = dm_task_create(DM_DEVICE_TARGET_MSG);
if (!dmt) fprintf(stderr, "dm_task_create failed\n"), exit(1);
if (!dm_task_set_name(dmt, "switch")) fprintf(stderr, "dm_task_set_name failed\n"), exit(1);
if (!dm_task_set_sector(dmt, 0)) fprintf(stderr, "dm_task_set_sector failed\n"), exit(1);
if (!dm_task_set_message(dmt, buffer)) fprintf(stderr, "dm_task_set_message failed\n"), exit(1);
if (!dm_task_run(dmt)) fprintf(stderr, "dm_task_run failed\n"), exit(1);
dm_task_destroy(dmt);
}
return 0;
}
More information about the dm-devel
mailing list