block: check '/' and '/opt' path for internal storage 51/258151/7 accepted/tizen/unified/20210528.134803 submit/tizen/20210528.010751
authorYunmi Ha <yunmi.ha@samsung.com>
Tue, 11 May 2021 08:53:00 +0000 (17:53 +0900)
committerYunmi Ha <yunmi.ha@samsung.com>
Mon, 17 May 2021 05:16:53 +0000 (14:16 +0900)
Change-Id: I24c8df4e927c94b173f01f2d9e55e0d8a8ab95be
Signed-off-by: Yunmi Ha <yunmi.ha@samsung.com>
src/block/block.c
src/block/block.h

index 878729f..6c0568d 100644 (file)
@@ -65,7 +65,7 @@
 #define MMC_PARTITION_PATH           "mmcblk[0-9]p[0-9]"
 /* Emulator send devlink for sdcard as \*\/sdcard\/\* */
 #define MMC_LINK_PATH                "*/sdcard/*"
-#define MMC_LINK_PARTITION_PATH     "vd[a-z][0-9]"
+#define MMC_LINK_PARTITION_PATH      "vd[a-z][0-9]"
 #define SCSI_PATH                    "*/sd[a-z]*"
 #define SCSI_PARTITION_PATH          "sd[a-z][0-9]"
 #define SCSI_PARTITION_LENGTH        9
@@ -75,7 +75,6 @@
 #define FILESYSTEM_NAME              "filesystem"
 
 #define DEV_PREFIX                   "/dev/"
-#define ROOT_DIR                     "/"
 
 #define UNMOUNT_RETRY                5
 #define TIMEOUT_MAKE_OBJECT          500 /* milliseconds */
 #define EXTENDEDSD_NAME              "extendedsd"
 
 /* Minimum value of block id */
-#define BLOCK_ID_MIN           10
+#define BLOCK_ID_MIN                 10
 /* For 2.4 Backward Compatibility */
-#define EXT_PRIMARY_SD_FIXID   1
+#define EXT_PRIMARY_SD_FIXID         1
 
 /* Maximum number of thread */
-#define THREAD_MAX             5
+#define THREAD_MAX                   5
 
-#define SPEEDCHECK_SIZE                16
-#define SPEEDCHECK_CRITERION   4 /* MB/s */
+#define SPEEDCHECK_SIZE              16
+#define SPEEDCHECK_CRITERION         4 /* MB/s */
 
-#define PKGDIR_BUS_NAME                "org.tizen.pkgdir_tool"
-#define PKGDIR_PATH            "/org/tizen/pkgdir_tool"
-#define PKGDIR_INTERFACE       "org.tizen.pkgdir_tool"
+#define PKGDIR_BUS_NAME              "org.tizen.pkgdir_tool"
+#define PKGDIR_PATH                  "/org/tizen/pkgdir_tool"
+#define PKGDIR_INTERFACE             "org.tizen.pkgdir_tool"
 
-#define POPUP_KEY_CONTENT      "_SYSPOPUP_CONTENT_"
-#define VIEWTYPE_KEY           "viewtype"
-#define DEVPATH_KEY            "dev_path"
-#define MAPPING_NODE_KEY       "mapping_node"
-#define INSERT_SD_CARD         "INSERT_SD_CARD"
+#define POPUP_KEY_CONTENT            "_SYSPOPUP_CONTENT_"
+#define VIEWTYPE_KEY                 "viewtype"
+#define DEVPATH_KEY                  "dev_path"
+#define MAPPING_NODE_KEY             "mapping_node"
+#define INSERT_SD_CARD               "INSERT_SD_CARD"
 
-#define MMC_POPUP_NOTI         "SDcardNoti"
-#define MMC_INSERTED           "inserted"
-#define MMC_REMOVED            "removed"
+#define MMC_POPUP_NOTI               "SDcardNoti"
+#define MMC_INSERTED                 "inserted"
+#define MMC_REMOVED                  "removed"
 
-#define ARRAY_SIZE(name)       (sizeof(name)/sizeof(name[0]))
+#define ARRAY_SIZE(name)             (sizeof(name)/sizeof(name[0]))
 
-#define FILE_NAME_LEN_MAX      255
+#define FILE_NAME_LEN_MAX            255
+#define DEV_INTERNAL_COUNT           2
 
 enum block_dev_operation {
        BLOCK_DEV_MOUNT,
@@ -207,6 +207,18 @@ char mmc_default_path[][FILE_NAME_LEN_MAX + 1] = {
        {"Downloads"},
 };
 
+static const char *dev_internal_list[DEV_INTERNAL_COUNT] = {
+       "/",
+       "/opt"
+};
+
+static struct dev_internal_struct {
+       enum block_device_type type;
+       char c_id;
+       int n_id;
+} dev_internal_ids[DEV_INTERNAL_COUNT];
+
+
 #define DIR_NUM ((int)(sizeof(mmc_default_path)/sizeof(mmc_default_path[0])))
 
 static GList *fs_head;
@@ -219,11 +231,6 @@ static bool block_boot = false;
 static pthread_mutex_t pipe_mutex = PTHREAD_MUTEX_INITIALIZER;
 static bool add_poweroff_wait = false;
 
-/* Assume there is only one physical internal storage */
-static int dev_internal = -1;
-static char dev_internal_scsi = '\0';
-static char dev_internal_emul = '\0';
-
 static int block_start(void *data);
 static int block_stop(void *data);
 
@@ -2396,7 +2403,7 @@ static int remove_block_device(struct udev_device *dev, const char *devnode)
        return 0;
 }
 
