1. 01 Nov, 2023 2 commits
    • Jan Kara's avatar
      ext4: properly sync file size update after O_SYNC direct IO · 91562895
      Jan Kara authored
      Gao Xiang has reported that on ext4 O_SYNC direct IO does not properly
      sync file size update and thus if we crash at unfortunate moment, the
      file can have smaller size although O_SYNC IO has reported successful
      completion. The problem happens because update of on-disk inode size is
      handled in ext4_dio_write_iter() *after* iomap_dio_rw() (and thus
      dio_complete() in particular) has returned and generic_file_sync() gets
      called by dio_complete(). Fix the problem by handling on-disk inode size
      update directly in our ->end_io completion handler.
      
      References: https://lore.kernel.org/all/02d18236-26ef-09b0-90ad-030c4fe3ee20@linux.alibaba.comReported-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
      CC: stable@vger.kernel.org
      Fixes: 378f32ba ("ext4: introduce direct I/O write using iomap infrastructure")
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      Tested-by: default avatarJoseph Qi <joseph.qi@linux.alibaba.com>
      Reviewed-by: default avatar"Ritesh Harjani (IBM)" <ritesh.list@gmail.com>
      Link: https://lore.kernel.org/r/20231013121350.26872-1-jack@suse.czSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      91562895
    • Brian Foster's avatar
      ext4: fix racy may inline data check in dio write · ce56d213
      Brian Foster authored
      syzbot reports that the following warning from ext4_iomap_begin()
      triggers as of the commit referenced below:
      
              if (WARN_ON_ONCE(ext4_has_inline_data(inode)))
                      return -ERANGE;
      
      This occurs during a dio write, which is never expected to encounter
      an inode with inline data. To enforce this behavior,
      ext4_dio_write_iter() checks the current inline state of the inode
      and clears the MAY_INLINE_DATA state flag to either fall back to
      buffered writes, or enforce that any other writers in progress on
      the inode are not allowed to create inline data.
      
      The problem is that the check for existing inline data and the state
      flag can span a lock cycle. For example, if the ilock is originally
      locked shared and subsequently upgraded to exclusive, another writer
      may have reacquired the lock and created inline data before the dio
      write task acquires the lock and proceeds.
      
      The commit referenced below loosens the lock requirements to allow
      some forms of unaligned dio writes to occur under shared lock, but
      AFAICT the inline data check was technically already racy for any
      dio write that would have involved a lock cycle. Regardless, lift
      clearing of the state bit to the same lock critical section that
      checks for preexisting inline data on the inode to close the race.
      
      Cc: stable@kernel.org
      Reported-by: syzbot+307da6ca5cb0d01d581a@syzkaller.appspotmail.com
      Fixes: 310ee090 ("ext4: allow concurrent unaligned dio overwrites")
      Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
      Link: https://lore.kernel.org/r/20231002185020.531537-1-bfoster@redhat.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      ce56d213
  2. 06 Oct, 2023 38 commits