Re: [PATCH v0 1/1] exfat: add limited FALLOC_FL_ZERO_RANGE support

From: Dan Carpenter

Date: Mon Mar 23 2026 - 04:00:04 EST


Hi David,

kernel test robot noticed the following build warnings:

https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/David-Timber/exfat-add-limited-FALLOC_FL_ZERO_RANGE-support/20260319-185700
base: next-20260318
patch link: https://lore.kernel.org/r/20260319043553.301185-2-dxdt%40dev.snart.me
patch subject: [PATCH v0 1/1] exfat: add limited FALLOC_FL_ZERO_RANGE support
config: i386-randconfig-141-20260322 (https://download.01.org/0day-ci/archive/20260322/202603221252.dVVrrOrL-lkp@xxxxxxxxx/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
smatch: v0.5.0-9004-gb810ac53

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@xxxxxxxxx>
| Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
| Closes: https://lore.kernel.org/r/202603221252.dVVrrOrL-lkp@xxxxxxxxx/

smatch warnings:
fs/exfat/file.c:183 exfat_fallocate() warn: inconsistent returns '&inode->i_rwsem'.

vim +183 fs/exfat/file.c

bf1797960c20f3d David Timber 2026-02-28 107 static long exfat_fallocate(struct file *file, int mode,
bf1797960c20f3d David Timber 2026-02-28 108 loff_t offset, loff_t len)
bf1797960c20f3d David Timber 2026-02-28 109 {
bf1797960c20f3d David Timber 2026-02-28 110 struct inode *inode = file->f_mapping->host;
1178dacb657facf David Timber 2026-03-19 111 loff_t newsize, isize;
bf1797960c20f3d David Timber 2026-02-28 112 int err = 0;
bf1797960c20f3d David Timber 2026-02-28 113
bf1797960c20f3d David Timber 2026-02-28 114 /* No support for other modes */
1178dacb657facf David Timber 2026-03-19 115 switch (mode) {
1178dacb657facf David Timber 2026-03-19 116 case FALLOC_FL_ALLOCATE_RANGE:
1178dacb657facf David Timber 2026-03-19 117 case FALLOC_FL_ZERO_RANGE:
1178dacb657facf David Timber 2026-03-19 118 case FALLOC_FL_ZERO_RANGE|FALLOC_FL_KEEP_SIZE:
1178dacb657facf David Timber 2026-03-19 119 break;
1178dacb657facf David Timber 2026-03-19 120 default:
bf1797960c20f3d David Timber 2026-02-28 121 return -EOPNOTSUPP;
1178dacb657facf David Timber 2026-03-19 122 }
bf1797960c20f3d David Timber 2026-02-28 123
bf1797960c20f3d David Timber 2026-02-28 124 /* No support for dir */
bf1797960c20f3d David Timber 2026-02-28 125 if (!S_ISREG(inode->i_mode))
1178dacb657facf David Timber 2026-03-19 126 return mode & FALLOC_FL_ZERO_RANGE ? -EINVAL : -EOPNOTSUPP;
bf1797960c20f3d David Timber 2026-02-28 127
bf1797960c20f3d David Timber 2026-02-28 128 if (unlikely(exfat_forced_shutdown(inode->i_sb)))
bf1797960c20f3d David Timber 2026-02-28 129 return -EIO;
bf1797960c20f3d David Timber 2026-02-28 130
bf1797960c20f3d David Timber 2026-02-28 131 inode_lock(inode);
^^^^^^^^^^^^^^^^^^

bf1797960c20f3d David Timber 2026-02-28 132
1178dacb657facf David Timber 2026-03-19 133 newsize = offset + len;
1178dacb657facf David Timber 2026-03-19 134 isize = i_size_read(inode);
1178dacb657facf David Timber 2026-03-19 135
1178dacb657facf David Timber 2026-03-19 136 if (mode & FALLOC_FL_ZERO_RANGE) {
1178dacb657facf David Timber 2026-03-19 137 struct exfat_inode_info *ei = EXFAT_I(inode);
1178dacb657facf David Timber 2026-03-19 138 loff_t saved_validsize = ei->valid_size;
1178dacb657facf David Timber 2026-03-19 139
1178dacb657facf David Timber 2026-03-19 140 /* The requested range must span to or past EOF */
1178dacb657facf David Timber 2026-03-19 141 if (newsize < isize) {
1178dacb657facf David Timber 2026-03-19 142 err = -EOPNOTSUPP;
1178dacb657facf David Timber 2026-03-19 143 goto error;
1178dacb657facf David Timber 2026-03-19 144 }
1178dacb657facf David Timber 2026-03-19 145
1178dacb657facf David Timber 2026-03-19 146 /* valid_size can only be truncated */
1178dacb657facf David Timber 2026-03-19 147 if (offset < ei->valid_size)
1178dacb657facf David Timber 2026-03-19 148 ei->valid_size = offset;
1178dacb657facf David Timber 2026-03-19 149 /* If offset >= ei->valid_size, the range is already zeroed so that'd be no-op */
1178dacb657facf David Timber 2026-03-19 150
1178dacb657facf David Timber 2026-03-19 151 if (!(mode & FALLOC_FL_KEEP_SIZE) && isize < newsize) {
1178dacb657facf David Timber 2026-03-19 152 err = exfat_cont_expand(inode, newsize);
1178dacb657facf David Timber 2026-03-19 153 if (err) {
1178dacb657facf David Timber 2026-03-19 154 /* inode unchanged - revert valid_size */
1178dacb657facf David Timber 2026-03-19 155 ei->valid_size = saved_validsize;
1178dacb657facf David Timber 2026-03-19 156 goto error;
1178dacb657facf David Timber 2026-03-19 157 }
1178dacb657facf David Timber 2026-03-19 158 /* inode invalidated in exfat_cont_expand() */
1178dacb657facf David Timber 2026-03-19 159 } else {
1178dacb657facf David Timber 2026-03-19 160 /* update inode */
1178dacb657facf David Timber 2026-03-19 161 inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
1178dacb657facf David Timber 2026-03-19 162
1178dacb657facf David Timber 2026-03-19 163 mark_inode_dirty(inode);
1178dacb657facf David Timber 2026-03-19 164
1178dacb657facf David Timber 2026-03-19 165 if (IS_SYNC(inode))
1178dacb657facf David Timber 2026-03-19 166 return write_inode_now(inode, 1);

I don't think this calls inode_unlock(inode);

1178dacb657facf David Timber 2026-03-19 167 }
1178dacb657facf David Timber 2026-03-19 168
1178dacb657facf David Timber 2026-03-19 169 /* drop cache after the new valid_size */
1178dacb657facf David Timber 2026-03-19 170 if (ei->valid_size != saved_validsize)
1178dacb657facf David Timber 2026-03-19 171 truncate_pagecache(inode, ei->valid_size);
1178dacb657facf David Timber 2026-03-19 172 } else { /* mode == FALLOC_FL_ALLOCATE_RANGE */
1178dacb657facf David Timber 2026-03-19 173 if (newsize <= isize)
bf1797960c20f3d David Timber 2026-02-28 174 goto error;
bf1797960c20f3d David Timber 2026-02-28 175
bf1797960c20f3d David Timber 2026-02-28 176 /* This is just an expanding truncate */
bf1797960c20f3d David Timber 2026-02-28 177 err = exfat_cont_expand(inode, newsize);
1178dacb657facf David Timber 2026-03-19 178 }
bf1797960c20f3d David Timber 2026-02-28 179
bf1797960c20f3d David Timber 2026-02-28 180 error:
bf1797960c20f3d David Timber 2026-02-28 181 inode_unlock(inode);
bf1797960c20f3d David Timber 2026-02-28 182
bf1797960c20f3d David Timber 2026-02-28 @183 return err;
bf1797960c20f3d David Timber 2026-02-28 184 }

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki