- log_err_msg(ERROR, -ret);
-}
-
-int get_oldest(const char *dirname, void *private)
-{
- struct edge_snapshot_data *esd = private;
- struct snapshot s;
- int ret = is_snapshot(dirname, esd->now, &s);
-
- if (ret <= 0)
- return 1;
- if (s.creation_time > esd->snap.creation_time)
- return 1;
- free(esd->snap.name);
- esd->snap = s;
- return 1;
-}
-
-int remove_oldest_snapshot()
-{
- int ret;
- struct edge_snapshot_data esd = {
- .now = get_current_time(),
- .snap = {.creation_time = LLONG_MAX}
- };
- for_each_subdir(get_oldest, &esd);
- if (!esd.snap.name) /* no snapshot found */
- return 0;
- DSS_INFO_LOG("oldest snapshot: %s\n", esd.snap.name);
- ret = 0;
- if (esd.snap.creation_time == current_snapshot_creation_time)
- goto out; /* do not remove the snapshot currently being created */
- ret = remove_snapshot(&esd.snap);
-out:
- free(esd.snap.name);
- return ret;
-}
-
-/* TODO: Also consider number of inodes. */
-int disk_space_low(void)
-{
- struct disk_space ds;
- int ret = get_disk_space(".", &ds);
-
- if (ret < 0)
- return ret;
- if (conf.min_free_mb_arg)
- if (ds.free_mb < conf.min_free_mb_arg)
- return 1;
- if (conf.min_free_percent_arg)
- if (ds.percent_free < conf.min_free_percent_arg)
- return 1;
- return 0;
-}
-
-int try_to_free_disk_space(int low_disk_space, struct snapshot_list *sl)
-{
- int ret;
-
- ret = remove_outdated_snapshot(sl);
- if (ret) /* error, or we are removing something */
- return ret;
- /* no outdated snapshot */
- ret = remove_redundant_snapshot(sl);
- if (ret)
- return ret;
- if (!low_disk_space)
- return 0;
- DSS_WARNING_LOG("disk space low and nothing obvious to remove\n");
- ret = remove_oldest_snapshot();
- if (ret)