From e1b068d70b8843c19f5e75c507d2db43c491913b Mon Sep 17 00:00:00 2001 From: Ermal Date: Wed, 17 Aug 2011 20:09:09 +0000 Subject: [PATCH] Ticket #1279. Decrease the refcount even though we're in booting phase. This helps the refcount to work as intended and help in making filesystem read only correctly on embedded platfroms. While here put some exceptions to refcount API and silent any related errors that might trigger. Also take not of the NOTE on the php manual that after a share memory is opened further references to it for size and access mode should be 0. --- etc/inc/config.lib.inc | 4 ++-- etc/inc/util.inc | 54 ++++++++++++++++++++++++------------------ 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/etc/inc/config.lib.inc b/etc/inc/config.lib.inc index 01bd7eccfe..9d5935d414 100644 --- a/etc/inc/config.lib.inc +++ b/etc/inc/config.lib.inc @@ -348,10 +348,10 @@ function conf_mount_ro() { if($platform == "cdrom" or $platform == "pfSense") return; - if($g['booting']) + if (refcount_unreference(1000) > 0) return; - if (refcount_unreference(1000) > 0) + if($g['booting']) return; clear_subsystem_dirty('mount'); diff --git a/etc/inc/util.inc b/etc/inc/util.inc index 96a48c72ae..4bf56352f2 100644 --- a/etc/inc/util.inc +++ b/etc/inc/util.inc @@ -179,36 +179,44 @@ function send_multiple_events($cmds) { } function refcount_init($reference) { - $shmid = shmop_open($reference, "c", 0644, 10); - shmop_write($shmid, 0, 0); - shmop_close($shmid); + $shmid = @shmop_open($reference, "c", 0644, 10); + @shmop_write($shmid, 0, 0); + @shmop_close($shmid); } function refcount_reference($reference) { - $shmid = @shmop_open($reference, "w", 0644, 10); - if (!$shmid) { - refcount_init($reference); - $shmid = shmop_open($reference, "w", 0644, 10); + try { + $shmid = @shmop_open($reference, "w", 0, 0); + if (!$shmid) { + refcount_init($reference); + $shmid = @shmop_open($reference, "w", 0, 0); + } + $shm_data = @shmop_read($shmid, 0, 10); + $shm_data = intval($shm_data) + 1; + @shmop_write($shmid, $shm_data, 0); + @shmop_close($shmid); + } catch (Exception $e) { + log_error($e->getMessage()); } - $shm_data = shmop_read($shmid, 0, 10); - $shm_data = intval($shm_data) + 1; - shmop_write($shmid, $shm_data, 0); - shmop_close($shmid); - + return $shm_data; } function refcount_unreference($reference) { - /* We assume that the shared memory exists. */ - $shmid = shmop_open($reference, "w", 0644, 10); - $shm_data = shmop_read($shmid, 0, 10); - $shm_data = intval($shm_data) - 1; - if ($shm_data < 0) { - //debug_backtrace(); - log_error("Reference {$reference} is going negative, not doing unreference."); - } else - shmop_write($shmid, $shm_data, 0); - shmop_close($shmid); + try { + /* We assume that the shared memory exists. */ + $shmid = @shmop_open($reference, "w", 0, 0); + $shm_data = @shmop_read($shmid, 0, 10); + $shm_data = intval($shm_data) - 1; + if ($shm_data < 0) { + //debug_backtrace(); + log_error("Reference {$reference} is going negative, not doing unreference."); + } else + @shmop_write($shmid, $shm_data, 0); + @shmop_close($shmid); + } catch (Exception $e) { + log_error($e->getMessage()); + } return $shm_data; } @@ -1502,4 +1510,4 @@ function array_merge_recursive_unique($array0, $array1) { return $result; } -?> \ No newline at end of file +?>