From e33c5d05cd44f461d9cf658a06a2961e5801804f Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 29 Jul 2012 13:21:09 +0000 Subject: [PATCH] and... first monitor mtab not fstab for MOUNT changes/ mtab is "current mounted status" . fstab is "stuff i WANT to mount". secondly.. if mtab is a symlink.. pretend we arent monitoring. this then kicks in the poll checker after mount cmd is done. SVN revision: 74545 --- legacy/eeze/src/lib/eeze_disk.c | 5 ++ legacy/eeze/src/lib/eeze_disk_libmount_new.c | 9 ++- legacy/eeze/src/lib/eeze_disk_mount.c | 61 ++++++++++++++++++-- legacy/eeze/src/lib/eeze_disk_private.h | 2 + 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/legacy/eeze/src/lib/eeze_disk.c b/legacy/eeze/src/lib/eeze_disk.c index 8d1aeec52d..722f47c023 100644 --- a/legacy/eeze/src/lib/eeze_disk.c +++ b/legacy/eeze/src/lib/eeze_disk.c @@ -283,6 +283,11 @@ eeze_disk_free(Eeze_Disk *disk) if (disk->mounter) ecore_exe_kill(disk->mounter); _eeze_disks = eina_list_remove(_eeze_disks, disk); eeze_events = eina_list_remove(eeze_events, disk); + if (disk->mount_fail_delay) + { + ecore_timer_del(disk->mount_fail_delay); + disk->mount_fail_delay = NULL; + } free(disk); } diff --git a/legacy/eeze/src/lib/eeze_disk_libmount_new.c b/legacy/eeze/src/lib/eeze_disk_libmount_new.c index c6248ff757..3b6357a1ae 100644 --- a/legacy/eeze/src/lib/eeze_disk_libmount_new.c +++ b/legacy/eeze/src/lib/eeze_disk_libmount_new.c @@ -408,6 +408,7 @@ EAPI Eina_Bool eeze_mount_tabs_watch(void) { libmnt_table *bak; + char *lnk; if (_watching) return EINA_TRUE; @@ -417,7 +418,7 @@ eeze_mount_tabs_watch(void) mnt_free_table(_eeze_mount_mtab); _eeze_mount_mtab = bak; - bak = _eeze_mount_tab_parse("/etc/fstab"); + bak = _eeze_mount_tab_parse("/etc/mtab"); EINA_SAFETY_ON_NULL_GOTO(bak, error); mnt_free_table(_eeze_mount_fstab); @@ -433,8 +434,10 @@ eeze_mount_tabs_watch(void) if (!_mountinfo) goto error; _mountinfo_fdh = ecore_main_fd_handler_add(fileno(_mountinfo), ECORE_FD_ERROR, _eeze_mount_fdh, NULL, NULL, NULL); if (!_mountinfo_fdh) goto error; - _fstab_mon = ecore_file_monitor_add("/etc/fstab", _eeze_mount_tab_watcher, NULL); - _watching = EINA_TRUE; + _fstab_mon = ecore_file_monitor_add("/etc/mtab", _eeze_mount_tab_watcher, NULL); + lnk = ecore_file_readlink("/etc/mtab"); + if (lnk) free(lnk); + else _watching = EINA_TRUE; return EINA_TRUE; diff --git a/legacy/eeze/src/lib/eeze_disk_mount.c b/legacy/eeze/src/lib/eeze_disk_mount.c index cbb57aed7c..54a9566778 100644 --- a/legacy/eeze/src/lib/eeze_disk_mount.c +++ b/legacy/eeze/src/lib/eeze_disk_mount.c @@ -54,6 +54,38 @@ _eeze_disk_mount_error_handler(Eeze_Disk *disk, const char *error) ecore_event_add(EEZE_EVENT_DISK_ERROR, de, (Ecore_End_Cb)_eeze_disk_mount_error_free, NULL); } +static Eina_Bool +_eeze_disk_mount_fail_delay_check(void *data) +{ + Eeze_Disk *disk = data; + + disk->fail_pol_check++; + if (eeze_disk_mounted_get(disk)) + { + Eeze_Event_Disk_Mount *e; + + disk->mounted = EINA_TRUE; + e = malloc(sizeof(Eeze_Event_Disk_Mount)); + if (e) + { + e->disk = disk; + ecore_event_add(EEZE_EVENT_DISK_MOUNT, e, NULL, NULL); + } + return EINA_FALSE; + } + if (disk->fail_pol_check > 30) + { + if (disk->mount_fail_delay) + { + ecore_timer_del(disk->mount_fail_delay); + disk->mount_fail_delay = NULL; + } + _eeze_disk_mount_error_handler(disk, "mount failure"); + return EINA_FALSE; + } + return EINA_TRUE; +} + static Eina_Bool _eeze_disk_mount_result_handler(void *data __UNUSED__, int type __UNUSED__, Ecore_Exe_Event_Del *ev) { @@ -79,11 +111,25 @@ _eeze_disk_mount_result_handler(void *data __UNUSED__, int type __UNUSED__, Ecor disk->mounter = NULL; if (!ev->exit_code) { - disk->mounted = EINA_TRUE; - e = malloc(sizeof(Eeze_Event_Disk_Mount)); - EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); - e->disk = disk; - ecore_event_add(EEZE_EVENT_DISK_MOUNT, e, NULL, NULL); + if (!eeze_disk_mounted_get(disk)) + { + /* libmount seems to have a nasty race condition... or + * mount .. or something... the mount exe returns + * BUT its not mounted yet! so poll for a bit.. and see */ + if (!disk->mount_fail_delay) + disk->mount_fail_delay = + ecore_timer_add(0.1, _eeze_disk_mount_fail_delay_check, + disk); + disk->fail_pol_check = 0; + } + else + { + disk->mounted = EINA_TRUE; + e = malloc(sizeof(Eeze_Event_Disk_Mount)); + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + e->disk = disk; + ecore_event_add(EEZE_EVENT_DISK_MOUNT, e, NULL, NULL); + } } else if (ev->exit_code & 2) _eeze_disk_mount_error_handler(disk, "system error (out of memory, cannot fork, no more loop devices)"); @@ -417,6 +463,11 @@ eeze_disk_cancel(Eeze_Disk *disk) disk->mount_status = EEZE_DISK_NULL; ecore_exe_kill(disk->mounter); disk->mounter = NULL; + if (disk->mount_fail_delay) + { + ecore_timer_del(disk->mount_fail_delay); + disk->mount_fail_delay = NULL; + } } EAPI const char * diff --git a/legacy/eeze/src/lib/eeze_disk_private.h b/legacy/eeze/src/lib/eeze_disk_private.h index afe2172388..080035fefa 100644 --- a/legacy/eeze/src/lib/eeze_disk_private.h +++ b/legacy/eeze/src/lib/eeze_disk_private.h @@ -51,6 +51,8 @@ struct _Eeze_Disk Eina_Bool unmount_cmd_changed : 1; Eina_Bool mounted : 1; Ecore_Exe *mounter; + Ecore_Timer *mount_fail_delay; + int fail_pol_check; const char *syspath; const char *devpath;