close(fd);
out:
free(config_file);
- if (ret < 0)
- DSS_EMERG_LOG(("%s\n", dss_strerror(-ret)));
return ret;
}
OPT_STRING_VAL(DSS, REMOTE_USER) : logname,
OPT_STRING_VAL(DSS, REMOTE_HOST),
lls_string_val(j, OPT_RESULT(DSS, SOURCE_DIR)),
- N == 1? "/" : ""
+ OPT_GIVEN(DSS, SOURCE_DIR) == 1? "/" : ""
);
}
}
{
pid_t pid;
char **argv, *tmp = dss_strdup(OPT_STRING_VAL(DSS, EXIT_HOOK));
- unsigned n = split_args(tmp, &argv, " \t");
+ unsigned n = split_args(tmp, &argv);
n++;
argv = dss_realloc(argv, (n + 1) * sizeof(char *));
struct snapshot_list sl;
struct snapshot *victim;
struct disk_space ds;
- const char *why;
+ char *why;
+ bool try_hard;
lock_dss_or_die();
- ret = get_disk_space(".", &ds);
- if (ret < 0)
- return ret;
- log_disk_space(&ds);
+ switch (OPT_UINT32_VAL(PRUNE, DISK_SPACE)) {
+ case FDS_LOW: try_hard = true; break;
+ case FDS_HIGH: try_hard = false; break;
+ default:
+ ret = get_disk_space(".", &ds);
+ if (ret < 0)
+ return ret;
+ log_disk_space(&ds);
+ try_hard = disk_space_low(&ds);
+ }
dss_get_snapshot_list(&sl);
- why = "outdated";
- victim = find_outdated_snapshot(&sl);
- if (victim)
- goto rm;
- why = "redundant";
- victim = find_redundant_snapshot(&sl);
- if (victim)
- goto rm;
- dss_msg("nothing to prune\n");
- ret = 0;
- goto out;
-rm:
+ victim = find_removable_snapshot(&sl, try_hard, &why);
+ if (!victim) {
+ dss_msg("nothing to prune\n");
+ ret = 0;
+ goto free_sl;
+ }
if (OPT_GIVEN(DSS, DRY_RUN)) {
- dss_msg("%s snapshot %s (interval = %i)\n",
+ dss_msg("picking %s snapshot %s (interval = %i)\n",
why, victim->name, victim->interval);
ret = 0;
- goto out;
+ goto free_why;
}
pre_remove_hook(victim, why);
if (snapshot_removal_status == HS_PRE_RUNNING) {
ret = wait_for_remove_process();
if (ret < 0)
- goto out;
+ goto free_why;
ret = -E_HOOK_FAILED;
if (snapshot_removal_status != HS_PRE_SUCCESS)
- goto out;
+ goto free_why;
}
ret = exec_rm();
if (ret < 0)
- goto out;
+ goto free_why;
ret = wait_for_remove_process();
if (ret < 0)
- goto out;
+ goto free_why;
assert(snapshot_removal_status == HS_SUCCESS);
post_remove_hook();
assert(snapshot_removal_status == HS_POST_RUNNING);
ret = wait_for_remove_process();
- if (ret < 0)
- goto out;
- ret = 1;
-out:
+free_why:
+ free(why);
+free_sl:
free_snapshot_list(&sl);
return ret;
}