1 // SPDX-License-Identifier: GPL-2.0+
3 * NILFS regular file handling primitives including fsync().
5 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
7 * Written by Amagai Yoshiji and Ryusuke Konishi.
12 #include <linux/writeback.h>
16 int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
19 * Called from fsync() system call
20 * This is the only entry point that can catch write and synch
21 * timing for both data blocks and intermediate blocks.
23 * This function should be implemented when the writeback function
24 * will be implemented.
26 struct the_nilfs *nilfs;
27 struct inode *inode = file->f_mapping->host;
30 if (nilfs_inode_dirty(inode)) {
32 err = nilfs_construct_dsync_segment(inode->i_sb, inode,
35 err = nilfs_construct_segment(inode->i_sb);
38 nilfs = inode->i_sb->s_fs_info;
40 err = nilfs_flush_device(nilfs);
45 static vm_fault_t nilfs_page_mkwrite(struct vm_fault *vmf)
47 struct vm_area_struct *vma = vmf->vma;
48 struct folio *folio = page_folio(vmf->page);
49 struct inode *inode = file_inode(vma->vm_file);
50 struct nilfs_transaction_info ti;
51 struct buffer_head *bh, *head;
54 if (unlikely(nilfs_near_disk_full(inode->i_sb->s_fs_info)))
55 return VM_FAULT_SIGBUS; /* -ENOSPC */
57 sb_start_pagefault(inode->i_sb);
59 if (folio->mapping != inode->i_mapping ||
60 folio_pos(folio) >= i_size_read(inode) ||
61 !folio_test_uptodate(folio)) {
63 ret = -EFAULT; /* make the VM retry the fault */
68 * check to see if the folio is mapped already (no holes)
70 if (folio_test_mappedtodisk(folio))
73 head = folio_buffers(folio);
79 if (!buffer_mapped(bh)) {
83 } while (bh = bh->b_this_page, bh != head);
86 folio_set_mappedtodisk(folio);
95 ret = nilfs_transaction_begin(inode->i_sb, &ti, 1);
96 /* never returns -ENOMEM, but may return -ENOSPC */
100 file_update_time(vma->vm_file);
101 ret = block_page_mkwrite(vma, vmf, nilfs_get_block);
103 nilfs_transaction_abort(inode->i_sb);
106 nilfs_set_file_dirty(inode, 1 << (PAGE_SHIFT - inode->i_blkbits));
107 nilfs_transaction_commit(inode->i_sb);
110 folio_wait_stable(folio);
112 sb_end_pagefault(inode->i_sb);
113 return vmf_fs_error(ret);
116 static const struct vm_operations_struct nilfs_file_vm_ops = {
117 .fault = filemap_fault,
118 .map_pages = filemap_map_pages,
119 .page_mkwrite = nilfs_page_mkwrite,
122 static int nilfs_file_mmap(struct file *file, struct vm_area_struct *vma)
125 vma->vm_ops = &nilfs_file_vm_ops;
130 * We have mostly NULL's here: the current defaults are ok for
131 * the nilfs filesystem.
133 const struct file_operations nilfs_file_operations = {
134 .llseek = generic_file_llseek,
135 .read_iter = generic_file_read_iter,
136 .write_iter = generic_file_write_iter,
137 .unlocked_ioctl = nilfs_ioctl,
139 .compat_ioctl = nilfs_compat_ioctl,
140 #endif /* CONFIG_COMPAT */
141 .mmap = nilfs_file_mmap,
142 .open = generic_file_open,
143 /* .release = nilfs_release_file, */
144 .fsync = nilfs_sync_file,
145 .splice_read = filemap_splice_read,
146 .splice_write = iter_file_splice_write,
149 const struct inode_operations nilfs_file_inode_operations = {
150 .setattr = nilfs_setattr,
151 .permission = nilfs_permission,
152 .fiemap = nilfs_fiemap,
153 .fileattr_get = nilfs_fileattr_get,
154 .fileattr_set = nilfs_fileattr_set,