Lines Matching +full:no +full:- +full:unaligned +full:- +full:direct +full:- +full:access
1 // SPDX-License-Identifier: GPL-2.0
33 struct super_block *sb = inode->i_sb; in zonefs_read_iomap_begin()
40 mutex_lock(&zi->i_truncate_mutex); in zonefs_read_iomap_begin()
41 iomap->bdev = inode->i_sb->s_bdev; in zonefs_read_iomap_begin()
42 iomap->offset = ALIGN_DOWN(offset, sb->s_blocksize); in zonefs_read_iomap_begin()
44 if (iomap->offset >= isize) { in zonefs_read_iomap_begin()
45 iomap->type = IOMAP_HOLE; in zonefs_read_iomap_begin()
46 iomap->addr = IOMAP_NULL_ADDR; in zonefs_read_iomap_begin()
47 iomap->length = length; in zonefs_read_iomap_begin()
49 iomap->type = IOMAP_MAPPED; in zonefs_read_iomap_begin()
50 iomap->addr = (z->z_sector << SECTOR_SHIFT) + iomap->offset; in zonefs_read_iomap_begin()
51 iomap->length = isize - iomap->offset; in zonefs_read_iomap_begin()
53 mutex_unlock(&zi->i_truncate_mutex); in zonefs_read_iomap_begin()
70 struct super_block *sb = inode->i_sb; in zonefs_write_iomap_begin()
74 if (WARN_ON_ONCE(offset + length > z->z_capacity)) in zonefs_write_iomap_begin()
75 return -EIO; in zonefs_write_iomap_begin()
78 * Sequential zones can only accept direct writes. This is already in zonefs_write_iomap_begin()
83 return -EIO; in zonefs_write_iomap_begin()
90 mutex_lock(&zi->i_truncate_mutex); in zonefs_write_iomap_begin()
91 iomap->bdev = inode->i_sb->s_bdev; in zonefs_write_iomap_begin()
92 iomap->offset = ALIGN_DOWN(offset, sb->s_blocksize); in zonefs_write_iomap_begin()
93 iomap->addr = (z->z_sector << SECTOR_SHIFT) + iomap->offset; in zonefs_write_iomap_begin()
95 if (iomap->offset >= isize) { in zonefs_write_iomap_begin()
96 iomap->type = IOMAP_UNWRITTEN; in zonefs_write_iomap_begin()
97 iomap->length = z->z_capacity - iomap->offset; in zonefs_write_iomap_begin()
99 iomap->type = IOMAP_MAPPED; in zonefs_write_iomap_begin()
100 iomap->length = isize - iomap->offset; in zonefs_write_iomap_begin()
102 mutex_unlock(&zi->i_truncate_mutex); in zonefs_write_iomap_begin()
130 struct zonefs_zone *z = zonefs_inode_zone(wpc->inode); in zonefs_writeback_range()
133 return -EIO; in zonefs_writeback_range()
134 if (WARN_ON_ONCE(offset >= i_size_read(wpc->inode))) in zonefs_writeback_range()
135 return -EIO; in zonefs_writeback_range()
138 if (offset < wpc->iomap.offset || in zonefs_writeback_range()
139 offset >= wpc->iomap.offset + wpc->iomap.length) { in zonefs_writeback_range()
142 error = zonefs_write_iomap_begin(wpc->inode, offset, in zonefs_writeback_range()
143 z->z_capacity - offset, IOMAP_WRITE, in zonefs_writeback_range()
144 &wpc->iomap, NULL); in zonefs_writeback_range()
161 .inode = mapping->host, in zonefs_writepages()
175 zonefs_err(inode->i_sb, in zonefs_swap_activate()
177 return -EINVAL; in zonefs_swap_activate()
211 return -EPERM; in zonefs_file_truncate()
215 else if (isize == z->z_capacity) in zonefs_file_truncate()
218 return -EPERM; in zonefs_file_truncate()
223 filemap_invalidate_lock(inode->i_mapping); in zonefs_file_truncate()
226 mutex_lock(&zi->i_truncate_mutex); in zonefs_file_truncate()
240 if (z->z_flags & ZONEFS_ZONE_OPEN) { in zonefs_file_truncate()
244 * re-open the zone to ensure new writes can be processed. in zonefs_file_truncate()
252 z->z_flags &= ~ZONEFS_ZONE_OPEN; in zonefs_file_truncate()
257 z->z_wpoffset = isize; in zonefs_file_truncate()
261 mutex_unlock(&zi->i_truncate_mutex); in zonefs_file_truncate()
262 filemap_invalidate_unlock(inode->i_mapping); in zonefs_file_truncate()
274 return -EPERM; in zonefs_file_fsync()
277 * Since only direct writes are allowed in sequential files, page cache in zonefs_file_fsync()
283 ret = blkdev_issue_flush(inode->i_sb->s_bdev); in zonefs_file_fsync()
293 struct inode *inode = file_inode(vmf->vma->vm_file); in zonefs_filemap_page_mkwrite()
306 sb_start_pagefault(inode->i_sb); in zonefs_filemap_page_mkwrite()
307 file_update_time(vmf->vma->vm_file); in zonefs_filemap_page_mkwrite()
310 filemap_invalidate_lock_shared(inode->i_mapping); in zonefs_filemap_page_mkwrite()
312 filemap_invalidate_unlock_shared(inode->i_mapping); in zonefs_filemap_page_mkwrite()
314 sb_end_pagefault(inode->i_sb); in zonefs_filemap_page_mkwrite()
326 struct file *file = desc->file; in zonefs_file_mmap_prepare()
331 * mappings are possible since there are no guarantees for write in zonefs_file_mmap_prepare()
335 (desc->vm_flags & VM_SHARED) && (desc->vm_flags & VM_MAYWRITE)) in zonefs_file_mmap_prepare()
336 return -EINVAL; in zonefs_file_mmap_prepare()
339 desc->vm_ops = &zonefs_file_vm_ops; in zonefs_file_mmap_prepare()
359 struct inode *inode = file_inode(iocb->ki_filp); in zonefs_file_write_dio_end_io()
380 mutex_lock(&zi->i_truncate_mutex); in zonefs_file_write_dio_end_io()
381 if (i_size_read(inode) < iocb->ki_pos + size) { in zonefs_file_write_dio_end_io()
382 zonefs_update_stats(inode, iocb->ki_pos + size); in zonefs_file_write_dio_end_io()
383 zonefs_i_size_write(inode, iocb->ki_pos + size); in zonefs_file_write_dio_end_io()
385 mutex_unlock(&zi->i_truncate_mutex); in zonefs_file_write_dio_end_io()
397 * limit it becomes a short access. If it exceeds the limit, return -EFBIG.
405 loff_t max_size = z->z_capacity; in zonefs_write_check_limits()
410 return -EFBIG; in zonefs_write_check_limits()
412 count = min(count, limit - pos); in zonefs_write_check_limits()
415 if (!(file->f_flags & O_LARGEFILE)) in zonefs_write_check_limits()
419 return -EFBIG; in zonefs_write_check_limits()
421 return min(count, max_size - pos); in zonefs_write_check_limits()
426 struct file *file = iocb->ki_filp; in zonefs_write_checks()
433 return -ETXTBSY; in zonefs_write_checks()
438 if ((iocb->ki_flags & IOCB_NOWAIT) && !(iocb->ki_flags & IOCB_DIRECT)) in zonefs_write_checks()
439 return -EINVAL; in zonefs_write_checks()
441 if (iocb->ki_flags & IOCB_APPEND) { in zonefs_write_checks()
443 return -EINVAL; in zonefs_write_checks()
444 mutex_lock(&zi->i_truncate_mutex); in zonefs_write_checks()
445 iocb->ki_pos = z->z_wpoffset; in zonefs_write_checks()
446 mutex_unlock(&zi->i_truncate_mutex); in zonefs_write_checks()
449 count = zonefs_write_check_limits(file, iocb->ki_pos, in zonefs_write_checks()
459 * Handle direct writes. For sequential zone files, this is the only possible
464 * elevator feature is being used (e.g. mq-deadline). The block layer always
470 struct inode *inode = file_inode(iocb->ki_filp); in zonefs_file_dio_write()
473 struct super_block *sb = inode->i_sb; in zonefs_file_dio_write()
477 * For async direct IOs to sequential zone files, refuse IOCB_NOWAIT in zonefs_file_dio_write()
479 * on the inode lock but the second goes through but is now unaligned). in zonefs_file_dio_write()
482 (iocb->ki_flags & IOCB_NOWAIT)) in zonefs_file_dio_write()
483 return -EOPNOTSUPP; in zonefs_file_dio_write()
485 if (iocb->ki_flags & IOCB_NOWAIT) { in zonefs_file_dio_write()
487 return -EAGAIN; in zonefs_file_dio_write()
498 if ((iocb->ki_pos | count) & (sb->s_blocksize - 1)) { in zonefs_file_dio_write()
499 ret = -EINVAL; in zonefs_file_dio_write()
505 mutex_lock(&zi->i_truncate_mutex); in zonefs_file_dio_write()
506 if (iocb->ki_pos != z->z_wpoffset) { in zonefs_file_dio_write()
507 mutex_unlock(&zi->i_truncate_mutex); in zonefs_file_dio_write()
508 ret = -EINVAL; in zonefs_file_dio_write()
517 z->z_wpoffset += count; in zonefs_file_dio_write()
519 mutex_unlock(&zi->i_truncate_mutex); in zonefs_file_dio_write()
529 if (ret == -ENOTBLK) in zonefs_file_dio_write()
530 ret = -EBUSY; in zonefs_file_dio_write()
542 ret = -EIO; in zonefs_file_dio_write()
543 if (ret < 0 && ret != -EIOCBQUEUED) in zonefs_file_dio_write()
556 struct inode *inode = file_inode(iocb->ki_filp); in zonefs_file_buffered_write()
560 * Direct IO writes are mandatory for sequential zone files so that the in zonefs_file_buffered_write()
564 return -EIO; in zonefs_file_buffered_write()
566 if (iocb->ki_flags & IOCB_NOWAIT) { in zonefs_file_buffered_write()
568 return -EAGAIN; in zonefs_file_buffered_write()
579 if (ret == -EIO) in zonefs_file_buffered_write()
592 struct inode *inode = file_inode(iocb->ki_filp); in zonefs_file_write_iter()
596 return -EPERM; in zonefs_file_write_iter()
598 if (sb_rdonly(inode->i_sb)) in zonefs_file_write_iter()
599 return -EROFS; in zonefs_file_write_iter()
602 if (iocb->ki_pos >= z->z_capacity) in zonefs_file_write_iter()
603 return -EFBIG; in zonefs_file_write_iter()
605 if (iocb->ki_flags & IOCB_DIRECT) { in zonefs_file_write_iter()
608 if (ret != -ENOTBLK) in zonefs_file_write_iter()
619 zonefs_io_error(file_inode(iocb->ki_filp), false); in zonefs_file_read_dio_end_io()
632 struct inode *inode = file_inode(iocb->ki_filp); in zonefs_file_read_iter()
635 struct super_block *sb = inode->i_sb; in zonefs_file_read_iter()
640 if (unlikely(IS_IMMUTABLE(inode) && !(inode->i_mode & 0777))) in zonefs_file_read_iter()
641 return -EPERM; in zonefs_file_read_iter()
643 if (iocb->ki_pos >= z->z_capacity) in zonefs_file_read_iter()
646 if (iocb->ki_flags & IOCB_NOWAIT) { in zonefs_file_read_iter()
648 return -EAGAIN; in zonefs_file_read_iter()
654 mutex_lock(&zi->i_truncate_mutex); in zonefs_file_read_iter()
656 if (iocb->ki_pos >= isize) { in zonefs_file_read_iter()
657 mutex_unlock(&zi->i_truncate_mutex); in zonefs_file_read_iter()
661 iov_iter_truncate(to, isize - iocb->ki_pos); in zonefs_file_read_iter()
662 mutex_unlock(&zi->i_truncate_mutex); in zonefs_file_read_iter()
664 if (iocb->ki_flags & IOCB_DIRECT) { in zonefs_file_read_iter()
667 if ((iocb->ki_pos | count) & (sb->s_blocksize - 1)) { in zonefs_file_read_iter()
668 ret = -EINVAL; in zonefs_file_read_iter()
671 file_accessed(iocb->ki_filp); in zonefs_file_read_iter()
676 if (ret == -EIO) in zonefs_file_read_iter()
697 if (unlikely(IS_IMMUTABLE(inode) && !(inode->i_mode & 0777))) in zonefs_file_splice_read()
698 return -EPERM; in zonefs_file_splice_read()
700 if (*ppos >= z->z_capacity) in zonefs_file_splice_read()
706 mutex_lock(&zi->i_truncate_mutex); in zonefs_file_splice_read()
711 len = min_t(loff_t, len, isize - *ppos); in zonefs_file_splice_read()
712 mutex_unlock(&zi->i_truncate_mutex); in zonefs_file_splice_read()
716 if (ret == -EIO) in zonefs_file_splice_read()
733 if (!(file->f_mode & FMODE_WRITE)) in zonefs_seq_file_need_wro()
745 mutex_lock(&zi->i_truncate_mutex); in zonefs_seq_file_write_open()
747 if (!zi->i_wr_refcnt) { in zonefs_seq_file_write_open()
748 struct zonefs_sb_info *sbi = ZONEFS_SB(inode->i_sb); in zonefs_seq_file_write_open()
749 unsigned int wro = atomic_inc_return(&sbi->s_wro_seq_files); in zonefs_seq_file_write_open()
751 if (sbi->s_mount_opts & ZONEFS_MNTOPT_EXPLICIT_OPEN) { in zonefs_seq_file_write_open()
753 if (sbi->s_max_wro_seq_files in zonefs_seq_file_write_open()
754 && wro > sbi->s_max_wro_seq_files) { in zonefs_seq_file_write_open()
755 atomic_dec(&sbi->s_wro_seq_files); in zonefs_seq_file_write_open()
756 ret = -EBUSY; in zonefs_seq_file_write_open()
760 if (i_size_read(inode) < z->z_capacity) { in zonefs_seq_file_write_open()
764 atomic_dec(&sbi->s_wro_seq_files); in zonefs_seq_file_write_open()
767 z->z_flags |= ZONEFS_ZONE_OPEN; in zonefs_seq_file_write_open()
773 zi->i_wr_refcnt++; in zonefs_seq_file_write_open()
776 mutex_unlock(&zi->i_truncate_mutex); in zonefs_seq_file_write_open()
785 file->f_mode |= FMODE_CAN_ODIRECT; in zonefs_file_open()
800 struct super_block *sb = inode->i_sb; in zonefs_seq_file_write_close()
804 mutex_lock(&zi->i_truncate_mutex); in zonefs_seq_file_write_close()
806 zi->i_wr_refcnt--; in zonefs_seq_file_write_close()
807 if (zi->i_wr_refcnt) in zonefs_seq_file_write_close()
815 if (z->z_flags & ZONEFS_ZONE_OPEN) { in zonefs_seq_file_write_close()
823 * read-only. in zonefs_seq_file_write_close()
825 if (z->z_flags & ZONEFS_ZONE_OPEN && in zonefs_seq_file_write_close()
826 !(sb->s_flags & SB_RDONLY)) { in zonefs_seq_file_write_close()
829 z->z_sector, ret); in zonefs_seq_file_write_close()
831 "remounting filesystem read-only\n"); in zonefs_seq_file_write_close()
832 sb->s_flags |= SB_RDONLY; in zonefs_seq_file_write_close()
837 z->z_flags &= ~ZONEFS_ZONE_OPEN; in zonefs_seq_file_write_close()
841 atomic_dec(&sbi->s_wro_seq_files); in zonefs_seq_file_write_close()
844 mutex_unlock(&zi->i_truncate_mutex); in zonefs_seq_file_write_close()
852 * the zone has gone offline or read-only). Make sure we don't fail the in zonefs_file_release()
853 * close(2) for user-space. in zonefs_file_release()