OSDN Git Service

bcache: use a separate data structure for the on-disk super block
authorChristoph Hellwig <hch@lst.de>
Thu, 23 Jan 2020 17:01:27 +0000 (01:01 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 23 Jan 2020 18:40:00 +0000 (11:40 -0700)
Split out an on-disk version struct cache_sb with the proper endianness
annotations.  This fixes a fair chunk of sparse warnings, but there are
some left due to the way the checksum is defined.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Coly Li <colyli@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/bcache/super.c
include/uapi/linux/bcache.h

index a573ce1..3045f27 100644 (file)
@@ -63,14 +63,14 @@ static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
                              struct page **res)
 {
        const char *err;
-       struct cache_sb *s;
+       struct cache_sb_disk *s;
        struct buffer_head *bh = __bread(bdev, 1, SB_SIZE);
        unsigned int i;
 
        if (!bh)
                return "IO error";
 
-       s = (struct cache_sb *) bh->b_data;
+       s = (struct cache_sb_disk *)bh->b_data;
 
        sb->offset              = le64_to_cpu(s->offset);
        sb->version             = le64_to_cpu(s->version);
@@ -209,7 +209,7 @@ static void write_bdev_super_endio(struct bio *bio)
 
 static void __write_super(struct cache_sb *sb, struct bio *bio)
 {
-       struct cache_sb *out = page_address(bio_first_page_all(bio));
+       struct cache_sb_disk *out = page_address(bio_first_page_all(bio));
        unsigned int i;
 
        bio->bi_iter.bi_sector  = SB_SECTOR;
index 5d4f58e..1d8b3a9 100644 (file)
@@ -156,6 +156,57 @@ static inline struct bkey *bkey_idx(const struct bkey *k, unsigned int nr_keys)
 
 #define BDEV_DATA_START_DEFAULT                16      /* sectors */
 
+struct cache_sb_disk {
+       __le64                  csum;
+       __le64                  offset; /* sector where this sb was written */
+       __le64                  version;
+
+       __u8                    magic[16];
+
+       __u8                    uuid[16];
+       union {
+               __u8            set_uuid[16];
+               __le64          set_magic;
+       };
+       __u8                    label[SB_LABEL_SIZE];
+
+       __le64                  flags;
+       __le64                  seq;
+       __le64                  pad[8];
+
+       union {
+       struct {
+               /* Cache devices */
+               __le64          nbuckets;       /* device size */
+
+               __le16          block_size;     /* sectors */
+               __le16          bucket_size;    /* sectors */
+
+               __le16          nr_in_set;
+               __le16          nr_this_dev;
+       };
+       struct {
+               /* Backing devices */
+               __le64          data_offset;
+
+               /*
+                * block_size from the cache device section is still used by
+                * backing devices, so don't add anything here until we fix
+                * things to not need it for backing devices anymore
+                */
+       };
+       };
+
+       __le32                  last_mount;     /* time overflow in y2106 */
+
+       __le16                  first_bucket;
+       union {
+               __le16          njournal_buckets;
+               __le16          keys;
+       };
+       __le64                  d[SB_JOURNAL_BUCKETS];  /* journal buckets */
+};
+
 struct cache_sb {
        __u64                   csum;
        __u64                   offset; /* sector where this sb was written */