From 6b1d41aa2ba678fd08fbfe091fe13c2a10c0b617 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Wed, 11 Oct 2017 16:52:57 +0900 Subject: [PATCH 01/16] block, app: Add CheckSpeed - Add CheckSpeed dbus method on storaged - App calls CheckSpeed (internal extended sdcard) Change-Id: I90817330ce210946d9ee1a1b9fcc9895648d431c Signed-off-by: pr.jung (cherry picked from commit 645a395e3af4fa85a1f4840b76a30da154f51c93) --- apps/extended-sd/include/dbus-call.h | 2 + apps/extended-sd/include/extended-sd-main.h | 2 - apps/extended-sd/src/dbus-call.c | 1 - apps/extended-sd/src/es-internal-storage-page.c | 110 ++++++++++++++++-------- src/block/block.c | 75 ++++++++++++++++ 5 files changed, 149 insertions(+), 41 deletions(-) diff --git a/apps/extended-sd/include/dbus-call.h b/apps/extended-sd/include/dbus-call.h index 0a3a10c..fcc3659 100644 --- a/apps/extended-sd/include/dbus-call.h +++ b/apps/extended-sd/include/dbus-call.h @@ -25,6 +25,8 @@ #include "dbus_macro.h" #include "extended-sd-main.h" +#define DBUS_REPLY_TIMEOUT (-1) + struct dbus_int { int *list; int size; diff --git a/apps/extended-sd/include/extended-sd-main.h b/apps/extended-sd/include/extended-sd-main.h index c4d5441..b89b062 100644 --- a/apps/extended-sd/include/extended-sd-main.h +++ b/apps/extended-sd/include/extended-sd-main.h @@ -51,8 +51,6 @@ typedef struct appdata { internal_storage_page_data_s* internal_storage_page_data; int storage_id; - Ecore_Timer* format_timer; //demo purpose, please remove once formatting implementation in place - Ecore_Timer* check_timer; //demo purpose, please remove once formatting implementation in place } appdata_s; #define SAFE_FREE(data) if (data) { free(data); data = NULL; } diff --git a/apps/extended-sd/src/dbus-call.c b/apps/extended-sd/src/dbus-call.c index cdc503e..c13e210 100644 --- a/apps/extended-sd/src/dbus-call.c +++ b/apps/extended-sd/src/dbus-call.c @@ -26,7 +26,6 @@ #include "dbus-call.h" #include "log-util.h" -#define DBUS_REPLY_TIMEOUT (-1) #define DBUS_MAXIMUM_NAME_LENGTH 255 struct pending_call_data { diff --git a/apps/extended-sd/src/es-internal-storage-page.c b/apps/extended-sd/src/es-internal-storage-page.c index 3405d50..5ebc14c 100644 --- a/apps/extended-sd/src/es-internal-storage-page.c +++ b/apps/extended-sd/src/es-internal-storage-page.c @@ -44,22 +44,6 @@ static Evas_Object* create_page_4(appdata_s* ad); static Evas_Object* create_page_5(appdata_s* ad); static void -_format_click_cb(void *data, Evas_Object* obj, void *event_info) -{ - FUNC_BEGIN(); - - appdata_s* ad = (appdata_s*)data; - ret_if(ad == NULL); - - Evas_Object* page_content = elm_object_part_content_unset(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content"); - EVAS_OBJECT_DEL(page_content); - page_content = create_page_2(ad); - elm_object_part_content_set(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content", page_content); - - FUNC_END(); -} - -static void format_done(void *data, GVariant *result, GError *err) { appdata_s* ad = (appdata_s*)data; @@ -99,7 +83,7 @@ format_done(void *data, GVariant *result, GError *err) } static void -_continue_click_cb(void *data, Evas_Object* obj, void *event_info) +encryption_format(void *data) { FUNC_BEGIN(); @@ -137,6 +121,77 @@ _continue_click_cb(void *data, Evas_Object* obj, void *event_info) } static void +check_speed_done(void *data, GVariant *result, GError *err) +{ + appdata_s* ad = (appdata_s*)data; + int ret; + + FUNC_BEGIN(); + ret_if(ad == NULL); + ret_if(result == NULL); + + g_variant_get(result, "(i)", &ret); + if (ret < 0) { + DMSG("Performance warning", ret); + Evas_Object* page_content = elm_object_part_content_unset(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content"); + EVAS_OBJECT_DEL(page_content); + page_content = create_page_3(ad); + elm_object_part_content_set(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content", page_content); + goto out; + } else + encryption_format(ad); + +out: + g_variant_unref(result); + FUNC_END(); +} + +static void +_format_click_cb(void *data, Evas_Object* obj, void *event_info) +{ + FUNC_BEGIN(); + + appdata_s* ad = (appdata_s*)data; + char str_id[32]; + char *arr[1]; + int ret; + + ret_if(ad == NULL); + + Evas_Object* page_content = elm_object_part_content_unset(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content"); + EVAS_OBJECT_DEL(page_content); + page_content = create_page_2(ad); + elm_object_part_content_set(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content", page_content); + + snprintf(str_id, sizeof(str_id), "%d", ad->storage_id); + arr[0] = str_id; + ret = dbus_method_async_with_reply(STORAGED_BUS_NAME, + STORAGED_PATH_BLOCK_MANAGER, + STORAGED_INTERFACE_BLOCK_MANAGER, + "CheckSpeed", + "i", + arr, + check_speed_done, + DBUS_REPLY_TIMEOUT, // ms + ad); + if (ret < 0) + DMSG("Failed to check speed", ret); + + FUNC_END(); +} + +static void +_continue_click_cb(void *data, Evas_Object* obj, void *event_info) +{ + FUNC_BEGIN(); + + appdata_s* ad = (appdata_s*)data; + + encryption_format(ad); + FUNC_END(); +} + +static void _move_files_button_click_cb(void *data, Evas_Object* obj, void *event_info) { FUNC_BEGIN(); @@ -429,23 +484,6 @@ out: return page_content; } -static Eina_Bool _check_timer_cb(void* data) -{ - FUNC_BEGIN(); - - appdata_s* ad = (appdata_s*)data; - retv_if(ad == NULL, ECORE_CALLBACK_CANCEL); - - Evas_Object* page_content = elm_object_part_content_unset(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content"); - EVAS_OBJECT_DEL(page_content); - page_content = create_page_3(ad); - elm_object_part_content_set(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content", page_content); - - ad->check_timer = NULL; - FUNC_END(); - return ECORE_CALLBACK_CANCEL; -} - static Evas_Object* create_page_2(appdata_s* ad) { FUNC_BEGIN(); @@ -505,10 +543,6 @@ static Evas_Object* create_page_2(appdata_s* ad) elm_genlist_item_class_free(extended_multiline_genlist_itc); - //demo implementation to emulate format process, please remove once formatting implementation in place - // prprprprprpr TODO - ECORE_TIMER_DEL(ad->check_timer); - ad->check_timer = ecore_timer_add(5, _check_timer_cb, ad); out: FUNC_END(); diff --git a/src/block/block.c b/src/block/block.c index edda2e8..c9107c9 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -106,6 +106,8 @@ /* Maximum number of thread */ #define THREAD_MAX 5 +#define SPEEDCHECK 16 + #define PKGDIR_BUS_NAME "org.tizen.pkgdir_tool" #define PKGDIR_PATH "/org/tizen/pkgdir_tool" #define PKGDIR_INTERFACE "org.tizen.pkgdir_tool" @@ -3265,6 +3267,78 @@ out: return reply; } +static DBusMessage *request_check_speed(dbus_method_reply_handle_h reply_handle, + DBusMessage *msg) +{ + struct timespec start_time, end_time; + DBusMessageIter iter; + DBusMessage *reply; + struct block_device *bdev; + struct block_data *data; + char *buf; + int ret = 0; + int id; + int fd; + + if (!reply_handle || !msg) + return NULL; + + ret = dbus_message_get_args(msg, NULL, + DBUS_TYPE_INT32, &id, + DBUS_TYPE_INVALID); + if (!ret) { + ret = -1; + goto out; + } + + bdev = find_block_device_by_id(id); + if (!bdev) { + ret = -1; + goto out; + } + data = bdev->data; + if (!data) { + ret = -1; + goto out; + } + + _D("speed check: %s", data->devnode); + fd = open(data->devnode, O_RDWR | O_SYNC); + buf = calloc(1, SPEEDCHECK * 1024 * 1024); + if (!buf) { + _E("calloc() failed"); + close(fd); + ret = -1; + goto out; + } + clock_gettime(CLOCK_REALTIME, &start_time); + _I("start time: %lu.%lu", start_time.tv_sec, start_time.tv_nsec); + ret = write(fd, buf, SPEEDCHECK * 1024 * 1024); + clock_gettime(CLOCK_REALTIME, &end_time); + _I("end time %lu.%lu", end_time.tv_sec, end_time.tv_nsec); + + free(buf); + + if (SPEEDCHECK / (end_time.tv_sec - start_time.tv_sec) < 4) { + ret = -1; + close(fd); + goto out; + } + + if (ret < 0) { + _E("write() failed %d", errno); + close(fd); + goto out; + } + + close(fd); +out: + reply = dbus_message_new_method_return(msg); + dbus_message_iter_init_append(reply, &iter); + dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret); + return reply; +} + /* Method name Method call format string Reply format string { "ShowDeviceList", NULL, NULL, request_show_device_list }, @@ -3291,6 +3365,7 @@ static const dbus_method_s manager_methods[] = { { "GetMmcPrimary" , NULL, request_get_mmc_primary }, { "PrivateMount", "is", request_private_mount_block }, { "PrivateUnmount", "ii", request_private_unmount_block }, + { "CheckSpeed", "i", request_check_speed }, }; static dbus_interface_s block_interface = { -- 2.7.4 From e71237c72d97e364fbafa10bfa841b6604443b13 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Thu, 12 Oct 2017 21:12:06 +0900 Subject: [PATCH 02/16] VFAT format with the label(emul-sdcard) in the mobile emulator Change-Id: I0747f1f1540fc844c9fc90483f91cd6261f5ffb4 Signed-off-by: Hyotaek Shim --- src/block/vfat.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/block/vfat.c b/src/block/vfat.c index 997b446..4ed6f3e 100644 --- a/src/block/vfat.c +++ b/src/block/vfat.c @@ -39,6 +39,11 @@ static const char *vfat_arg[] = { "-F", "32", "-O", "tizen", "-c", "8", NULL, NULL, }; +static const char *emul_vfat_arg[] = { + "/usr/bin/newfs_msdos", + "-F", "32", "-O", "tizen", "-L", "emul-sdcard", "-c", "8", NULL, NULL, +}; + static const char *vfat_check_arg[] = { "/usr/bin/fsck_msdosfs", "-pf", NULL, NULL, @@ -131,9 +136,17 @@ static int vfat_mount(bool smack, const char *devpath, const char *mount_point) static int vfat_format(const char *devpath) { int argc; - argc = ARRAY_SIZE(vfat_arg); - vfat_arg[argc - 2] = devpath; - return run_child(argc, vfat_arg); + + if(!is_emulator()) { + argc = ARRAY_SIZE(vfat_arg); + vfat_arg[argc - 2] = devpath; + return run_child(argc, vfat_arg); + } + else { + argc = ARRAY_SIZE(emul_vfat_arg); + emul_vfat_arg[argc - 2] = devpath; + return run_child(argc, emul_vfat_arg); + } } static const struct block_fs_ops vfat_ops = { -- 2.7.4 From c53a417ecb0e1b35d4d316611c0712d3c4a94821 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Fri, 13 Oct 2017 11:09:56 +0900 Subject: [PATCH 03/16] Modify UX scenario to set up sdcard through setting apps Change-Id: Ib6a6bba01222b0c74ad15aff6b47e424a62b0ca9 Signed-off-by: Hyotaek Shim --- src/block/block.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/block/block.c b/src/block/block.c index c9107c9..082eeb3 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -2103,7 +2103,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i { struct block_data *data; struct block_device *bdev; - char id_string[PATH_LEN]; + //char id_string[PATH_LEN]; bool partition; int ret; int thread_id; @@ -2151,9 +2151,42 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i pthread_mutex_lock(&(th_manager[thread_id].mutex)); th_manager[thread_id].num_dev++; DD_LIST_APPEND(th_manager[thread_id].block_dev_list, bdev); - pthread_mutex_unlock(&(th_manager[thread_id].mutex)); + if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) { + bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV; + ret = change_mount_point(bdev, EXTENDED_SD_PATH); + if (ret < 0) { + ret = -EPERM; + free_block_device(bdev); + return ret; + } + + /* ---- ODE UI launch ---- + snprintf(id_string, PATH_LEN, "%d", bdev->data->id); + ret = launch_system_app(POPUP_DEFAULT, 4, POPUP_KEY_CONTENT, "sdcardsetup", POPUP_SDCARD_ID, id_string); + if (ret < 0) + _E("Failed to launch popup"); + + ode_luks_set_event_cb(CALLBACK) + */ + + return 0; + } else if (!strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) { + bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV; + ret = change_mount_point(bdev, EXTENDED_SD_PATH); + if (ret < 0) { + ret = -EPERM; + free_block_device(bdev); + return ret; + } + } else if (!bdev->data->fs_type) { + _E("Unformatted Storage"); + free_block_device(bdev); + return -EPERM; + } + +#if 0 /* Check this sdcard is already formatted for extended internal sdcard */ if (block_conf[bdev->data->block_type].extendedinternal && bdev->data->block_type == BLOCK_MMC_DEV && @@ -2188,7 +2221,6 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i free_block_device(bdev); return ret; } - } } } else { @@ -2198,7 +2230,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i return -EPERM; } } - +#endif ret = add_operation(bdev, BLOCK_DEV_INSERT, NULL, (void *)data); if (ret < 0) { _E("Failed to add operation (insert %s)", devnode); -- 2.7.4 From 906c1fc5c63aa13849e9a0c629999ac4faca2e66 Mon Sep 17 00:00:00 2001 From: Krzysztof Jackiewicz Date: Fri, 22 Sep 2017 14:01:58 +0200 Subject: [PATCH 04/16] Support for encrypted internal memory extension - Support device mapper devices. Necessary because dmcrypt uses device mapper. It also requires proper udev rules for device mapper. Device mapper devices will be marked as BLOCK_MAPPER_DEV (previously BLOCK_MMC_EXTENDED_INTERNAL_DEV). Update block.conf file and related logic. - Support different/unknown filesystems. We don't know what kind of data will be on sd card, but we have to be able to detect it. All sdcards are marked as BLOCK_MMC_DEV. Listener can distinguish cards by fs_type if needed. - For devices with non-filesystem FS_USAGE (for example "crypto") we don't need 2.4 backward compatibility and fixed id. - Don't generate mount path for devices with non-filesystem FS_USAGE. - Don't check for primary partition on device mapper devices. - Don't check multimount for unknown filesystems. - Trigger card setup UI for cards without LUKS or with garbage on them. Don't treat unformatted cards as an error. - For internal memory extension assign the mountpoint in make_block_data() as in case of other types of storage. - Don't try to mount unknown filesystems. - In case of device mapper udev events treat "change" as "add" (perhaps this can be avoided by providing proper udev rules). - Update device data when udev "change" event occurs. Formatting partition externally (LUKS case) requires manual udev read so that both udev and storaged have the actual device state. Also notify listeners about this change. - Allow unmounting internal memory extension card. Not sure why it was disabled. Change-Id: I26f98b31a24936f0b4524fc5c081163f9c9e4878 Signed-off-by: Hyotaek Shim --- src/block/block.c | 188 ++++++++++++++++++++++++--------------------------- src/block/block.conf | 4 ++ src/block/block.h | 2 +- 3 files changed, 93 insertions(+), 101 deletions(-) diff --git a/src/block/block.c b/src/block/block.c index 082eeb3..24f1a79 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -62,6 +62,7 @@ #define SCSI_PATH "*/sd[a-z]*" #define SCSI_PARTITION_PATH "sd[a-z][0-9]" #define SCSI_PARTITION_LENGTH 9 +#define EXTENDEDSD_PATH "/dev/mapper/extendedsd*" #define FILESYSTEM "filesystem" @@ -160,7 +161,7 @@ struct pipe_data { static struct block_conf { bool multimount; bool extendedinternal; -} block_conf[BLOCK_MMC_EXTENDED_INTERNAL_DEV + 1]; +} block_conf[BLOCK_EXTENDEDSD_DEV + 1]; static struct manage_thread { dd_list *th_node_list; /* List of devnode which thread dealt with. Only main thread access */ @@ -267,17 +268,17 @@ static void broadcast_block_info(enum block_dev_operation op, continue; // TODO What happend on extended internal storage case? if (op == BLOCK_DEV_MOUNT) { - if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) + if (data->block_type == BLOCK_EXTENDEDSD_DEV) ops->mounted(data, result, true); else ops->mounted(data, result, false); } else if (op == BLOCK_DEV_UNMOUNT) { - if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) + if (data->block_type == BLOCK_EXTENDEDSD_DEV) ops->unmounted(data, result, true); else ops->unmounted(data, result, false); } else if (op == BLOCK_DEV_FORMAT) { - if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) + if (data->block_type == BLOCK_EXTENDEDSD_DEV) ops->formatted(data, result, true); else ops->formatted(data, result, false); @@ -551,7 +552,7 @@ static char *generate_mount_path(struct block_data *data) char *name, node[64]; int ret; - if (!data || !data->devnode) + if (!data || !data->devnode || !data->fs_usage || strcmp(data->fs_usage, FILESYSTEM)) return NULL; name = strrchr(data->devnode, '/'); @@ -566,7 +567,7 @@ static char *generate_mount_path(struct block_data *data) case BLOCK_SCSI_DEV: ret = get_scsi_mount_node(name, node, sizeof(node)); break; - case BLOCK_MMC_EXTENDED_INTERNAL_DEV: + case BLOCK_EXTENDEDSD_DEV: return strdup(EXTENDED_SD_PATH); default: _E("Invalid block type (%d)", data->block_type); @@ -602,7 +603,8 @@ static bool check_primary_partition(const char *devnode) if (fnmatch(MMC_LINK_PATH, devnode, 0) && fnmatch(MMC_PATH, devnode, 0) && - fnmatch(SCSI_PATH, devnode, 0)) + fnmatch(SCSI_PATH, devnode, 0) && + fnmatch(EXTENDEDSD_PATH, devnode, 0)) return false; temp = strrchr(devnode, '/'); @@ -671,7 +673,7 @@ static struct block_data *make_block_data(const char *devnode, return NULL; if (!fs_type) - _E("Not support extended partition"); + _I("Unknown fs type"); data = calloc(1, sizeof(struct block_data)); if (!data) { @@ -701,6 +703,8 @@ static struct block_data *make_block_data(const char *devnode, data->block_type = BLOCK_MMC_DEV; else if (!fnmatch(SCSI_PATH, devnode, 0)) data->block_type = BLOCK_SCSI_DEV; + else if (!fnmatch(EXTENDEDSD_PATH, devnode, 0)) + data->block_type = BLOCK_EXTENDEDSD_DEV; else data->block_type = -1; @@ -709,7 +713,8 @@ static struct block_data *make_block_data(const char *devnode, /* for 2.4 backward compatibility */ // What if storage id 1 is existed? (multi sdcard case) - if (data->primary == true && data->block_type == BLOCK_MMC_DEV) + if (data->primary == true && data->block_type == BLOCK_MMC_DEV && + data->fs_usage && !strcmp(data->fs_usage, FILESYSTEM)) data->id = EXT_PRIMARY_SD_FIXID; else data->id = block_get_new_id(); @@ -965,7 +970,7 @@ static bool pipe_cb(int fd, void *data) ret = change_mount_point(pdata.bdev, ""); /* Modify /run/external-storage/id file */ if (ret == 0) { - if (pdata.bdev->data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) + if (pdata.bdev->data->block_type == BLOCK_EXTENDEDSD_DEV) create_file(pdata.bdev->data->id, pdata.bdev->data->mount_point, true); else create_file(pdata.bdev->data->id, pdata.bdev->data->mount_point, false); @@ -980,10 +985,7 @@ static bool pipe_cb(int fd, void *data) create_external_apps_directory(); if (pdata.op == BLOCK_DEV_UNMOUNT) { /* Remove file for block device /run/xxxxxx/id */ - if (pdata.bdev->data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) - remove_file(pdata.bdev->data->id, true); - else - remove_file(pdata.bdev->data->id, false); + remove_file(pdata.bdev->data->id, pdata.bdev->data->block_type == BLOCK_EXTENDEDSD_DEV); } /* Broadcast to mmc and usb storage module */ @@ -1162,7 +1164,7 @@ static int block_mount(struct block_data *data) goto out; } - if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) + if (data->block_type == BLOCK_EXTENDEDSD_DEV) r = fs->mount(false, data->devnode, data->mount_point); else r = fs->mount(smack, data->devnode, data->mount_point); @@ -1315,7 +1317,7 @@ static int block_unmount(struct block_device *bdev, /* Mobile specific: * should unmount the below vconf key. */ if ((data->block_type == BLOCK_MMC_DEV || - data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) && + data->block_type == BLOCK_EXTENDEDSD_DEV) && data->primary) { /* At first, notify to other app * who already access sdcard */ @@ -1405,7 +1407,7 @@ out: } static int block_format(struct block_data *data, - const char *fs_type, bool mount_point_updated) + const char *fs_type, bool mount_point_updated, bool udev_update) { const struct block_fs_ops *fs; dd_list *elem; @@ -1416,7 +1418,7 @@ static int block_format(struct block_data *data, if (!data || !data->devnode || !data->mount_point) return -EINVAL; - if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) + if (data->block_type == BLOCK_EXTENDEDSD_DEV) fstype = EXT4_NAME; else { if (!fs_type) { @@ -1453,8 +1455,8 @@ static int block_format(struct block_data *data, /* need to update the partition data. * It can be changed in doing format. */ - retrieve_udev_device(data, mount_point_updated); - + if (udev_update) + retrieve_udev_device(data, mount_point_updated); out: return r; } @@ -1482,7 +1484,7 @@ static int format_block_device(struct block_device *bdev, } } - r = block_format(data, fs_type, bdev->mount_point_updated); + r = block_format(data, fs_type, bdev->mount_point_updated, false); if (r < 0) _E("fail to format %s device : %d", data->devnode, r); @@ -1832,7 +1834,6 @@ static void trigger_operation(struct block_device *bdev, dd_list *queue, struct pthread_mutex_unlock(&(th_manager[thread_id].mutex)); /* UNLOCK */ - if (operation == BLOCK_DEV_INSERT || operation == BLOCK_DEV_REMOVE) { if (pipe_trigger(operation, bdev, 0) < 0) _E("fail to trigger pipe"); @@ -2099,7 +2100,7 @@ out: } // Called by MainThread -static int add_block_device(struct udev_device *dev, const char *devnode, bool init) +static int add_block_device(struct udev_device *dev, const char *devnode, bool mapper) { struct block_data *data; struct block_device *bdev; @@ -2107,6 +2108,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i bool partition; int ret; int thread_id; + bool need_format = false; partition = check_partition(dev); if (partition) { @@ -2115,19 +2117,32 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i return 0; } - data = make_block_data(devnode, - udev_device_get_syspath(dev), - udev_device_get_property_value(dev, "ID_FS_USAGE"), - udev_device_get_property_value(dev, "ID_FS_TYPE"), - udev_device_get_property_value(dev, "ID_FS_VERSION"), - udev_device_get_property_value(dev, "ID_FS_UUID_ENC"), - udev_device_get_sysattr_value(dev, "ro")); + if (mapper && !udev_device_get_property_value(dev, "ID_FS_TYPE")) { + data = make_block_data(devnode, + udev_device_get_syspath(dev), + FILESYSTEM, + EXT4_NAME, + "1.0", + udev_device_get_property_value(dev, "ID_FS_UUID_ENC"), + udev_device_get_sysattr_value(dev, "ro")); + need_format = true; + } else { + data = make_block_data(devnode, + udev_device_get_syspath(dev), + udev_device_get_property_value(dev, "ID_FS_USAGE"), + udev_device_get_property_value(dev, "ID_FS_TYPE"), + udev_device_get_property_value(dev, "ID_FS_VERSION"), + udev_device_get_property_value(dev, "ID_FS_UUID_ENC"), + udev_device_get_sysattr_value(dev, "ro")); + } + if (!data) { _E("fail to make block data for %s", devnode); return -EPERM; } - if (!block_conf[data->block_type].multimount && !data->primary) { + if (!block_conf[data->block_type].multimount && !data->primary && + data->fs_usage && !strcmp(data->fs_usage, FILESYSTEM)) { _D("Not support multi mount by config info"); free_block_data(data); return -EPERM; @@ -2153,8 +2168,19 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i DD_LIST_APPEND(th_manager[thread_id].block_dev_list, bdev); pthread_mutex_unlock(&(th_manager[thread_id].mutex)); - if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) { - bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV; + if (need_format) { + ret = block_format(bdev->data, EXT4_NAME, false, false); + if (ret < 0) { + _E("Failed to add operation (format %s)", bdev->data->devnode); + } + } + + if (!bdev->data->fs_type) { + _E("Unformatted Storage"); + free_block_device(bdev); + return -EPERM; + } else if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) { + bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; ret = change_mount_point(bdev, EXTENDED_SD_PATH); if (ret < 0) { ret = -EPERM; @@ -2173,64 +2199,15 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i return 0; } else if (!strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) { - bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV; + bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; ret = change_mount_point(bdev, EXTENDED_SD_PATH); if (ret < 0) { ret = -EPERM; free_block_device(bdev); return ret; } - } else if (!bdev->data->fs_type) { - _E("Unformatted Storage"); - free_block_device(bdev); - return -EPERM; } -#if 0 - /* Check this sdcard is already formatted for extended internal sdcard */ - if (block_conf[bdev->data->block_type].extendedinternal && - bdev->data->block_type == BLOCK_MMC_DEV && - bdev->data->primary) { // sdcard primary partition and extended internal option is on - _I("Check whether sdcard will be used as extended internal storage"); - - if (!init) { // after booting is done launch popup for setting - ret = add_operation(bdev, BLOCK_DEV_INSERT, NULL, (void *)data); - if (ret < 0) { - _E("Failed to add operation (insert %s)", devnode); - free_block_device(bdev); - return ret; - } - - snprintf(id_string, PATH_LEN, "%d", bdev->data->id); - ret = launch_system_app(POPUP_DEFAULT, 4, POPUP_KEY_CONTENT, "sdcardsetup", POPUP_SDCARD_ID, id_string); - if (ret < 0) - _E("Failed to launch popup"); - return 0; - } else { // at booting time - if (!bdev->data->fs_type) { - _E("Unformatted Storage"); - free_block_device(bdev); - return -EPERM; - } - - if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) { - bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV; - ret = change_mount_point(bdev, EXTENDED_SD_PATH); - if (ret < 0) { - ret = -EPERM; - free_block_device(bdev); - return ret; - } - } - } - } else { - if (!bdev->data->fs_type) { - _E("Unformatted Storage"); - free_block_device(bdev); - return -EPERM; - } - } -#endif ret = add_operation(bdev, BLOCK_DEV_INSERT, NULL, (void *)data); if (ret < 0) { _E("Failed to add operation (insert %s)", devnode); @@ -2238,11 +2215,14 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i return ret; } + // Not a regular filesystem -> skip mounting + if (!bdev->data->fs_usage || strcmp(bdev->data->fs_usage, FILESYSTEM)) { + _I("Not a filesystem. Not mounting"); + return 0; + } + /* Create file for block device /run/external-storage/id */ - if (bdev->data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) - create_file(bdev->data->id, bdev->data->mount_point, true); - else - create_file(bdev->data->id, bdev->data->mount_point, false); + create_file(bdev->data->id, bdev->data->mount_point, bdev->data->block_type == BLOCK_EXTENDEDSD_DEV); ret = add_operation(bdev, BLOCK_DEV_MOUNT, NULL, NULL); if (ret < 0) { _E("Failed to add operation (mount %s)", devnode); @@ -2471,7 +2451,8 @@ static int block_init_from_udev_enumerate(void) continue; if (fnmatch(MMC_PATH, devnode, 0) && - fnmatch(SCSI_PATH, devnode, 0)) + fnmatch(SCSI_PATH, devnode, 0) && + fnmatch(EXTENDEDSD_PATH, devnode, 0)) continue; } @@ -2486,7 +2467,7 @@ static int block_init_from_udev_enumerate(void) } _I("%s device add", devnode); - add_block_device(dev, devnode, true); + add_block_device(dev, devnode, false); udev_device_unref(dev); } @@ -2603,6 +2584,7 @@ static void uevent_block_handler(struct udev_device *dev) const char *action; struct udev_list_entry *list_entry; int r; + bool mapper = false; udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev)) { const char *devlink = udev_list_entry_get_name(list_entry); @@ -2610,6 +2592,11 @@ static void uevent_block_handler(struct udev_device *dev) devnode = devlink; break; } + if (!fnmatch(EXTENDEDSD_PATH, devlink, 0)) { + mapper = true; + devnode = devlink; + break; + } } if (!devnode) { @@ -2631,16 +2618,18 @@ static void uevent_block_handler(struct udev_device *dev) return; _I("%s device %s", devnode, action); - if (!strncmp(action, UDEV_ADD, sizeof(UDEV_ADD))) { + if (!strncmp(action, UDEV_ADD, sizeof(UDEV_ADD)) || + (mapper && !strcmp(action, UDEV_CHANGE))) { r = check_already_handled(devnode); if (r < 0) { _I("%s is already handled", devnode); return; } - add_block_device(dev, devnode, false); - } else if (!strncmp(action, UDEV_REMOVE, sizeof(UDEV_REMOVE))) + add_block_device(dev, devnode, mapper); + } else if (!strncmp(action, UDEV_REMOVE, sizeof(UDEV_REMOVE))) { remove_block_device(dev, devnode); + } } static DBusMessage *request_mount_block(dbus_method_reply_handle_h reply_handle, @@ -2699,7 +2688,7 @@ static DBusMessage *request_mount_block(dbus_method_reply_handle_h reply_handle, ret = -EPERM; goto out; } else { - bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV; + bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; ret = change_mount_point(bdev, EXTENDED_SD_PATH); if (ret < 0) { ret = -EPERM; @@ -2771,7 +2760,8 @@ static DBusMessage *request_unmount_block(dbus_method_reply_handle_h reply_handl ret = -ENOENT; goto out; } - if (bdev->data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) { + + if (bdev->data->block_type == BLOCK_EXTENDEDSD_DEV) { _I("Impossible to request unmount extended internal sdcard"); ret = -EPERM; goto out; @@ -3275,7 +3265,8 @@ static DBusMessage *request_get_mmc_primary(dbus_method_reply_handle_h reply_han continue; if (bdev->removed) continue; - if (data->block_type != BLOCK_MMC_DEV) + if (data->block_type != BLOCK_MMC_DEV && + data->block_type != BLOCK_EXTENDEDSD_DEV) continue; if (!data->primary) continue; @@ -3417,6 +3408,8 @@ static int load_config(struct parse_result *result, void *user_data) index = BLOCK_SCSI_DEV; else if (MATCH(result->section, "MMC")) index = BLOCK_MMC_DEV; + else if (MATCH(result->section, "Mapper")) + index = BLOCK_EXTENDEDSD_DEV; else return -EINVAL; @@ -3427,11 +3420,6 @@ static int load_config(struct parse_result *result, void *user_data) block_conf[index].extendedinternal = (MATCH(result->value, "yes") ? true : false); - if (index == BLOCK_MMC_DEV) { - block_conf[index + 1].multimount = block_conf[index].multimount; - block_conf[index + 1].extendedinternal = block_conf[index].extendedinternal; - } - return 0; } diff --git a/src/block/block.conf b/src/block/block.conf index a022cf7..d27c779 100644 --- a/src/block/block.conf +++ b/src/block/block.conf @@ -6,3 +6,7 @@ ExtendedInternalStorage=yes # yes or no [SCSI] Multimount=yes # yes or no + +[Mapper] +Multimount=no +ExtendedInternalStorage=yes \ No newline at end of file diff --git a/src/block/block.h b/src/block/block.h index 57b02b5..32a071d 100644 --- a/src/block/block.h +++ b/src/block/block.h @@ -55,7 +55,7 @@ void remove_fs(const struct block_fs_ops *fs); enum block_device_type { BLOCK_SCSI_DEV, BLOCK_MMC_DEV, - BLOCK_MMC_EXTENDED_INTERNAL_DEV, + BLOCK_EXTENDEDSD_DEV, }; enum mount_state { -- 2.7.4 From d6cab28affb12e482ae562f6995bcd02410bafe2 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Tue, 17 Oct 2017 16:41:06 +0900 Subject: [PATCH 05/16] block: Mapper device should not update udev data on format operation Change-Id: I2a7473272e8c6b26d66dd5de4f06879e5b0aa038 Signed-off-by: pr.jung --- src/block/block.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/block/block.c b/src/block/block.c index 24f1a79..36f3929 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -150,6 +150,7 @@ struct format_data { struct block_device *bdev; char *fs_type; enum unmount_operation option; + bool udev_update; }; struct pipe_data { @@ -1463,7 +1464,7 @@ out: static int format_block_device(struct block_device *bdev, const char *fs_type, - enum unmount_operation option) + enum unmount_operation option, bool udev_update) { struct block_data *data; int r; @@ -1484,7 +1485,7 @@ static int format_block_device(struct block_device *bdev, } } - r = block_format(data, fs_type, bdev->mount_point_updated, false); + r = block_format(data, fs_type, bdev->mount_point_updated, udev_update); if (r < 0) _E("fail to format %s device : %d", data->devnode, r); @@ -1499,7 +1500,7 @@ out: } static struct format_data *get_format_data( - const char *fs_type, enum unmount_operation option) + const char *fs_type, enum unmount_operation option, bool udev_update) { struct format_data *fdata; @@ -1514,6 +1515,7 @@ static struct format_data *get_format_data( else fdata->fs_type = NULL; fdata->option = option; + fdata->udev_update = udev_update; return fdata; } @@ -1581,7 +1583,7 @@ static int block_format_device(struct block_device *bdev, void *data) goto out; } - ret = format_block_device(bdev, fdata->fs_type, fdata->option); + ret = format_block_device(bdev, fdata->fs_type, fdata->option, fdata->udev_update); if (ret < 0) _E("fail to mount block device for %s", bdev->data->devnode); @@ -2169,9 +2171,18 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m pthread_mutex_unlock(&(th_manager[thread_id].mutex)); if (need_format) { - ret = block_format(bdev->data, EXT4_NAME, false, false); + struct format_data *fdata; + + fdata = get_format_data(NULL, 1, false); + if (!fdata) { + _E("Failed to get format data"); + return -ENOMEM; + } + + ret = add_operation(bdev, BLOCK_DEV_FORMAT, NULL, (void *)fdata); if (ret < 0) { _E("Failed to add operation (format %s)", bdev->data->devnode); + release_format_data(fdata); } } @@ -2840,7 +2851,7 @@ static DBusMessage *request_format_block(dbus_method_reply_handle_h reply_handle goto out; } - fdata = get_format_data(NULL, option); + fdata = get_format_data(NULL, option, true); if (!fdata) { _E("Failed to get format data"); goto out; @@ -2916,7 +2927,7 @@ static DBusMessage *request_format_block_type(dbus_method_reply_handle_h reply_h goto out; } - fdata = get_format_data(type, option); + fdata = get_format_data(type, option, true); if (!fdata) { _E("Failed to get format data"); goto out; -- 2.7.4 From 84f5b9aba3f8c648119b383b164d66cbd9ca6ced Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Mon, 16 Oct 2017 18:23:06 +0900 Subject: [PATCH 06/16] app: Need to launch app with launch option - Can skip portable / extended internal selection page Change-Id: Ib4d1dc7e06c65ad6bccb8779c47ca271b391a352 Signed-off-by: pr.jung --- apps/extended-sd/src/extended-sd-main.c | 21 +++++++++++++++++++-- src/shared/dbus_macro.h | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/apps/extended-sd/src/extended-sd-main.c b/apps/extended-sd/src/extended-sd-main.c index 8bff947..d4065ea 100644 --- a/apps/extended-sd/src/extended-sd-main.c +++ b/apps/extended-sd/src/extended-sd-main.c @@ -3,6 +3,9 @@ #include "log-util.h" #include "dbus-call.h" +#define SETUP_EXTENDED "EXTENDED_STORAGE_SETUP" +#define SETUP_EXTERNAL "EXTERNAL_STORAGE_SETUP" + static void win_delete_request_cb(void *data, Evas_Object *obj, void *event_info) { @@ -42,8 +45,6 @@ create_base_gui(appdata_s *ad) /* Show window after base gui is set up */ evas_object_show(ad->win); - create_home_page_base_layout(ad); - FUNC_END(); } @@ -82,6 +83,9 @@ app_control(app_control_h app_control, void *data) int int_id; int ret; + char *type = NULL; + int len; + app_control_get_extra_data(app_control, POPUP_SDCARD_ID, &id); if (!id) { ad->storage_id = -1; @@ -93,6 +97,19 @@ app_control(app_control_h app_control, void *data) ad->storage_id = atoi(id); register_signal_handler(ad); + len = strlen(SETUP_EXTENDED) + 1; + app_control_get_extra_data(app_control, SDCARD_SETUP_TYPE, &type); + if (!type) { + DMSG("No setup type"); + create_home_page_base_layout(ad); + } else if (!strncmp(type, SETUP_EXTENDED, len)) { + DMSG("selected USE_AS_INTERNAL_STORAGE"); + create_internal_storage_page_base_layout(ad); + } else if (!strncmp(type, SETUP_EXTERNAL, len)) { + DMSG("selected USE_AS_PORTABLE_STORAGE"); + create_portable_storage_page_base_layout(ad); + } else + create_home_page_base_layout(ad); snprintf(str_id, sizeof(str_id), "%d", ad->storage_id); arr[0] = str_id; diff --git a/src/shared/dbus_macro.h b/src/shared/dbus_macro.h index 3d70090..76f54a8 100755 --- a/src/shared/dbus_macro.h +++ b/src/shared/dbus_macro.h @@ -90,5 +90,6 @@ #define POPUP_METHOD_LAUNCH "PopupLaunch" #define POPUP_KEY_CONTENT "_SYSPOPUP_CONTENT_" #define POPUP_SDCARD_ID "_SDCARD_NUM_" +#define SDCARD_SETUP_TYPE "_SDCARD_SETUP_TYPE_" #endif /* __STORAGED_DBUS_MACRO_H__ */ -- 2.7.4 From 6c03b8060a03e42b29ed18866225d410799931f9 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Mon, 16 Oct 2017 19:08:43 +0900 Subject: [PATCH 07/16] app: Launch org.tizen.ode for encryption and get signal for mapper node from storaged - Launch org.tizen.ode for extended internal storage encryption - Wait for mapper node mounted signal (DeviceChanged) Change-Id: I592795cd7249114c2994ab22f5ed3e259e8b1bae Signed-off-by: pr.jung --- apps/extended-sd/CMakeLists.txt | 1 + apps/extended-sd/include/extended-sd-main.h | 9 +++ apps/extended-sd/src/dbus-call.c | 95 +------------------------ apps/extended-sd/src/es-internal-storage-page.c | 81 +++++++++++---------- apps/extended-sd/src/es-portable-storage-page.c | 3 + apps/extended-sd/src/extended-sd-main.c | 33 +++++++-- packaging/storaged.spec | 1 + 7 files changed, 83 insertions(+), 140 deletions(-) diff --git a/apps/extended-sd/CMakeLists.txt b/apps/extended-sd/CMakeLists.txt index c1b3a7e..9c8b6fa 100755 --- a/apps/extended-sd/CMakeLists.txt +++ b/apps/extended-sd/CMakeLists.txt @@ -24,6 +24,7 @@ pkg_check_modules(pkgs REQUIRED capi-system-system-settings efl-extension capi-appfw-app-control + storage ) FIND_LIBRARY(LIB_M m) diff --git a/apps/extended-sd/include/extended-sd-main.h b/apps/extended-sd/include/extended-sd-main.h index b89b062..406e79a 100644 --- a/apps/extended-sd/include/extended-sd-main.h +++ b/apps/extended-sd/include/extended-sd-main.h @@ -6,6 +6,8 @@ #include #include #include +#include + //#include //#include @@ -18,6 +20,11 @@ #define UNMOUNT_FORCE 1 #define MYFILES_APP_ID "org.tizen.myfile" +#define SECURITY_APP_ID "org.tizen.ode" +#define VIEWTYPE_KEY "viewtype" +#define DEVPATH_KEY "dev_path" +#define ENCRYPT_EXTENSION "ENCRYPT_EXTENSION" +#define MAPPING_NODE_KEY "mapping_node" typedef enum { USE_AS_PORTABLE_STORAGE = 0, @@ -82,4 +89,6 @@ void apply_theme_extension(); Evas_Object* create_image(Evas_Object* parent, char* image_path); void load_font_color_table(); +void mapper_device_cb(int id, storage_dev_e dev, storage_state_e state, const char *fstype, const char *fsuuid, const char *mount_point, bool primary, int flags, void *user_data); + #endif /* __EXTENDED_SD_MAIN_H__ */ diff --git a/apps/extended-sd/src/dbus-call.c b/apps/extended-sd/src/dbus-call.c index c13e210..01360d7 100644 --- a/apps/extended-sd/src/dbus-call.c +++ b/apps/extended-sd/src/dbus-call.c @@ -43,7 +43,6 @@ struct proxy_node { static GList *proxy_pool; static pthread_mutex_t dmutex = PTHREAD_MUTEX_INITIALIZER; static int bus_init; -static guint signal_id = 0; static int g_dbus_error_to_errno(int code) { @@ -408,96 +407,4 @@ int dbus_method_async_with_reply(const char *dest, const char *path, pthread_mutex_unlock(&dmutex); return 0; -} - -static GDBusConnection *get_dbus_connection(void) -{ - GError *err = NULL; - static GDBusConnection *conn; - - conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err); - if (!conn) { - if (err) - _D("Fail to get dbus connection: %s", err->message); - else - _D("Fail to get dbus connection"); - return NULL; - } - - return conn; -} - -static void storage_signal_callback(GDBusConnection *conn, - const gchar *sender, - const gchar *path, - const gchar *iface, - const gchar *signal, - GVariant *params, - gpointer user_data) -{ - size_t iface_len, signal_len; - appdata_s *ad = (appdata_s *)user_data; - int id; - - if (!params || !sender || !path || !iface || !signal) - return; - - iface_len = strlen(iface) + 1; - signal_len = strlen(signal) + 1; - - if (strncmp(iface, STORAGED_INTERFACE_BLOCK_MANAGER, iface_len)) - return; - - if (strncmp(signal, "DeviceRemoved", signal_len)) - return; - - g_variant_get(params, "(issssssisibii)", NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &id); - if (id == ad->storage_id) { - DMSG("Storage is removed"); - ui_app_exit(); - } -} - -int register_signal_handler(appdata_s *ad) -{ - GDBusConnection *conn; - - conn = get_dbus_connection(); - if (!conn) { - _E("Failed to get dbus connection"); - return -EPERM; - } - - signal_id = g_dbus_connection_signal_subscribe(conn, - NULL, - STORAGED_INTERFACE_BLOCK_MANAGER, - NULL, - NULL, - NULL, - G_DBUS_SIGNAL_FLAGS_NONE, - storage_signal_callback, - ad, - NULL); - if (signal_id == 0) { - _E("Failed to subscrive bus signal"); - return -EPERM; - } - - return 0; -} - -int unregister_signal_handler() -{ - GDBusConnection *conn; - - conn = get_dbus_connection(); - if (!conn) { - _E("Failed to get dbus connection"); - return -EPERM; - } - - g_dbus_connection_signal_unsubscribe(conn, signal_id); - - return 0; -} +} \ No newline at end of file diff --git a/apps/extended-sd/src/es-internal-storage-page.c b/apps/extended-sd/src/es-internal-storage-page.c index 5ebc14c..0be6fd9 100644 --- a/apps/extended-sd/src/es-internal-storage-page.c +++ b/apps/extended-sd/src/es-internal-storage-page.c @@ -43,42 +43,36 @@ static Evas_Object* create_page_3(appdata_s* ad); static Evas_Object* create_page_4(appdata_s* ad); static Evas_Object* create_page_5(appdata_s* ad); -static void -format_done(void *data, GVariant *result, GError *err) +void +mapper_device_cb(int id, storage_dev_e dev, storage_state_e state, + const char *fstype, const char *fsuuide, const char *mount_point, + bool primary, int flags, void *user_data) { - appdata_s* ad = (appdata_s*)data; - char str_id[32]; - char *arr[2]; - int ret; - FUNC_BEGIN(); + appdata_s* ad = (appdata_s*)user_data; + ret_if(ad == NULL); - ret_if(result == NULL); - g_variant_get(result, "(i)", &ret); - if (ret < 0) { - DMSG("Failed to format sd card as portable storage: %d", ret); + //TODO This supports only one extended internal storage and one sdcard slot. + // What if sdcard #1 is setting on extended internal storage, + // and another sdcard #2 is inserted and then #1 is removed? + if (dev != STORAGE_DEV_EXTENDED_INTERNAL) { + DMSG("Not mapper device"); return; } - snprintf(str_id, sizeof(str_id), "%d", ad->storage_id); - arr[0] = str_id; - arr[1] = "ExtendedInternalSD"; - - ret = dbus_method_sync(STORAGED_BUS_NAME, - STORAGED_PATH_BLOCK_MANAGER, STORAGED_INTERFACE_BLOCK_MANAGER, "Mount", "is", arr); - if (ret < 0) { - DMSG("Failed to mount sd card as extended internal storage: %d", ret); + // Do not deal with STORAGE_STATE_UNMOUNTABLE. Because of Format operation also emits signals with STORAGE_STATE_UNMOUNTABLE. + if (state == STORAGE_STATE_REMOVED) { + DMSG("Storage is removed"); + ui_app_exit(); + } else if (state == STORAGE_STATE_UNMOUNTABLE) return; - } Evas_Object* page_content = elm_object_part_content_unset(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content"); EVAS_OBJECT_DEL(page_content); page_content = create_page_5(ad); elm_object_part_content_set(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content", page_content); - - g_variant_unref(result); FUNC_END(); } @@ -87,10 +81,8 @@ encryption_format(void *data) { FUNC_BEGIN(); + app_control_h app_control = NULL; appdata_s* ad = (appdata_s*)data; - char str_id[32]; - char str_option[32]; - char *arr[3]; int ret; ret_if(ad == NULL); @@ -100,22 +92,26 @@ encryption_format(void *data) page_content = create_page_4(ad); elm_object_part_content_set(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content", page_content); - snprintf(str_id, sizeof(str_id), "%d", ad->storage_id); - arr[0] = str_id; - snprintf(str_option, sizeof(str_option), "%d", UNMOUNT_FORCE); - arr[1] = str_option; - arr[2] = "ext4"; - ret = dbus_method_async_with_reply(STORAGED_BUS_NAME, - STORAGED_PATH_BLOCK_MANAGER, - STORAGED_INTERFACE_BLOCK_MANAGER, - "FormatwithType", - "iis", - arr, - format_done, - 120000, // ms - ad); - if (ret < 0) - DMSG("Failed to format", ret); + ret = app_control_create(&app_control); + if (ret != APP_CONTROL_ERROR_NONE) + return; + + app_control_add_extra_data(app_control, VIEWTYPE_KEY, ENCRYPT_EXTENSION); + app_control_add_extra_data(app_control, DEVPATH_KEY, "/dev/mmcblk1"); + app_control_add_extra_data(app_control, MAPPING_NODE_KEY, "extendedsd"); + ret = app_control_set_app_id(app_control, SECURITY_APP_ID); + if (ret != APP_CONTROL_ERROR_NONE) { + app_control_destroy(app_control); + return; + } + + app_control_set_launch_mode(app_control, APP_CONTROL_LAUNCH_MODE_GROUP); + + ret = app_control_send_launch_request(app_control, NULL, ad); + if (ret != APP_CONTROL_ERROR_NONE) + DMSG_ERR("app_control_send_launch_request() is failed err = %d", ret); + + app_control_destroy(app_control); FUNC_END(); } @@ -210,6 +206,9 @@ _move_files_button_click_cb(void *data, Evas_Object* obj, void *event_info) } ret = app_control_send_launch_request(app_control, NULL, NULL); + if (ret != APP_CONTROL_ERROR_NONE) + DMSG_ERR("app_control_send_launch_request() is failed err = %d", ret); + app_control_destroy(app_control); FUNC_END(); diff --git a/apps/extended-sd/src/es-portable-storage-page.c b/apps/extended-sd/src/es-portable-storage-page.c index 41a3141..0947fca 100644 --- a/apps/extended-sd/src/es-portable-storage-page.c +++ b/apps/extended-sd/src/es-portable-storage-page.c @@ -128,6 +128,9 @@ _move_button_click_cb(void *data, Evas_Object* obj, void *event_info) } ret = app_control_send_launch_request(app_control, NULL, NULL); + if (ret != APP_CONTROL_ERROR_NONE) + DMSG_ERR("app_control_send_launch_request() is failed err = %d", ret); + app_control_destroy(app_control); FUNC_END(); diff --git a/apps/extended-sd/src/extended-sd-main.c b/apps/extended-sd/src/extended-sd-main.c index d4065ea..e91db75 100644 --- a/apps/extended-sd/src/extended-sd-main.c +++ b/apps/extended-sd/src/extended-sd-main.c @@ -72,6 +72,23 @@ app_create(void *data) } static void +storage_removed_cb(int id, storage_state_e state, void *user_data) +{ + FUNC_BEGIN(); + + appdata_s *ad = (appdata_s *)user_data; + + ret_if(ad == NULL); + + if (id == ad->storage_id) { + DMSG("Storage is removed"); + ui_app_exit(); + } + + FUNC_END(); +} + +static void app_control(app_control_h app_control, void *data) { /* Handle the launch request. */ @@ -82,20 +99,25 @@ app_control(app_control_h app_control, void *data) char *arr[1]; int int_id; int ret; - char *type = NULL; int len; + ret_if(ad == NULL); + app_control_get_extra_data(app_control, POPUP_SDCARD_ID, &id); if (!id) { ad->storage_id = -1; DMSG("No sdcard id"); - //temp - ad->storage_id = 1; return; } ad->storage_id = atoi(id); - register_signal_handler(ad); + + ret = storage_set_state_changed_cb(ad->storage_id, storage_removed_cb, ad); + if (ret != STORAGE_ERROR_NONE) { + DMSG_ERR("Failed to register signal handler"); + ui_app_exit(); + } + ret = storage_set_changed_cb(STORAGE_TYPE_EXTENDED_INTERNAL, mapper_device_cb, ad); len = strlen(SETUP_EXTENDED) + 1; app_control_get_extra_data(app_control, SDCARD_SETUP_TYPE, &type); @@ -146,10 +168,11 @@ app_terminate(void *data) { FUNC_BEGIN(); - unregister_signal_handler(); appdata_s* ad = (appdata_s*)data; ret_if(ad == NULL); + storage_unset_state_changed_cb(ad->storage_id, storage_removed_cb); + FUNC_END(); } diff --git a/packaging/storaged.spec b/packaging/storaged.spec index 0ec0776..4b5f39a 100644 --- a/packaging/storaged.spec +++ b/packaging/storaged.spec @@ -35,6 +35,7 @@ BuildRequires: pkgconfig(capi-appfw-preference) BuildRequires: pkgconfig(capi-appfw-app-control) BuildRequires: pkgconfig(capi-system-system-settings) BuildRequires: pkgconfig(efl-extension) +BuildRequires: pkgconfig(storage) #For /usr/bin/msgfmt BuildRequires: gettext-tools -- 2.7.4 From e56b76a6d8ffbcbadc8fc60c698fee413d548e4c Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Tue, 17 Oct 2017 20:09:08 +0900 Subject: [PATCH 08/16] Fix for mounting the extended internal storage (/dev/mapper/extendedsd) Change-Id: Icac79f0f46d8f2baf76d0052aaac0a905e2d7985 Signed-off-by: Hyotaek Shim --- src/block/block.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/block/block.c b/src/block/block.c index 36f3929..23e450d 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -2191,8 +2191,6 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m free_block_device(bdev); return -EPERM; } else if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) { - bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; - ret = change_mount_point(bdev, EXTENDED_SD_PATH); if (ret < 0) { ret = -EPERM; free_block_device(bdev); @@ -2207,9 +2205,8 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m ode_luks_set_event_cb(CALLBACK) */ - return 0; - } else if (!strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) { + } else if (mapper && !strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) { bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; ret = change_mount_point(bdev, EXTENDED_SD_PATH); if (ret < 0) { -- 2.7.4 From 3fdd98163e528ddaeaddec8aea08874bee700e11 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Tue, 17 Oct 2017 20:43:30 +0900 Subject: [PATCH 09/16] app: Remove test code - Get Primary mmc id and devpath using dbus method call Change-Id: I0a798bad0dfb7e7ad69e986c81f37c2620c1067d Signed-off-by: pr.jung (cherry picked from commit c670c0e89036d4f96847456b0c8f896c38503fb3) --- apps/extended-sd/include/extended-sd-main.h | 1 + apps/extended-sd/src/es-internal-storage-page.c | 2 +- apps/extended-sd/src/extended-sd-main.c | 30 ++++++++----------------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/apps/extended-sd/include/extended-sd-main.h b/apps/extended-sd/include/extended-sd-main.h index 406e79a..f3f772f 100644 --- a/apps/extended-sd/include/extended-sd-main.h +++ b/apps/extended-sd/include/extended-sd-main.h @@ -58,6 +58,7 @@ typedef struct appdata { internal_storage_page_data_s* internal_storage_page_data; int storage_id; + char *devpath; } appdata_s; #define SAFE_FREE(data) if (data) { free(data); data = NULL; } diff --git a/apps/extended-sd/src/es-internal-storage-page.c b/apps/extended-sd/src/es-internal-storage-page.c index 0be6fd9..711d4ef 100644 --- a/apps/extended-sd/src/es-internal-storage-page.c +++ b/apps/extended-sd/src/es-internal-storage-page.c @@ -97,7 +97,7 @@ encryption_format(void *data) return; app_control_add_extra_data(app_control, VIEWTYPE_KEY, ENCRYPT_EXTENSION); - app_control_add_extra_data(app_control, DEVPATH_KEY, "/dev/mmcblk1"); + app_control_add_extra_data(app_control, DEVPATH_KEY, ad->devpath); app_control_add_extra_data(app_control, MAPPING_NODE_KEY, "extendedsd"); ret = app_control_set_app_id(app_control, SECURITY_APP_ID); if (ret != APP_CONTROL_ERROR_NONE) { diff --git a/apps/extended-sd/src/extended-sd-main.c b/apps/extended-sd/src/extended-sd-main.c index e91db75..b59073f 100644 --- a/apps/extended-sd/src/extended-sd-main.c +++ b/apps/extended-sd/src/extended-sd-main.c @@ -94,24 +94,14 @@ app_control(app_control_h app_control, void *data) /* Handle the launch request. */ GVariant *output; appdata_s *ad = (appdata_s *)data; - char *id = NULL; - char str_id[32]; - char *arr[1]; - int int_id; + int id; int ret; char *type = NULL; + char *devpath; int len; ret_if(ad == NULL); - app_control_get_extra_data(app_control, POPUP_SDCARD_ID, &id); - if (!id) { - ad->storage_id = -1; - DMSG("No sdcard id"); - return; - } - ad->storage_id = atoi(id); - ret = storage_set_state_changed_cb(ad->storage_id, storage_removed_cb, ad); if (ret != STORAGE_ERROR_NONE) { DMSG_ERR("Failed to register signal handler"); @@ -133,21 +123,19 @@ app_control(app_control_h app_control, void *data) } else create_home_page_base_layout(ad); - snprintf(str_id, sizeof(str_id), "%d", ad->storage_id); - arr[0] = str_id; ret = dbus_method_sync_with_reply(STORAGED_BUS_NAME, - STORAGED_PATH_BLOCK_MANAGER, STORAGED_INTERFACE_BLOCK_MANAGER, "GetDeviceInfo", "i", arr, &output); + STORAGED_PATH_BLOCK_MANAGER, STORAGED_INTERFACE_BLOCK_MANAGER, "GetMmcPrimary", NULL, NULL, &output); if (ret < 0) { DMSG("Failed to get storage information: %d", ret); return; } - g_variant_get(output, "(issssssisibii)", NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &int_id); - if (int_id != ad->storage_id) { - DMSG("Storage already removed"); - ui_app_exit(); - } + g_variant_get(output, "(issssssisibii)", NULL, &devpath, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &id); + + DMSG("Get Primary MMC: %d %s", id, devpath); + ad->storage_id = id; + ad->devpath = strdup(devpath); } -- 2.7.4 From 22b694ec443b45c2fab92af28af3f07a37e14589 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Tue, 17 Oct 2017 21:06:25 +0900 Subject: [PATCH 10/16] Fix sleep function waiting for udev properties Change-Id: Ie893ebe310f20bcaab3630c139e1329e0167eed6 Signed-off-by: Hyotaek Shim --- src/block/block.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/block/block.c b/src/block/block.c index 23e450d..8884307 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -1084,6 +1084,7 @@ static int retrieve_udev_device(struct block_data *data, bool mount_point_update struct udev *udev; struct udev_device *dev; int r; + int wait; if (!data) return -EINVAL; @@ -1101,6 +1102,13 @@ static int retrieve_udev_device(struct block_data *data, bool mount_point_update return -EPERM; } + for (wait = 0; wait < 3; wait++) { + if (!udev_device_get_property_value(dev, "ID_FS_TYPE")) + sleep(1); + else + break; + } + r = update_block_data(data, udev_device_get_property_value(dev, "ID_FS_USAGE"), udev_device_get_property_value(dev, "ID_FS_TYPE"), @@ -1451,9 +1459,6 @@ static int block_format(struct block_data *data, goto out; } - /* it takes some seconds til kernel set udev property */ - sleep(2); - /* need to update the partition data. * It can be changed in doing format. */ if (udev_update) @@ -2191,12 +2196,6 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m free_block_device(bdev); return -EPERM; } else if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) { - if (ret < 0) { - ret = -EPERM; - free_block_device(bdev); - return ret; - } - /* ---- ODE UI launch ---- snprintf(id_string, PATH_LEN, "%d", bdev->data->id); ret = launch_system_app(POPUP_DEFAULT, 4, POPUP_KEY_CONTENT, "sdcardsetup", POPUP_SDCARD_ID, id_string); -- 2.7.4 From afd82583b04a4787d56d3caa8e875d71565164e1 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Wed, 18 Oct 2017 15:25:14 +0900 Subject: [PATCH 11/16] app: Need to unmount sdcard before launching encryption app Change-Id: Id01b0888d3b102e350844c2a00c7c6790b9e3a24 Signed-off-by: pr.jung (cherry picked from commit 863659e8fc5e53a0edc780dc2a49f20e2fdf3470) --- apps/extended-sd/src/es-internal-storage-page.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/extended-sd/src/es-internal-storage-page.c b/apps/extended-sd/src/es-internal-storage-page.c index 711d4ef..9047ce7 100644 --- a/apps/extended-sd/src/es-internal-storage-page.c +++ b/apps/extended-sd/src/es-internal-storage-page.c @@ -4,6 +4,8 @@ #include "dbus-call.h" #include "log-util.h" +#define UNMOUNT_FORCE 1 + typedef enum { INTERNAL_STORAGE_ITEM_PAGE_1_HEADING = 0, INTERNAL_STORAGE_ITEM_PAGE_1_PARA_1, @@ -84,6 +86,9 @@ encryption_format(void *data) app_control_h app_control = NULL; appdata_s* ad = (appdata_s*)data; int ret; + char str_id[32]; + char str_option[32]; + char *arr[2]; ret_if(ad == NULL); @@ -92,6 +97,19 @@ encryption_format(void *data) page_content = create_page_4(ad); elm_object_part_content_set(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content", page_content); + // Unmount sdcard + snprintf(str_id, sizeof(str_id), "%d", ad->storage_id); + arr[0] = str_id; + snprintf(str_option, sizeof(str_option), "%d", UNMOUNT_FORCE); + arr[1] = str_option; + + ret = dbus_method_sync(STORAGED_BUS_NAME, + STORAGED_PATH_BLOCK_MANAGER, STORAGED_INTERFACE_BLOCK_MANAGER, "Unmount", "ii", arr); + if (ret < 0) { + DMSG("Failed to mount sd card as portable storage: %d", ret); + return; + } + ret = app_control_create(&app_control); if (ret != APP_CONTROL_ERROR_NONE) return; -- 2.7.4 From af7827ac022ddd88ca46d52d508c0fb0ffcaa7fb Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Thu, 19 Oct 2017 16:47:37 +0900 Subject: [PATCH 12/16] Add dependency to dbus.socket in storaged.service Change-Id: I42fb8b7bdfaaf143ba9cf139df9de73f7b0c5899 Signed-off-by: Hyotaek Shim (cherry picked from commit fe9ff73d99312682c5df4b023f29d65db98ee52a) --- systemd/storaged.service | 1 + 1 file changed, 1 insertion(+) diff --git a/systemd/storaged.service b/systemd/storaged.service index a0b7562..afbe628 100644 --- a/systemd/storaged.service +++ b/systemd/storaged.service @@ -1,5 +1,6 @@ [Unit] Description=System storage daemon +Requires=dbus.socket [Service] Type=notify -- 2.7.4 From 54a7aa6e1575a591dada156d4cf5dd7d5eeb4ab6 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Thu, 19 Oct 2017 16:24:20 +0900 Subject: [PATCH 13/16] block: Launch popup when extended internal storage is inserted - Popup launchs ode ui for password Change-Id: I872c3f52993022d23f1e35670f45c9a9946d7bdd Signed-off-by: pr.jung (cherry picked from commit e1442c70e678b4c29cbabc04fdc9cba98a679c93) --- apps/extended-sd/include/extended-sd-main.h | 3 --- src/block/block.c | 11 ++++++----- src/shared/dbus_macro.h | 4 ++++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/extended-sd/include/extended-sd-main.h b/apps/extended-sd/include/extended-sd-main.h index f3f772f..3cdbd2b 100644 --- a/apps/extended-sd/include/extended-sd-main.h +++ b/apps/extended-sd/include/extended-sd-main.h @@ -21,10 +21,7 @@ #define MYFILES_APP_ID "org.tizen.myfile" #define SECURITY_APP_ID "org.tizen.ode" -#define VIEWTYPE_KEY "viewtype" -#define DEVPATH_KEY "dev_path" #define ENCRYPT_EXTENSION "ENCRYPT_EXTENSION" -#define MAPPING_NODE_KEY "mapping_node" typedef enum { USE_AS_PORTABLE_STORAGE = 0, diff --git a/src/block/block.c b/src/block/block.c index 8884307..fcbb236 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -2196,14 +2196,15 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m free_block_device(bdev); return -EPERM; } else if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) { - /* ---- ODE UI launch ---- - snprintf(id_string, PATH_LEN, "%d", bdev->data->id); - ret = launch_system_app(POPUP_DEFAULT, 4, POPUP_KEY_CONTENT, "sdcardsetup", POPUP_SDCARD_ID, id_string); + bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; + _D("Need to unlock encrypted sdcard"); + // ---- ODE UI launch ---- + ret = launch_system_app(POPUP_DEFAULT, 8, POPUP_KEY_CONTENT, "unlockextendedsd", VIEWTYPE_KEY, INSERT_SD_CARD, DEVPATH_KEY, bdev->data->devnode, MAPPING_NODE_KEY, EXTENDEDSD); if (ret < 0) _E("Failed to launch popup"); - ode_luks_set_event_cb(CALLBACK) - */ + //ode_luks_set_event_cb(CALLBACK) + return 0; } else if (mapper && !strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) { bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; diff --git a/src/shared/dbus_macro.h b/src/shared/dbus_macro.h index 76f54a8..edaf1e4 100755 --- a/src/shared/dbus_macro.h +++ b/src/shared/dbus_macro.h @@ -90,6 +90,10 @@ #define POPUP_METHOD_LAUNCH "PopupLaunch" #define POPUP_KEY_CONTENT "_SYSPOPUP_CONTENT_" #define POPUP_SDCARD_ID "_SDCARD_NUM_" +#define VIEWTYPE_KEY "viewtype" +#define DEVPATH_KEY "dev_path" +#define MAPPING_NODE_KEY "mapping_node" #define SDCARD_SETUP_TYPE "_SDCARD_SETUP_TYPE_" +#define INSERT_SD_CARD "INSERT_SD_CARD" #endif /* __STORAGED_DBUS_MACRO_H__ */ -- 2.7.4 From 4f1b6d390c965e0c1e6fe78d8dc20034276d78e9 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Thu, 19 Oct 2017 20:07:14 +0900 Subject: [PATCH 14/16] Remove MS_NOEXEC option from ext4 mount for extended internal storage Change-Id: Ia6a0947427a68323df24e3e32cc38d2ab4f98375 Signed-off-by: Hyotaek Shim --- src/block/block.c | 3 ++- src/block/ext4.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/block/block.c b/src/block/block.c index fcbb236..b76d2a4 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -98,6 +98,7 @@ #define EXT4_NAME "ext4" #define LUKS_NAME "crypto_LUKS" +#define EXTENDEDSD_NAME "extendedsd" /* Minimum value of block id */ #define BLOCK_ID_MIN 10 @@ -2199,7 +2200,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; _D("Need to unlock encrypted sdcard"); // ---- ODE UI launch ---- - ret = launch_system_app(POPUP_DEFAULT, 8, POPUP_KEY_CONTENT, "unlockextendedsd", VIEWTYPE_KEY, INSERT_SD_CARD, DEVPATH_KEY, bdev->data->devnode, MAPPING_NODE_KEY, EXTENDEDSD); + ret = launch_system_app(POPUP_DEFAULT, 8, POPUP_KEY_CONTENT, "unlockextendedsd", VIEWTYPE_KEY, INSERT_SD_CARD, DEVPATH_KEY, bdev->data->devnode, MAPPING_NODE_KEY, EXTENDEDSD_NAME); if (ret < 0) _E("Failed to launch popup"); diff --git a/src/block/ext4.c b/src/block/ext4.c index 2e79c34..f05b160 100644 --- a/src/block/ext4.c +++ b/src/block/ext4.c @@ -117,7 +117,7 @@ static int ext4_mount(bool smack, const char *devpath, const char *mount_point) { int r, retry = RETRY_COUNT; struct timespec time = {0,}; - unsigned long mountflags = MS_NOSUID | MS_NOEXEC | MS_NODEV | MS_DIRSYNC; + unsigned long mountflags = MS_NOSUID | MS_NODEV | MS_DIRSYNC; do { r = mount(devpath, mount_point, "ext4", mountflags, NULL); -- 2.7.4 From 71157fc2f8cc5cb5c31e107c8e7c20fb05d0a310 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Thu, 19 Oct 2017 14:53:49 +0900 Subject: [PATCH 15/16] block: Unmount mapper node when extended internal storage is removed Change-Id: I4176eaa2b5419aff67ba400734369acb3b6514d6 Signed-off-by: pr.jung Signed-off-by: Hyotaek Shim --- CMakeLists.txt | 1 + packaging/storaged.spec | 1 + src/block/CMakeLists.txt | 3 +- src/block/block.c | 115 ++++++++++++++++++++++------- src/block/block.h | 2 +- src/block/ext4.c | 3 +- src/block/mmc.c | 2 +- src/block/utils.c | 2 +- src/block/vfat.c | 2 +- src/shared/common.c | 2 +- src/shared/{common.h => storaged_common.h} | 0 src/storage/CMakeLists.txt | 2 +- 12 files changed, 101 insertions(+), 34 deletions(-) rename src/shared/{common.h => storaged_common.h} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 97096df..d9c2e2c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ SET(PKG_MODULES libtzplatform-config libudev vconf + ode ) ADD_DEFINITIONS("-DLIBPATH=\"${LIB_INSTALL_DIR}\"") diff --git a/packaging/storaged.spec b/packaging/storaged.spec index 4b5f39a..4c64e6c 100644 --- a/packaging/storaged.spec +++ b/packaging/storaged.spec @@ -36,6 +36,7 @@ BuildRequires: pkgconfig(capi-appfw-app-control) BuildRequires: pkgconfig(capi-system-system-settings) BuildRequires: pkgconfig(efl-extension) BuildRequires: pkgconfig(storage) +BuildRequires: pkgconfig(ode) #For /usr/bin/msgfmt BuildRequires: gettext-tools diff --git a/src/block/CMakeLists.txt b/src/block/CMakeLists.txt index c58a78c..4445a6c 100644 --- a/src/block/CMakeLists.txt +++ b/src/block/CMakeLists.txt @@ -14,6 +14,7 @@ pkg_check_modules(${PROJECT_NAME}_pkgs REQUIRED libtzplatform-config vconf capi-system-device + ode ) FOREACH(flag ${${PROJECT_NAME}_pkgs_CFLAGS}) @@ -28,7 +29,7 @@ IF(BLOCK_TMPFS STREQUAL on) ADD_DEFINITIONS("-DBLOCK_TMPFS") ENDIF(BLOCK_TMPFS STREQUAL on) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/share) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/shared) FILE(GLOB ALL_SRCS "*.c") SET(SRCS ${ALL_SRCS}) diff --git a/src/block/block.c b/src/block/block.c index b76d2a4..baacbc1 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "log.h" #include "config-parser.h" @@ -55,22 +56,22 @@ /** * TODO Assume root device is always mmcblk0*. */ -#define MMC_PATH "*/mmcblk[0-9]*" -#define MMC_PARTITION_PATH "mmcblk[0-9]p[0-9]" +#define MMC_PATH "*/mmcblk[0-9]*" +#define MMC_PARTITION_PATH "mmcblk[0-9]p[0-9]" /* Emulator send devlink for sdcard as \*\/sdcard\/\* */ -#define MMC_LINK_PATH "*/sdcard/*" -#define SCSI_PATH "*/sd[a-z]*" -#define SCSI_PARTITION_PATH "sd[a-z][0-9]" -#define SCSI_PARTITION_LENGTH 9 -#define EXTENDEDSD_PATH "/dev/mapper/extendedsd*" +#define MMC_LINK_PATH "*/sdcard/*" +#define SCSI_PATH "*/sd[a-z]*" +#define SCSI_PARTITION_PATH "sd[a-z][0-9]" +#define SCSI_PARTITION_LENGTH 9 +#define EXTENDEDSD_NODE_PATH "/dev/mapper/extendedsd*" -#define FILESYSTEM "filesystem" +#define FILESYSTEM "filesystem" -#define DEV_PREFIX "/dev/" -#define ROOT_DIR "/" +#define DEV_PREFIX "/dev/" +#define ROOT_DIR "/" -#define UNMOUNT_RETRY 5 -#define TIMEOUT_MAKE_OBJECT 500 /* milliseconds */ +#define UNMOUNT_RETRY 5 +#define TIMEOUT_MAKE_OBJECT 500 /* milliseconds */ #define SIGNAL_POWEROFF_STATE "ChangeState" @@ -93,8 +94,8 @@ #define EXTENDED_INTERNAL_PATH "/run/extended-internal-sd" #define PATH_LEN 55 -#define EXTENDED_SD_PATH "/opt/extendedsd" -#define EXTENDED_SD_STRING "ExtendedInternalSD" +#define EXTENDEDSD_MOUNT_POINT "/opt/extendedsd" +#define EXTENDEDSD_STRING "ExtendedInternalSD" #define EXT4_NAME "ext4" #define LUKS_NAME "crypto_LUKS" @@ -570,7 +571,7 @@ static char *generate_mount_path(struct block_data *data) ret = get_scsi_mount_node(name, node, sizeof(node)); break; case BLOCK_EXTENDEDSD_DEV: - return strdup(EXTENDED_SD_PATH); + return strdup(EXTENDEDSD_MOUNT_POINT); default: _E("Invalid block type (%d)", data->block_type); return NULL; @@ -606,7 +607,7 @@ static bool check_primary_partition(const char *devnode) if (fnmatch(MMC_LINK_PATH, devnode, 0) && fnmatch(MMC_PATH, devnode, 0) && fnmatch(SCSI_PATH, devnode, 0) && - fnmatch(EXTENDEDSD_PATH, devnode, 0)) + fnmatch(EXTENDEDSD_NODE_PATH, devnode, 0)) return false; temp = strrchr(devnode, '/'); @@ -705,7 +706,7 @@ static struct block_data *make_block_data(const char *devnode, data->block_type = BLOCK_MMC_DEV; else if (!fnmatch(SCSI_PATH, devnode, 0)) data->block_type = BLOCK_SCSI_DEV; - else if (!fnmatch(EXTENDEDSD_PATH, devnode, 0)) + else if (!fnmatch(EXTENDEDSD_NODE_PATH, devnode, 0)) data->block_type = BLOCK_EXTENDEDSD_DEV; else data->block_type = -1; @@ -861,6 +862,30 @@ static struct block_device *find_block_device(const char *devnode) return NULL; } +// Called By MainThread - Remove Device +static struct block_device *find_block_device_path(const char *mount_point) +{ + struct block_device *bdev; + dd_list *elem; + int len; + int i; + + len = strlen(mount_point) + 1; + for (i = 0; i < THREAD_MAX; i++) { + pthread_mutex_lock(&(th_manager[i].mutex)); + DD_LIST_FOREACH(th_manager[i].block_dev_list, elem, bdev) { + if (bdev->data && !bdev->removed && + !strncmp(bdev->data->mount_point, mount_point, len)) { + pthread_mutex_unlock(&(th_manager[i].mutex)); + return bdev; + } + } + pthread_mutex_unlock(&(th_manager[i].mutex)); + } + + return NULL; +} + // Called By MainThread - Mount,Unmount,Format,GetInfo static struct block_device *find_block_device_by_id(int id) { @@ -2200,16 +2225,23 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; _D("Need to unlock encrypted sdcard"); // ---- ODE UI launch ---- - ret = launch_system_app(POPUP_DEFAULT, 8, POPUP_KEY_CONTENT, "unlockextendedsd", VIEWTYPE_KEY, INSERT_SD_CARD, DEVPATH_KEY, bdev->data->devnode, MAPPING_NODE_KEY, EXTENDEDSD_NAME); + ret = launch_system_app(POPUP_DEFAULT + , 8 + , POPUP_KEY_CONTENT + , "unlockextendedsd" + , VIEWTYPE_KEY + , INSERT_SD_CARD + , DEVPATH_KEY + , bdev->data->devnode + , MAPPING_NODE_KEY + , EXTENDEDSD_NAME); if (ret < 0) _E("Failed to launch popup"); - //ode_luks_set_event_cb(CALLBACK) - return 0; } else if (mapper && !strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) { bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; - ret = change_mount_point(bdev, EXTENDED_SD_PATH); + ret = change_mount_point(bdev, EXTENDEDSD_MOUNT_POINT); if (ret < 0) { ret = -EPERM; free_block_device(bdev); @@ -2243,6 +2275,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m static int remove_block_device(struct udev_device *dev, const char *devnode) { struct block_device *bdev; + struct block_device *bdev_extended; int ret; bdev = find_block_device(devnode); @@ -2259,6 +2292,38 @@ static int remove_block_device(struct udev_device *dev, const char *devnode) _D("Private operation state: %d", bdev->on_private_op); } + if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) { + bdev_extended = find_block_device_path(EXTENDEDSD_MOUNT_POINT); + if (bdev_extended) { + BLOCK_FLAG_SET(bdev_extended->data, UNMOUNT_UNSAFE); + + bdev_extended->removed = true; + if (bdev_extended->on_private_op != REQ_NORMAL) { + bdev_extended->on_private_op = REQ_NORMAL; + _D("Private operation state: %d", bdev_extended->on_private_op); + } + + ret = add_operation(bdev_extended, BLOCK_DEV_UNMOUNT, NULL, (void *)UNMOUNT_FORCE); + if (ret < 0) { + _E("Failed to add operation (unmount %s)", devnode); + return ret; + } + + ret = add_operation(bdev_extended, BLOCK_DEV_REMOVE, NULL, NULL); + if (ret < 0) { + _E("Failed to add operation (remove %s)", devnode); + return ret; + } + + ret = ode_luks_close(EXTENDEDSD_NAME); + if (ret < 0) { + _E("Failed on ode_luks_close(%s)", EXTENDEDSD_NAME); + return ret; + } + } else + _E("fail to find block data for extended sd card"); + } + ret = add_operation(bdev, BLOCK_DEV_UNMOUNT, NULL, (void *)UNMOUNT_FORCE); if (ret < 0) { _E("Failed to add operation (unmount %s)", devnode); @@ -2461,7 +2526,7 @@ static int block_init_from_udev_enumerate(void) if (fnmatch(MMC_PATH, devnode, 0) && fnmatch(SCSI_PATH, devnode, 0) && - fnmatch(EXTENDEDSD_PATH, devnode, 0)) + fnmatch(EXTENDEDSD_NODE_PATH, devnode, 0)) continue; } @@ -2601,7 +2666,7 @@ static void uevent_block_handler(struct udev_device *dev) devnode = devlink; break; } - if (!fnmatch(EXTENDEDSD_PATH, devlink, 0)) { + if (!fnmatch(EXTENDEDSD_NODE_PATH, devlink, 0)) { mapper = true; devnode = devlink; break; @@ -2690,7 +2755,7 @@ static DBusMessage *request_mount_block(dbus_method_reply_handle_h reply_handle, /* if requester want to use a specific mount point */ if (mount_point && - !strncmp(mount_point, EXTENDED_SD_STRING, strlen(EXTENDED_SD_STRING) + 1) != 0) { + !strncmp(mount_point, EXTENDEDSD_STRING, strlen(EXTENDEDSD_STRING) + 1) != 0) { if (!block_conf[bdev->data->block_type].extendedinternal || !bdev->data->primary) { _E("Not support extended internal storage"); @@ -2698,7 +2763,7 @@ static DBusMessage *request_mount_block(dbus_method_reply_handle_h reply_handle, goto out; } else { bdev->data->block_type = BLOCK_EXTENDEDSD_DEV; - ret = change_mount_point(bdev, EXTENDED_SD_PATH); + ret = change_mount_point(bdev, EXTENDEDSD_MOUNT_POINT); if (ret < 0) { ret = -EPERM; goto out; diff --git a/src/block/block.h b/src/block/block.h index 32a071d..658bf89 100644 --- a/src/block/block.h +++ b/src/block/block.h @@ -21,7 +21,7 @@ #define __BLOCK_H__ #include -#include "common.h" +#include "storaged_common.h" #define SMACKFS_MOUNT_OPT "smackfsroot=*,smackfsdef=*" diff --git a/src/block/ext4.c b/src/block/ext4.c index f05b160..1141794 100644 --- a/src/block/ext4.c +++ b/src/block/ext4.c @@ -16,7 +16,6 @@ * limitations under the License. */ - #include #include #include @@ -28,7 +27,7 @@ #include #include -#include "common.h" +#include "storaged_common.h" #include "log.h" #include "block.h" diff --git a/src/block/mmc.c b/src/block/mmc.c index 80ec367..94cdd1b 100644 --- a/src/block/mmc.c +++ b/src/block/mmc.c @@ -23,7 +23,7 @@ #include #include "log.h" -#include "common.h" +#include "storaged_common.h" #include "block.h" static void mmc_update_state(int state) diff --git a/src/block/utils.c b/src/block/utils.c index 086f8e0..0f3ef34 100644 --- a/src/block/utils.c +++ b/src/block/utils.c @@ -36,8 +36,8 @@ #include #include #include +#include "storaged_common.h" #include "log.h" -#include "common.h" int print_open_files(const char *mount_point) { diff --git a/src/block/vfat.c b/src/block/vfat.c index 4ed6f3e..d66ef0f 100644 --- a/src/block/vfat.c +++ b/src/block/vfat.c @@ -25,7 +25,7 @@ #include #include -#include "common.h" +#include "storaged_common.h" #include "log.h" #include "block.h" diff --git a/src/shared/common.c b/src/shared/common.c index 21a7ddc..76713ef 100644 --- a/src/shared/common.c +++ b/src/shared/common.c @@ -39,7 +39,7 @@ #include #include #include "log.h" -#include "common.h" +#include "storaged_common.h" #define MODEL_NAME "http://tizen.org/system/model_name" diff --git a/src/shared/common.h b/src/shared/storaged_common.h similarity index 100% rename from src/shared/common.h rename to src/shared/storaged_common.h diff --git a/src/storage/CMakeLists.txt b/src/storage/CMakeLists.txt index e2aea8b..f3bac89 100644 --- a/src/storage/CMakeLists.txt +++ b/src/storage/CMakeLists.txt @@ -19,7 +19,7 @@ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wall -Werror -fvisibility=hidden -rdynamic") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC") SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/share) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/shared) FILE(GLOB ALL_SRCS "*.c") SET(SRCS ${ALL_SRCS}) -- 2.7.4 From 1ad550fdb3130ca26f2391da6fd019e9149e5228 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Tue, 24 Oct 2017 15:23:52 +0900 Subject: [PATCH 16/16] Update bdev properties on UDEV_CHANGE Change-Id: I0e701c3aee78f372a65d1286e5a6d286dc95c66d Signed-off-by: Hyotaek Shim --- src/block/block.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/block/block.c b/src/block/block.c index baacbc1..24a1540 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -2703,6 +2703,25 @@ static void uevent_block_handler(struct udev_device *dev) add_block_device(dev, devnode, mapper); } else if (!strncmp(action, UDEV_REMOVE, sizeof(UDEV_REMOVE))) { remove_block_device(dev, devnode); + } else if (!strncmp(action, UDEV_CHANGE, sizeof(UDEV_CHANGE))) { + struct block_device *bdev; + bdev = find_block_device(devnode); + if (!bdev) { + _E("fail to find block data for %s", devnode); + return; + } + if (!udev_device_get_property_value(dev, "ID_FS_TYPE")) + return; + + r = update_block_data(bdev->data, + udev_device_get_property_value(dev, "ID_FS_USAGE"), + udev_device_get_property_value(dev, "ID_FS_TYPE"), + udev_device_get_property_value(dev, "ID_FS_VERSION"), + udev_device_get_property_value(dev, "ID_FS_UUID_ENC"), + udev_device_get_sysattr_value(dev, "ro"), + false); + if (r < 0) + _E("fail to update block data for %s", bdev->data->devnode); } } -- 2.7.4