On Tue, May 24, 2022 at 8:59 AM Logan Gunthorpe <logang@xxxxxxxxxxxx> wrote: > > > > On 2022-05-23 00:47, Song Liu wrote: > >> A problem here is that `struct r5l_log` of `conf->log` is private to raid5-cache.c and gcc below version 10 (wrongly) regards the `typeof(*p) *local` declaration of __rcu_access_pointer as a dereference: > >> > >> CC drivers/md/raid5.o > >> > >> In file included from ./include/linux/rculist.h:11:0, > >> > >> from ./include/linux/dcache.h:8, > >> > >> from ./include/linux/fs.h:8, > >> > >> from ./include/linux/highmem.h:5, > >> > >> from ./include/linux/bvec.h:10, > >> > >> from ./include/linux/blk_types.h:10, > >> > >> from ./include/linux/blkdev.h:9, > >> > >> from drivers/md/raid5.c:38: > >> > >> drivers/md/raid5-log.h: In function ‘log_stripe’: > >> > >> ./include/linux/rcupdate.h:384:9: error: dereferencing pointer to incomplete type ‘struct r5l_log’ > >> > >> typeof(*p) *local = (typeof(*p) *__force)READ_ONCE(p); \ > >> > >> ^ > >> > >> ./include/linux/rcupdate.h:495:31: note: in expansion of macro ‘__rcu_access_pointer’ > >> > >> #define rcu_access_pointer(p) __rcu_access_pointer((p), __UNIQUE_ID(rcu), __rcu) > >> > >> ^~~~~~~~~~~~~~~~~~~~ > >> > >> drivers/md/raid5-log.h:61:6: note: in expansion of macro ‘rcu_access_pointer’ > >> > >> if (rcu_access_pointer(conf->log)) { > >> > >> ^~~~~~~~~~~~~~~~~~ > >> > >> make[2]: *** [scripts/Makefile.build:288: drivers/md/raid5.o] Error 1 > >> > >> make[1]: *** [scripts/Makefile.build:550: drivers/md] Error 2 > >> > >> make: *** [Makefile:1834: drivers] Error 2 > > > > This is annoying.. And there are a few other cases in raid5-log.h and > > raid5.c. > > > > Maybe we should move the definition of r5l_log to raid5-log.h? > > That's the only solution I can think of, and what I'll likely do for v2. > If anyone has a better solution I'm open to it. Let's move the definition. Thanks, Song