generic block based fiemap implementation
[linux-2.6.git] / fs / ext2 / file.c
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          = ext2_sync_file,
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          = ext2_sync_file,
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         .permission     = ext2_permission,
89         .fiemap         = ext2_fiemap,
90 };