block: Unmount mapper node when extended internal storage is removed 89/157089/7 accepted/tizen/unified/20171024.071451 submit/tizen/20171023.130046
authorpr.jung <pr.jung@samsung.com>
Thu, 19 Oct 2017 05:53:49 +0000 (14:53 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Mon, 23 Oct 2017 11:55:15 +0000 (11:55 +0000)
Change-Id: I4176eaa2b5419aff67ba400734369acb3b6514d6
Signed-off-by: pr.jung <pr.jung@samsung.com>
Signed-off-by: Hyotaek Shim <hyotaek.shim@samsung.com>
12 files changed:
CMakeLists.txt
packaging/storaged.spec
src/block/CMakeLists.txt
src/block/block.c
src/block/block.h
src/block/ext4.c
src/block/mmc.c
src/block/utils.c
src/block/vfat.c
src/shared/common.c
src/shared/storaged_common.h [moved from src/shared/common.h with 100% similarity]
src/storage/CMakeLists.txt

index 97096df..d9c2e2c 100755 (executable)
@@ -25,6 +25,7 @@ SET(PKG_MODULES
        libtzplatform-config
        libudev
        vconf
+       ode
 )
 
 ADD_DEFINITIONS("-DLIBPATH=\"${LIB_INSTALL_DIR}\"")
index 4b5f39a..4c64e6c 100644 (file)
@@ -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
index c58a78c..4445a6c 100644 (file)
@@ -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})
index b76d2a4..baacbc1 100644 (file)
@@ -40,6 +40,7 @@
 #include <app2ext_interface.h>
 #include <libmount.h>
 #include <blkid/blkid.h>
+#include <ode/luks.h>
 
 #include "log.h"
 #include "config-parser.h"
 /**
  * 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;
index 32a071d..658bf89 100644 (file)
@@ -21,7 +21,7 @@
 #define __BLOCK_H__
 
 #include <stdbool.h>
-#include "common.h"
+#include "storaged_common.h"
 
 #define SMACKFS_MOUNT_OPT   "smackfsroot=*,smackfsdef=*"
 
index f05b160..1141794 100644 (file)
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/mount.h>
@@ -28,7 +27,7 @@
 #include <errno.h>
 #include <time.h>
 
-#include "common.h"
+#include "storaged_common.h"
 #include "log.h"
 #include "block.h"
 
index 80ec367..94cdd1b 100644 (file)
@@ -23,7 +23,7 @@
 #include <attr/xattr.h>
 
 #include "log.h"
-#include "common.h"
+#include "storaged_common.h"
 #include "block.h"
 
 static void mmc_update_state(int state)
index 086f8e0..0f3ef34 100644 (file)
@@ -36,8 +36,8 @@
 #include <system_info.h>
 #include <sys/mount.h>
 #include <sys/time.h>
+#include "storaged_common.h"
 #include "log.h"
-#include "common.h"
 
 int print_open_files(const char *mount_point)
 {
index 4ed6f3e..d66ef0f 100644 (file)
@@ -25,7 +25,7 @@
 #include <errno.h>
 #include <time.h>
 
-#include "common.h"
+#include "storaged_common.h"
 #include "log.h"
 #include "block.h"
 
index 21a7ddc..76713ef 100644 (file)
@@ -39,7 +39,7 @@
 #include <sys/mount.h>
 #include <sys/time.h>
 #include "log.h"
-#include "common.h"
+#include "storaged_common.h"
 
 
 #define MODEL_NAME      "http://tizen.org/system/model_name"
index e2aea8b..f3bac89 100644 (file)
@@ -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})