btrfs-progs: tests/fsck: Add test case to check if btrfs check can skip data csum...
[platform/upstream/btrfs-progs.git] / task-utils.c
index 0390a69..12b0002 100644 (file)
@@ -51,7 +51,7 @@ int task_start(struct task_info *info)
                             info->private_data);
 
        if (ret)
-               info->id = -1;
+               info->id = 0;
 
        return ret;
 }
@@ -61,12 +61,15 @@ void task_stop(struct task_info *info)
        if (!info)
                return;
 
-       if (info->periodic.timer_fd)
-               close(info->periodic.timer_fd);
-
        if (info->id > 0) {
                pthread_cancel(info->id);
                pthread_join(info->id, NULL);
+               info->id = 0;
+       }
+
+       if (info->periodic.timer_fd) {
+               close(info->periodic.timer_fd);
+               info->periodic.timer_fd = 0;
        }
 
        if (info->postfn)
@@ -91,8 +94,10 @@ int task_period_start(struct task_info *info, unsigned int period_ms)
                return -1;
 
        info->periodic.timer_fd = timerfd_create(CLOCK_MONOTONIC, 0);
-       if (info->periodic.timer_fd == -1)
+       if (info->periodic.timer_fd == -1) {
+               info->periodic.timer_fd = 0;
                return info->periodic.timer_fd;
+       }
 
        info->periodic.wakeups_missed = 0;
 
@@ -114,6 +119,9 @@ void task_period_wait(struct task_info *info)
        if (!info)
                return;
 
+       if (info->periodic.timer_fd == 0)
+               return;
+
        ret = read(info->periodic.timer_fd, &missed, sizeof (missed));
        if (ret == -1)
                return;
@@ -130,5 +138,6 @@ void task_period_stop(struct task_info *info)
        if (info->periodic.timer_fd) {
                timerfd_settime(info->periodic.timer_fd, 0, NULL, NULL);
                close(info->periodic.timer_fd);
+               info->periodic.timer_fd = -1;
        }
 }