-static void get_internal_storage_number_from_device_mapper(char *root_name)
+static void get_internal_storage_number_from_device_mapper(char *root_name, int index)
 {
        int major, minor;
        char dev_name[PATH_MAX];
@@ -2436,14 +2443,27 @@ static void get_internal_storage_number_from_device_mapper(char *root_name)
        _D("Found actual device associated with root device of device mapper: %s", dev_name);
 
        if (!is_emulator()) {
-               if (!fnmatch(MMC_PARTITION_PATH, dev_name, 0))
-                       sscanf(dev_name, "mmcblk%d", &dev_internal);
-               else if (!fnmatch(SCSI_PARTITION_PATH, dev_name, 0))
-                       sscanf(dev_name, "sd%c", &dev_internal_scsi);
-       } else
-               if (!fnmatch(MMC_LINK_PARTITION_PATH, dev_name, 0))
-                       sscanf(dev_name, "vd%c", &dev_internal_emul);
-
+               if (!fnmatch(MMC_PARTITION_PATH, dev_name, 0)) {
+                       sscanf(dev_name, "mmcblk%d", &dev_internal_ids[index].n_id);
+                       dev_internal_ids[index].type = BLOCK_MMC_DEV;
+               } else if (!fnmatch(SCSI_PARTITION_PATH, dev_name, 0)) {
+                       sscanf(dev_name, "sd%c", &dev_internal_ids[index].c_id);
+                       dev_internal_ids[index].type = BLOCK_SCSI_DEV;
+               } else {
+                       dev_internal_ids[index].type = BLOCK_UNKNOWN_DEV;
+                       dev_internal_ids[index].c_id = '\0';
+                       dev_internal_ids[index].n_id = -1;
+               }
+       } else {
+               if (!fnmatch(MMC_LINK_PARTITION_PATH, dev_name, 0)) {
+                       sscanf(dev_name, "vd%c", &dev_internal_ids[index].c_id);
+                       dev_internal_ids[index].type = BLOCK_EMUL_DEV;
+               } else {
+                       dev_internal_ids[index].type = BLOCK_UNKNOWN_DEV;
+                       dev_internal_ids[index].c_id = '\0';
+                       dev_internal_ids[index].n_id = -1;
+               }
+       }
 out:
        dm_task_destroy(dmt);
 }
@@ -2455,10 +2475,7 @@ static int get_internal_storage_number(void)
        const char *temp;
        char *name;
        int r = 0, dev_temp;
-
-       if ((!is_emulator() && (dev_internal >= 0 || dev_internal_scsi != '\0')) ||
-               (is_emulator() && dev_internal_emul != '\0'))
-               return 0;
+       int dev_i;
 
        t = mnt_new_table();
        if (!t)
@@ -2470,38 +2487,58 @@ static int get_internal_storage_number(void)
                return -EPERM;
        }
 
