From: kernel test robot <lkp@intel.com>
To: oe-kbuild@lists.linux.dev
Cc: lkp@intel.com, Dan Carpenter <error27@gmail.com>
Subject: [linux-next:master 4387/5391] fs/ntfs/mft.c:1065 mft_bitmap_alloc_free_rec() warn: mask and shift to zero: expr='bit >> 3'
Date: Thu, 10 Sep 2026 04:54:28 +0800 [thread overview]
Message-ID: <202609100452.olYH79h9-lkp@intel.com> (raw)
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
TO: Namjae Jeon <linkinjeon@kernel.org>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head: c68a982815dcce5464e3bf2a31ac94f5146c04ca
commit: 56a997d6008519d3a600a3bff064b850d6edbef7 [4387/5391] ntfs: use dynamic MFT tail reservation
:::::: branch date: 6 hours ago
:::::: commit date: 35 hours ago
config: x86_64-randconfig-161-20260909 (https://download.01.org/0day-ci/archive/20260910/202609100452.olYH79h9-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
smatch: v0.5.0-9187-g5189e3fb
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 <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202609100452.olYH79h9-lkp@intel.com/
New smatch warnings:
fs/ntfs/mft.c:1065 mft_bitmap_alloc_free_rec() warn: mask and shift to zero: expr='bit >> 3'
Old smatch warnings:
fs/ntfs/mft.c:2686 ntfs_mft_record_alloc() error: we previously assumed '*ni' could be null (see line 2156)
vim +1065 fs/ntfs/mft.c
56a997d6008519d Namjae Jeon 2026-09-08 957
56a997d6008519d Namjae Jeon 2026-09-08 958 /*
56a997d6008519d Namjae Jeon 2026-09-08 959 * mft_bitmap_alloc_free_rec - find and allocate a free MFT record
1e9ea7e04472d4e Namjae Jeon 2025-12-30 960 * @vol: volume on which to search for a free mft record
1e9ea7e04472d4e Namjae Jeon 2025-12-30 961 * @base_ni: open base inode if allocating an extent mft record or NULL
56a997d6008519d Namjae Jeon 2026-09-08 962 * @max_mft_no: first record which must not be allocated, or -1
56a997d6008519d Namjae Jeon 2026-09-08 963 * @new_reserve_end: if not NULL, end of a free run starting after the result
1e9ea7e04472d4e Namjae Jeon 2025-12-30 964 *
1e9ea7e04472d4e Namjae Jeon 2025-12-30 965 * Search for a free mft record in the mft bitmap attribute on the ntfs volume
1e9ea7e04472d4e Namjae Jeon 2025-12-30 966 * @vol.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 967 *
1e9ea7e04472d4e Namjae Jeon 2025-12-30 968 * If @base_ni is NULL start the search at the default allocator position.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 969 *
1e9ea7e04472d4e Namjae Jeon 2025-12-30 970 * If @base_ni is not NULL start the search at the mft record after the base
1e9ea7e04472d4e Namjae Jeon 2025-12-30 971 * mft record @base_ni.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 972 *
1e9ea7e04472d4e Namjae Jeon 2025-12-30 973 * Return the free mft record on success and -errno on error. An error code of
1e9ea7e04472d4e Namjae Jeon 2025-12-30 974 * -ENOSPC means that there are no free mft records in the currently
1e9ea7e04472d4e Namjae Jeon 2025-12-30 975 * initialized mft bitmap.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 976 *
1e9ea7e04472d4e Namjae Jeon 2025-12-30 977 * Locking: Caller must hold vol->mftbmp_lock for writing.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 978 */
56a997d6008519d Namjae Jeon 2026-09-08 979 static s64 mft_bitmap_alloc_free_rec(struct ntfs_volume *vol,
56a997d6008519d Namjae Jeon 2026-09-08 980 struct ntfs_inode *base_ni,
56a997d6008519d Namjae Jeon 2026-09-08 981 s64 max_mft_no, s64 *new_reserve_end)
1e9ea7e04472d4e Namjae Jeon 2025-12-30 982 {
1e9ea7e04472d4e Namjae Jeon 2025-12-30 983 s64 pass_end, ll, data_pos, pass_start, ofs, bit;
56a997d6008519d Namjae Jeon 2026-09-08 984 s64 initialized_mft_records;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 985 unsigned long flags;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 986 struct address_space *mftbmp_mapping;
115380f9a2f9675 Namjae Jeon 2026-02-13 987 u8 *buf = NULL, *byte;
115380f9a2f9675 Namjae Jeon 2026-02-13 988 struct folio *folio;
115380f9a2f9675 Namjae Jeon 2026-02-13 989 unsigned int folio_ofs, size;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 990 u8 pass, b;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 991
115380f9a2f9675 Namjae Jeon 2026-02-13 992 ntfs_debug("Searching for free mft record in the currently initialized mft bitmap.");
1e9ea7e04472d4e Namjae Jeon 2025-12-30 993 mftbmp_mapping = vol->mftbmp_ino->i_mapping;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 994 /*
1e9ea7e04472d4e Namjae Jeon 2025-12-30 995 * Set the end of the pass making sure we do not overflow the mft
1e9ea7e04472d4e Namjae Jeon 2025-12-30 996 * bitmap.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 997 */
1e9ea7e04472d4e Namjae Jeon 2025-12-30 998 read_lock_irqsave(&NTFS_I(vol->mft_ino)->size_lock, flags);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 999 pass_end = NTFS_I(vol->mft_ino)->allocated_size >>
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1000 vol->mft_record_size_bits;
56a997d6008519d Namjae Jeon 2026-09-08 1001 initialized_mft_records = NTFS_I(vol->mft_ino)->initialized_size >>
56a997d6008519d Namjae Jeon 2026-09-08 1002 vol->mft_record_size_bits;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1003 read_unlock_irqrestore(&NTFS_I(vol->mft_ino)->size_lock, flags);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1004 read_lock_irqsave(&NTFS_I(vol->mftbmp_ino)->size_lock, flags);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1005 ll = NTFS_I(vol->mftbmp_ino)->initialized_size << 3;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1006 read_unlock_irqrestore(&NTFS_I(vol->mftbmp_ino)->size_lock, flags);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1007 if (pass_end > ll)
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1008 pass_end = ll;
56a997d6008519d Namjae Jeon 2026-09-08 1009 if (max_mft_no >= 0 && pass_end > max_mft_no)
56a997d6008519d Namjae Jeon 2026-09-08 1010 pass_end = max_mft_no;
56a997d6008519d Namjae Jeon 2026-09-08 1011 if (base_ni && base_ni->mft_no == FILE_MFT) {
56a997d6008519d Namjae Jeon 2026-09-08 1012 data_pos = FILE_first_user;
56a997d6008519d Namjae Jeon 2026-09-08 1013 pass = 2;
56a997d6008519d Namjae Jeon 2026-09-08 1014 if (data_pos >= pass_end)
56a997d6008519d Namjae Jeon 2026-09-08 1015 return -ENOSPC;
56a997d6008519d Namjae Jeon 2026-09-08 1016 } else {
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1017 pass = 1;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1018 if (!base_ni)
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1019 data_pos = vol->mft_data_pos;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1020 else
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1021 data_pos = base_ni->mft_no + 1;
56a997d6008519d Namjae Jeon 2026-09-08 1022 if (data_pos < FIRST_NORMAL_MFT_RECORD)
56a997d6008519d Namjae Jeon 2026-09-08 1023 data_pos = FIRST_NORMAL_MFT_RECORD;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1024 if (data_pos >= pass_end) {
56a997d6008519d Namjae Jeon 2026-09-08 1025 data_pos = FIRST_NORMAL_MFT_RECORD;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1026 pass = 2;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1027 /* This happens on a freshly formatted volume. */
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1028 if (data_pos >= pass_end)
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1029 return -ENOSPC;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1030 }
115380f9a2f9675 Namjae Jeon 2026-02-13 1031 }
115380f9a2f9675 Namjae Jeon 2026-02-13 1032
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1033 pass_start = data_pos;
115380f9a2f9675 Namjae Jeon 2026-02-13 1034 ntfs_debug("Starting bitmap search: pass %u, pass_start 0x%llx, pass_end 0x%llx, data_pos 0x%llx.",
115380f9a2f9675 Namjae Jeon 2026-02-13 1035 pass, pass_start, pass_end, data_pos);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1036 /* Loop until a free mft record is found. */
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1037 for (; pass <= 2;) {
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1038 /* Cap size to pass_end. */
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1039 ofs = data_pos >> 3;
115380f9a2f9675 Namjae Jeon 2026-02-13 1040 folio_ofs = ofs & ~PAGE_MASK;
115380f9a2f9675 Namjae Jeon 2026-02-13 1041 size = PAGE_SIZE - folio_ofs;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1042 ll = ((pass_end + 7) >> 3) - ofs;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1043 if (size > ll)
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1044 size = ll;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1045 size <<= 3;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1046 /*
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1047 * If we are still within the active pass, search the next page
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1048 * for a zero bit.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1049 */
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1050 if (size) {
115380f9a2f9675 Namjae Jeon 2026-02-13 1051 folio = read_mapping_folio(mftbmp_mapping,
115380f9a2f9675 Namjae Jeon 2026-02-13 1052 ofs >> PAGE_SHIFT, NULL);
115380f9a2f9675 Namjae Jeon 2026-02-13 1053 if (IS_ERR(folio)) {
115380f9a2f9675 Namjae Jeon 2026-02-13 1054 ntfs_error(vol->sb, "Failed to read mft bitmap, aborting.");
115380f9a2f9675 Namjae Jeon 2026-02-13 1055 return PTR_ERR(folio);
115380f9a2f9675 Namjae Jeon 2026-02-13 1056 }
115380f9a2f9675 Namjae Jeon 2026-02-13 1057 folio_lock(folio);
115380f9a2f9675 Namjae Jeon 2026-02-13 1058 buf = (u8 *)kmap_local_folio(folio, 0) + folio_ofs;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1059 bit = data_pos & 7;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1060 data_pos &= ~7ull;
115380f9a2f9675 Namjae Jeon 2026-02-13 1061 ntfs_debug("Before inner for loop: size 0x%x, data_pos 0x%llx, bit 0x%llx",
115380f9a2f9675 Namjae Jeon 2026-02-13 1062 size, data_pos, bit);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1063 for (; bit < size && data_pos + bit < pass_end;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1064 bit &= ~7ull, bit += 8) {
1e9ea7e04472d4e Namjae Jeon 2025-12-30 @1065 byte = buf + (bit >> 3);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1066 if (*byte == 0xff)
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1067 continue;
56a997d6008519d Namjae Jeon 2026-09-08 1068 b = bit & 7;
56a997d6008519d Namjae Jeon 2026-09-08 1069 for (; b < 8; b++) {
56a997d6008519d Namjae Jeon 2026-09-08 1070 if (*byte & (1 << b))
56a997d6008519d Namjae Jeon 2026-09-08 1071 continue;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1072 ll = data_pos + (bit & ~7ull) + b;
56a997d6008519d Namjae Jeon 2026-09-08 1073 if (ll >= pass_end)
56a997d6008519d Namjae Jeon 2026-09-08 1074 break;
56a997d6008519d Namjae Jeon 2026-09-08 1075 /* Keep the dynamic tail reserve for $MFT metadata. */
56a997d6008519d Namjae Jeon 2026-09-08 1076 if ((!base_ni || base_ni->mft_no != FILE_MFT) &&
56a997d6008519d Namjae Jeon 2026-09-08 1077 ll >= vol->mft_record_reserve_pos &&
56a997d6008519d Namjae Jeon 2026-09-08 1078 ll < vol->mft_record_reserve_end)
56a997d6008519d Namjae Jeon 2026-09-08 1079 continue;
679ee5afd5b4764 DaeMyung Kang 2026-05-09 1080 if (unlikely(ll >= (1ll << 32))) {
115380f9a2f9675 Namjae Jeon 2026-02-13 1081 folio_unlock(folio);
115380f9a2f9675 Namjae Jeon 2026-02-13 1082 kunmap_local(buf);
115380f9a2f9675 Namjae Jeon 2026-02-13 1083 folio_put(folio);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1084 return -ENOSPC;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1085 }
56a997d6008519d Namjae Jeon 2026-09-08 1086 goto found;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1087 }
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1088 }
115380f9a2f9675 Namjae Jeon 2026-02-13 1089 ntfs_debug("After inner for loop: size 0x%x, data_pos 0x%llx, bit 0x%llx",
115380f9a2f9675 Namjae Jeon 2026-02-13 1090 size, data_pos, bit);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1091 data_pos += size;
115380f9a2f9675 Namjae Jeon 2026-02-13 1092 folio_unlock(folio);
115380f9a2f9675 Namjae Jeon 2026-02-13 1093 kunmap_local(buf);
115380f9a2f9675 Namjae Jeon 2026-02-13 1094 folio_put(folio);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1095 /*
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1096 * If the end of the pass has not been reached yet,
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1097 * continue searching the mft bitmap for a zero bit.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1098 */
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1099 if (data_pos < pass_end)
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1100 continue;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1101 }
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1102 /* Do the next pass. */
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1103 if (++pass == 2) {
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1104 /*
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1105 * Starting the second pass, in which we scan the first
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1106 * part of the zone which we omitted earlier.
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1107 */
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1108 pass_end = pass_start;
56a997d6008519d Namjae Jeon 2026-09-08 1109 data_pos = FIRST_NORMAL_MFT_RECORD;
56a997d6008519d Namjae Jeon 2026-09-08 1110 pass_start = FIRST_NORMAL_MFT_RECORD;
115380f9a2f9675 Namjae Jeon 2026-02-13 1111 ntfs_debug("pass %i, pass_start 0x%llx, pass_end 0x%llx.",
115380f9a2f9675 Namjae Jeon 2026-02-13 1112 pass, pass_start, pass_end);
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1113 if (data_pos >= pass_end)
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1114 break;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1115 }
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1116 }
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1117 /* No free mft records in currently initialized mft bitmap. */
115380f9a2f9675 Namjae Jeon 2026-02-13 1118 ntfs_debug("Done. (No free mft records left in currently initialized mft bitmap.)");
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1119 return -ENOSPC;
56a997d6008519d Namjae Jeon 2026-09-08 1120 found:
56a997d6008519d Namjae Jeon 2026-09-08 1121 if (new_reserve_end)
56a997d6008519d Namjae Jeon 2026-09-08 1122 *new_reserve_end = mft_reserve_end(buf, data_pos,
56a997d6008519d Namjae Jeon 2026-09-08 1123 data_pos + size, ll, pass_end,
56a997d6008519d Namjae Jeon 2026-09-08 1124 initialized_mft_records);
56a997d6008519d Namjae Jeon 2026-09-08 1125 *byte |= 1 << b;
56a997d6008519d Namjae Jeon 2026-09-08 1126 folio_mark_dirty(folio);
56a997d6008519d Namjae Jeon 2026-09-08 1127 folio_unlock(folio);
56a997d6008519d Namjae Jeon 2026-09-08 1128 kunmap_local(buf);
56a997d6008519d Namjae Jeon 2026-09-08 1129 folio_put(folio);
56a997d6008519d Namjae Jeon 2026-09-08 1130 ntfs_debug("Done. (Found and allocated mft record 0x%llx.)", ll);
56a997d6008519d Namjae Jeon 2026-09-08 1131 return ll;
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1132 }
1e9ea7e04472d4e Namjae Jeon 2025-12-30 1133
:::::: The code at line 1065 was first introduced by commit
:::::: 1e9ea7e04472d4e5e12e58c881eaacfb3e49b669 Revert "fs: Remove NTFS classic"
:::::: TO: Namjae Jeon <linkinjeon@kernel.org>
:::::: CC: Namjae Jeon <linkinjeon@kernel.org>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-09-09 20:54 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202609100452.olYH79h9-lkp@intel.com \
--to=lkp@intel.com \
--cc=error27@gmail.com \
--cc=oe-kbuild@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.