block,app: Support extended internal storage -> portable storage setting 55/158355/6 accepted/tizen/4.0/unified/20171106.074053 submit/tizen_4.0/20171103.053539 submit/tizen_4.0/20171103.070423
authorpr.jung <pr.jung@samsung.com>
Tue, 31 Oct 2017 08:13:14 +0000 (17:13 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Wed, 1 Nov 2017 10:29:57 +0000 (10:29 +0000)
- Only block type of mapper node(/dev/mapper/extendedsd) is BLOCK_EXTENDEDSD_DEV
- Not handle unformatted storage is setting on external storage using extended-sd app.
- Remove mount operation as extended internal storage when "ExtendedInternalSD" is sent as mount path (Mount dbus method)
- Support unmount operation for extended internal storage
- Add BLOCK_LUKS_CLOSE operation.
- Need to close luks when unmounting mapper node
- Register storage callback for removed signal for external storage(ex. /dev/mmcblk1p1)
- Register storage callback for mapper node
    - internal -> portable setting: Get mapper node removed signal to progress format operation for external storage.
    - portable -> internal setting: Get mapper node mounted signal to progress app ui

Change-Id: Iba8206e6e50ff2ed7df18931cd63c5c88109d049
Signed-off-by: pr.jung <pr.jung@samsung.com>
Signed-off-by: Hyotaek Shim <hyotaek.shim@samsung.com>
(cherry picked from commit 84ddf0472888c5823047db19adf538b6b8f5d4a7)

apps/extended-sd/include/extended-sd-main.h
apps/extended-sd/src/es-internal-storage-page.c
apps/extended-sd/src/es-portable-storage-page.c
apps/extended-sd/src/extended-sd-main.c
src/block/block.c

index ba6cc2a..b8cc0a1 100644 (file)
@@ -90,6 +90,5 @@ 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__ */
index b9635f2..17d53c3 100644 (file)
@@ -45,7 +45,7 @@ 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);
 
-void
+static 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)
@@ -64,11 +64,7 @@ mapper_device_cb(int id, storage_dev_e dev, storage_state_e state,
        }
 
        // 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();
-               return;
-       } else if (state == STORAGE_STATE_UNMOUNTABLE)
+       if (state == STORAGE_STATE_UNMOUNTABLE || state == STORAGE_STATE_REMOVED)
                return;
 
        Evas_Object* page_content = elm_object_part_content_unset(ad->internal_storage_page_data->internal_storage_page_base_layout, "elm.swallow.content");
@@ -833,6 +829,11 @@ void create_internal_storage_page_base_layout(appdata_s *ad)
        FUNC_BEGIN();
        Evas_Object *page_content = NULL;
        char *str_setup;
+       int ret;
+
+       ret = storage_set_changed_cb(STORAGE_TYPE_EXTENDED_INTERNAL, mapper_device_cb, ad);
+       if (ret != STORAGE_ERROR_NONE)
+               DMSG_ERR("Failed to register signal handler for extended internal storage");
 
        if (ad->internal_storage_page_data) {
                ELM_OBJECT_ITEM_DEL(ad->internal_storage_page_data->internal_storage_page_navi_it);
index 97981e1..509bfa6 100644 (file)
@@ -5,6 +5,8 @@
 //#include "dbus-macro.h"
 #include "log-util.h"
 
+#define LUKS_NAME "crypto_LUKS"
+
 typedef enum {
        PORTABLE_STORAGE_ITEM_PAGE_1_HEADING = 0,
        PORTABLE_STORAGE_ITEM_PAGE_1_PARA_1,
@@ -70,14 +72,114 @@ format_done(void *data, GVariant *result, GError *err)
 }
 
 static void
-_format_click_cb(void *data, Evas_Object* obj, void *event_info)
+mapper_device_cb(int mapper_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)
 {
        FUNC_BEGIN();
+       appdata_s* ad = (appdata_s*)user_data;
+       GVariant *output;
+       GVariantIter *iter;
        char str_id[32];
        char str_option[32];
        char *arr[3];
+       char *new_fstype;
+       bool new_primary;
        int ret;
+       int id;
+
+       ret_if(ad == NULL);
+
+       //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;
+       }
+
+       if (mapper_id != ad->storage_id)
+               return;
+
+       // After mapper node is removed, app need to format sdcard
+       if (state != STORAGE_STATE_REMOVED)
+               return;
+
+       arr[0] = "mmc";
+       ret = dbus_method_sync_with_reply(STORAGED_BUS_NAME,
+                       STORAGED_PATH_BLOCK_MANAGER, STORAGED_INTERFACE_BLOCK_MANAGER, "GetDeviceList", "s", arr, &output);
+       if (ret < 0) {
+               DMSG("Failed to get storage information: %d", ret);
+               return;
+       }
+
+       g_variant_get(output, "(a(issssssisibii))", &iter);
+
+       while (g_variant_iter_loop(iter, "(issssssisibii)",
+                               NULL, NULL, NULL,
+                               NULL, &new_fstype,
+                               NULL, NULL,
+                               NULL, NULL,
+                               NULL, &new_primary,
+                               NULL, &id)) {
+               if (!primary)
+                       continue;
+               if (strncmp(new_fstype, LUKS_NAME, strlen(LUKS_NAME) + 1))
+                       continue;
+
+               DMSG("Get Primary MMC: %d", id);
+               ad->storage_id = id;
+               break;
+       }
+
+       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] = "vfat";
 
