#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 FILESYSTEM "filesystem"
static struct block_conf {
bool multimount;
bool extendedinternal;
-} block_conf[BLOCK_MMC_EXTENDED_INTERNAL_DEV + 1];
+} block_conf[BLOCK_EXTENDEDSD_DEV + 1];
static struct manage_thread {
dd_list *th_node_list; /* List of devnode which thread dealt with. Only main thread access */
continue;
// TODO What happend on extended internal storage case?
if (op == BLOCK_DEV_MOUNT) {
- if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV)
+ if (data->block_type == BLOCK_EXTENDEDSD_DEV)
ops->mounted(data, result, true);
else
ops->mounted(data, result, false);
} else if (op == BLOCK_DEV_UNMOUNT) {
- if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV)
+ if (data->block_type == BLOCK_EXTENDEDSD_DEV)
ops->unmounted(data, result, true);
else
ops->unmounted(data, result, false);
} else if (op == BLOCK_DEV_FORMAT) {
- if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV)
+ if (data->block_type == BLOCK_EXTENDEDSD_DEV)
ops->formatted(data, result, true);
else
ops->formatted(data, result, false);
char *name, node[64];
int ret;
- if (!data || !data->devnode)
+ if (!data || !data->devnode || !data->fs_usage || strcmp(data->fs_usage, FILESYSTEM))
return NULL;
name = strrchr(data->devnode, '/');
case BLOCK_SCSI_DEV:
ret = get_scsi_mount_node(name, node, sizeof(node));
break;
- case BLOCK_MMC_EXTENDED_INTERNAL_DEV:
+ case BLOCK_EXTENDEDSD_DEV:
return strdup(EXTENDED_SD_PATH);
default:
_E("Invalid block type (%d)", data->block_type);
if (fnmatch(MMC_LINK_PATH, devnode, 0) &&
fnmatch(MMC_PATH, devnode, 0) &&
- fnmatch(SCSI_PATH, devnode, 0))
+ fnmatch(SCSI_PATH, devnode, 0) &&
+ fnmatch(EXTENDEDSD_PATH, devnode, 0))
return false;
temp = strrchr(devnode, '/');
return NULL;
if (!fs_type)
- _E("Not support extended partition");
+ _I("Unknown fs type");
data = calloc(1, sizeof(struct block_data));
if (!data) {
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))
+ data->block_type = BLOCK_EXTENDEDSD_DEV;
else
data->block_type = -1;
/* 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)
+ if (data->primary == true && data->block_type == BLOCK_MMC_DEV &&
+ data->fs_usage && !strcmp(data->fs_usage, FILESYSTEM))
data->id = EXT_PRIMARY_SD_FIXID;
else
data->id = block_get_new_id();
ret = change_mount_point(pdata.bdev, "");
/* Modify /run/external-storage/id file */
if (ret == 0) {
- if (pdata.bdev->data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV)
+ if (pdata.bdev->data->block_type == BLOCK_EXTENDEDSD_DEV)
create_file(pdata.bdev->data->id, pdata.bdev->data->mount_point, true);
else
create_file(pdata.bdev->data->id, pdata.bdev->data->mount_point, false);
create_external_apps_directory();
if (pdata.op == BLOCK_DEV_UNMOUNT) {
/* Remove file for block device /run/xxxxxx/id */
- if (pdata.bdev->data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV)
- remove_file(pdata.bdev->data->id, true);
- else
- remove_file(pdata.bdev->data->id, false);
+ remove_file(pdata.bdev->data->id, pdata.bdev->data->block_type == BLOCK_EXTENDEDSD_DEV);
}
/* Broadcast to mmc and usb storage module */
goto out;
}
- if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV)
+ if (data->block_type == BLOCK_EXTENDEDSD_DEV)
r = fs->mount(false, data->devnode, data->mount_point);
else
r = fs->mount(smack, data->devnode, data->mount_point);
/* Mobile specific:
* should unmount the below vconf key. */
if ((data->block_type == BLOCK_MMC_DEV ||
- data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) &&
+ data->block_type == BLOCK_EXTENDEDSD_DEV) &&
data->primary) {
/* At first, notify to other app
* who already access sdcard */
}
static int block_format(struct block_data *data,
- const char *fs_type, bool mount_point_updated)
+ const char *fs_type, bool mount_point_updated, bool udev_update)
{
const struct block_fs_ops *fs;
dd_list *elem;
if (!data || !data->devnode || !data->mount_point)
return -EINVAL;
- if (data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV)
+ if (data->block_type == BLOCK_EXTENDEDSD_DEV)
fstype = EXT4_NAME;
else {
if (!fs_type) {
/* need to update the partition data.
* It can be changed in doing format. */
- retrieve_udev_device(data, mount_point_updated);
-
+ if (udev_update)
+ retrieve_udev_device(data, mount_point_updated);
out:
return r;
}
}
}
- r = block_format(data, fs_type, bdev->mount_point_updated);
+ r = block_format(data, fs_type, bdev->mount_point_updated, false);
if (r < 0)
_E("fail to format %s device : %d", data->devnode, r);
pthread_mutex_unlock(&(th_manager[thread_id].mutex));
/* UNLOCK */
-
if (operation == BLOCK_DEV_INSERT || operation == BLOCK_DEV_REMOVE) {
if (pipe_trigger(operation, bdev, 0) < 0)
_E("fail to trigger pipe");
}
// Called by MainThread
-static int add_block_device(struct udev_device *dev, const char *devnode, bool init)
+static int add_block_device(struct udev_device *dev, const char *devnode, bool mapper)
{
struct block_data *data;
struct block_device *bdev;
bool partition;
int ret;
int thread_id;
+ bool need_format = false;
partition = check_partition(dev);
if (partition) {
return 0;
}
- data = make_block_data(devnode,
- udev_device_get_syspath(dev),
- udev_device_get_property_value(dev, "ID_FS_USAGE"),
- udev_device_get_property_value(dev, "ID_FS_TYPE"),
- udev_device_get_property_value(dev, "ID_FS_VERSION"),
- udev_device_get_property_value(dev, "ID_FS_UUID_ENC"),
- udev_device_get_sysattr_value(dev, "ro"));
+ if (mapper && !udev_device_get_property_value(dev, "ID_FS_TYPE")) {
+ data = make_block_data(devnode,
+ udev_device_get_syspath(dev),
+ FILESYSTEM,
+ EXT4_NAME,
+ "1.0",
+ udev_device_get_property_value(dev, "ID_FS_UUID_ENC"),
+ udev_device_get_sysattr_value(dev, "ro"));
+ need_format = true;
+ } else {
+ data = make_block_data(devnode,
+ udev_device_get_syspath(dev),
+ udev_device_get_property_value(dev, "ID_FS_USAGE"),
+ udev_device_get_property_value(dev, "ID_FS_TYPE"),
+ udev_device_get_property_value(dev, "ID_FS_VERSION"),
+ udev_device_get_property_value(dev, "ID_FS_UUID_ENC"),
+ udev_device_get_sysattr_value(dev, "ro"));
+ }
+
if (!data) {
_E("fail to make block data for %s", devnode);
return -EPERM;
}
- if (!block_conf[data->block_type].multimount && !data->primary) {
+ if (!block_conf[data->block_type].multimount && !data->primary &&
+ data->fs_usage && !strcmp(data->fs_usage, FILESYSTEM)) {
_D("Not support multi mount by config info");
free_block_data(data);
return -EPERM;
DD_LIST_APPEND(th_manager[thread_id].block_dev_list, bdev);
pthread_mutex_unlock(&(th_manager[thread_id].mutex));
- if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) {
- bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV;
+ if (need_format) {
+ ret = block_format(bdev->data, EXT4_NAME, false, false);
+ if (ret < 0) {
+ _E("Failed to add operation (format %s)", bdev->data->devnode);
+ }
+ }
+
+ if (!bdev->data->fs_type) {
+ _E("Unformatted Storage");
+ 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;
ret = change_mount_point(bdev, EXTENDED_SD_PATH);
if (ret < 0) {
ret = -EPERM;
return 0;
} else if (!strncmp(bdev->data->fs_type, EXT4_NAME, strlen(EXT4_NAME))) {
- bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV;
+ bdev->data->block_type = BLOCK_EXTENDEDSD_DEV;
ret = change_mount_point(bdev, EXTENDED_SD_PATH);
if (ret < 0) {
ret = -EPERM;
free_block_device(bdev);
return ret;
}
- } else if (!bdev->data->fs_type) {
- _E("Unformatted Storage");
- free_block_device(bdev);
- return -EPERM;
}
-#if 0
- /* Check this sdcard is already formatted for extended internal sdcard */
- if (block_conf[bdev->data->block_type].extendedinternal &&
- bdev->data->block_type == BLOCK_MMC_DEV &&
- bdev->data->primary) { // sdcard primary partition and extended internal option is on
- _I("Check whether sdcard will be used as extended internal storage");
-
- if (!init) { // after booting is done launch popup for setting
- 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;
- }
-
- snprintf(id_string, PATH_LEN, "%d", bdev->data->id);
- ret = launch_system_app(POPUP_DEFAULT, 4, POPUP_KEY_CONTENT, "sdcardsetup", POPUP_SDCARD_ID, id_string);
- if (ret < 0)
- _E("Failed to launch popup");
- return 0;
- } else { // at booting time
- if (!bdev->data->fs_type) {
- _E("Unformatted Storage");
- free_block_device(bdev);
- return -EPERM;
- }
-
- if (!strncmp(bdev->data->fs_type, LUKS_NAME, strlen(LUKS_NAME))) {
- bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV;
- ret = change_mount_point(bdev, EXTENDED_SD_PATH);
- if (ret < 0) {
- ret = -EPERM;
- free_block_device(bdev);
- return ret;
- }
- }
- }
- } else {
- if (!bdev->data->fs_type) {
- _E("Unformatted Storage");
- free_block_device(bdev);
- return -EPERM;
- }
- }
-#endif
ret = add_operation(bdev, BLOCK_DEV_INSERT, NULL, (void *)data);
if (ret < 0) {
_E("Failed to add operation (insert %s)", devnode);
return ret;
}
+ // Not a regular filesystem -> skip mounting
+ if (!bdev->data->fs_usage || strcmp(bdev->data->fs_usage, FILESYSTEM)) {
+ _I("Not a filesystem. Not mounting");
+ return 0;
+ }
+
/* Create file for block device /run/external-storage/id */
- if (bdev->data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV)
- create_file(bdev->data->id, bdev->data->mount_point, true);
- else
- create_file(bdev->data->id, bdev->data->mount_point, false);
+ create_file(bdev->data->id, bdev->data->mount_point, bdev->data->block_type == BLOCK_EXTENDEDSD_DEV);
ret = add_operation(bdev, BLOCK_DEV_MOUNT, NULL, NULL);
if (ret < 0) {
_E("Failed to add operation (mount %s)", devnode);
continue;
if (fnmatch(MMC_PATH, devnode, 0) &&
- fnmatch(SCSI_PATH, devnode, 0))
+ fnmatch(SCSI_PATH, devnode, 0) &&
+ fnmatch(EXTENDEDSD_PATH, devnode, 0))
continue;
}
}
_I("%s device add", devnode);
- add_block_device(dev, devnode, true);
+ add_block_device(dev, devnode, false);
udev_device_unref(dev);
}
const char *action;
struct udev_list_entry *list_entry;
int r;
+ bool mapper = false;
udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev)) {
const char *devlink = udev_list_entry_get_name(list_entry);
devnode = devlink;
break;
}
+ if (!fnmatch(EXTENDEDSD_PATH, devlink, 0)) {
+ mapper = true;
+ devnode = devlink;
+ break;
+ }
}
if (!devnode) {
return;
_I("%s device %s", devnode, action);
- if (!strncmp(action, UDEV_ADD, sizeof(UDEV_ADD))) {
+ if (!strncmp(action, UDEV_ADD, sizeof(UDEV_ADD)) ||
+ (mapper && !strcmp(action, UDEV_CHANGE))) {
r = check_already_handled(devnode);
if (r < 0) {
_I("%s is already handled", devnode);
return;
}
- add_block_device(dev, devnode, false);
- } else if (!strncmp(action, UDEV_REMOVE, sizeof(UDEV_REMOVE)))
+ add_block_device(dev, devnode, mapper);
+ } else if (!strncmp(action, UDEV_REMOVE, sizeof(UDEV_REMOVE))) {
remove_block_device(dev, devnode);
+ }
}
static DBusMessage *request_mount_block(dbus_method_reply_handle_h reply_handle,
ret = -EPERM;
goto out;
} else {
- bdev->data->block_type = BLOCK_MMC_EXTENDED_INTERNAL_DEV;
+ bdev->data->block_type = BLOCK_EXTENDEDSD_DEV;
ret = change_mount_point(bdev, EXTENDED_SD_PATH);
if (ret < 0) {
ret = -EPERM;
ret = -ENOENT;
goto out;
}
- if (bdev->data->block_type == BLOCK_MMC_EXTENDED_INTERNAL_DEV) {
+
+ if (bdev->data->block_type == BLOCK_EXTENDEDSD_DEV) {
_I("Impossible to request unmount extended internal sdcard");
ret = -EPERM;
goto out;
continue;
if (bdev->removed)
continue;
- if (data->block_type != BLOCK_MMC_DEV)
+ if (data->block_type != BLOCK_MMC_DEV &&
+ data->block_type != BLOCK_EXTENDEDSD_DEV)
continue;
if (!data->primary)
continue;
index = BLOCK_SCSI_DEV;
else if (MATCH(result->section, "MMC"))
index = BLOCK_MMC_DEV;
+ else if (MATCH(result->section, "Mapper"))
+ index = BLOCK_EXTENDEDSD_DEV;
else
return -EINVAL;
block_conf[index].extendedinternal =
(MATCH(result->value, "yes") ? true : false);
- if (index == BLOCK_MMC_DEV) {
- block_conf[index + 1].multimount = block_conf[index].multimount;
- block_conf[index + 1].extendedinternal = block_conf[index].extendedinternal;
- }
-
return 0;
}