From: Yunmi Ha Date: Tue, 11 May 2021 08:53:00 +0000 (+0900) Subject: block: check '/' and '/opt' path for internal storage X-Git-Tag: submit/tizen/20210528.010751^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a6f14c1bd93c41626e66792cdf4bd392cdd8e093;p=platform%2Fcore%2Fsystem%2Fstoraged.git block: check '/' and '/opt' path for internal storage Change-Id: I24c8df4e927c94b173f01f2d9e55e0d8a8ab95be Signed-off-by: Yunmi Ha --- diff --git a/src/block/block.c b/src/block/block.c index 878729f..6c0568d 100644 --- a/src/block/block.c +++ b/src/block/block.c @@ -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 */ @@ -111,33 +110,34 @@ #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; } diff --git a/src/block/block.h b/src/block/block.h index 2eb76dc..a0e8e1f 100644 --- a/src/block/block.h +++ b/src/block/block.h @@ -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, };