From c7a0e5308d96e3750867d52329febe971dd1cb1d Mon Sep 17 00:00:00 2001 From: INSUN PYO Date: Fri, 29 Sep 2017 13:04:19 +0900 Subject: [PATCH 01/16] Coverity fixes. Signed-off-by: INSUN PYO Change-Id: I0e0745dbbd84ed7e76f5eb0ff4211c127dfd7687 --- src/block/block.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/block/block.c b/src/block/block.c index e3717d6..bc8e798 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -2127,6 +2127,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i if (!block_conf[data->block_type].multimount && !data->primary) { _D("Not support multi mount by config info"); + free_block_data(data); return -EPERM; } -- 2.7.4 From 5363dabb92fa99fc07d34a1ee95ef453995b61cb Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Tue, 10 Oct 2017 11:22:01 +0900 Subject: [PATCH 02/16] Add "Requires: %{name}-org.tizen.extended-sd" Change-Id: I1efc633404818c65530f4142770466f030166fdb Signed-off-by: Hyotaek Shim (cherry picked from commit f7aafc6095ba447bd99c621645a86609bd83199d) --- packaging/storaged.spec | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packaging/storaged.spec b/packaging/storaged.spec index 046d11c..403b25b 100644 --- a/packaging/storaged.spec +++ b/packaging/storaged.spec @@ -43,25 +43,26 @@ Requires(post): /usr/bin/vconftool Requires: /usr/bin/fsck_msdosfs Requires: /usr/bin/newfs_msdos +Requires: %{name}-org.tizen.extended-sd %description storage daemon. -%package module_block -Summary: block module plugin -Requires: %{name} = %{version}-%{release} +%package module_block +Summary: block module plugin +Requires: %{name} = %{version}-%{release} %description module_block block module plugin -%package module_storage -Summary: storage module plugin -Requires: %{name} = %{version}-%{release} +%package module_storage +Summary: storage module plugin +Requires: %{name} = %{version}-%{release} %description module_storage storage module plugin -%package org.tizen.extended-sd -Summary: App to setup sdcard -Requires: %{name} = %{version}-%{release} +%package org.tizen.extended-sd +Summary: App to setup sdcard +Requires: %{name} = %{version}-%{release} %description org.tizen.extended-sd App to setup sdcard -- 2.7.4 From 226bea6786b902f16a31ce908248ec00514cee51 Mon Sep 17 00:00:00 2001 From: "sanghyeok.oh" Date: Tue, 10 Oct 2017 11:51:11 +0900 Subject: [PATCH 03/16] app: svace fix - handle NULL var Change-Id: I6d2ece851362dfdbaa40e2b80d5c65d491e6956a Signed-off-by: sanghyeok.oh Signed-off-by: Hyotaek Shim --- apps/extended-sd/src/es-home-page.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/extended-sd/src/es-home-page.c b/apps/extended-sd/src/es-home-page.c index d24bf87..46a62a7 100644 --- a/apps/extended-sd/src/es-home-page.c +++ b/apps/extended-sd/src/es-home-page.c @@ -148,6 +148,11 @@ void create_home_page_base_layout(appdata_s* ad) home_genlist_item_s *item; home_page_genlist_itc = elm_genlist_item_class_new(); + if (!home_page_genlist_itc) { + DMSG_ERR("elm_genlist_item_class_new failed"); + return; + } + home_page_genlist_itc->item_style = "multiline"; home_page_genlist_itc->func.text_get = _home_page_genlist_text_get; home_page_genlist_itc->func.content_get = _home_page_genlist_content_get; @@ -168,7 +173,7 @@ void create_home_page_base_layout(appdata_s* ad) item = (home_genlist_item_s *)malloc(sizeof(home_genlist_item_s)); if (!item) { DMSG_ERR("malloc failed"); - return; + goto out; } item->ad = ad; @@ -179,7 +184,7 @@ void create_home_page_base_layout(appdata_s* ad) item = (home_genlist_item_s *)malloc(sizeof(home_genlist_item_s)); if (!item) { DMSG_ERR("malloc failed"); - return; + goto out; } item->ad = ad; @@ -191,7 +196,7 @@ void create_home_page_base_layout(appdata_s* ad) item = (home_genlist_item_s *)malloc(sizeof(home_genlist_item_s)); if (!item) { DMSG_ERR("malloc failed"); - return; + goto out; } item->ad = ad; @@ -212,7 +217,7 @@ void create_home_page_base_layout(appdata_s* ad) elm_object_item_part_content_set(home_page_data->home_page_navi_it, "toolbar", next_button); evas_object_smart_callback_add(next_button, "clicked", _next_button_clicked_cb, ad); +out: elm_genlist_item_class_free(home_page_genlist_itc); - FUNC_END(); } -- 2.7.4 From dc6863417b88e98459d2da01025a07f705eaad96 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Tue, 10 Oct 2017 15:23:49 +0900 Subject: [PATCH 04/16] block: Do not add INSERT operation for unformatted device (except mmc) Change-Id: I73ed8bf74b367397f25ec043d690d7caa63e7b30 Signed-off-by: pr.jung --- src/block/block.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/block/block.c b/src/block/block.c index bc8e798..edda2e8 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -2152,20 +2152,20 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i pthread_mutex_unlock(&(th_manager[thread_id].mutex)); - 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; - } - /* 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) { + 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 + 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) @@ -2183,6 +2183,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i ret = change_mount_point(bdev, EXTENDED_SD_PATH); if (ret < 0) { ret = -EPERM; + free_block_device(bdev); return ret; } @@ -2196,6 +2197,13 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool i } } + 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; + } + /* 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); -- 2.7.4 From 9da8aca1f2d99958251e17880a6e3ee54355423e Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Wed, 11 Oct 2017 13:23:08 +0900 Subject: [PATCH 05/16] Remove "Requires: %{name}-org.tizen.extended-sd" Change-Id: Iba7f575599447169d33b3d3144ece788d55460ea Signed-off-by: Hyotaek Shim --- packaging/storaged.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/packaging/storaged.spec b/packaging/storaged.spec index 403b25b..0ec0776 100644 --- a/packaging/storaged.spec +++ b/packaging/storaged.spec @@ -43,7 +43,6 @@ Requires(post): /usr/bin/vconftool Requires: /usr/bin/fsck_msdosfs Requires: /usr/bin/newfs_msdos -Requires: %{name}-org.tizen.extended-sd %description storage daemon. -- 2.7.4 From 6b1d41aa2ba678fd08fbfe091fe13c2a10c0b617 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Wed, 11 Oct 2017 16:52:57 +0900 Subject: [PATCH 06/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 07/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 08/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 09/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 10/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 11/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 12/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 13/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 14/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 15/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 16/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