int devmapper_stop(struct devmapping *dm)
{
    int rc;

    LOG_VOL("devmapper_stop():");

    if ((rc = destroy_devmapping(dm)))
        return rc;

    if (dm->src_type == dmsrc_loopback) {
        if ((rc = loopback_stop(dm)))
            return rc;
    } else if (dm->src_type == dmsrc_partition) {
        LOGE("partition maps not yet supported");
        return -ENOSYS;
    }
    return 0;
}
예제 #2
0
static int do_set_ums_enable(char *cmd)
{
#ifdef ADD_ISO
	static struct devmapping *loop = NULL;
	static struct devmapping loopback;
	static char devpath[4096];
	// TODO: lun_syspath を変更する必要がある。
	static char *lun_syspath = "/sys/devices/platform/s3c-usbgadget/gadget/lun0/file";
	LOG_VOL("do_set_ums_enable:%s:%s\n", cmd, lun_syspath);

	if (!strcmp(cmd, VOLD_CMD_ENABLE_UMS_SD)) {
		loop = NULL;
		LOG_VOL("do_set_ums_enable:%s\n", VOLD_CMD_ENABLE_UMS_SD);
        	return volmgr_enable_ums(true);
	} else if (!strncmp(cmd, VOLD_CMD_ENABLE_UMS_CD, strlen(VOLD_CMD_ENABLE_UMS_CD))) {
		/* ループバックデバイスパスの取得 */
		LOG_VOL("do_set_ums_enable:%s\n", VOLD_CMD_ENABLE_UMS_CD);
		int rc = 0;
		memset(devpath, 0, 4096);
		memcpy(devpath, &cmd[strlen(VOLD_CMD_ENABLE_UMS_CD)], 
				strlen(&cmd[strlen(VOLD_CMD_ENABLE_UMS_CD)]));
		LOG_VOL("do_set_ums_enable devpath=%s\n", devpath);

		/* ループバックデバイスの登録 */
		loopback.src_type = dmsrc_loopback;
		loopback.type_data.loop.loop_src = devpath;
		loopback.type_data.loop.loop_dev = NULL;
		rc = loopback_start(&loopback);
		if (rc) {
			LOGE("loopback_start err=%d\n", rc);
		}
		/* ループバックデバイスパスをカーネルに追加する */
		/* カーネルにはloopback dev登録であることを知らせナイトね */
		rc = ums_enable(loopback.type_data.loop.loop_dev, lun_syspath, false);
		if (rc) {
			LOGE("ums_enable err=%d\n", rc);
		}
		loop = &loopback;
		return 0;
	} else {
		int ret = 0;
		LOG_VOL("do_set_ums_enable:%s\n", "disable_ums\n");
		if (loop) {
			int rc;
			rc = ums_disable(lun_syspath);
			if (rc) {
				LOGE("ums_enable err=%d\n", rc);
			}
			/* ループバックデバイスの解除 */
			rc = loopback_stop(loop);
			if (rc) {
				LOGE("loopback_stop err=%d\n", rc);
			} else {
				free(loopback.type_data.loop.loop_dev);
				loopback.type_data.loop.loop_dev = NULL;
			}
		} else {
			ret = volmgr_enable_ums(false);
		}
		loop = NULL;
		return ret;
	}
#else
    if (!strcmp(cmd, VOLD_CMD_ENABLE_UMS))
        return volmgr_enable_ums(true);

    return volmgr_enable_ums(false);
#endif /* ADD_ISO */
}