tree:
https://git.kernel.org/pub/scm/linux/kernel/git/colyli/linux-bcache.git for-next
head: fda12af14f942aa1b3c6b5b6aa8e9276febca58f
commit: 216de35c8ed4d7253b717d68336d32c97fced838 [13/23] bcache: increase super block
version for cache device and backing device
config: arc-randconfig-s032-20200710 (attached as .config)
compiler: arc-elf-gcc (GCC) 9.3.0
reproduce:
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O
~/bin/make.cross
chmod +x ~/bin/make.cross
# apt-get install sparse
# sparse version: v0.6.2-37-gc9676a3b-dirty
git checkout 216de35c8ed4d7253b717d68336d32c97fced838
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1
CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=arc
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
sparse warnings: (new ones prefixed by >>)
drivers/md/bcache/super.c:180:24: sparse: sparse: cast from restricted __le16
drivers/md/bcache/super.c:180:14: sparse: sparse: restricted __le64 degrades to
integer
> drivers/md/bcache/super.c:216:36: sparse: sparse: incorrect type
in assignment (different base types) @@ expected restricted __le64 [usertype]
feature_compat @@ got unsigned long long @@
drivers/md/bcache/super.c:216:36:
sparse: expected restricted __le64 [usertype] feature_compat
drivers/md/bcache/super.c:216:36: sparse: got unsigned long long
> drivers/md/bcache/super.c:217:38: sparse: sparse: incorrect type
in assignment (different base types) @@ expected restricted __le64 [usertype]
feature_incompat @@ got unsigned long long @@
drivers/md/bcache/super.c:217:38: sparse: expected restricted __le64 [usertype]
feature_incompat
drivers/md/bcache/super.c:217:38: sparse: got unsigned long long
> drivers/md/bcache/super.c:218:39: sparse: sparse: incorrect type
in assignment (different base types) @@ expected restricted __le64 [usertype]
feature_ro_compat @@ got unsigned long long @@
drivers/md/bcache/super.c:218:39: sparse: expected restricted __le64 [usertype]
feature_ro_compat
drivers/md/bcache/super.c:218:39: sparse: got unsigned long long
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from restricted __le64
> drivers/md/bcache/super.c:270:42: sparse: sparse: incorrect type
in argument 1 (different base types) @@ expected unsigned long long [usertype] val @@
got restricted __le64 [usertype] feature_compat @@
> drivers/md/bcache/super.c:270:42: sparse: expected unsigned long long [usertype]
val
> drivers/md/bcache/super.c:270:42: sparse: got restricted __le64 [usertype]
feature_compat
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from
restricted __le64
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:270:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:271:42: sparse: sparse: cast from restricted __le64
> drivers/md/bcache/super.c:271:42: sparse: sparse: incorrect type
in argument 1 (different base types) @@ expected unsigned long long [usertype] val @@
got restricted __le64 [usertype] feature_incompat @@
drivers/md/bcache/super.c:271:42: sparse: expected unsigned long long [usertype] val
> drivers/md/bcache/super.c:271:42: sparse: got restricted
__le64 [usertype] feature_incompat
drivers/md/bcache/super.c:271:42: sparse:
sparse: cast from restricted __le64
drivers/md/bcache/super.c:271:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:271:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:271:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:271:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:271:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:271:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:271:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:272:42: sparse: sparse: cast from restricted __le64
> drivers/md/bcache/super.c:272:42: sparse: sparse: incorrect type
in argument 1 (different base types) @@ expected unsigned long long [usertype] val @@
got restricted __le64 [usertype] feature_ro_compat @@
drivers/md/bcache/super.c:272:42: sparse: expected unsigned long long [usertype] val
> drivers/md/bcache/super.c:272:42: sparse: got restricted
__le64 [usertype] feature_ro_compat
drivers/md/bcache/super.c:272:42: sparse:
sparse: cast from restricted __le64
drivers/md/bcache/super.c:272:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:272:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:272:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:272:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:272:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:272:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:272:42: sparse: sparse: cast from restricted __le64
drivers/md/bcache/super.c:276:21: sparse: sparse: cast from restricted __le16
drivers/md/bcache/super.c:276:19: sparse: sparse: incorrect type in assignment
(different base types) @@ expected restricted __le64 [usertype] csum @@ got
unsigned long long @@
drivers/md/bcache/super.c:276:19: sparse: expected restricted __le64 [usertype]
csum
drivers/md/bcache/super.c:276:19: sparse: got unsigned long long
drivers/md/bcache/super.c:616:33: sparse: sparse: incorrect type in assignment
(different base types) @@ expected unsigned short [usertype] prio @@ got
restricted __le16 [usertype] @@
drivers/md/bcache/super.c:616:33: sparse: expected unsigned short [usertype] prio
drivers/md/bcache/super.c:616:33: sparse: got restricted __le16 [usertype]
drivers/md/bcache/super.c:689:27: sparse: sparse: cast to restricted __le16
drivers/md/bcache/super.c:689:27: sparse: sparse: cast to restricted __le16
drivers/md/bcache/super.c:689:27: sparse: sparse: cast to restricted __le16
drivers/md/bcache/super.c:689:27: sparse: sparse: cast to restricted __le16
drivers/md/bcache/super.c:795:32: sparse: sparse: incorrect type in assignment
(different base types) @@ expected unsigned int [usertype] invalidated @@ got
restricted __le32 [usertype] @@
drivers/md/bcache/super.c:795:32: sparse: expected unsigned int [usertype]
invalidated
drivers/md/bcache/super.c:795:32: sparse: got restricted __le32 [usertype]
drivers/md/bcache/super.c:1170:26: sparse: sparse: incorrect type in initializer
(different base types) @@ expected unsigned int [usertype] rtime @@ got restricted
__le32 [usertype] @@
drivers/md/bcache/super.c:1170:26: sparse: expected unsigned int [usertype] rtime
drivers/md/bcache/super.c:1170:26: sparse: got restricted __le32 [usertype]
drivers/md/bcache/super.c:1214:32: sparse: sparse: incorrect type in assignment
(different base types) @@ expected unsigned int [usertype] invalidated @@ got
restricted __le32 [usertype] @@
drivers/md/bcache/super.c:1214:32: sparse: expected unsigned int [usertype]
invalidated
drivers/md/bcache/super.c:1214:32: sparse: got restricted __le32 [usertype]
drivers/md/bcache/super.c:1566:36: sparse: sparse: incorrect type in assignment
(different base types) @@ expected unsigned int [usertype] last_reg @@ got
restricted __le32 [usertype] @@
drivers/md/bcache/super.c:1566:36: sparse: expected unsigned int [usertype]
last_reg
drivers/md/bcache/super.c:1566:36: sparse: got restricted __le32 [usertype]
vim +216 drivers/md/bcache/super.c
41
42 static struct kobject *bcache_kobj;
43 struct mutex bch_register_lock;
44 bool bcache_is_reboot;
45 LIST_HEAD(bch_cache_sets);
46 static LIST_HEAD(uncached_devices);
47
48 static int bcache_major;
49 static DEFINE_IDA(bcache_device_idx);
50 static wait_queue_head_t unregister_wait;
51 struct workqueue_struct *bcache_wq;
52 struct workqueue_struct *bch_journal_wq;
53
54
55 #define BTREE_MAX_PAGES (256 * 1024 / PAGE_SIZE)
56 /* limitation of partitions number on single bcache device */
57 #define BCACHE_MINORS 128
58 /* limitation of bcache devices number on single system */
59 #define BCACHE_DEVICE_IDX_MAX ((1U << MINORBITS)/BCACHE_MINORS)
60
61 /* Superblock */
62
63 static const char *read_super_basic(struct cache_sb *sb, struct block_device
*bdev,
64 struct cache_sb_disk *s)
65 {
66 const char *err;
67 unsigned int i;
68
69 sb->nbuckets = le64_to_cpu(s->nbuckets);
70 sb->bucket_size = le16_to_cpu(s->bucket_size);
71
72 sb->nr_in_set = le16_to_cpu(s->nr_in_set);
73 sb->nr_this_dev = le16_to_cpu(s->nr_this_dev);
74
75 err = "Too many buckets";
76 if (sb->nbuckets > LONG_MAX)
77 goto err;
78
79 err = "Not enough buckets";
80 if (sb->nbuckets < 1 << 7)
81 goto err;
82
83 err = "Bad block size (not power of 2)";
84 if (!is_power_of_2(sb->block_size))
85 goto err;
86
87 err = "Bad block size (larger than page size)";
88 if (sb->block_size > PAGE_SECTORS)
89 goto err;
90
91 err = "Bad bucket size (not power of 2)";
92 if (!is_power_of_2(sb->bucket_size))
93 goto err;
94
95 err = "Bad bucket size (smaller than page size)";
96 if (sb->bucket_size < PAGE_SECTORS)
97 goto err;
98
99 err = "Invalid superblock: device too small";
100 if (get_capacity(bdev->bd_disk) <
101 sb->bucket_size * sb->nbuckets)
102 goto err;
103
104 err = "Bad UUID";
105 if (bch_is_zero(sb->set_uuid, 16))
106 goto err;
107
108 err = "Bad cache device number in set";
109 if (!sb->nr_in_set ||
110 sb->nr_in_set <= sb->nr_this_dev ||
111 sb->nr_in_set > MAX_CACHES_PER_SET)
112 goto err;
113
114 err = "Journal buckets not sequential";
115 for (i = 0; i < sb->keys; i++)
116 if (sb->d[i] != sb->first_bucket + i)
117 goto err;
118
119 err = "Too many journal buckets";
120 if (sb->first_bucket + sb->keys > sb->nbuckets)
121 goto err;
122
123 err = "Invalid superblock: first bucket comes before end of super";
124 if (sb->first_bucket * sb->bucket_size < 16)
125 goto err;
126
127 err = NULL;
128 err:
129 return err;
130 }
131
132
133 static const char *read_super(struct cache_sb *sb, struct block_device *bdev,
134 struct cache_sb_disk **res)
135 {
136 const char *err;
137 struct cache_sb_disk *s;
138 struct page *page;
139 unsigned int i;
140
141 page = read_cache_page_gfp(bdev->bd_inode->i_mapping,
142 SB_OFFSET >> PAGE_SHIFT, GFP_KERNEL);
143 if (IS_ERR(page))
144 return "IO error";
145 s = page_address(page) + offset_in_page(SB_OFFSET);
146
147 sb->offset = le64_to_cpu(s->offset);
148 sb->version = le64_to_cpu(s->version);
149
150 memcpy(sb->magic, s->magic, 16);
151 memcpy(sb->uuid, s->uuid, 16);
152 memcpy(sb->set_uuid, s->set_uuid, 16);
153 memcpy(sb->label, s->label, SB_LABEL_SIZE);
154
155 sb->flags = le64_to_cpu(s->flags);
156 sb->seq = le64_to_cpu(s->seq);
157 sb->last_mount = le32_to_cpu(s->last_mount);
158 sb->first_bucket = le16_to_cpu(s->first_bucket);
159 sb->keys = le16_to_cpu(s->keys);
160
161 for (i = 0; i < SB_JOURNAL_BUCKETS; i++)
162 sb->d[i] = le64_to_cpu(s->d[i]);
163
164 pr_debug("read sb version %llu, flags %llu, seq %llu, journal size
%u\n",
165 sb->version, sb->flags, sb->seq, sb->keys);
166
167 err = "Not a bcache superblock (bad offset)";
168 if (sb->offset != SB_SECTOR)
169 goto err;
170
171 err = "Not a bcache superblock (bad magic)";
172 if (memcmp(sb->magic, bcache_magic, 16))
173 goto err;
174
175 err = "Too many journal buckets";
176 if (sb->keys > SB_JOURNAL_BUCKETS)
177 goto err;
178
179 err = "Bad checksum";
180 if (s->csum != csum_set(s))
181 goto err;
182
183 err = "Bad UUID";
184 if (bch_is_zero(sb->uuid, 16))
185 goto err;
186
187 sb->block_size = le16_to_cpu(s->block_size);
188
189 err = "Superblock block size smaller than device block size";
190 if (sb->block_size << 9 < bdev_logical_block_size(bdev))
191 goto err;
192
193 switch (sb->version) {
194 case BCACHE_SB_VERSION_BDEV:
195 sb->data_offset = BDEV_DATA_START_DEFAULT;
196 break;
197 case BCACHE_SB_VERSION_BDEV_WITH_OFFSET:
198 case BCACHE_SB_VERSION_BDEV_WITH_FEATURES:
199 sb->data_offset = le64_to_cpu(s->data_offset);
200
201 err = "Bad data offset";
202 if (sb->data_offset < BDEV_DATA_START_DEFAULT)
203 goto err;
204
205 break;
206 case BCACHE_SB_VERSION_CDEV:
207 case BCACHE_SB_VERSION_CDEV_WITH_UUID:
208 err = read_super_basic(sb, bdev, s);
209 if (err)
210 goto err;
211 break;
212 case BCACHE_SB_VERSION_CDEV_WITH_FEATURES:
213 err = read_super_basic(sb, bdev, s);
214 if (err)
215 goto err;
216 sb->feature_compat = le64_to_cpu(s->feature_compat);
217 sb->feature_incompat = le64_to_cpu(s->feature_incompat);
218 sb->feature_ro_compat = le64_to_cpu(s->feature_ro_compat);
219 break;
220 default:
221 err = "Unsupported superblock version";
222 goto err;
223 }
224
225 sb->last_mount = (u32)ktime_get_real_seconds();
226 *res = s;
227 return NULL;
228 err:
229 put_page(page);
230 return err;
231 }
232
233 static void write_bdev_super_endio(struct bio *bio)
234 {
235 struct cached_dev *dc = bio->bi_private;
236
237 if (bio->bi_status)
238 bch_count_backing_io_errors(dc, bio);
239
240 closure_put(&dc->sb_write);
241 }
242
243 static void __write_super(struct cache_sb *sb, struct cache_sb_disk *out,
244 struct bio *bio)
245 {
246 unsigned int i;
247
248 bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_META;
249 bio->bi_iter.bi_sector = SB_SECTOR;
250 __bio_add_page(bio, virt_to_page(out), SB_SIZE,
251 offset_in_page(out));
252
253 out->offset = cpu_to_le64(sb->offset);
254
255 memcpy(out->uuid, sb->uuid, 16);
256 memcpy(out->set_uuid, sb->set_uuid, 16);
257 memcpy(out->label, sb->label, SB_LABEL_SIZE);
258
259 out->flags = cpu_to_le64(sb->flags);
260 out->seq = cpu_to_le64(sb->seq);
261
262 out->last_mount = cpu_to_le32(sb->last_mount);
263 out->first_bucket = cpu_to_le16(sb->first_bucket);
264 out->keys = cpu_to_le16(sb->keys);
265
266 for (i = 0; i < sb->keys; i++)
267 out->d[i] = cpu_to_le64(sb->d[i]);
268
269 if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES) {
270 out->feature_compat =
cpu_to_le64(sb->feature_compat);
271 out->feature_incompat = cpu_to_le64(sb->feature_incompat);
272 out->feature_ro_compat = cpu_to_le64(sb->feature_ro_compat);
273 }
274
275 out->version = cpu_to_le64(sb->version);
276 out->csum = csum_set(out);
277
278 pr_debug("ver %llu, flags %llu, seq %llu\n",
279 sb->version, sb->flags, sb->seq);
280
281 submit_bio(bio);
282 }
283
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org