]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - raid6check.c
mdadm: Move pr_vrb define to mdadm.h
[thirdparty/mdadm.git] / raid6check.c
index cb8522e523a6e26610878a9921ef8fc971df32a3..99477761c640b696bc1a36df10747b5defe54025 100644 (file)
@@ -24,7 +24,6 @@
 
 #include "mdadm.h"
 #include <stdint.h>
-#include <signal.h>
 #include <sys/mman.h>
 
 #define CHECK_PAGE_BITS (12)
@@ -130,30 +129,36 @@ void raid6_stats(int *disk, int *results, int raid_disks, int chunk_size)
 }
 
 int lock_stripe(struct mdinfo *info, unsigned long long start,
-               int chunk_size, int data_disks, sighandler_t *sig) {
+               int chunk_size, int data_disks, sighandler_t *sig)
+{
        int rv;
+
+       sig[0] = signal_s(SIGTERM, SIG_IGN);
+       sig[1] = signal_s(SIGINT, SIG_IGN);
+       sig[2] = signal_s(SIGQUIT, SIG_IGN);
+
+       if (sig[0] == SIG_ERR || sig[1] == SIG_ERR || sig[2] == SIG_ERR)
+               return 1;
+
        if(mlockall(MCL_CURRENT | MCL_FUTURE) != 0) {
                return 2;
        }
 
-       sig[0] = signal(SIGTERM, SIG_IGN);
-       sig[1] = signal(SIGINT, SIG_IGN);
-       sig[2] = signal(SIGQUIT, SIG_IGN);
-
        rv = sysfs_set_num(info, NULL, "suspend_lo", start * chunk_size * data_disks);
        rv |= sysfs_set_num(info, NULL, "suspend_hi", (start + 1) * chunk_size * data_disks);
        return rv * 256;
 }
 
-int unlock_all_stripes(struct mdinfo *info, sighandler_t *sig) {
+int unlock_all_stripes(struct mdinfo *info, sighandler_t *sig)
+{
        int rv;
        rv = sysfs_set_num(info, NULL, "suspend_lo", 0x7FFFFFFFFFFFFFFFULL);
        rv |= sysfs_set_num(info, NULL, "suspend_hi", 0);
        rv |= sysfs_set_num(info, NULL, "suspend_lo", 0);
 
-       signal(SIGQUIT, sig[2]);
-       signal(SIGINT, sig[1]);
-       signal(SIGTERM, sig[0]);
+       signal_s(SIGQUIT, sig[2]);
+       signal_s(SIGINT, sig[1]);
+       signal_s(SIGTERM, sig[0]);
 
        if(munlockall() != 0)
                return 3;
@@ -266,7 +271,8 @@ int manual_repair(int chunk_size, int syndrome_disks,
                                failed_data = failed_slot2;
                        else
                                failed_data = failed_slot1;
-                               printf("Repairing D(%d) and P\n", failed_data);
+
+                       printf("Repairing D(%d) and P\n", failed_data);
                        raid6_datap_recov(syndrome_disks+2, chunk_size,
                                          failed_data, (uint8_t**)blocks, 1);
                } else {
@@ -349,7 +355,8 @@ int check_stripes(struct mdinfo *info, int *source, unsigned long long *offsets,
        if (!tables_ready)
                make_tables();
 
-       posix_memalign((void**)&stripe_buf, 4096, raid_disks * chunk_size);
+       if (posix_memalign((void**)&stripe_buf, 4096, raid_disks * chunk_size) != 0)
+               exit(4);
        block_index_for_slot += 2;
        blocks += 2;
        blocks_page += 2;
@@ -560,7 +567,7 @@ int main(int argc, char *argv[])
                          GET_LEVEL|
                          GET_LAYOUT|
                          GET_DISKS|
-                         GET_DEGRADED |
+                         GET_STATE |
                          GET_COMPONENT|
                          GET_CHUNK|
                          GET_DEVS|