Skip to content

Commit f183ff4

Browse files
konistorvalds
authored andcommitted
nilfs2: file operations
This adds primitives for regular file handling. Signed-off-by: Ryusuke Konishi <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 05fe58f commit f183ff4

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

fs/nilfs2/file.c

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
* file.c - NILFS regular file handling primitives including fsync().
3+
*
4+
* Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
5+
*
6+
* This program is free software; you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation; either version 2 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with this program; if not, write to the Free Software
18+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
*
20+
* Written by Amagai Yoshiji <[email protected]>,
21+
* Ryusuke Konishi <[email protected]>
22+
*/
23+
24+
#include <linux/fs.h>
25+
#include <linux/mm.h>
26+
#include <linux/writeback.h>
27+
#include "nilfs.h"
28+
#include "segment.h"
29+
30+
int nilfs_sync_file(struct file *file, struct dentry *dentry, int datasync)
31+
{
32+
/*
33+
* Called from fsync() system call
34+
* This is the only entry point that can catch write and synch
35+
* timing for both data blocks and intermediate blocks.
36+
*
37+
* This function should be implemented when the writeback function
38+
* will be implemented.
39+
*/
40+
struct inode *inode = dentry->d_inode;
41+
int err;
42+
43+
if (!nilfs_inode_dirty(inode))
44+
return 0;
45+
46+
if (datasync)
47+
err = nilfs_construct_dsync_segment(inode->i_sb, inode);
48+
else
49+
err = nilfs_construct_segment(inode->i_sb);
50+
51+
return err;
52+
}
53+
54+
static ssize_t
55+
nilfs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
56+
unsigned long nr_segs, loff_t pos)
57+
{
58+
struct file *file = iocb->ki_filp;
59+
struct inode *inode = file->f_dentry->d_inode;
60+
ssize_t ret;
61+
62+
ret = generic_file_aio_write(iocb, iov, nr_segs, pos);
63+
if (ret <= 0)
64+
return ret;
65+
66+
if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) {
67+
int err;
68+
69+
err = nilfs_construct_dsync_segment(inode->i_sb, inode);
70+
if (unlikely(err))
71+
return err;
72+
}
73+
return ret;
74+
}
75+
76+
static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct page *page)
77+
{
78+
if (!(vma->vm_flags & (VM_WRITE | VM_MAYWRITE)))
79+
return -EPERM;
80+
SetPageChecked(page);
81+
wait_on_page_writeback(page);
82+
return 0;
83+
}
84+
85+
struct vm_operations_struct nilfs_file_vm_ops = {
86+
.fault = filemap_fault,
87+
.page_mkwrite = nilfs_page_mkwrite,
88+
};
89+
90+
static int nilfs_file_mmap(struct file *file, struct vm_area_struct *vma)
91+
{
92+
file_accessed(file);
93+
vma->vm_ops = &nilfs_file_vm_ops;
94+
vma->vm_flags |= VM_CAN_NONLINEAR;
95+
return 0;
96+
}
97+
98+
/*
99+
* We have mostly NULL's here: the current defaults are ok for
100+
* the nilfs filesystem.
101+
*/
102+
struct file_operations nilfs_file_operations = {
103+
.llseek = generic_file_llseek,
104+
.read = do_sync_read,
105+
.write = do_sync_write,
106+
.aio_read = generic_file_aio_read,
107+
.aio_write = nilfs_file_aio_write,
108+
.ioctl = nilfs_ioctl,
109+
#ifdef CONFIG_COMPAT
110+
.compat_ioctl = nilfs_compat_ioctl,
111+
#endif /* CONFIG_COMPAT */
112+
.mmap = nilfs_file_mmap,
113+
.open = generic_file_open,
114+
/* .release = nilfs_release_file, */
115+
.fsync = nilfs_sync_file,
116+
.splice_read = generic_file_splice_read,
117+
};
118+
119+
struct inode_operations nilfs_file_inode_operations = {
120+
.truncate = nilfs_truncate,
121+
.setattr = nilfs_setattr,
122+
.permission = nilfs_permission,
123+
};
124+
125+
/* end of file */

0 commit comments

Comments
 (0)