Message ID | 20240520055153.136091-4-harshadshirwadkar@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | Ext4 fast commit performance patch series | expand |
Hi Harshad,
kernel test robot noticed the following build warnings:
[auto build test WARNING on tytso-ext4/dev]
[also build test WARNING on linus/master v6.9 next-20240520]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Harshad-Shirwadkar/ext4-convert-i_fc_lock-to-spinlock/20240520-135501
base: https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git dev
patch link: https://lore.kernel.org/r/20240520055153.136091-4-harshadshirwadkar%40gmail.com
patch subject: [PATCH 03/10] ext4: mark inode dirty before grabbing i_data_sem in ext4_setattr
config: arm-defconfig (https://download.01.org/0day-ci/archive/20240520/202405201505.ZqZypxE6-lkp@intel.com/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240520/202405201505.ZqZypxE6-lkp@intel.com/reproduce)
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>
| Closes: https://lore.kernel.org/oe-kbuild-all/202405201505.ZqZypxE6-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> fs/ext4/inode.c:5427:33: warning: variable 'old_disksize' is uninitialized when used here [-Wuninitialized]
EXT4_I(inode)->i_disksize = old_disksize;
^~~~~~~~~~~~
fs/ext4/inode.c:5343:22: note: initialize the variable 'old_disksize' to silence this warning
loff_t old_disksize;
^
= 0
1 warning generated.
vim +/old_disksize +5427 fs/ext4/inode.c
53e872681fed6a4 Jan Kara 2012-12-25 5241
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5242 /*
617ba13b31fbf50 Mingming Cao 2006-10-11 5243 * ext4_setattr()
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5244 *
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5245 * Called from notify_change.
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5246 *
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5247 * We want to trap VFS attempts to truncate the file as soon as
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5248 * possible. In particular, we want to make sure that when the VFS
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5249 * shrinks i_size, we put the inode on the orphan list and modify
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5250 * i_disksize immediately, so that during the subsequent flushing of
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5251 * dirty pages and freeing of disk blocks, we can guarantee that any
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5252 * commit will leave the blocks being flushed in an unused state on
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5253 * disk. (On recovery, the inode will get truncated and the blocks will
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5254 * be freed, so we have a strong guarantee that no future commit will
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5255 * leave these blocks visible to the user.)
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5256 *
678aaf481496b01 Jan Kara 2008-07-11 5257 * Another thing we have to assure is that if we are in ordered mode
678aaf481496b01 Jan Kara 2008-07-11 5258 * and inode is still attached to the committing transaction, we must
678aaf481496b01 Jan Kara 2008-07-11 5259 * we start writeout of all the dirty pages which are being truncated.
678aaf481496b01 Jan Kara 2008-07-11 5260 * This way we are sure that all the data written in the previous
678aaf481496b01 Jan Kara 2008-07-11 5261 * transaction are already on disk (truncate waits for pages under
678aaf481496b01 Jan Kara 2008-07-11 5262 * writeback).
678aaf481496b01 Jan Kara 2008-07-11 5263 *
f340b3d90274859 hongnanli 2022-01-21 5264 * Called with inode->i_rwsem down.
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5265 */
c1632a0f1120933 Christian Brauner 2023-01-13 5266 int ext4_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
549c7297717c32e Christian Brauner 2021-01-21 5267 struct iattr *attr)
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5268 {
2b0143b5c986be1 David Howells 2015-03-17 5269 struct inode *inode = d_inode(dentry);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5270 int error, rc = 0;
3d287de3b828226 Dmitry Monakhov 2010-10-27 5271 int orphan = 0;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5272 const unsigned int ia_valid = attr->ia_valid;
a642c2c0827f560 Jeff Layton 2022-09-08 5273 bool inc_ivers = true;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5274
eb8ab4443aec5ff Jan Kara 2023-06-16 5275 if (unlikely(ext4_forced_shutdown(inode->i_sb)))
0db1ff222d40f16 Theodore Ts'o 2017-02-05 5276 return -EIO;
0db1ff222d40f16 Theodore Ts'o 2017-02-05 5277
02b016ca7f99229 Theodore Ts'o 2019-06-09 5278 if (unlikely(IS_IMMUTABLE(inode)))
02b016ca7f99229 Theodore Ts'o 2019-06-09 5279 return -EPERM;
02b016ca7f99229 Theodore Ts'o 2019-06-09 5280
02b016ca7f99229 Theodore Ts'o 2019-06-09 5281 if (unlikely(IS_APPEND(inode) &&
02b016ca7f99229 Theodore Ts'o 2019-06-09 5282 (ia_valid & (ATTR_MODE | ATTR_UID |
02b016ca7f99229 Theodore Ts'o 2019-06-09 5283 ATTR_GID | ATTR_TIMES_SET))))
02b016ca7f99229 Theodore Ts'o 2019-06-09 5284 return -EPERM;
02b016ca7f99229 Theodore Ts'o 2019-06-09 5285
c1632a0f1120933 Christian Brauner 2023-01-13 5286 error = setattr_prepare(idmap, dentry, attr);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5287 if (error)
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5288 return error;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5289
3ce2b8ddd84d507 Eric Biggers 2017-10-18 5290 error = fscrypt_prepare_setattr(dentry, attr);
3ce2b8ddd84d507 Eric Biggers 2017-10-18 5291 if (error)
3ce2b8ddd84d507 Eric Biggers 2017-10-18 5292 return error;
3ce2b8ddd84d507 Eric Biggers 2017-10-18 5293
c93d8f88580921c Eric Biggers 2019-07-22 5294 error = fsverity_prepare_setattr(dentry, attr);
c93d8f88580921c Eric Biggers 2019-07-22 5295 if (error)
c93d8f88580921c Eric Biggers 2019-07-22 5296 return error;
c93d8f88580921c Eric Biggers 2019-07-22 5297
f861646a65623bc Christian Brauner 2023-01-13 5298 if (is_quota_modification(idmap, inode, attr)) {
a7cdadee0e89486 Jan Kara 2015-06-29 5299 error = dquot_initialize(inode);
a7cdadee0e89486 Jan Kara 2015-06-29 5300 if (error)
a7cdadee0e89486 Jan Kara 2015-06-29 5301 return error;
a7cdadee0e89486 Jan Kara 2015-06-29 5302 }
2729cfdcfa1cc49 Harshad Shirwadkar 2021-12-23 5303
0dbe12f2e49c046 Christian Brauner 2023-01-13 5304 if (i_uid_needs_update(idmap, attr, inode) ||
0dbe12f2e49c046 Christian Brauner 2023-01-13 5305 i_gid_needs_update(idmap, attr, inode)) {
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5306 handle_t *handle;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5307
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5308 /* (user+group)*(old+new) structure, inode write (sb,
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5309 * inode block, ? - but truncate inode update has it) */
9924a92a8c21757 Theodore Ts'o 2013-02-08 5310 handle = ext4_journal_start(inode, EXT4_HT_QUOTA,
9924a92a8c21757 Theodore Ts'o 2013-02-08 5311 (EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb) +
194074acacebc16 Dmitry Monakhov 2009-12-08 5312 EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb)) + 3);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5313 if (IS_ERR(handle)) {
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5314 error = PTR_ERR(handle);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5315 goto err_out;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5316 }
7a9ca53aea10ad4 Tahsin Erdogan 2017-06-22 5317
7a9ca53aea10ad4 Tahsin Erdogan 2017-06-22 5318 /* dquot_transfer() calls back ext4_get_inode_usage() which
7a9ca53aea10ad4 Tahsin Erdogan 2017-06-22 5319 * counts xattr inode references.
7a9ca53aea10ad4 Tahsin Erdogan 2017-06-22 5320 */
7a9ca53aea10ad4 Tahsin Erdogan 2017-06-22 5321 down_read(&EXT4_I(inode)->xattr_sem);
f861646a65623bc Christian Brauner 2023-01-13 5322 error = dquot_transfer(idmap, inode, attr);
7a9ca53aea10ad4 Tahsin Erdogan 2017-06-22 5323 up_read(&EXT4_I(inode)->xattr_sem);
7a9ca53aea10ad4 Tahsin Erdogan 2017-06-22 5324
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5325 if (error) {
617ba13b31fbf50 Mingming Cao 2006-10-11 5326 ext4_journal_stop(handle);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5327 return error;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5328 }
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5329 /* Update corresponding info in inode so that everything is in
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5330 * one transaction */
0dbe12f2e49c046 Christian Brauner 2023-01-13 5331 i_uid_update(idmap, attr, inode);
0dbe12f2e49c046 Christian Brauner 2023-01-13 5332 i_gid_update(idmap, attr, inode);
617ba13b31fbf50 Mingming Cao 2006-10-11 5333 error = ext4_mark_inode_dirty(handle, inode);
617ba13b31fbf50 Mingming Cao 2006-10-11 5334 ext4_journal_stop(handle);
512c15ef05d73a0 Pan Bian 2021-01-17 5335 if (unlikely(error)) {
4209ae12b12265d Harshad Shirwadkar 2020-04-26 5336 return error;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5337 }
512c15ef05d73a0 Pan Bian 2021-01-17 5338 }
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5339
3da40c7b089810a Josef Bacik 2015-06-22 5340 if (attr->ia_valid & ATTR_SIZE) {
5208386c501276d Jan Kara 2013-08-17 5341 handle_t *handle;
3da40c7b089810a Josef Bacik 2015-06-22 5342 loff_t oldsize = inode->i_size;
f4534c9fc94d223 Ye Bin 2022-03-26 5343 loff_t old_disksize;
b9c1c26739ec2d4 Jan Kara 2019-05-30 5344 int shrink = (attr->ia_size < inode->i_size);
562c72aa57c36b1 Christoph Hellwig 2011-06-24 5345
12e9b892002d9af Dmitry Monakhov 2010-05-16 5346 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) {
e2b4657453c0d55 Eric Sandeen 2008-01-28 5347 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
e2b4657453c0d55 Eric Sandeen 2008-01-28 5348
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5349 if (attr->ia_size > sbi->s_bitmap_maxbytes) {
0c095c7f113e9fd Theodore Ts'o 2010-07-27 5350 return -EFBIG;
e2b4657453c0d55 Eric Sandeen 2008-01-28 5351 }
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5352 }
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5353 if (!S_ISREG(inode->i_mode)) {
3da40c7b089810a Josef Bacik 2015-06-22 5354 return -EINVAL;
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5355 }
dff6efc326a4d5f Christoph Hellwig 2013-11-19 5356
a642c2c0827f560 Jeff Layton 2022-09-08 5357 if (attr->ia_size == inode->i_size)
a642c2c0827f560 Jeff Layton 2022-09-08 5358 inc_ivers = false;
dff6efc326a4d5f Christoph Hellwig 2013-11-19 5359
b9c1c26739ec2d4 Jan Kara 2019-05-30 5360 if (shrink) {
b9c1c26739ec2d4 Jan Kara 2019-05-30 5361 if (ext4_should_order_data(inode)) {
5208386c501276d Jan Kara 2013-08-17 5362 error = ext4_begin_ordered_truncate(inode,
5208386c501276d Jan Kara 2013-08-17 5363 attr->ia_size);
5208386c501276d Jan Kara 2013-08-17 5364 if (error)
5208386c501276d Jan Kara 2013-08-17 5365 goto err_out;
5208386c501276d Jan Kara 2013-08-17 5366 }
b9c1c26739ec2d4 Jan Kara 2019-05-30 5367 /*
b9c1c26739ec2d4 Jan Kara 2019-05-30 5368 * Blocks are going to be removed from the inode. Wait
b9c1c26739ec2d4 Jan Kara 2019-05-30 5369 * for dio in flight.
b9c1c26739ec2d4 Jan Kara 2019-05-30 5370 */
b9c1c26739ec2d4 Jan Kara 2019-05-30 5371 inode_dio_wait(inode);
b9c1c26739ec2d4 Jan Kara 2019-05-30 5372 }
b9c1c26739ec2d4 Jan Kara 2019-05-30 5373
d4f5258eae7b38c Jan Kara 2021-02-04 5374 filemap_invalidate_lock(inode->i_mapping);
b9c1c26739ec2d4 Jan Kara 2019-05-30 5375
b9c1c26739ec2d4 Jan Kara 2019-05-30 5376 rc = ext4_break_layouts(inode);
b9c1c26739ec2d4 Jan Kara 2019-05-30 5377 if (rc) {
d4f5258eae7b38c Jan Kara 2021-02-04 5378 filemap_invalidate_unlock(inode->i_mapping);
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5379 goto err_out;
b9c1c26739ec2d4 Jan Kara 2019-05-30 5380 }
b9c1c26739ec2d4 Jan Kara 2019-05-30 5381
3da40c7b089810a Josef Bacik 2015-06-22 5382 if (attr->ia_size != inode->i_size) {
9924a92a8c21757 Theodore Ts'o 2013-02-08 5383 handle = ext4_journal_start(inode, EXT4_HT_INODE, 3);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5384 if (IS_ERR(handle)) {
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5385 error = PTR_ERR(handle);
b9c1c26739ec2d4 Jan Kara 2019-05-30 5386 goto out_mmap_sem;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5387 }
3da40c7b089810a Josef Bacik 2015-06-22 5388 if (ext4_handle_valid(handle) && shrink) {
617ba13b31fbf50 Mingming Cao 2006-10-11 5389 error = ext4_orphan_add(handle, inode);
3d287de3b828226 Dmitry Monakhov 2010-10-27 5390 orphan = 1;
3d287de3b828226 Dmitry Monakhov 2010-10-27 5391 }
911af577de4e444 Eryu Guan 2015-07-28 5392 /*
911af577de4e444 Eryu Guan 2015-07-28 5393 * Update c/mtime on truncate up, ext4_truncate() will
911af577de4e444 Eryu Guan 2015-07-28 5394 * update c/mtime in shrink case below
911af577de4e444 Eryu Guan 2015-07-28 5395 */
1bc33893e79a79d Jeff Layton 2023-07-05 5396 if (!shrink)
b898ab233611f79 Jeff Layton 2023-10-04 5397 inode_set_mtime_to_ts(inode,
b898ab233611f79 Jeff Layton 2023-10-04 5398 inode_set_ctime_current(inode));
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5399
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5400 if (shrink)
a80f7fcf18672ae Harshad Shirwadkar 2020-11-05 5401 ext4_fc_track_range(handle, inode,
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5402 (attr->ia_size > 0 ? attr->ia_size - 1 : 0) >>
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5403 inode->i_sb->s_blocksize_bits,
9725958bb75cdfa Xin Yin 2021-12-23 5404 EXT_MAX_BLOCKS - 1);
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5405 else
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5406 ext4_fc_track_range(
a80f7fcf18672ae Harshad Shirwadkar 2020-11-05 5407 handle, inode,
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5408 (oldsize > 0 ? oldsize - 1 : oldsize) >>
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5409 inode->i_sb->s_blocksize_bits,
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5410 (attr->ia_size > 0 ? attr->ia_size - 1 : 0) >>
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5411 inode->i_sb->s_blocksize_bits);
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5412
617ba13b31fbf50 Mingming Cao 2006-10-11 5413 rc = ext4_mark_inode_dirty(handle, inode);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5414 if (!error)
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5415 error = rc;
a879a75fe2d0cec Harshad Shirwadkar 2024-05-20 5416 down_write(&EXT4_I(inode)->i_data_sem);
a879a75fe2d0cec Harshad Shirwadkar 2024-05-20 5417 EXT4_I(inode)->i_disksize = attr->ia_size;
a879a75fe2d0cec Harshad Shirwadkar 2024-05-20 5418
90e775b71ac4e68 Jan Kara 2013-08-17 5419 /*
90e775b71ac4e68 Jan Kara 2013-08-17 5420 * We have to update i_size under i_data_sem together
90e775b71ac4e68 Jan Kara 2013-08-17 5421 * with i_disksize to avoid races with writeback code
90e775b71ac4e68 Jan Kara 2013-08-17 5422 * running ext4_wb_update_i_disksize().
90e775b71ac4e68 Jan Kara 2013-08-17 5423 */
90e775b71ac4e68 Jan Kara 2013-08-17 5424 if (!error)
90e775b71ac4e68 Jan Kara 2013-08-17 5425 i_size_write(inode, attr->ia_size);
f4534c9fc94d223 Ye Bin 2022-03-26 5426 else
f4534c9fc94d223 Ye Bin 2022-03-26 @5427 EXT4_I(inode)->i_disksize = old_disksize;
90e775b71ac4e68 Jan Kara 2013-08-17 5428 up_write(&EXT4_I(inode)->i_data_sem);
617ba13b31fbf50 Mingming Cao 2006-10-11 5429 ext4_journal_stop(handle);
b9c1c26739ec2d4 Jan Kara 2019-05-30 5430 if (error)
b9c1c26739ec2d4 Jan Kara 2019-05-30 5431 goto out_mmap_sem;
82a25b027ca48d7 Jan Kara 2019-05-23 5432 if (!shrink) {
b9c1c26739ec2d4 Jan Kara 2019-05-30 5433 pagecache_isize_extended(inode, oldsize,
b9c1c26739ec2d4 Jan Kara 2019-05-30 5434 inode->i_size);
b9c1c26739ec2d4 Jan Kara 2019-05-30 5435 } else if (ext4_should_journal_data(inode)) {
82a25b027ca48d7 Jan Kara 2019-05-23 5436 ext4_wait_for_tail_page_commit(inode);
b9c1c26739ec2d4 Jan Kara 2019-05-30 5437 }
430657b6be896db Ross Zwisler 2018-07-29 5438 }
430657b6be896db Ross Zwisler 2018-07-29 5439
53e872681fed6a4 Jan Kara 2012-12-25 5440 /*
53e872681fed6a4 Jan Kara 2012-12-25 5441 * Truncate pagecache after we've waited for commit
53e872681fed6a4 Jan Kara 2012-12-25 5442 * in data=journal mode to make pages freeable.
53e872681fed6a4 Jan Kara 2012-12-25 5443 */
7caef26767c1727 Kirill A. Shutemov 2013-09-12 5444 truncate_pagecache(inode, inode->i_size);
b9c1c26739ec2d4 Jan Kara 2019-05-30 5445 /*
b9c1c26739ec2d4 Jan Kara 2019-05-30 5446 * Call ext4_truncate() even if i_size didn't change to
b9c1c26739ec2d4 Jan Kara 2019-05-30 5447 * truncate possible preallocated blocks.
b9c1c26739ec2d4 Jan Kara 2019-05-30 5448 */
b9c1c26739ec2d4 Jan Kara 2019-05-30 5449 if (attr->ia_size <= oldsize) {
2c98eb5ea249767 Theodore Ts'o 2016-11-13 5450 rc = ext4_truncate(inode);
2c98eb5ea249767 Theodore Ts'o 2016-11-13 5451 if (rc)
2c98eb5ea249767 Theodore Ts'o 2016-11-13 5452 error = rc;
2c98eb5ea249767 Theodore Ts'o 2016-11-13 5453 }
b9c1c26739ec2d4 Jan Kara 2019-05-30 5454 out_mmap_sem:
d4f5258eae7b38c Jan Kara 2021-02-04 5455 filemap_invalidate_unlock(inode->i_mapping);
3da40c7b089810a Josef Bacik 2015-06-22 5456 }
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5457
2c98eb5ea249767 Theodore Ts'o 2016-11-13 5458 if (!error) {
a642c2c0827f560 Jeff Layton 2022-09-08 5459 if (inc_ivers)
a642c2c0827f560 Jeff Layton 2022-09-08 5460 inode_inc_iversion(inode);
c1632a0f1120933 Christian Brauner 2023-01-13 5461 setattr_copy(idmap, inode, attr);
1025774ce411f2b Christoph Hellwig 2010-06-04 5462 mark_inode_dirty(inode);
1025774ce411f2b Christoph Hellwig 2010-06-04 5463 }
1025774ce411f2b Christoph Hellwig 2010-06-04 5464
1025774ce411f2b Christoph Hellwig 2010-06-04 5465 /*
1025774ce411f2b Christoph Hellwig 2010-06-04 5466 * If the call to ext4_truncate failed to get a transaction handle at
1025774ce411f2b Christoph Hellwig 2010-06-04 5467 * all, we need to clean up the in-core orphan list manually.
1025774ce411f2b Christoph Hellwig 2010-06-04 5468 */
3d287de3b828226 Dmitry Monakhov 2010-10-27 5469 if (orphan && inode->i_nlink)
617ba13b31fbf50 Mingming Cao 2006-10-11 5470 ext4_orphan_del(NULL, inode);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5471
2c98eb5ea249767 Theodore Ts'o 2016-11-13 5472 if (!error && (ia_valid & ATTR_MODE))
13e83a4923bea7c Christian Brauner 2023-01-13 5473 rc = posix_acl_chmod(idmap, dentry, inode->i_mode);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5474
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5475 err_out:
aa75f4d3daaeb13 Harshad Shirwadkar 2020-10-15 5476 if (error)
617ba13b31fbf50 Mingming Cao 2006-10-11 5477 ext4_std_error(inode->i_sb, error);
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5478 if (!error)
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5479 error = rc;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5480 return error;
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5481 }
ac27a0ec112a089 Dave Kleikamp 2006-10-11 5482
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index aa6440992a55..26b9d3076536 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5410,12 +5410,12 @@ int ext4_setattr(struct mnt_idmap *idmap, struct dentry *dentry, (attr->ia_size > 0 ? attr->ia_size - 1 : 0) >> inode->i_sb->s_blocksize_bits); - down_write(&EXT4_I(inode)->i_data_sem); - old_disksize = EXT4_I(inode)->i_disksize; - EXT4_I(inode)->i_disksize = attr->ia_size; rc = ext4_mark_inode_dirty(handle, inode); if (!error) error = rc; + down_write(&EXT4_I(inode)->i_data_sem); + EXT4_I(inode)->i_disksize = attr->ia_size; + /* * We have to update i_size under i_data_sem together * with i_disksize to avoid races with writeback code
Mark inode dirty first and then grab i_data_sem in ext4_setattr(). Signed-off-by: Harshad Shirwadkar <harshadshirwadkar@gmail.com> --- fs/ext4/inode.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)