[pacman-dev] [PATCH 1/5] diskspace: add _alpm_check_downloadspace()

Dan McGee dpmcgee at gmail.com
Sun Oct 16 15:37:51 EDT 2011


On Sun, Oct 16, 2011 at 1:59 PM, Dave Reisner <d at falconindy.com> wrote:
> This function determines if the given cachedir has at least the given
> amount of free space on it. This will be later used in the sync code to
> preemptively halt downloads.
>
> Signed-off-by: Dave Reisner <dreisner at archlinux.org>
> ---
>  lib/libalpm/diskspace.c |   54 +++++++++++++++++++++++++++++++++++++++++++++++
>  lib/libalpm/diskspace.h |    2 +
>  2 files changed, 56 insertions(+), 0 deletions(-)
>
> diff --git a/lib/libalpm/diskspace.c b/lib/libalpm/diskspace.c
> index 9dedbe1..d376444 100644
> --- a/lib/libalpm/diskspace.c
> +++ b/lib/libalpm/diskspace.c
> @@ -253,6 +253,60 @@ static int check_mountpoint(alpm_handle_t *handle, alpm_mountpoint_t *mp)
>        return 0;
>  }
>
> +int _alpm_check_downloadspace(alpm_handle_t *handle, const char *cachedir,
> +               size_t num_files, off_t *file_sizes)
> +{
> +       alpm_list_t *i, *mount_points;
> +       alpm_mountpoint_t *cachedir_mp;
> +       fsblkcnt_t blocks_needed = 0;
> +       size_t j;
> +       int error = 0;
> +
> +       mount_points = mount_point_list(handle);
> +       if(mount_points == NULL) {
> +               _alpm_log(handle, ALPM_LOG_ERROR, _("could not determine filesystem mount points\n"));
> +               return -1;
> +       }
> +
> +       cachedir_mp = match_mount_point(mount_points, cachedir);
> +       if(cachedir == NULL) {
> +               _alpm_log(handle, ALPM_LOG_ERROR, _("could not determine cachedir mount point %s\n"),
> +                               cachedir);
> +               error = 1;
> +               goto finish;
> +       }
> +
> +       /* there's no need to check for a R/O mounted filesystem here, as
> +        * _alpm_filecache_setup will never give us a non-writeable directory */
s/writeable/writable/
> +
> +       /* round up the size of each file to the nearest block and accumulate */
> +       for(j = 0; j < num_files; j++) {
> +               blocks_needed += (file_sizes[j] + cachedir_mp->fsp.f_bsize + 1) /
> +                       cachedir_mp->fsp.f_bsize;
> +       }
> +
> +       if(cachedir_mp->fsp.f_bfree < blocks_needed) {
Can we use the extracted check_mountpoint() for this please so we get
the same 5%/20 MiB cushion for this check that we do on a normal
install?

> +               _alpm_log(handle, ALPM_LOG_ERROR,
> +                               _("Partition %s too full: %jd blocks needed, %jd blocks free\n"),
> +                               cachedir_mp->mount_dir, (intmax_t)blocks_needed,
> +                               (uintmax_t)cachedir_mp->fsp.f_bfree);
> +               error = 1;
> +       }
> +
> +finish:
> +       for(i = mount_points; i; i = i->next) {
> +               alpm_mountpoint_t *data = i->data;
> +               FREE(data->mount_dir);
> +       }
> +       FREELIST(mount_points);
Might be worthwhile to add a mountpoint_list_free() static function
since we do this in multiple places now.
> +
> +       if(error) {
> +               RET_ERR(handle, ALPM_ERR_DISK_SPACE, -1);
> +       }
> +
> +       return 0;
> +}
> +
>  int _alpm_check_diskspace(alpm_handle_t *handle)
>  {
>        alpm_list_t *mount_points, *i;
> diff --git a/lib/libalpm/diskspace.h b/lib/libalpm/diskspace.h
> index 5944bb1..a613e23 100644
> --- a/lib/libalpm/diskspace.h
> +++ b/lib/libalpm/diskspace.h
> @@ -50,6 +50,8 @@ typedef struct __alpm_mountpoint_t {
>  } alpm_mountpoint_t;
>
>  int _alpm_check_diskspace(alpm_handle_t *handle);
> +int _alpm_check_downloadspace(alpm_handle_t *handle, const char *cachedir,
> +               size_t num_files, off_t *file_sizes);
>
>  #endif /* _ALPM_DISKSPACE_H */
>
> --
> 1.7.7
>
>
>


More information about the pacman-dev mailing list