Support reformatting from internal to external storage 28/158128/6
authorHyotaek Shim <hyotaek.shim@samsung.com>
Mon, 30 Oct 2017 02:50:05 +0000 (11:50 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Mon, 30 Oct 2017 07:34:11 +0000 (16:34 +0900)
Change-Id: Idcf3befbd50de35899545cddf142865cee547cb9
Signed-off-by: Hyotaek Shim <hyotaek.shim@samsung.com>
src/block/block.c

index 0971a5b..e371b6d 100644 (file)
@@ -65,8 +65,6 @@
 #define SCSI_PARTITION_LENGTH  9
 #define EXTENDEDSD_NODE_PATH    "/dev/mapper/extendedsd"
 
-#define FILESYSTEM             "filesystem"
-
 #define DEV_PREFIX             "/dev/"
 #define ROOT_DIR               "/"
 
 #define EXT4_NAME              "ext4"
 #define LUKS_NAME              "crypto_LUKS"
 #define EXTENDEDSD_NAME                "extendedsd"
+#define FILESYSTEM_NAME                "filesystem"
 
 /* Minimum value of block id */
 #define BLOCK_ID_MIN 10
@@ -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))
+       if (!data || !data->devnode || !data->fs_usage || strcmp(data->fs_usage, FILESYSTEM_NAME))
                return NULL;
 
        name = strrchr(data->devnode, '/');
@@ -711,7 +710,7 @@ 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 &&
-           data->fs_usage && !strcmp(data->fs_usage, FILESYSTEM))
+           data->fs_usage && !strcmp(data->fs_usage, FILESYSTEM_NAME))
                data->id = EXT_PRIMARY_SD_FIXID;
        else
                data->id = block_get_new_id();
@@ -869,7 +868,7 @@ static struct block_device *find_block_device_path(const char *mount_point)
                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)) {
+                          (bdev->data->mount_point != NULL && !strncmp(bdev->data->mount_point, mount_point, len))) {
                                pthread_mutex_unlock(&(th_manager[i].mutex));
                                return bdev;
                        }
@@ -1169,8 +1168,8 @@ static int block_mount(struct block_data *data)
 
        /* check matched file system */
        if (!data->fs_usage ||
-           strncmp(data->fs_usage, FILESYSTEM,
-                   sizeof(FILESYSTEM)) != 0) {
+           strncmp(data->fs_usage, FILESYSTEM_NAME,
+                   sizeof(FILESYSTEM_NAME)) != 0) {
                r = -ENODEV;
                goto out;
        }
@@ -2115,7 +2114,7 @@ static bool check_partition(struct udev_device *dev)
                fs_usage = udev_device_get_property_value(dev,
                                "ID_FS_USAGE");
                if (fs_usage &&
-                   strncmp(fs_usage, FILESYSTEM, sizeof(FILESYSTEM)) == 0) {
+                   strncmp(fs_usage, FILESYSTEM_NAME, sizeof(FILESYSTEM_NAME)) == 0) {
                        if (!disk_is_partitioned_by_kernel(dev))
                                        goto out;
                }
@@ -2157,11 +2156,11 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m
                r = rindex(udev_device_get_syspath(dev), '/');
                if (!r) return -ENODEV;
 
-               sprintf(syspath, "/sys/block%s", r);
+               snprintf(syspath, sizeof(syspath), "/sys/block%s", r);
 
                data = make_block_data(devnode,
                                syspath,
-                               FILESYSTEM,
+                               FILESYSTEM_NAME,
                                EXT4_NAME,
                                "1.0",
                                udev_device_get_property_value(dev, "ID_FS_UUID_ENC"),
@@ -2183,7 +2182,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m
        }
 
        if (!block_conf[data->block_type].multimount && !data->primary &&
-           data->fs_usage && !strcmp(data->fs_usage, FILESYSTEM)) {
+           data->fs_usage && !strcmp(data->fs_usage, FILESYSTEM_NAME)) {
                _D("Not support multi mount by config info");
                free_block_data(data);
                return -EPERM;
@@ -2265,7 +2264,7 @@ static int add_block_device(struct udev_device *dev, const char *devnode, bool m
        }
 
        // Not a regular filesystem -> skip mounting
-       if (!bdev->data->fs_usage || strcmp(bdev->data->fs_usage, FILESYSTEM)) {
+       if (!bdev->data->fs_usage || strcmp(bdev->data->fs_usage, FILESYSTEM_NAME)) {
                _I("Not a filesystem. Not mounting");
                return 0;
        }
@@ -3006,6 +3005,7 @@ static DBusMessage *request_format_block_type(dbus_method_reply_handle_h reply_h
                goto out;
 
        bdev = find_block_device_by_id(id);
+
        if (!bdev) {
                _E("Failed to find (%d) in the device list", id);
                goto out;
@@ -3025,11 +3025,59 @@ static DBusMessage *request_format_block_type(dbus_method_reply_handle_h reply_h
        }
 
        prev_state = bdev->data->state;
-       if (prev_state == BLOCK_MOUNT) {
+
+       if (bdev->data->fs_type != NULL && !strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) {
+               struct block_device *bdev_extended;
+               bdev_extended = find_block_device_path(EXTENDEDSD_MOUNT_PATH);
+               if (bdev_extended) {
+                       const char *devnode_extended = bdev_extended->data->devnode;    
+                       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_extended);
+                               goto out;
+                       }
+
+                       ret = add_operation(bdev_extended, BLOCK_DEV_REMOVE, NULL, NULL);
+                       if (ret < 0) {
+                               _E("Failed to add operation (remove %s)", devnode_extended);
+                               goto out;
+                       }
+
+                       ret = add_operation(bdev_extended, BLOCK_LUKS_CLOSE, NULL, NULL);
+                       if (ret < 0) {
+                               _E("Failed to add operation (luks_close %s)", devnode_extended);
+                               goto out;
+                       }
+
+                       //FIXME
+                       sleep(3);
+               }
+
+               ret = update_block_data(bdev->data,
+                               FILESYSTEM_NAME,
+                               type,
+                               "1.0",
+                               NULL,
+                               0,
+                               false);
+               if (ret < 0)
+                       _E("Fail to update block data for %s", bdev->data->devnode);
+
+               prev_state = BLOCK_MOUNT;
+       } else if (prev_state == BLOCK_MOUNT) {
                if (bdev->on_private_op == REQ_PRIVATE) {
                        bdev->on_private_op = REQ_PRIVATE_FORMAT;
                        _D("Private operation state: %d", bdev->on_private_op);
                }
+
                ret = add_operation(bdev, BLOCK_DEV_UNMOUNT, NULL, (void *)UNMOUNT_FORCE);
                if (ret < 0) {
                        _E("Failed to add operation (unmount %s)", bdev->data->devnode);