All of lore.kernel.org
 help / color / mirror / Atom feed
* [linux-next:master 4387/5391] fs/ntfs/mft.c:1065 mft_bitmap_alloc_free_rec() warn: mask and shift to zero: expr='bit >> 3'
@ 2026-09-09 20:54 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-09-09 20:54 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-09-09 20:54 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-09 20:54 [linux-next:master 4387/5391] fs/ntfs/mft.c:1065 mft_bitmap_alloc_free_rec() warn: mask and shift to zero: expr='bit >> 3' kernel test robot

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.