[pacman-dev] [PATCH] Ensure we have a root partition when checking space

Allan McRae allan at archlinux.org
Thu Mar 17 07:27:15 EDT 2011


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 at 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),
>   			mount_point_cmp);
> +	for(ptr = mount_points; ptr != NULL; ptr = ptr->next) {
> +		mp = ptr->data;
> +		_alpm_log(PM_LOG_DEBUG, "mountpoint: %s\n", mp->mount_dir);
> +	}
>   	return(mount_points);
>   }
>
> @@ -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"));
>   		return(-1);
>   	}
> +	/* 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) {



More information about the pacman-dev mailing list