tree: https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git fsverity head: 1a96f6eee4094764886183b852c8789e28e1c212 commit: 1a96f6eee4094764886183b852c8789e28e1c212 [2/2] ext4: add fsverity read support config: arm-omap2plus_defconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout 1a96f6eee4094764886183b852c8789e28e1c212 # save the attached .config to linux build tree make.cross ARCH=arm All errors (new ones prefixed by >>): In file included from arch/arm/include/asm/barrier.h:66:0, from include/linux/compiler.h:245, from include/linux/kernel.h:10, from fs/ext4/readpage.c:31: fs/ext4/readpage.c: In function 'get_bio_post_read_ctx': >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/asm-generic/barrier.h:135:10: note: in definition of macro '__smp_load_acquire' typeof(*p) ___p1 = READ_ONCE(*p); \ ^ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ In file included from include/linux/kernel.h:10:0, from fs/ext4/readpage.c:31: >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:250:17: note: in definition of macro '__READ_ONCE' union { typeof(x) __val; char __c[1]; } __u; \ ^ include/asm-generic/barrier.h:135:21: note: in expansion of macro 'READ_ONCE' typeof(*p) ___p1 = READ_ONCE(*p); \ ^~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:252:22: note: in definition of macro '__READ_ONCE' __read_once_size(&(x), __u.__c, sizeof(x)); \ ^ include/asm-generic/barrier.h:135:21: note: in expansion of macro 'READ_ONCE' typeof(*p) ___p1 = READ_ONCE(*p); \ ^~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:252:42: note: in definition of macro '__READ_ONCE' __read_once_size(&(x), __u.__c, sizeof(x)); \ ^ include/asm-generic/barrier.h:135:21: note: in expansion of macro 'READ_ONCE' typeof(*p) ___p1 = READ_ONCE(*p); \ ^~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:254:30: note: in definition of macro '__READ_ONCE' __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ ^ include/asm-generic/barrier.h:135:21: note: in expansion of macro 'READ_ONCE' typeof(*p) ___p1 = READ_ONCE(*p); \ ^~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:254:50: note: in definition of macro '__READ_ONCE' __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ ^ include/asm-generic/barrier.h:135:21: note: in expansion of macro 'READ_ONCE' typeof(*p) ___p1 = READ_ONCE(*p); \ ^~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:316:19: note: in definition of macro '__compiletime_assert' bool __cond = !(condition); \ ^~~~~~~~~ include/linux/compiler.h:339:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:342:2: note: in expansion of macro 'compiletime_assert' compiletime_assert(__native_word(t), \ ^~~~~~~~~~~~~~~~~~ include/linux/compiler.h:342:21: note: in expansion of macro '__native_word' compiletime_assert(__native_word(t), \ ^~~~~~~~~~~~~ include/asm-generic/barrier.h:136:2: note: in expansion of macro 'compiletime_assert_atomic_type' compiletime_assert_atomic_type(*p); \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:316:19: note: in definition of macro '__compiletime_assert' bool __cond = !(condition); \ ^~~~~~~~~ include/linux/compiler.h:339:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:342:2: note: in expansion of macro 'compiletime_assert' compiletime_assert(__native_word(t), \ ^~~~~~~~~~~~~~~~~~ include/linux/compiler.h:342:21: note: in expansion of macro '__native_word' compiletime_assert(__native_word(t), \ ^~~~~~~~~~~~~ include/asm-generic/barrier.h:136:2: note: in expansion of macro 'compiletime_assert_atomic_type' compiletime_assert_atomic_type(*p); \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:316:19: note: in definition of macro '__compiletime_assert' bool __cond = !(condition); \ ^~~~~~~~~ include/linux/compiler.h:339:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:342:2: note: in expansion of macro 'compiletime_assert' compiletime_assert(__native_word(t), \ ^~~~~~~~~~~~~~~~~~ include/linux/compiler.h:342:21: note: in expansion of macro '__native_word' compiletime_assert(__native_word(t), \ ^~~~~~~~~~~~~ include/asm-generic/barrier.h:136:2: note: in expansion of macro 'compiletime_assert_atomic_type' compiletime_assert_atomic_type(*p); \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ >> fs/ext4/readpage.c:162:32: error: 'struct inode' has no member named 'i_verity_info'; did you mean 'i_write_hint'? (smp_load_acquire(&inode->i_verity_info) != NULL) && ^ include/linux/compiler.h:316:19: note: in definition of macro '__compiletime_assert' bool __cond = !(condition); \ ^~~~~~~~~ include/linux/compiler.h:339:2: note: in expansion of macro '_compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:342:2: note: in expansion of macro 'compiletime_assert' compiletime_assert(__native_word(t), \ ^~~~~~~~~~~~~~~~~~ include/linux/compiler.h:342:21: note: in expansion of macro '__native_word' compiletime_assert(__native_word(t), \ ^~~~~~~~~~~~~ include/asm-generic/barrier.h:136:2: note: in expansion of macro 'compiletime_assert_atomic_type' compiletime_assert_atomic_type(*p); \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/asm-generic/barrier.h:161:29: note: in expansion of macro '__smp_load_acquire' #define smp_load_acquire(p) __smp_load_acquire(p) ^~~~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:7: note: in expansion of macro 'smp_load_acquire' (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~~~~~~~~~~~~~~~ fs/ext4/readpage.c:162:47: warning: comparison between pointer and integer (smp_load_acquire(&inode->i_verity_info) != NULL) && ^~ vim +162 fs/ext4/readpage.c > 31 #include <linux/kernel.h> 32 #include <linux/export.h> 33 #include <linux/mm.h> 34 #include <linux/kdev_t.h> 35 #include <linux/gfp.h> 36 #include <linux/bio.h> 37 #include <linux/fs.h> 38 #include <linux/buffer_head.h> 39 #include <linux/blkdev.h> 40 #include <linux/highmem.h> 41 #include <linux/prefetch.h> 42 #include <linux/mpage.h> 43 #include <linux/writeback.h> 44 #include <linux/backing-dev.h> 45 #include <linux/pagevec.h> 46 #include <linux/cleancache.h> 47 48 #include "ext4.h" 49 50 #define NUM_PREALLOC_POST_READ_CTXS 128 51 52 static struct kmem_cache *bio_post_read_ctx_cache; 53 static mempool_t *bio_post_read_ctx_pool; 54 55 static inline bool ext4_bio_encrypted(struct bio *bio) 56 { 57 #ifdef CONFIG_EXT4_FS_ENCRYPTION 58 return unlikely(bio->bi_private != NULL); 59 #else 60 return false; 61 #endif 62 } 63 64 /* postprocessing steps for read bios */ 65 enum bio_post_read_step { 66 STEP_INITIAL = 0, 67 STEP_DECRYPT, 68 STEP_VERITY, 69 }; 70 71 struct bio_post_read_ctx { 72 struct bio *bio; 73 struct work_struct work; 74 unsigned int cur_step; 75 unsigned int enabled_steps; 76 }; 77 78 static void __read_end_io(struct bio *bio) 79 { 80 struct page *page; 81 struct bio_vec *bv; 82 int i; 83 84 bio_for_each_segment_all(bv, bio, i) { 85 page = bv->bv_page; 86 87 /* PG_error was set if any post_read step failed */ 88 if (bio->bi_status || PageError(page)) { 89 ClearPageUptodate(page); 90 SetPageError(page); 91 } else { 92 SetPageUptodate(page); 93 } 94 unlock_page(page); 95 } 96 if (bio->bi_private) 97 mempool_free(bio->bi_private, bio_post_read_ctx_pool); 98 bio_put(bio); 99 } 100 101 static void bio_post_read_processing(struct bio_post_read_ctx *ctx); 102 103 static void decrypt_work(struct work_struct *work) 104 { 105 struct bio_post_read_ctx *ctx = 106 container_of(work, struct bio_post_read_ctx, work); 107 108 fscrypt_decrypt_bio(ctx->bio); 109 110 bio_post_read_processing(ctx); 111 } 112 113 static void verity_work(struct work_struct *work) 114 { 115 struct bio_post_read_ctx *ctx = 116 container_of(work, struct bio_post_read_ctx, work); 117 118 fsverity_verify_bio(ctx->bio); 119 120 bio_post_read_processing(ctx); 121 } 122 123 static void bio_post_read_processing(struct bio_post_read_ctx *ctx) 124 { 125 /* 126 * We use different work queues for decryption and for verity because 127 * verity may require reading metadata pages that need decryption, and 128 * we shouldn't recurse to the same workqueue. 129 */ 130 switch (++ctx->cur_step) { 131 case STEP_DECRYPT: 132 if (ctx->enabled_steps & (1 << STEP_DECRYPT)) { 133 INIT_WORK(&ctx->work, decrypt_work); 134 fscrypt_enqueue_decrypt_work(&ctx->work); 135 return; 136 } 137 ctx->cur_step++; 138 /* fall-through */ 139 case STEP_VERITY: 140 if (ctx->enabled_steps & (1 << STEP_VERITY)) { 141 INIT_WORK(&ctx->work, verity_work); 142 fsverity_enqueue_verify_work(&ctx->work); 143 return; 144 } 145 ctx->cur_step++; 146 /* fall-through */ 147 default: 148 __read_end_io(ctx->bio); 149 } 150 } 151 152 static struct bio_post_read_ctx *get_bio_post_read_ctx(struct inode *inode, 153 struct bio *bio, 154 pgoff_t index) 155 { 156 unsigned int post_read_steps = 0; 157 struct bio_post_read_ctx *ctx = NULL; 158 159 if (ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)) 160 post_read_steps |= 1 << STEP_DECRYPT; 161 if (ext4_verity_inode(inode) && > 162 (smp_load_acquire(&inode->i_verity_info) != NULL) && 163 (index <= ((i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT))) 164 post_read_steps |= 1 << STEP_VERITY; 165 if (post_read_steps) { 166 ctx = mempool_alloc(bio_post_read_ctx_pool, GFP_NOFS); 167 if (!ctx) 168 return ERR_PTR(-ENOMEM); 169 ctx->bio = bio; 170 ctx->enabled_steps = post_read_steps; 171 bio->bi_private = ctx; 172 } 173 return ctx; 174 } 175 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip