int ploop_complete_running_operation(const char *device) { struct ploop_balloon_ctl b_ctl; int fd, ret; fd = open_device(device); if (fd == -1) return SYSEXIT_OPEN; bzero(&b_ctl, sizeof(b_ctl)); b_ctl.keep_intact = 1; ret = ioctl(fd, PLOOP_IOC_BALLOON, &b_ctl); if (ret) { ploop_err(errno, "Unable to get in-kernel maintenance state"); ret = SYSEXIT_DEVIOC; goto err; } if (b_ctl.mntn_type == PLOOP_MNTN_OFF) goto err; ploop_log(0, "Completing an on-going operation %s for device %s", mntn2str(b_ctl.mntn_type), device); switch (b_ctl.mntn_type) { case PLOOP_MNTN_MERGE: ret = ioctl_device(fd, PLOOP_IOC_MERGE, 0); break; case PLOOP_MNTN_GROW: ret = ioctl_device(fd, PLOOP_IOC_GROW, 0); break; case PLOOP_MNTN_RELOC: case PLOOP_MNTN_FBLOADED: ret = ploop_balloon_complete(device); break; case PLOOP_MNTN_TRACK: ret = ioctl_device(fd, PLOOP_IOC_TRACK_ABORT, 0); break; case PLOOP_MNTN_DISCARD: ret = ploop_balloon_complete(device); break; case PLOOP_MNTN_BALLOON: /* FIXME : ploop_balloon_check_and_repair(device, mount_point, 1; */ ret = 0; break; } err: close(fd); return ret; }
static int pb_complete(int argc, char **argv) { int i, ret, fd; while ((i = getopt(argc, argv, "d:m:")) != EOF) { switch (i) { case 'd': device = optarg; break; case 'm': mount_point = optarg; break; default: usage_complete(); return SYSEXIT_PARAM; } } argc -= optind; argv += optind; GET_DD(argc, argv); if (argc != 0 || fill_opts()) { usage_complete(); return SYSEXIT_PARAM; } ret = get_balloon(mount_point, NULL, &fd); if (ret) return ret; return ploop_balloon_complete(device); }
static void cancel_discard(void *data) { ploop_balloon_complete(data); }