FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.

» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > ArchLinux > ArchLinux Pacman Development

LinkBack Thread Tools
Old 03-17-2011, 10:27 AM
Allan McRae
Default Ensure we have a root partition when checking space

On 17/03/11 20:16, Dan McGee wrote:

Partially addresses the "why doesn't CheckSpace work in a chroot" issue.
We can't make it work, but we can at least detect when it won't work by
the lack of a root partition to bucket the stragglers into. Check the
last item in the mountpoint list to ensure it is our root device, and if
not, bail out with an error.

Signed-off-by: Dan McGee<dan@archlinux.org>

For maint? Allan, Eric, enjoy, I think this should help address things, but
testing it out in a chroot would be much appreciated.

This looks good. I will do some testing with it later, but it seems
fine for a maint release.

But... lets look for an extreme edge case! Using "pacman -r <dir>"
does not necessarily need the / partition to be found, just the one
containing <dir>. I'm not sure such a set-up is possible, so I am
happy ignoring it until someone actually reports it...

As an asdie, with this check, we should never encounter the error when a
file can not be matched to a mountpoint. So that string update should
never be seen. :P

lib/libalpm/diskspace.c | 14 +++++++++++++-
1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/lib/libalpm/diskspace.c b/lib/libalpm/diskspace.c
index 892b1aa..19eaeea 100644
--- a/lib/libalpm/diskspace.c
+++ b/lib/libalpm/diskspace.c
@@ -61,7 +61,7 @@ static int mount_point_cmp(const void *p1, const void *p2)

static alpm_list_t *mount_point_list(void)
- alpm_list_t *mount_points = NULL;
+ alpm_list_t *mount_points = NULL, *ptr;
alpm_mountpoint_t *mp;

#if defined HAVE_GETMNTENT
@@ -124,6 +124,10 @@ static alpm_list_t *mount_point_list(void)

mount_points = alpm_list_msort(mount_points, alpm_list_count(mount_points),
+ for(ptr = mount_points; ptr != NULL; ptr = ptr->next) {
+ mp = ptr->data;
+ _alpm_log(PM_LOG_DEBUG, "mountpoint: %s
", mp->mount_dir);
+ }

@@ -256,6 +260,7 @@ cleanup:
int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db_local)
alpm_list_t *mount_points, *i;
+ alpm_mountpoint_t *last;
size_t replaces = 0, current = 0, numtargs;
int abort = 0;
alpm_list_t *targ;
@@ -266,6 +271,13 @@ int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db_local)
_alpm_log(PM_LOG_ERROR, _("could not determine filesystem mount points"));
+ /* due to sorting, the last entry in our mountpoint list should be '/' */
+ i = alpm_list_last(mount_points);
+ last = i->data;
+ if(strcmp("/", last->mount_dir) != 0) {
+ _alpm_log(PM_LOG_ERROR, _("could not determine root filesystem mount"));
+ return(-1);
+ }

replaces = alpm_list_count(trans->remove);
if(replaces) {

Thread Tools

All times are GMT. The time now is 02:31 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org