[ammarfaizi2-block:dhowells/linux-fs/netfs-linked-list 61/61] fs/netfs/buffered_flush.c:1072 netfs_select_dirty() warn: inconsistent returns '&ctx->dirty_lock'.

From: Dan Carpenter
Date: Mon Jul 04 2022 - 09:33:12 EST


tree: https://github.com/ammarfaizi2/linux-block dhowells/linux-fs/netfs-linked-list
head: ce4670495468b797b0c5927fcb661bc0da48b9ab
commit: ce4670495468b797b0c5927fcb661bc0da48b9ab [61/61] netfs: Add a struct to group modifications together and flushed in order
config: i386-randconfig-m021 (https://download.01.org/0day-ci/archive/20220703/202207032252.h0jjY5dH-lkp@xxxxxxxxx/config)
compiler: gcc-11 (Debian 11.3.0-3) 11.3.0

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@xxxxxxxxx>
Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>

New smatch warnings:
fs/netfs/buffered_flush.c:1072 netfs_select_dirty() warn: inconsistent returns '&ctx->dirty_lock'.

vim +1072 fs/netfs/buffered_flush.c

2dc27084e13c291 David Howells 2021-06-29 980 static int netfs_select_dirty(struct netfs_io_request *wreq,
2dc27084e13c291 David Howells 2021-06-29 981 struct writeback_control *wbc,
2dc27084e13c291 David Howells 2021-06-29 982 struct netfs_inode *ctx,
2dc27084e13c291 David Howells 2021-06-29 983 pgoff_t *_first, pgoff_t last)
2dc27084e13c291 David Howells 2021-06-29 984 {
2dc27084e13c291 David Howells 2021-06-29 985 struct netfs_dirty_region *region;
ce4670495468b79 David Howells 2022-02-07 986 struct netfs_flush_group *group;
2dc27084e13c291 David Howells 2021-06-29 987 pgoff_t first = *_first;
2dc27084e13c291 David Howells 2021-06-29 988 pgoff_t csize = 1UL << ctx->cache_order;
ce4670495468b79 David Howells 2022-02-07 989 bool advance = true;
2dc27084e13c291 David Howells 2021-06-29 990 int ret;
2dc27084e13c291 David Howells 2021-06-29 991
2dc27084e13c291 David Howells 2021-06-29 992 /* Round out the range we're looking through to accommodate whole cache
2dc27084e13c291 David Howells 2021-06-29 993 * blocks. The cache may only be able to store blocks of that size, in
2dc27084e13c291 David Howells 2021-06-29 994 * which case we may need to add non-dirty pages to the buffer too.
2dc27084e13c291 David Howells 2021-06-29 995 */
2dc27084e13c291 David Howells 2021-06-29 996 if (ctx->cache_order) {
2dc27084e13c291 David Howells 2021-06-29 997 first = round_down(first, csize);
2dc27084e13c291 David Howells 2021-06-29 998 last = round_up_incl(last, csize);
2dc27084e13c291 David Howells 2021-06-29 999 }
2dc27084e13c291 David Howells 2021-06-29 1000
2dc27084e13c291 David Howells 2021-06-29 1001 _enter("%lx-%lx", first, last);
2dc27084e13c291 David Howells 2021-06-29 1002
2dc27084e13c291 David Howells 2021-06-29 1003 if (wbc->sync_mode == WB_SYNC_NONE) {
2dc27084e13c291 David Howells 2021-06-29 1004 if (!mutex_trylock(&ctx->wb_mutex))
2dc27084e13c291 David Howells 2021-06-29 1005 return 0;
2dc27084e13c291 David Howells 2021-06-29 1006 } else {
2dc27084e13c291 David Howells 2021-06-29 1007 mutex_lock(&ctx->wb_mutex);
2dc27084e13c291 David Howells 2021-06-29 1008 }
2dc27084e13c291 David Howells 2021-06-29 1009
2dc27084e13c291 David Howells 2021-06-29 1010 /* Find the first dirty region that overlaps the requested range */
2dc27084e13c291 David Howells 2021-06-29 1011 spin_lock(&ctx->dirty_lock);
ce4670495468b79 David Howells 2022-02-07 1012
2dc27084e13c291 David Howells 2021-06-29 1013 region = netfs_scan_for_region(ctx, first, last);
ce4670495468b79 David Howells 2022-02-07 1014 if (region)
ce4670495468b79 David Howells 2022-02-07 1015 kdebug("scan got D=%08x", region->debug_id);
ce4670495468b79 David Howells 2022-02-07 1016
ce4670495468b79 David Howells 2022-02-07 1017 /* If the region selected is not in the bottommost flush group, we need
ce4670495468b79 David Howells 2022-02-07 1018 * to flush prerequisites first.
ce4670495468b79 David Howells 2022-02-07 1019 */
ce4670495468b79 David Howells 2022-02-07 1020 if (region && region->group) {
ce4670495468b79 David Howells 2022-02-07 1021 group = list_first_entry(&ctx->flush_groups,
ce4670495468b79 David Howells 2022-02-07 1022 struct netfs_flush_group, group_link);
ce4670495468b79 David Howells 2022-02-07 1023 if (region->group != group) {
ce4670495468b79 David Howells 2022-02-07 1024 kdebug("flush prereq");
ce4670495468b79 David Howells 2022-02-07 1025 region = netfs_select_from_flush_group(wbc, ctx, group);
ce4670495468b79 David Howells 2022-02-07 1026 if (IS_ERR(region)) {
ce4670495468b79 David Howells 2022-02-07 1027 ret = PTR_ERR(region);
ce4670495468b79 David Howells 2022-02-07 1028 goto unlock;

spin_unlock(&ctx->dirty_lock);

ce4670495468b79 David Howells 2022-02-07 1029 }
ce4670495468b79 David Howells 2022-02-07 1030 advance = false;
ce4670495468b79 David Howells 2022-02-07 1031 }
2dc27084e13c291 David Howells 2021-06-29 1032 }
ce4670495468b79 David Howells 2022-02-07 1033
ce4670495468b79 David Howells 2022-02-07 1034 if (region)
ce4670495468b79 David Howells 2022-02-07 1035 netfs_get_dirty_region(ctx, region, netfs_region_trace_get_wback);
ce4670495468b79 David Howells 2022-02-07 1036
2dc27084e13c291 David Howells 2021-06-29 1037 spin_unlock(&ctx->dirty_lock);
2dc27084e13c291 David Howells 2021-06-29 1038 if (!region) {
2dc27084e13c291 David Howells 2021-06-29 1039 _debug("scan failed");
2dc27084e13c291 David Howells 2021-06-29 1040 *_first = last;
2dc27084e13c291 David Howells 2021-06-29 1041 ret = 0;
2dc27084e13c291 David Howells 2021-06-29 1042 goto unlock;
2dc27084e13c291 David Howells 2021-06-29 1043 }
2dc27084e13c291 David Howells 2021-06-29 1044
2dc27084e13c291 David Howells 2021-06-29 1045 /* Try to grab the first folio of the requested range within that
2dc27084e13c291 David Howells 2021-06-29 1046 * region.
2dc27084e13c291 David Howells 2021-06-29 1047 */
2dc27084e13c291 David Howells 2021-06-29 1048 if (*_first < region->first)
2dc27084e13c291 David Howells 2021-06-29 1049 *_first = region->first;
ce4670495468b79 David Howells 2022-02-07 1050
2dc27084e13c291 David Howells 2021-06-29 1051 ret = netfs_find_writeback_start(wreq, wbc, region, _first, last);
2dc27084e13c291 David Howells 2021-06-29 1052 if (ret <= 0)
ce4670495468b79 David Howells 2022-02-07 1053 goto put_region;
2dc27084e13c291 David Howells 2021-06-29 1054
2dc27084e13c291 David Howells 2021-06-29 1055 netfs_extend_writeback(wreq, wbc, ctx, region);
ce4670495468b79 David Howells 2022-02-07 1056 if (advance)
2dc27084e13c291 David Howells 2021-06-29 1057 *_first = wreq->last + 1;
2dc27084e13c291 David Howells 2021-06-29 1058
2dc27084e13c291 David Howells 2021-06-29 1059 netfs_split_out_regions(wreq, ctx, region);
2dc27084e13c291 David Howells 2021-06-29 1060
2dc27084e13c291 David Howells 2021-06-29 1061 /* The assembled write request gets placed on the list to prevent
2dc27084e13c291 David Howells 2021-06-29 1062 * conflicting write requests happening simultaneously.
2dc27084e13c291 David Howells 2021-06-29 1063 */
2dc27084e13c291 David Howells 2021-06-29 1064 netfs_add_wback_to_list(ctx, wreq);
2dc27084e13c291 David Howells 2021-06-29 1065 ret = 1;
2dc27084e13c291 David Howells 2021-06-29 1066
ce4670495468b79 David Howells 2022-02-07 1067 put_region:
ce4670495468b79 David Howells 2022-02-07 1068 netfs_put_dirty_region(ctx, region, netfs_region_trace_put_wback);
2dc27084e13c291 David Howells 2021-06-29 1069 unlock:
2dc27084e13c291 David Howells 2021-06-29 1070 mutex_unlock(&ctx->wb_mutex);
2dc27084e13c291 David Howells 2021-06-29 1071 _leave(" = %d [%lx]", ret, *_first);
2dc27084e13c291 David Howells 2021-06-29 @1072 return ret;
2dc27084e13c291 David Howells 2021-06-29 1073 }

--
0-DAY CI Kernel Test Service
https://01.org/lkp