+       ret = dbus_method_async_with_reply(STORAGED_BUS_NAME,
+                       STORAGED_PATH_BLOCK_MANAGER,
+                       STORAGED_INTERFACE_BLOCK_MANAGER,
+                       "FormatwithType",
+                       "iis",
+                       arr,
+                       format_done,
+                       120000,
+                       ad);
+       if (ret < 0)
+               DMSG("Failed to format", ret);
+
+       FUNC_END();
+}
+
+static void
+unmount_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("Failed to format sd card as portable storage: %d", ret);
+               return;
+       }
+
+       FUNC_END();
+}
+
+static void
+_format_click_cb(void *data, Evas_Object* obj, void *event_info)
+{
+       FUNC_BEGIN();
+       char str_id[32];
+       char str_option[32];
+       char *arr[2];
+       int ret;
 
        appdata_s* ad = (appdata_s*)data;
        ret_if(ad == NULL);
@@ -92,15 +194,14 @@ _format_click_cb(void *data, Evas_Object* obj, void *event_info)
        arr[0] = str_id;
        snprintf(str_option, sizeof(str_option), "%d", UNMOUNT_FORCE);
        arr[1] = str_option;
-       arr[2] = "vfat";
        ret = dbus_method_async_with_reply(STORAGED_BUS_NAME,
                        STORAGED_PATH_BLOCK_MANAGER,
                        STORAGED_INTERFACE_BLOCK_MANAGER,
-                       "FormatwithType",
-                       "iis",
+                       "Unmount",
+                       "ii",
                        arr,
-                       format_done,
-                       120000,
+                       unmount_done,
+                       DBUS_REPLY_TIMEOUT,
                        ad);
        if (ret < 0)
                DMSG("Failed to format", ret);
@@ -527,6 +628,11 @@ void create_portable_storage_page_base_layout(appdata_s *ad)
        FUNC_BEGIN();
        Evas_Object* page_content = NULL;
        char *str_portable;
+       int ret;
+
+       ret = storage_set_changed_cb(STORAGE_TYPE_EXTENDED_INTERNAL, mapper_device_cb, ad);
+       if (ret != STORAGE_ERROR_NONE)
+               DMSG_ERR("Failed to register signal handler for extended internal storage");
 
        if (ad->portable_storage_page_data) {
                ELM_OBJECT_ITEM_DEL(ad->portable_storage_page_data->portable_storage_page_navi_it);
index b59073f..625f62f 100644 (file)
@@ -72,7 +72,9 @@ app_create(void *data)
 }
 
 static void
-storage_removed_cb(int id, storage_state_e state, void *user_data)
+storage_removed_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)
 {
        FUNC_BEGIN();
 
@@ -80,10 +82,16 @@ storage_removed_cb(int id, storage_state_e state, void *user_data)
 
        ret_if(ad == NULL);
 
-       if (id == ad->storage_id) {
-               DMSG("Storage is removed");
-               ui_app_exit();
-       }
+       if (dev != STORAGE_DEV_EXT_SDCARD)
+               return;
+
+       if (state != STORAGE_STATE_REMOVED)
+               return;
+
+       /* Only one mmc slot is supported
+          ad->storage_id is mapper node id */
+       DMSG("Storage is removed");
+       ui_app_exit();
 
        FUNC_END();
 }
@@ -102,12 +110,9 @@ app_control(app_control_h app_control, void *data)
 
        ret_if(ad == NULL);
 
-       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);
+       ret = storage_set_changed_cb(STORAGE_TYPE_EXTERNAL, storage_removed_cb, ad);
+       if (ret != STORAGE_ERROR_NONE)
+               DMSG_ERR("Failed to register signal handler for extended internal storage");
 
        len = strlen(SETUP_EXTENDED) + 1;
        app_control_get_extra_data(app_control, SDCARD_SETUP_TYPE, &type);
@@ -159,7 +164,7 @@ app_terminate(void *data)
        appdata_s* ad = (appdata_s*)data;
        ret_if(ad == NULL);
 
-       storage_unset_state_changed_cb(ad->storage_id, storage_removed_cb);
+       storage_unset_changed_cb(STORAGE_TYPE_EXTERNAL, storage_removed_cb);
 
        FUNC_END();
 }
