]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
super1: Fix bblog_size accesses on big-ending machines.
[thirdparty/mdadm.git] / super1.c
index 0f6797a8f1cdb3d5e351be20bd7ff3f4f095d558..9b877e504c4bd05c255e5cdddf996effc84ae72b 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -1,7 +1,7 @@
 /*
  * mdadm - manage Linux "md" devices aka RAID arrays.
  *
- * Copyright (C) 2001-2009 Neil Brown <neilb@suse.de>
+ * Copyright (C) 2001-2016 Neil Brown <neilb@suse.com>
  *
  *
  *    This program is free software; you can redistribute it and/or modify
@@ -141,6 +141,7 @@ struct misc_dev_info {
                                        |MD_FEATURE_JOURNAL             \
                                        )
 
+#ifndef MDASSEMBLE
 static int role_from_sb(struct mdp_superblock_1 *sb)
 {
        unsigned int d;
@@ -153,6 +154,7 @@ static int role_from_sb(struct mdp_superblock_1 *sb)
                role = MD_DISK_ROLE_SPARE;
        return role;
 }
+#endif
 
 /* return how many bytes are needed for bitmap, for cluster-md each node
  * should have it's own bitmap */
@@ -728,12 +730,12 @@ static int copy_metadata1(struct supertype *st, int from, int to)
        }
 
        if (super.bblog_size != 0 &&
-           __le32_to_cpu(super.bblog_size) <= 100 &&
+           __le16_to_cpu(super.bblog_size) <= 100 &&
            super.bblog_offset != 0 &&
            (super.feature_map & __le32_to_cpu(MD_FEATURE_BAD_BLOCKS))) {
                /* There is a bad block log */
                unsigned long long bb_offset = sb_offset;
-               int bytes = __le32_to_cpu(super.bblog_size) * 512;
+               int bytes = __le16_to_cpu(super.bblog_size) * 512;
                int written = 0;
                struct align_fd afrom, ato;
 
@@ -830,7 +832,7 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
        __u64 *bbl, *bbp;
        int i;
 
-       if  (!sb->bblog_size || __le32_to_cpu(sb->bblog_size) > 100
+       if  (!sb->bblog_size || __le16_to_cpu(sb->bblog_size) > 100
             || !sb->bblog_offset){
                printf("No bad-blocks list configured on %s\n", devname);
                return 0;
@@ -841,7 +843,7 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
                return 0;
        }
 
-       size = __le32_to_cpu(sb->bblog_size)* 512;
+       size = __le16_to_cpu(sb->bblog_size)* 512;
        if (posix_memalign((void**)&bbl, 4096, size) != 0) {
                pr_err("could not allocate badblocks list\n");
                return 0;
@@ -984,7 +986,7 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
                if (sb->bblog_offset && sb->bblog_size) {
                        unsigned long long bbend = super_offset;
                        bbend += (int32_t)__le32_to_cpu(sb->bblog_offset);
-                       bbend += __le32_to_cpu(sb->bblog_size);
+                       bbend += __le16_to_cpu(sb->bblog_size);
                        if (bbend > earliest)
                                earliest = bbend;
                }
@@ -1654,6 +1656,7 @@ static void free_super1(struct supertype *st);
 #define META_BLOCK_SIZE 4096
 __u32 crc32c_le(__u32 crc, unsigned char const *p, size_t len);
 
+#ifndef MDASSEMBLE
 static int write_empty_r5l_meta_block(struct supertype *st, int fd)
 {
        struct r5l_meta_block *mb;
@@ -1699,7 +1702,6 @@ fail_to_write:
        return 1;
 }
 
-#ifndef MDASSEMBLE
 static int write_init_super1(struct supertype *st)
 {
        struct mdp_superblock_1 *sb = st->sb;