-       fs = mnt_table_find_target(t, ROOT_DIR, MNT_ITER_BACKWARD);
+       for ( dev_i = 0; dev_i < DEV_INTERNAL_COUNT; dev_i++) {
+               fs = mnt_table_find_target(t, dev_internal_list[dev_i], MNT_ITER_BACKWARD);
 
-       if (!fs) {
-               mnt_free_table(t);
-               return -EPERM;
-       }
-       temp = mnt_fs_get_srcpath(fs);
-       if (!temp) {
-               mnt_free_table(t);
-               return -EPERM;
-       }
 
-       name = strrchr(temp, '/');
-       if (!name) {
-               mnt_free_table(t);
-               return -EPERM;
-       }
-       name++;
+               if (!fs) {
+                       mnt_free_table(t);
+                       return -EPERM;
+               }
 
-       /* Boot from USB is not handled */
-       if (!strcmp(temp, DEVICE_MAPPER_ROOT_NODE_PATH))
-               get_internal_storage_number_from_device_mapper(name);
-       else if (!is_emulator()) {
-               if (!fnmatch(MMC_PATH, temp, 0))
-                       sscanf(name, "mmcblk%d", &dev_internal);
-               else if (!fnmatch(SCSI_PATH, temp, 0))
-                       sscanf(name, "sd%c", &dev_internal_scsi);
-       } else {
-               if (!fnmatch(MMC_LINK_PATH, temp, 0))
-                       sscanf(name, "vd%c%d", &dev_internal_emul, &dev_temp);
-               else
-                       dev_internal_emul = '\0';
+               temp = mnt_fs_get_srcpath(fs);
+               if (!temp) {
+                       mnt_free_table(t);
+                       return -EPERM;
+               }
+
+               name = strrchr(temp, '/');
+               if (!name) {
+                       mnt_free_table(t);
+                       return -EPERM;
+               }
+               name++;
+
+               /* Boot from USB is not handled */
+               if (!strcmp(temp, DEVICE_MAPPER_ROOT_NODE_PATH))
+                       get_internal_storage_number_from_device_mapper(name, dev_i);
+               else if (!is_emulator()) {
+                       if (!fnmatch(MMC_PATH, temp, 0)) {
+                               sscanf(name, "mmcblk%d", &dev_internal_ids[dev_i].n_id);
+                               dev_internal_ids[dev_i].type = BLOCK_MMC_DEV;
+                               _D("Found internal device (%s). type=BLOCK_MMC_DEV, id=%d", dev_internal_list[dev_i], dev_internal_ids[dev_i].n_id);
+                       } else if (!fnmatch(SCSI_PATH, temp, 0)) {
+                               sscanf(name, "sd%c", &dev_internal_ids[dev_i].c_id);
+                               dev_internal_ids[dev_i].type = BLOCK_SCSI_DEV;
+                               _D("Found internal device (%s). type=BLOCK_SCSI_DEV, id=%c", dev_internal_list[dev_i], dev_internal_ids[dev_i].c_id);
+                       } else {
+                               dev_internal_ids[dev_i].type = BLOCK_UNKNOWN_DEV;
+                               dev_internal_ids[dev_i].c_id = '\0';
+                               dev_internal_ids[dev_i].n_id = -1;
+                               _E("Failed to get internal device (%s) number.", dev_internal_list[dev_i]);
+                       }
+               } else {
+                       if (!fnmatch(MMC_LINK_PATH, temp, 0)) {
+                               sscanf(name, "vd%c%d", &dev_internal_ids[dev_i].c_id, &dev_temp);
+                               dev_internal_ids[dev_i].type = BLOCK_EMUL_DEV;
+                               _D("Found internal device (%s). type=BLOCK_EMUL_DEV, id=%c", dev_internal_list[dev_i], dev_internal_ids[dev_i].c_id);
+                       } else {
+                               dev_internal_ids[dev_i].type = BLOCK_UNKNOWN_DEV;
+                               dev_internal_ids[dev_i].c_id = '\0';
+                               dev_internal_ids[dev_i].n_id = -1;
+                               _E("Failed to get internal device (%s) number.", dev_internal_list[dev_i]);
+                       }
+               }
        }
 
        mnt_free_table(t);
@@ -2509,6 +2546,32 @@ static int get_internal_storage_number(void)
        return 0;
 }
 
+static bool is_internal_storage_char(enum block_device_type type, const char c_id)
+{
+       int i;
+
+       for (i = 0; i < DEV_INTERNAL_COUNT; i++) {
+               if (dev_internal_ids[i].type == type) {
+                       if (dev_internal_ids[i].c_id == c_id)
+                               return true;
+               }
+       }
+       return false;
+}
+
+static bool is_internal_storage_num(enum block_device_type type, int n_id)
+{
+       int i;
+
+       for (i = 0; i < DEV_INTERNAL_COUNT; i++) {
+               if (dev_internal_ids[i].type == type) {
+                       if (dev_internal_ids[i].n_id == n_id)
+                               return true;
+               }
+       }
+       return false;
+}
+
 static int check_external_storage(const char* devnode)
 {
        char dev_scsi = '\0';
@@ -2526,13 +2589,13 @@ static int check_external_storage(const char* devnode)
        if (!is_emulator()) {
                if (!fnmatch(MMC_PATH, devnode, 0)) {
                        sscanf(name, "mmcblk%d", &dev_num);
-                       if (dev_internal == dev_num) {
+                       if (is_internal_storage_num(BLOCK_MMC_DEV, dev_num)) {
                                _D("%s is internal storage.", devnode);
                                return 0;
                        }
                } else if (!fnmatch(SCSI_PATH, devnode, 0)) {
                        sscanf(name, "sd%c", &dev_scsi);
-                       if (dev_internal_scsi == dev_scsi) {
+                       if (is_internal_storage_char(BLOCK_SCSI_DEV, dev_scsi)) {
                                _D("%s is internal storage.", devnode);
                                return 0;
                        }
@@ -2540,7 +2603,7 @@ static int check_external_storage(const char* devnode)
        } else {
                if (!fnmatch(MMC_LINK_PATH, devnode, 0)) {
                        sscanf(name, "vd%c%d", &emul, &dev_temp);
-                       if (dev_internal_emul == emul) {
+                       if (is_internal_storage_char(BLOCK_EMUL_DEV, emul)) {
                                _D("%s is internal storage.", devnode);
                                return 0;
                        }
index 2eb76dc..a0e8e1f 100644 (file)
@@ -58,6 +58,7 @@ enum block_device_type {
        BLOCK_SCSI_DEV = 0, /* Should be zero. used as index of array */
        BLOCK_MMC_DEV,
        BLOCK_EXTENDEDSD_DEV,
+       BLOCK_EMUL_DEV,
        BLOCK_ALL_DEV,
 };