index 96293a9..1791473 100644 (file)
@@ -95,7 +95,6 @@
 #define PATH_LEN               55
 
 #define EXTENDEDSD_MOUNT_PATH  "/opt/extendedsd"
-#define EXTENDEDSD_STRING      "ExtendedInternalSD"
 
 #define EXT4_NAME              "ext4"
 #define LUKS_NAME              "crypto_LUKS"
@@ -549,7 +548,7 @@ static char *generate_mount_path(struct block_data *data)
        char *name, node[64];
        int ret;
 
-       if (!data || !data->devnode || !data->fs_usage || strcmp(data->fs_usage, FILESYSTEM_NAME))
+       if (!data || !data->devnode || !data->fs_usage || (strcmp(data->fs_usage, FILESYSTEM_NAME) && strncmp(data->fs_usage, "crypto", strlen("crypto"))))
                return NULL;
 
        name = strrchr(data->devnode, '/');
@@ -929,6 +928,9 @@ static char *get_operation_char(enum block_dev_operation op,
        case BLOCK_DEV_REMOVE:
                str = "REMOVE";
                break;
+       case BLOCK_LUKS_CLOSE:
+               str = "LUKS CLOSE";
+               break;
        default:
                _E("invalid operation (%d)", op);
                break;
@@ -2230,7 +2232,8 @@ 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;
+//             bdev->data->block_type = BLOCK_EXTENDEDSD_DEV;
+               bdev->data->primary = true;
                _D("Need to unlock encrypted sdcard");
                // ---- ODE UI launch ----
                ret = launch_system_app(POPUP_DEFAULT
@@ -2246,6 +2249,13 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m
                if (ret < 0)
                        _E("Failed to launch popup");
 
+               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;
+               }
+
                return 0;
        } else if (mapper && !strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) {
                bdev->data->block_type = BLOCK_EXTENDEDSD_DEV;
@@ -2731,6 +2741,8 @@ static void uevent_block_handler(struct udev_device *dev)
                                false);
                if (r < 0)
                        _E("fail to update block data for %s", bdev->data->devnode);
+               if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME)))
+                       _I("filesystem type is updated: crypto_LUKS");
        }
 }
 
@@ -2782,24 +2794,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, EXTENDEDSD_STRING, strlen(EXTENDEDSD_STRING) + 1) != 0) {
-               if (!block_conf[bdev->data->block_type].extendedinternal ||
-                       !bdev->data->primary) {
-                       _E("Not support extended internal storage");
-                       ret = -EPERM;
-                       goto out;
-               } else {
-                       bdev->data->block_type = BLOCK_EXTENDEDSD_DEV;
-                       ret = change_mount_point(bdev, EXTENDEDSD_MOUNT_PATH);
-                       if (ret < 0) {
-                               ret = -EPERM;
-                               goto out;
-                       }
-
-                       create_file(bdev->data->id, bdev->data->mount_point, true);
-               }
-       } else if (mount_point && strncmp(mount_point, "", 1) != 0) {
+       if (mount_point && strncmp(mount_point, "", 1) != 0) {
                ret = change_mount_point(bdev, mount_point);
                if (ret < 0) {
                        ret = -EPERM;
@@ -2863,12 +2858,6 @@ static DBusMessage *request_unmount_block(dbus_method_reply_handle_h reply_handl
                goto out;
        }
 
-       if (bdev->data->block_type == BLOCK_EXTENDEDSD_DEV) {
-               _I("Impossible to request unmount extended internal sdcard");
-               ret = -EPERM;
-               goto out;
-       }
-
        if (onprivate) {
                pid = get_dbus_method_sender_pid(reply_handle);
                if (bdev->on_private_op == REQ_NORMAL || (bdev->on_private_op != REQ_NORMAL && pid != bdev->private_pid)) {
@@ -2890,6 +2879,12 @@ static DBusMessage *request_unmount_block(dbus_method_reply_handle_h reply_handl
                goto out;
        }
 
+       if (bdev->data->block_type == BLOCK_EXTENDEDSD_DEV) {
+               ret = add_operation(bdev, BLOCK_LUKS_CLOSE, NULL, NULL);
+               if (ret < 0)
+                       _E("Failed to add operation (luks_close %s)", bdev->data->devnode);
+       }
+
        return NULL;
 
 out:
@@ -3372,6 +3367,9 @@ static DBusMessage *request_get_mmc_primary(dbus_method_reply_handle_h reply_han
                                continue;
                        if (!data->primary)
                                continue;
+                       // Return mapper node(/dev/mapper/extendedsd) for primary mmc (not /dev/mmcblk1p1(ex))
+                       if (!strncmp(data->fs_type, LUKS_NAME, strlen(LUKS_NAME)))
+                               continue;
                        found = true;
                        break;
                }