@@ -333,19 +333,16 @@ int initialize_globals() {
333333
334334int initialize_directories () {
335335 int res = -1 ;
336- int version = 0 ;
337- FILE * file ;
338336
339337 // Read current filesystem layout version to handle upgrade paths
340338 char version_path [PATH_MAX ];
341- if (snprintf (version_path , PATH_MAX , "%s.layout_version" , android_data_dir .path ) > PATH_MAX ) {
342- return -1 ;
343- }
344- file = fopen (version_path , "r" );
345- if (file != NULL ) {
346- fscanf (file , "%d" , & version );
347- fclose (file );
339+ snprintf (version_path , PATH_MAX , "%s.layout_version" , android_data_dir .path );
340+
341+ int oldVersion ;
342+ if (fs_read_atomic_int (version_path , & oldVersion ) == -1 ) {
343+ oldVersion = 0 ;
348344 }
345+ int version = oldVersion ;
349346
350347 // /data/user
351348 char * user_data_dir = build_string2 (android_data_dir .path , SECONDARY_USER_PREFIX );
@@ -376,16 +373,12 @@ int initialize_directories() {
376373 }
377374 }
378375
379- // /data/media/0
380- char owner_media_dir [PATH_MAX ];
381- create_persona_media_path (owner_media_dir , 0 );
382-
383376 if (version == 0 ) {
384377 // Introducing multi-user, so migrate /data/media contents into /data/media/0
385- ALOGD ("Migrating /data/media for multi-user" );
378+ ALOGD ("Upgrading /data/media for multi-user" );
386379
387380 // Ensure /data/media
388- if (ensure_dir (android_media_dir .path , 0770 , AID_MEDIA_RW , AID_MEDIA_RW ) == -1 ) {
381+ if (fs_prepare_dir (android_media_dir .path , 0770 , AID_MEDIA_RW , AID_MEDIA_RW ) == -1 ) {
389382 goto fail ;
390383 }
391384
@@ -402,10 +395,14 @@ int initialize_directories() {
402395 }
403396
404397 // Create /data/media again
405- if (ensure_dir (android_media_dir .path , 0770 , AID_MEDIA_RW , AID_MEDIA_RW ) == -1 ) {
398+ if (fs_prepare_dir (android_media_dir .path , 0770 , AID_MEDIA_RW , AID_MEDIA_RW ) == -1 ) {
406399 goto fail ;
407400 }
408401
402+ // /data/media/0
403+ char owner_media_dir [PATH_MAX ];
404+ snprintf (owner_media_dir , PATH_MAX , "%s0" , android_media_dir .path );
405+
409406 // Move any owner data into place
410407 if (access (media_tmp_dir , F_OK ) == 0 ) {
411408 if (rename (media_tmp_dir , owner_media_dir ) == -1 ) {
@@ -433,8 +430,7 @@ int initialize_directories() {
433430
434431 // /data/media/<user_id>
435432 snprintf (user_media_dir , PATH_MAX , "%s%s" , android_media_dir .path , name );
436- if (ensure_dir (user_media_dir , 0770 , AID_MEDIA_RW , AID_MEDIA_RW ) == -1 ) {
437- ALOGE ("Failed to ensure %s: %s" , user_media_dir , strerror (errno ));
433+ if (fs_prepare_dir (user_media_dir , 0770 , AID_MEDIA_RW , AID_MEDIA_RW ) == -1 ) {
438434 goto fail ;
439435 }
440436 }
@@ -445,22 +441,46 @@ int initialize_directories() {
445441 version = 1 ;
446442 }
447443
448- // Ensure /data/media/0 is always ready
449- if (ensure_dir (owner_media_dir , 0770 , AID_MEDIA_RW , AID_MEDIA_RW ) == -1 ) {
450- goto fail ;
444+ // /data/media/obb
445+ char media_obb_dir [PATH_MAX ];
446+ snprintf (media_obb_dir , PATH_MAX , "%sobb" , android_media_dir .path );
447+
448+ if (version == 1 ) {
449+ // Introducing /data/media/obb for sharing OBB across users; migrate
450+ // any existing OBB files from owner.
451+ ALOGD ("Upgrading to shared /data/media/obb" );
452+
453+ // /data/media/0/Android/obb
454+ char owner_obb_path [PATH_MAX ];
455+ snprintf (owner_obb_path , PATH_MAX , "%s0/Android/obb" , android_media_dir .path );
456+
457+ // Only move if target doesn't already exist
458+ if (access (media_obb_dir , F_OK ) != 0 && access (owner_obb_path , F_OK ) == 0 ) {
459+ if (rename (owner_obb_path , media_obb_dir ) == -1 ) {
460+ ALOGE ("Failed to move OBB from owner: %s" , strerror (errno ));
461+ goto fail ;
462+ }
463+ }
464+
465+ version = 2 ;
451466 }
452467
453- // Persist our current version
454- file = fopen (version_path , "w" );
455- if (file != NULL ) {
456- fprintf (file , "%d" , version );
457- fsync (fileno (file ));
458- fclose (file );
459- } else {
460- ALOGE ("Failed to save version to %s: %s" , version_path , strerror (errno ));
468+ if (ensure_media_user_dirs (0 ) == -1 ) {
469+ ALOGE ("Failed to setup media for user 0" );
470+ goto fail ;
471+ }
472+ if (fs_prepare_dir (media_obb_dir , 0770 , AID_MEDIA_RW , AID_MEDIA_RW ) == -1 ) {
461473 goto fail ;
462474 }
463475
476+ // Persist layout version if changed
477+ if (version != oldVersion ) {
478+ if (fs_write_atomic_int (version_path , version ) == -1 ) {
479+ ALOGE ("Failed to save version to %s: %s" , version_path , strerror (errno ));
480+ goto fail ;
481+ }
482+ }
483+
464484 // Success!
465485 res = 0 ;
466486
0 commit comments