12 #include <xseg/xseg.h>
13 #include <xseg/protocol.h>
15 #define MAX_ARG_LEN 255
16 int safe_strlen(char *s)
22 for (i = 0; i < MAX_ARG_LEN; i++) {
30 int validate_alphanumeric(char *s)
33 int len = safe_strlen(s);
38 for (i = 0; i < len; i++) {
39 if (!isalnum(*s)&&*s!='-'&&*s!='.')
46 int validate_numeric(char *s)
49 int len = safe_strlen(s);
53 for (i = 0; i < len; i++) {
61 char *spec = "segdev:xsegbd:16:1024:12";
63 struct xseg_config cfg;
64 xport srcport = NoPort;
66 struct xseg_port *port;
69 static void init_local_signal()
71 if (xseg && sport != srcport){
72 xseg_init_local_signal(xseg, srcport);
77 int wait_reply(struct xseg_request *expected_req)
79 struct xseg_request *rec;
80 xseg_prepare_wait(xseg, srcport);
82 rec = xseg_receive(xseg, srcport, 0);
84 if (rec != expected_req) {
85 fprintf(stderr, "Unknown received req. Putting req.\n");
86 xseg_put_request(xseg, rec, srcport);
87 } else if (!(rec->state & XS_SERVED)) {
88 fprintf(stderr, "Failed req\n");
94 xseg_wait_signal(xseg, 1000000UL);
96 xseg_cancel_wait(xseg, srcport);
101 int vlmc_create(char *name, uint64_t size, char *snap)
104 int targetlen = safe_strlen(name);
105 int snaplen = safe_strlen(snap);
106 if (targetlen <= 0) {
107 fprintf(stderr, "Invalid name\n");
110 if (snaplen <= 0 && size == -1) {
111 fprintf(stderr, "Size or snap must be provided in create\n");
114 XSEGLOG("Name: %s", name);
115 XSEGLOG("Snap: %s", snap);
117 struct xseg_request *req = xseg_get_request(xseg, srcport, mportno, X_ALLOC);
119 fprintf(stderr, "Couldn't allocate xseg request\n");
122 int r = xseg_prep_request(xseg, req, targetlen, sizeof(struct xseg_request_clone));
124 fprintf(stderr, "Couldn't prep xseg request\n");
125 xseg_put_request(xseg, req, srcport);
128 //FIXME what to do if no snap ? how do i send mapper to create a non copy up volume?
129 char *target = xseg_get_target(xseg, req);
130 strncpy(target, name, targetlen);
131 struct xseg_request_clone *xclone = (struct xseg_request_clone *) xseg_get_data(xseg, req);
133 memset(xclone->target, 0, XSEG_MAX_TARGETLEN);
134 xclone->targetlen = 0;
137 strncpy(xclone->target, snap, snaplen);
138 xclone->targetlen = snaplen;
142 req->size = req->datalen;
145 xport p = xseg_submit(xseg, req, srcport, X_ALLOC);
147 fprintf(stderr, "couldn't submit req\n");
148 xseg_put_request(xseg, req, srcport);
151 xseg_signal(xseg, p);
153 ret = wait_reply(req);
155 xseg_put_request(xseg, req, srcport);
160 int vlmc_snapshot(char *name)
165 int vlmc_remove(char *name)
167 int targetlen = safe_strlen(name);
168 if (targetlen <= 0) {
169 fprintf(stderr, "Invalid name\n");
173 struct xseg_request *req = xseg_get_request(xseg, srcport, mportno, X_ALLOC);
175 fprintf(stderr, "Couldn't allocate xseg request\n");
178 int r = xseg_prep_request(xseg, req, targetlen, 0);
180 fprintf(stderr, "Couldn't prep xseg request\n");
181 xseg_put_request(xseg, req, srcport);
184 char *target = xseg_get_target(xseg, req);
185 strncpy(target, name, targetlen);
187 req->size = req->datalen;
190 xport p = xseg_submit(xseg, req, srcport, X_ALLOC);
192 fprintf(stderr, "couldn't submit req\n");
193 xseg_put_request(xseg, req, srcport);
196 xseg_signal(xseg, p);
200 xseg_put_request(xseg, req, srcport);
205 int vlmc_resize(char *name, uint64_t size)
210 int vlmc_map(char *name)
219 for (p = 2; p < cfg.nr_ports; p++) {
220 sprintf(buf, "%sdevices/%u/srcport", XSEGBD_SYSFS, p);
221 fd = open(buf, O_RDONLY);
222 if (fd < 0 && errno == ENOENT)
225 if (p == cfg.nr_ports){
226 fprintf(stderr, "No available port\n");
230 sprintf(cmd, "%s %u:%u:%u", name, p, VPORT, REQS);
231 sprintf(buf, "%sadd", XSEGBD_SYSFS);
232 fd = open(add, O_WRONLY);
234 fprintf(stderr, "Cannot open sysfs add\n");
237 r = write(fd, cmd, strlen(cmd));
239 fprintf(stderr, "write error\n");
247 int vlmc_unmap(char *name)
257 #define err_in_arg(__i, __arg) do { \
258 fprintf(stderr, "Error in argument %d (%s)\n", __i, __arg); \
262 int main(int argc, char *argv[])
266 fprintf(stderr, "insufficient arguments\n");
271 if (xseg_parse_spec(spec, &cfg)) {
272 fprintf(stderr, "Cannot parse spec\n");
276 if (xseg_initialize()) {
277 fprintf(stderr, "cannot initialize!\n");
281 xseg = xseg_join(cfg.type, cfg.name, "posix", NULL);
283 fprintf(stderr, "cannot join segment!\n");
294 for (i = 3; i < argc; i++) {
295 if ((!strcmp(argv[i], "-s") || !strcmp(argv[i], "--size")) && i+1 < argc){
296 if (!validate_numeric(argv[i+1])){
297 err_in_arg(i, argv[i]);
299 size = atol(argv[i+1]);
302 }else if ((!strcmp(argv[i], "-c") || !strcmp(argv[i], "--config")) && i+1 < argc){
303 if (!validate_alphanumeric(argv[i+1])){
304 err_in_arg(i, argv[i]);
309 } else if (!strcmp(argv[i], "--snap") && i+1 < argc){
310 if (!validate_alphanumeric(argv[i+1])){
311 err_in_arg(i, argv[i]);
316 } else if (!strcmp(argv[i], "-mp") && i+1 < argc){
317 if (!validate_numeric(argv[i+1])){
318 err_in_arg(i, argv[i]);
320 mportno = atol(argv[i+1]);
323 } else if (!strcmp(argv[i], "-p") && i+1 < argc){
324 if (!validate_alphanumeric(argv[i+1])){
325 err_in_arg(i, argv[i]);
327 srcport = atol(argv[i+1]);
330 } else if (!strcmp(argv[i], "--name") && i+1 < argc){
331 if (!validate_alphanumeric(argv[i+1])){
332 err_in_arg(i, argv[i]);
338 err_in_arg(i, argv[i]);
342 if (srcport > cfg.nr_ports || mportno > cfg.nr_ports) {
343 fprintf(stderr, "Invalid port\n");
347 port = xseg_bind_port(xseg, srcport, NULL);
349 fprintf(stderr, "Error binding port %u\n", srcport);
355 if (!strcmp(argv[2], "create"))
356 ret = vlmc_create(name, size, snap);
357 else if (!strcmp(argv[2], "remove"))
358 ret = vlmc_remove(name);
360 else if (!strcmp(argv[2], "map"))
361 ret = vlmc_map(name);
362 else if (!strcmp(argv[2], "unmap"))
363 ret = vlmc_unmap(name);
364 else if (!strcmp(argv[2], "showmapped"))
365 ret = vlmc_showmapped();
366 else if (!strcmp(argv[2], "list") || !(strcmp(argv[2], "ls"))
369 else if (!strcmp(argv[2], "resize"))
370 ret = vlmc_resize(name, size);
372 fprintf(stderr, "unknown action (%s)\n", argv[2]);