[brauner-vfs:vfs.all 117/195] fs/iomap/direct-io.c:1074 iomap_dio_simple() warn: bitwise AND condition is false here
kernel test robot <[email protected]>
| Newsgroups | dev.linux.lists.oe-kbuild |
|---|---|
| Message-ID | <[email protected]> |
BCC: [email protected] CC: [email protected] CC: Christian Brauner <[email protected]> TO: Fengnan Chang <[email protected]> CC: Christian Brauner <[email protected]> CC: Christoph Hellwig <[email protected]> tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.all head: cf6f88615485a68df77092de1f90f88708a32fa6 commit: c45650e4f8ba25d02e860094a77bf85ec3a35f13 [117/195] iomap: add simple dio path for small direct I/O :::::: branch date: 2 hours ago :::::: commit date: 21 hours ago config: i386-randconfig-141-20260702 (https://download.01.org/0day-ci/archive/20260702/[email protected]/config) compiler: gcc-14 (Debian 14.2.0-19) 14.2.0 smatch: v0.5.0-9185-gbcc58b9c If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Closes: https://lore.kernel.org/r/[email protected]/ New smatch warnings: fs/iomap/direct-io.c:1074 iomap_dio_simple() warn: bitwise AND condition is false here Old smatch warnings: fs/iomap/direct-io.c:376 iomap_dio_bio_iter_one() warn: bitwise AND condition is false here fs/iomap/internal.h:15 iomap_max_bio_size() warn: bitwise AND condition is false here vim +1074 fs/iomap/direct-io.c c45650e4f8ba25 Fengnan Chang 2026-07-01 1002 c45650e4f8ba25 Fengnan Chang 2026-07-01 1003 /* c45650e4f8ba25 Fengnan Chang 2026-07-01 1004 * Fast path for small, block-aligned direct I/Os that map to a single c45650e4f8ba25 Fengnan Chang 2026-07-01 1005 * contiguous on-disk extent. c45650e4f8ba25 Fengnan Chang 2026-07-01 1006 * c45650e4f8ba25 Fengnan Chang 2026-07-01 1007 * iomap_dio_simple_supported() enforces the cheap up-front constraints before c45650e4f8ba25 Fengnan Chang 2026-07-01 1008 * entering this path. c45650e4f8ba25 Fengnan Chang 2026-07-01 1009 * c45650e4f8ba25 Fengnan Chang 2026-07-01 1010 * @dops must be NULL: a non-NULL @dops means the caller wants its c45650e4f8ba25 Fengnan Chang 2026-07-01 1011 * ->end_io / ->submit_io hooks invoked, and in particular wants its bios to be c45650e4f8ba25 Fengnan Chang 2026-07-01 1012 * allocated from the filesystem-private @dops->bio_set (whose front_pad sizes a c45650e4f8ba25 Fengnan Chang 2026-07-01 1013 * filesystem-private wrapper around the bio). The fast path instead allocates c45650e4f8ba25 Fengnan Chang 2026-07-01 1014 * from the shared iomap_dio_simple_pool, whose front_pad matches struct c45650e4f8ba25 Fengnan Chang 2026-07-01 1015 * iomap_dio_simple; the two wrappers are not interchangeable, so we must fall c45650e4f8ba25 Fengnan Chang 2026-07-01 1016 * back to __iomap_dio_rw() in that case. c45650e4f8ba25 Fengnan Chang 2026-07-01 1017 * c45650e4f8ba25 Fengnan Chang 2026-07-01 1018 * @done_before must be zero: a non-zero caller-accumulated residual cannot be c45650e4f8ba25 Fengnan Chang 2026-07-01 1019 * carried through a single-bio inline completion. c45650e4f8ba25 Fengnan Chang 2026-07-01 1020 * c45650e4f8ba25 Fengnan Chang 2026-07-01 1021 * @iter must describe a non-empty READ no larger than the inode block size: c45650e4f8ba25 Fengnan Chang 2026-07-01 1022 * writes, zero-length I/O, and larger requests need the generic iomap direct c45650e4f8ba25 Fengnan Chang 2026-07-01 1023 * I/O path. c45650e4f8ba25 Fengnan Chang 2026-07-01 1024 * c45650e4f8ba25 Fengnan Chang 2026-07-01 1025 * @dio_flags must not request IOMAP_DIO_FORCE_WAIT, IOMAP_DIO_PARTIAL, or c45650e4f8ba25 Fengnan Chang 2026-07-01 1026 * IOMAP_DIO_BOUNCE: this path does not support forced waiting, partial direct c45650e4f8ba25 Fengnan Chang 2026-07-01 1027 * I/O, or bouncing. The range must also stay within i_size and encrypted c45650e4f8ba25 Fengnan Chang 2026-07-01 1028 * inodes must use the generic iomap direct I/O path. c45650e4f8ba25 Fengnan Chang 2026-07-01 1029 * c45650e4f8ba25 Fengnan Chang 2026-07-01 1030 * -ENOTBLK is the private sentinel returned by iomap_dio_simple() when it c45650e4f8ba25 Fengnan Chang 2026-07-01 1031 * decides the request does not fit the fast path. In that case we proceed to c45650e4f8ba25 Fengnan Chang 2026-07-01 1032 * the generic __iomap_dio_rw() slow path. Any other errno is a real result and c45650e4f8ba25 Fengnan Chang 2026-07-01 1033 * is propagated as-is, in particular -EAGAIN for IOCB_NOWAIT must reach the c45650e4f8ba25 Fengnan Chang 2026-07-01 1034 * caller. c45650e4f8ba25 Fengnan Chang 2026-07-01 1035 */ c45650e4f8ba25 Fengnan Chang 2026-07-01 1036 static ssize_t c45650e4f8ba25 Fengnan Chang 2026-07-01 1037 iomap_dio_simple(struct kiocb *iocb, struct iov_iter *iter, c45650e4f8ba25 Fengnan Chang 2026-07-01 1038 const struct iomap_ops *ops, void *private, c45650e4f8ba25 Fengnan Chang 2026-07-01 1039 unsigned int dio_flags) c45650e4f8ba25 Fengnan Chang 2026-07-01 1040 { c45650e4f8ba25 Fengnan Chang 2026-07-01 1041 struct inode *inode = file_inode(iocb->ki_filp); c45650e4f8ba25 Fengnan Chang 2026-07-01 1042 size_t count = iov_iter_count(iter); c45650e4f8ba25 Fengnan Chang 2026-07-01 1043 bool wait_for_completion = is_sync_kiocb(iocb); c45650e4f8ba25 Fengnan Chang 2026-07-01 1044 struct iomap_iter iomi = { c45650e4f8ba25 Fengnan Chang 2026-07-01 1045 .inode = inode, c45650e4f8ba25 Fengnan Chang 2026-07-01 1046 .pos = iocb->ki_pos, c45650e4f8ba25 Fengnan Chang 2026-07-01 1047 .len = count, c45650e4f8ba25 Fengnan Chang 2026-07-01 1048 .flags = IOMAP_DIRECT, c45650e4f8ba25 Fengnan Chang 2026-07-01 1049 .private = private, c45650e4f8ba25 Fengnan Chang 2026-07-01 1050 }; c45650e4f8ba25 Fengnan Chang 2026-07-01 1051 struct iomap_dio_simple *sr; c45650e4f8ba25 Fengnan Chang 2026-07-01 1052 unsigned int alignment; c45650e4f8ba25 Fengnan Chang 2026-07-01 1053 struct bio *bio; c45650e4f8ba25 Fengnan Chang 2026-07-01 1054 ssize_t ret; c45650e4f8ba25 Fengnan Chang 2026-07-01 1055 c45650e4f8ba25 Fengnan Chang 2026-07-01 1056 if (iocb->ki_flags & IOCB_NOWAIT) c45650e4f8ba25 Fengnan Chang 2026-07-01 1057 iomi.flags |= IOMAP_NOWAIT; c45650e4f8ba25 Fengnan Chang 2026-07-01 1058 c45650e4f8ba25 Fengnan Chang 2026-07-01 1059 ret = kiocb_write_and_wait(iocb, count); c45650e4f8ba25 Fengnan Chang 2026-07-01 1060 if (ret) c45650e4f8ba25 Fengnan Chang 2026-07-01 1061 return ret; c45650e4f8ba25 Fengnan Chang 2026-07-01 1062 c45650e4f8ba25 Fengnan Chang 2026-07-01 1063 inode_dio_begin(inode); c45650e4f8ba25 Fengnan Chang 2026-07-01 1064 c45650e4f8ba25 Fengnan Chang 2026-07-01 1065 ret = ops->iomap_begin(inode, iomi.pos, count, iomi.flags, c45650e4f8ba25 Fengnan Chang 2026-07-01 1066 &iomi.iomap, &iomi.srcmap); c45650e4f8ba25 Fengnan Chang 2026-07-01 1067 if (ret) { c45650e4f8ba25 Fengnan Chang 2026-07-01 1068 inode_dio_end(inode); c45650e4f8ba25 Fengnan Chang 2026-07-01 1069 return ret; c45650e4f8ba25 Fengnan Chang 2026-07-01 1070 } c45650e4f8ba25 Fengnan Chang 2026-07-01 1071 c45650e4f8ba25 Fengnan Chang 2026-07-01 1072 if (iomi.iomap.type != IOMAP_MAPPED || c45650e4f8ba25 Fengnan Chang 2026-07-01 1073 iomi.iomap.offset + iomi.iomap.length < iomi.pos + count || c45650e4f8ba25 Fengnan Chang 2026-07-01 @1074 (iomi.iomap.flags & IOMAP_F_INTEGRITY)) { c45650e4f8ba25 Fengnan Chang 2026-07-01 1075 ret = -ENOTBLK; c45650e4f8ba25 Fengnan Chang 2026-07-01 1076 goto out_iomap_end; c45650e4f8ba25 Fengnan Chang 2026-07-01 1077 } c45650e4f8ba25 Fengnan Chang 2026-07-01 1078 c45650e4f8ba25 Fengnan Chang 2026-07-01 1079 alignment = iomap_dio_alignment(inode, iomi.iomap.bdev, dio_flags); c45650e4f8ba25 Fengnan Chang 2026-07-01 1080 if ((iomi.pos | count) & (alignment - 1)) { c45650e4f8ba25 Fengnan Chang 2026-07-01 1081 ret = -EINVAL; c45650e4f8ba25 Fengnan Chang 2026-07-01 1082 goto out_iomap_end; c45650e4f8ba25 Fengnan Chang 2026-07-01 1083 } c45650e4f8ba25 Fengnan Chang 2026-07-01 1084 c45650e4f8ba25 Fengnan Chang 2026-07-01 1085 if (!wait_for_completion && unlikely(!inode->i_sb->s_dio_done_wq)) { c45650e4f8ba25 Fengnan Chang 2026-07-01 1086 ret = sb_init_dio_done_wq(inode->i_sb); c45650e4f8ba25 Fengnan Chang 2026-07-01 1087 if (ret < 0) c45650e4f8ba25 Fengnan Chang 2026-07-01 1088 goto out_iomap_end; c45650e4f8ba25 Fengnan Chang 2026-07-01 1089 } c45650e4f8ba25 Fengnan Chang 2026-07-01 1090 c45650e4f8ba25 Fengnan Chang 2026-07-01 1091 trace_iomap_dio_rw_begin(iocb, iter, dio_flags, 0); c45650e4f8ba25 Fengnan Chang 2026-07-01 1092 c45650e4f8ba25 Fengnan Chang 2026-07-01 1093 if (user_backed_iter(iter)) c45650e4f8ba25 Fengnan Chang 2026-07-01 1094 dio_flags |= IOMAP_DIO_USER_BACKED; c45650e4f8ba25 Fengnan Chang 2026-07-01 1095 c45650e4f8ba25 Fengnan Chang 2026-07-01 1096 bio = bio_alloc_bioset(iomi.iomap.bdev, c45650e4f8ba25 Fengnan Chang 2026-07-01 1097 bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS), c45650e4f8ba25 Fengnan Chang 2026-07-01 1098 REQ_OP_READ, GFP_KERNEL, &iomap_dio_simple_pool); c45650e4f8ba25 Fengnan Chang 2026-07-01 1099 sr = container_of(bio, struct iomap_dio_simple, bio); c45650e4f8ba25 Fengnan Chang 2026-07-01 1100 sr->iocb = iocb; c45650e4f8ba25 Fengnan Chang 2026-07-01 1101 sr->dio_flags = dio_flags; c45650e4f8ba25 Fengnan Chang 2026-07-01 1102 c45650e4f8ba25 Fengnan Chang 2026-07-01 1103 bio->bi_iter.bi_sector = iomap_sector(&iomi.iomap, iomi.pos); c45650e4f8ba25 Fengnan Chang 2026-07-01 1104 bio->bi_ioprio = iocb->ki_ioprio; c45650e4f8ba25 Fengnan Chang 2026-07-01 1105 c45650e4f8ba25 Fengnan Chang 2026-07-01 1106 ret = bio_iov_iter_get_pages(bio, iter, alignment - 1); c45650e4f8ba25 Fengnan Chang 2026-07-01 1107 if (unlikely(ret)) c45650e4f8ba25 Fengnan Chang 2026-07-01 1108 goto out_bio_put; c45650e4f8ba25 Fengnan Chang 2026-07-01 1109 c45650e4f8ba25 Fengnan Chang 2026-07-01 1110 if (bio->bi_iter.bi_size != count) { c45650e4f8ba25 Fengnan Chang 2026-07-01 1111 iov_iter_revert(iter, bio->bi_iter.bi_size); c45650e4f8ba25 Fengnan Chang 2026-07-01 1112 ret = -ENOTBLK; c45650e4f8ba25 Fengnan Chang 2026-07-01 1113 goto out_bio_release_pages; c45650e4f8ba25 Fengnan Chang 2026-07-01 1114 } c45650e4f8ba25 Fengnan Chang 2026-07-01 1115 c45650e4f8ba25 Fengnan Chang 2026-07-01 1116 sr->size = bio->bi_iter.bi_size; c45650e4f8ba25 Fengnan Chang 2026-07-01 1117 c45650e4f8ba25 Fengnan Chang 2026-07-01 1118 if (dio_flags & IOMAP_DIO_USER_BACKED) c45650e4f8ba25 Fengnan Chang 2026-07-01 1119 bio_set_pages_dirty(bio); c45650e4f8ba25 Fengnan Chang 2026-07-01 1120 c45650e4f8ba25 Fengnan Chang 2026-07-01 1121 if (iocb->ki_flags & IOCB_NOWAIT) c45650e4f8ba25 Fengnan Chang 2026-07-01 1122 bio->bi_opf |= REQ_NOWAIT; c45650e4f8ba25 Fengnan Chang 2026-07-01 1123 if ((iocb->ki_flags & IOCB_HIPRI) && !wait_for_completion) { c45650e4f8ba25 Fengnan Chang 2026-07-01 1124 bio->bi_opf |= REQ_POLLED; c45650e4f8ba25 Fengnan Chang 2026-07-01 1125 WRITE_ONCE(iocb->private, bio); c45650e4f8ba25 Fengnan Chang 2026-07-01 1126 } c45650e4f8ba25 Fengnan Chang 2026-07-01 1127 c45650e4f8ba25 Fengnan Chang 2026-07-01 1128 if (ops->iomap_end) c45650e4f8ba25 Fengnan Chang 2026-07-01 1129 ops->iomap_end(inode, iomi.pos, count, count, iomi.flags, c45650e4f8ba25 Fengnan Chang 2026-07-01 1130 &iomi.iomap); c45650e4f8ba25 Fengnan Chang 2026-07-01 1131 c45650e4f8ba25 Fengnan Chang 2026-07-01 1132 if (!wait_for_completion) { c45650e4f8ba25 Fengnan Chang 2026-07-01 1133 bio->bi_end_io = iomap_dio_simple_end_io; c45650e4f8ba25 Fengnan Chang 2026-07-01 1134 submit_bio(bio); c45650e4f8ba25 Fengnan Chang 2026-07-01 1135 trace_iomap_dio_rw_queued(inode, iomi.pos, count); c45650e4f8ba25 Fengnan Chang 2026-07-01 1136 return -EIOCBQUEUED; c45650e4f8ba25 Fengnan Chang 2026-07-01 1137 } c45650e4f8ba25 Fengnan Chang 2026-07-01 1138 c45650e4f8ba25 Fengnan Chang 2026-07-01 1139 submit_bio_wait(bio); c45650e4f8ba25 Fengnan Chang 2026-07-01 1140 return iomap_dio_simple_complete(sr); c45650e4f8ba25 Fengnan Chang 2026-07-01 1141 c45650e4f8ba25 Fengnan Chang 2026-07-01 1142 out_bio_release_pages: c45650e4f8ba25 Fengnan Chang 2026-07-01 1143 bio_release_pages(bio, false); c45650e4f8ba25 Fengnan Chang 2026-07-01 1144 out_bio_put: c45650e4f8ba25 Fengnan Chang 2026-07-01 1145 bio_put(bio); c45650e4f8ba25 Fengnan Chang 2026-07-01 1146 out_iomap_end: c45650e4f8ba25 Fengnan Chang 2026-07-01 1147 if (ops->iomap_end) c45650e4f8ba25 Fengnan Chang 2026-07-01 1148 ops->iomap_end(inode, iomi.pos, count, 0, iomi.flags, c45650e4f8ba25 Fengnan Chang 2026-07-01 1149 &iomi.iomap); c45650e4f8ba25 Fengnan Chang 2026-07-01 1150 inode_dio_end(inode); c45650e4f8ba25 Fengnan Chang 2026-07-01 1151 return ret; c45650e4f8ba25 Fengnan Chang 2026-07-01 1152 } c45650e4f8ba25 Fengnan Chang 2026-07-01 1153 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki