Lines Matching +full:non +full:- +full:exclusive
1 // SPDX-License-Identifier: GPL-2.0
7 * Laboratoire MASI - Institut Blaise Pascal
18 * 64-bit file support on 64-bit platforms by Jakub Jelinek
32 #include <linux/backing-dev.h>
57 struct inode *inode = file_inode(iocb->ki_filp); in ext4_should_use_dio()
66 return IS_ALIGNED(iocb->ki_pos | iov_iter_alignment(iter), dio_align); in ext4_should_use_dio()
72 struct inode *inode = file_inode(iocb->ki_filp); in ext4_dio_read_iter()
74 if (iocb->ki_flags & IOCB_NOWAIT) { in ext4_dio_read_iter()
76 return -EAGAIN; in ext4_dio_read_iter()
90 iocb->ki_flags &= ~IOCB_DIRECT; in ext4_dio_read_iter()
97 file_accessed(iocb->ki_filp); in ext4_dio_read_iter()
104 struct inode *inode = file_inode(iocb->ki_filp); in ext4_dax_read_iter()
107 if (iocb->ki_flags & IOCB_NOWAIT) { in ext4_dax_read_iter()
109 return -EAGAIN; in ext4_dax_read_iter()
114 * Recheck under inode lock - at this point we are sure it cannot in ext4_dax_read_iter()
125 file_accessed(iocb->ki_filp); in ext4_dax_read_iter()
132 struct inode *inode = file_inode(iocb->ki_filp); in ext4_file_read_iter()
134 if (unlikely(ext4_forced_shutdown(inode->i_sb))) in ext4_file_read_iter()
135 return -EIO; in ext4_file_read_iter()
144 if (iocb->ki_flags & IOCB_DIRECT) in ext4_file_read_iter()
156 if (unlikely(ext4_forced_shutdown(inode->i_sb))) in ext4_file_splice_read()
157 return -EIO; in ext4_file_splice_read()
173 if ((filp->f_mode & FMODE_WRITE) && in ext4_release_file()
174 (atomic_read(&inode->i_writecount) == 1) && in ext4_release_file()
175 !EXT4_I(inode)->i_reserved_data_blocks) { in ext4_release_file()
176 down_write(&EXT4_I(inode)->i_data_sem); in ext4_release_file()
178 up_write(&EXT4_I(inode)->i_data_sem); in ext4_release_file()
180 if (is_dx(inode) && filp->private_data) in ext4_release_file()
181 ext4_htree_free_dir_info(filp->private_data); in ext4_release_file()
187 * This tests whether the IO in question is block-aligned or not.
188 * Ext4 utilizes unwritten extents when hole-filling during direct IO, and they
198 struct super_block *sb = inode->i_sb; in ext4_unaligned_io()
199 unsigned long blockmask = sb->s_blocksize - 1; in ext4_unaligned_io()
211 offset + len > EXT4_I(inode)->i_disksize) in ext4_extending_io()
221 unsigned int blkbits = inode->i_blkbits; in ext4_overwrite_io()
246 struct inode *inode = file_inode(iocb->ki_filp); in ext4_generic_write_checks()
250 return -EPERM; in ext4_generic_write_checks()
257 * If we have encountered a bitmap-format file, the size limit in ext4_generic_write_checks()
258 * is smaller than s_maxbytes, which is for extent-mapped files. in ext4_generic_write_checks()
261 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_generic_write_checks()
263 if (iocb->ki_pos >= sbi->s_bitmap_maxbytes) in ext4_generic_write_checks()
264 return -EFBIG; in ext4_generic_write_checks()
265 iov_iter_truncate(from, sbi->s_bitmap_maxbytes - iocb->ki_pos); in ext4_generic_write_checks()
279 ret = file_modified(iocb->ki_filp); in ext4_write_checks()
289 struct inode *inode = file_inode(iocb->ki_filp); in ext4_buffered_write_iter()
291 if (iocb->ki_flags & IOCB_NOWAIT) in ext4_buffered_write_iter()
292 return -EOPNOTSUPP; in ext4_buffered_write_iter()
313 lockdep_assert_held_write(&inode->i_rwsem); in ext4_handle_inode_extension()
326 if ((written == count) && inode->i_nlink) in ext4_handle_inode_extension()
339 lockdep_assert_held_write(&inode->i_rwsem); in ext4_inode_extension_cleanup()
345 * remove the inode from the in-memory linked list. in ext4_inode_extension_cleanup()
347 if (inode->i_nlink) in ext4_inode_extension_cleanup()
357 if (!list_empty(&EXT4_I(inode)->i_orphan) && inode->i_nlink) { in ext4_inode_extension_cleanup()
377 loff_t pos = iocb->ki_pos; in ext4_dio_write_end_io()
378 struct inode *inode = file_inode(iocb->ki_filp); in ext4_dio_write_end_io()
385 * Note that EXT4_I(inode)->i_disksize can get extended up to in ext4_dio_write_end_io()
386 * inode->i_size while the I/O was running due to writeback of delalloc in ext4_dio_write_end_io()
393 if (pos + size <= READ_ONCE(EXT4_I(inode)->i_disksize) && in ext4_dio_write_end_io()
406 * condition requires an exclusive inode lock. If yes, then we restart the
407 * whole operation by releasing the shared lock and acquiring exclusive lock.
409 * - For unaligned_io we never take shared lock as it may cause data corruption
412 * - For extending writes case we don't take the shared lock, since it requires
413 * updating inode i_disksize and/or orphan handling with exclusive lock.
415 * - shared locking will only be true mostly with overwrites, including
418 * also release exclusive i_rwsem lock.
420 * - Otherwise we will switch to exclusive i_rwsem lock.
426 struct file *file = iocb->ki_filp; in ext4_dio_write_checks()
438 offset = iocb->ki_pos; in ext4_dio_write_checks()
446 * Determine whether we need to upgrade to an exclusive lock. This is in ext4_dio_write_checks()
448 * I/O, any form of non-overwrite I/O, and unaligned I/O to unwritten in ext4_dio_write_checks()
459 if (iocb->ki_flags & IOCB_NOWAIT) { in ext4_dio_write_checks()
460 ret = -EAGAIN; in ext4_dio_write_checks()
472 * behavior already. The inode lock is already held exclusive if the in ext4_dio_write_checks()
473 * write is non-overwrite or extending, so drain all outstanding dio and in ext4_dio_write_checks()
477 if (iocb->ki_flags & IOCB_NOWAIT) { in ext4_dio_write_checks()
478 ret = -EAGAIN; in ext4_dio_write_checks()
503 struct inode *inode = file_inode(iocb->ki_filp); in ext4_dio_write_iter()
504 loff_t offset = iocb->ki_pos; in ext4_dio_write_iter()
519 if (iocb->ki_flags & IOCB_NOWAIT) { in ext4_dio_write_iter()
522 return -EAGAIN; in ext4_dio_write_iter()
525 return -EAGAIN; in ext4_dio_write_iter()
557 offset = iocb->ki_pos; in ext4_dio_write_iter()
577 if (ret == -ENOTBLK) in ext4_dio_write_iter()
586 WARN_ON_ONCE(ret == -EIOCBQUEUED); in ext4_dio_write_iter()
601 * There is no support for atomic writes on buffered-io yet, in ext4_dio_write_iter()
602 * we should never fallback to buffered-io for DIO atomic in ext4_dio_write_iter()
605 WARN_ON_ONCE(iocb->ki_flags & IOCB_ATOMIC); in ext4_dio_write_iter()
607 offset = iocb->ki_pos; in ext4_dio_write_iter()
620 endbyte = offset + err - 1; in ext4_dio_write_iter()
621 err = filemap_write_and_wait_range(iocb->ki_filp->f_mapping, in ext4_dio_write_iter()
624 invalidate_mapping_pages(iocb->ki_filp->f_mapping, in ext4_dio_write_iter()
641 struct inode *inode = file_inode(iocb->ki_filp); in ext4_dax_write_iter()
643 if (iocb->ki_flags & IOCB_NOWAIT) { in ext4_dax_write_iter()
645 return -EAGAIN; in ext4_dax_write_iter()
654 offset = iocb->ki_pos; in ext4_dax_write_iter()
657 if (offset + count > EXT4_I(inode)->i_disksize) { in ext4_dax_write_iter()
691 struct inode *inode = file_inode(iocb->ki_filp); in ext4_file_write_iter()
693 if (unlikely(ext4_forced_shutdown(inode->i_sb))) in ext4_file_write_iter()
694 return -EIO; in ext4_file_write_iter()
701 if (iocb->ki_flags & IOCB_ATOMIC) { in ext4_file_write_iter()
705 if (len < EXT4_SB(inode->i_sb)->s_awu_min || in ext4_file_write_iter()
706 len > EXT4_SB(inode->i_sb)->s_awu_max) in ext4_file_write_iter()
707 return -EINVAL; in ext4_file_write_iter()
714 if (iocb->ki_flags & IOCB_DIRECT) in ext4_file_write_iter()
727 struct inode *inode = file_inode(vmf->vma->vm_file); in ext4_dax_huge_fault()
728 struct super_block *sb = inode->i_sb; in ext4_dax_huge_fault()
734 * read-only. in ext4_dax_huge_fault()
736 * We check for VM_SHARED rather than vmf->cow_page since the latter is in ext4_dax_huge_fault()
741 bool write = (vmf->flags & FAULT_FLAG_WRITE) && in ext4_dax_huge_fault()
742 (vmf->vma->vm_flags & VM_SHARED); in ext4_dax_huge_fault()
743 struct address_space *mapping = vmf->vma->vm_file->f_mapping; in ext4_dax_huge_fault()
748 file_update_time(vmf->vma->vm_file); in ext4_dax_huge_fault()
765 if ((result & VM_FAULT_ERROR) && error == -ENOSPC && in ext4_dax_huge_fault()
803 struct inode *inode = file->f_mapping->host; in ext4_file_mmap()
804 struct dax_device *dax_dev = EXT4_SB(inode->i_sb)->s_daxdev; in ext4_file_mmap()
806 if (unlikely(ext4_forced_shutdown(inode->i_sb))) in ext4_file_mmap()
807 return -EIO; in ext4_file_mmap()
810 * We don't support synchronous mappings for non-DAX files and in ext4_file_mmap()
814 return -EOPNOTSUPP; in ext4_file_mmap()
818 vma->vm_ops = &ext4_dax_vm_ops; in ext4_file_mmap()
821 vma->vm_ops = &ext4_file_vm_ops; in ext4_file_mmap()
850 path.dentry = mnt->mnt_root; in ext4_sample_last_mounted()
860 BUFFER_TRACE(sbi->s_sbh, "get_write_access"); in ext4_sample_last_mounted()
861 err = ext4_journal_get_write_access(handle, sb, sbi->s_sbh, in ext4_sample_last_mounted()
865 lock_buffer(sbi->s_sbh); in ext4_sample_last_mounted()
866 strtomem_pad(sbi->s_es->s_last_mounted, cp, 0); in ext4_sample_last_mounted()
868 unlock_buffer(sbi->s_sbh); in ext4_sample_last_mounted()
869 ext4_handle_dirty_metadata(handle, NULL, sbi->s_sbh); in ext4_sample_last_mounted()
881 if (unlikely(ext4_forced_shutdown(inode->i_sb))) in ext4_file_open()
882 return -EIO; in ext4_file_open()
884 ret = ext4_sample_last_mounted(inode->i_sb, filp->f_path.mnt); in ext4_file_open()
900 if (filp->f_mode & FMODE_WRITE) { in ext4_file_open()
907 filp->f_mode |= FMODE_CAN_ATOMIC_WRITE; in ext4_file_open()
909 filp->f_mode |= FMODE_NOWAIT | FMODE_CAN_ODIRECT; in ext4_file_open()
914 * ext4_llseek() handles both block-mapped and extent-mapped maxbytes values
920 struct inode *inode = file->f_mapping->host; in ext4_llseek()
924 maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; in ext4_llseek()
926 maxbytes = inode->i_sb->s_maxbytes; in ext4_llseek()