Add this handler to break the defrag better, so it has 1. the stats reporting 2. remove the temporary file Signed-off-by: Wengang Wang <wen.gang.wang@xxxxxxxxxx> --- spaceman/defrag.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/spaceman/defrag.c b/spaceman/defrag.c index 9f11e36b..61e47a43 100644 --- a/spaceman/defrag.c +++ b/spaceman/defrag.c @@ -297,6 +297,13 @@ get_time_delta_us(struct timeval *pre_time, struct timeval *cur_time) return us; } +static volatile bool usedKilled = false; +void defrag_sigint_handler(int dummy) +{ + usedKilled = true; + printf("Please wait until current segment is defragmented\n"); +}; + /* * defragment a file * return 0 if successfully done, 1 otherwise @@ -345,6 +352,8 @@ defrag_xfs_defrag(char *file_path) { goto out; } + signal(SIGINT, defrag_sigint_handler); + do { struct timeval t_clone, t_unshare, t_punch_hole; struct defrag_segment segment; @@ -434,7 +443,7 @@ defrag_xfs_defrag(char *file_path) { if (time_delta > max_punch_us) max_punch_us = time_delta; - if (stop) + if (stop || usedKilled) break; } while (true); out: -- 2.39.3 (Apple Git-146)