#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
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, '/');
/* 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();
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;
}
/* 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;
}
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;
}
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"),
}
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;
}
// 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;
}
goto out;
bdev = find_block_device_by_id(id);
+
if (!bdev) {
_E("Failed to find (%d) in the device list", id);
goto out;
}
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);