int ensure_volume_unmounted(fstab_rec* v, bool detach) { if (v == NULL) { LOGE("cannot unmount unknown volume\n"); return -1; } if (strcmp(v->fs_type, "ramdisk") == 0) { // the ramdisk is always mounted; you can't unmount it. return -1; } int result; result = scan_mounted_volumes(); if (result < 0) { LOGE("failed to scan mounted volumes\n"); return -1; } if (fs_mgr_is_voldmanaged(v)) { if (!strcmp(v->mount_point, "auto")) { return vold_unmount_auto_volume(v->label, 0, 1, detach); } return vold_unmount_volume(v->mount_point, 0, 1, detach); } const MountedVolume* mv = find_mounted_volume_by_mount_point(v->mount_point); if (mv == NULL) { // volume is already unmounted return 0; } if (detach) { result = unmount_mounted_volume_detach(mv); } else { result = unmount_mounted_volume(mv); } return result; }
int ensure_path_unmounted(const char* path) { // if we are using /data/media, do not ever unmount volumes /data or /sdcard if (is_data_media_volume_path(path)) { return ensure_path_unmounted("/data"); } if (strstr(path, "/data") == path && is_data_media() && !ignore_data_media) { return 0; } Volume* v = volume_for_path(path); if (v == NULL) { LOGE("unknown volume for path [%s]\n", path); return -1; } if (strcmp(v->fs_type, "ramdisk") == 0) { // the ramdisk is always mounted; you can't unmount it. return -1; } int result; result = scan_mounted_volumes(); if (result < 0) { LOGE("failed to scan mounted volumes\n"); return -1; } const MountedVolume* mv = find_mounted_volume_by_mount_point(v->mount_point); if (mv == NULL) { // volume is already unmounted return 0; } if (fs_mgr_is_voldmanaged(volume_for_path(v->mount_point))) return vold_unmount_volume(v->mount_point, 0, 1) == CommandOkay ? 0 : -1; return unmount_mounted_volume(mv); }