xref: /linux/fs/ext2/file.c (revision bcefe12eff5dca6fdfa94ed85e5bee66380d5cd9)
1 /*
2  *  linux/fs/ext2/file.c
3  *
4  * Copyright (C) 1992, 1993, 1994, 1995
5  * Remy Card (card@masi.ibp.fr)
6  * Laboratoire MASI - Institut Blaise Pascal
7  * Universite Pierre et Marie Curie (Paris VI)
8  *
9  *  from
10  *
11  *  linux/fs/minix/file.c
12  *
13  *  Copyright (C) 1991, 1992  Linus Torvalds
14  *
15  *  ext2 fs regular file handling primitives
16  *
17  *  64-bit file support on 64-bit platforms by Jakub Jelinek
18  * 	(jj@sunsite.ms.mff.cuni.cz)
19  */
20 
21 #include <linux/time.h>
22 #include "ext2.h"
23 #include "xattr.h"
24 #include "acl.h"
25 
26 /*
27  * Called when filp is released. This happens when all file descriptors
28  * for a single struct file are closed. Note that different open() calls
29  * for the same file yield different struct file structures.
30  */
31 static int ext2_release_file (struct inode * inode, struct file * filp)
32 {
33 	if (filp->f_mode & FMODE_WRITE) {
34 		mutex_lock(&EXT2_I(inode)->truncate_mutex);
35 		ext2_discard_reservation(inode);
36 		mutex_unlock(&EXT2_I(inode)->truncate_mutex);
37 	}
38 	return 0;
39 }
40 
41 /*
42  * We have mostly NULL's here: the current defaults are ok for
43  * the ext2 filesystem.
44  */
45 const struct file_operations ext2_file_operations = {
46 	.llseek		= generic_file_llseek,
47 	.read		= do_sync_read,
48 	.write		= do_sync_write,
49 	.aio_read	= generic_file_aio_read,
50 	.aio_write	= generic_file_aio_write,
51 	.unlocked_ioctl = ext2_ioctl,
52 #ifdef CONFIG_COMPAT
53 	.compat_ioctl	= ext2_compat_ioctl,
54 #endif
55 	.mmap		= generic_file_mmap,
56 	.open		= generic_file_open,
57 	.release	= ext2_release_file,
58 	.fsync		= simple_fsync,
59 	.splice_read	= generic_file_splice_read,
60 	.splice_write	= generic_file_splice_write,
61 };
62 
63 #ifdef CONFIG_EXT2_FS_XIP
64 const struct file_operations ext2_xip_file_operations = {
65 	.llseek		= generic_file_llseek,
66 	.read		= xip_file_read,
67 	.write		= xip_file_write,
68 	.unlocked_ioctl = ext2_ioctl,
69 #ifdef CONFIG_COMPAT
70 	.compat_ioctl	= ext2_compat_ioctl,
71 #endif
72 	.mmap		= xip_file_mmap,
73 	.open		= generic_file_open,
74 	.release	= ext2_release_file,
75 	.fsync		= simple_fsync,
76 };
77 #endif
78 
79 const struct inode_operations ext2_file_inode_operations = {
80 	.truncate	= ext2_truncate,
81 #ifdef CONFIG_EXT2_FS_XATTR
82 	.setxattr	= generic_setxattr,
83 	.getxattr	= generic_getxattr,
84 	.listxattr	= ext2_listxattr,
85 	.removexattr	= generic_removexattr,
86 #endif
87 	.setattr	= ext2_setattr,
88 	.check_acl	= ext2_check_acl,
89 	.fiemap		= ext2_fiemap,
90 };
91