[XFS] Reorder xfs_ioctl32.c for some tidiness
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / xfs / linux-2.6 / xfs_file.c
CommitLineData
1da177e4 1/*
7b718769
NS
2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
3 * All Rights Reserved.
1da177e4 4 *
7b718769
NS
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
1da177e4
LT
7 * published by the Free Software Foundation.
8 *
7b718769
NS
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
1da177e4 13 *
7b718769
NS
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1da177e4 17 */
1da177e4 18#include "xfs.h"
a844f451 19#include "xfs_bit.h"
1da177e4 20#include "xfs_log.h"
a844f451 21#include "xfs_inum.h"
1da177e4 22#include "xfs_sb.h"
a844f451 23#include "xfs_ag.h"
1da177e4
LT
24#include "xfs_dir2.h"
25#include "xfs_trans.h"
26#include "xfs_dmapi.h"
27#include "xfs_mount.h"
28#include "xfs_bmap_btree.h"
29#include "xfs_alloc_btree.h"
30#include "xfs_ialloc_btree.h"
31#include "xfs_alloc.h"
32#include "xfs_btree.h"
33#include "xfs_attr_sf.h"
1da177e4
LT
34#include "xfs_dir2_sf.h"
35#include "xfs_dinode.h"
36#include "xfs_inode.h"
37#include "xfs_error.h"
38#include "xfs_rw.h"
39#include "xfs_ioctl32.h"
739bfb2a 40#include "xfs_vnodeops.h"
f999a5bf 41#include "xfs_da_btree.h"
1da177e4
LT
42
43#include <linux/dcache.h>
44#include <linux/smp_lock.h>
45
3562fd45 46static struct vm_operations_struct xfs_file_vm_ops;
1da177e4 47
7989cb8e 48STATIC_INLINE ssize_t
3562fd45 49__xfs_file_read(
1da177e4 50 struct kiocb *iocb,
027445c3
BP
51 const struct iovec *iov,
52 unsigned long nr_segs,
1da177e4 53 int ioflags,
1da177e4
LT
54 loff_t pos)
55{
1da177e4 56 struct file *file = iocb->ki_filp;
1da177e4
LT
57
58 BUG_ON(iocb->ki_pos != pos);
1da177e4
LT
59 if (unlikely(file->f_flags & O_DIRECT))
60 ioflags |= IO_ISDIRECT;
739bfb2a
CH
61 return xfs_read(XFS_I(file->f_path.dentry->d_inode), iocb, iov,
62 nr_segs, &iocb->ki_pos, ioflags);
1da177e4
LT
63}
64
1da177e4 65STATIC ssize_t
3562fd45 66xfs_file_aio_read(
1da177e4 67 struct kiocb *iocb,
027445c3
BP
68 const struct iovec *iov,
69 unsigned long nr_segs,
1da177e4
LT
70 loff_t pos)
71{
027445c3 72 return __xfs_file_read(iocb, iov, nr_segs, IO_ISAIO, pos);
1da177e4
LT
73}
74
75STATIC ssize_t
3562fd45 76xfs_file_aio_read_invis(
1da177e4 77 struct kiocb *iocb,
027445c3
BP
78 const struct iovec *iov,
79 unsigned long nr_segs,
1da177e4
LT
80 loff_t pos)
81{
027445c3 82 return __xfs_file_read(iocb, iov, nr_segs, IO_ISAIO|IO_INVIS, pos);
1da177e4
LT
83}
84
7989cb8e 85STATIC_INLINE ssize_t
3562fd45 86__xfs_file_write(
027445c3
BP
87 struct kiocb *iocb,
88 const struct iovec *iov,
89 unsigned long nr_segs,
90 int ioflags,
91 loff_t pos)
1da177e4 92{
1da177e4 93 struct file *file = iocb->ki_filp;
1da177e4
LT
94
95 BUG_ON(iocb->ki_pos != pos);
96 if (unlikely(file->f_flags & O_DIRECT))
97 ioflags |= IO_ISDIRECT;
739bfb2a
CH
98 return xfs_write(XFS_I(file->f_mapping->host), iocb, iov, nr_segs,
99 &iocb->ki_pos, ioflags);
1da177e4
LT
100}
101
1da177e4 102STATIC ssize_t
3562fd45 103xfs_file_aio_write(
1da177e4 104 struct kiocb *iocb,
027445c3
BP
105 const struct iovec *iov,
106 unsigned long nr_segs,
1da177e4
LT
107 loff_t pos)
108{
027445c3 109 return __xfs_file_write(iocb, iov, nr_segs, IO_ISAIO, pos);
1da177e4
LT
110}
111
112STATIC ssize_t
3562fd45 113xfs_file_aio_write_invis(
1da177e4 114 struct kiocb *iocb,
027445c3
BP
115 const struct iovec *iov,
116 unsigned long nr_segs,
1da177e4
LT
117 loff_t pos)
118{
027445c3 119 return __xfs_file_write(iocb, iov, nr_segs, IO_ISAIO|IO_INVIS, pos);
1da177e4
LT
120}
121
1b895840
NS
122STATIC ssize_t
123xfs_file_splice_read(
124 struct file *infilp,
cbb7e577 125 loff_t *ppos,
3a326a2c 126 struct pipe_inode_info *pipe,
1b895840
NS
127 size_t len,
128 unsigned int flags)
129{
739bfb2a
CH
130 return xfs_splice_read(XFS_I(infilp->f_path.dentry->d_inode),
131 infilp, ppos, pipe, len, flags, 0);
1b895840
NS
132}
133
134STATIC ssize_t
135xfs_file_splice_read_invis(
136 struct file *infilp,
cbb7e577 137 loff_t *ppos,
3a326a2c 138 struct pipe_inode_info *pipe,
1b895840
NS
139 size_t len,
140 unsigned int flags)
141{
739bfb2a
CH
142 return xfs_splice_read(XFS_I(infilp->f_path.dentry->d_inode),
143 infilp, ppos, pipe, len, flags, IO_INVIS);
1b895840
NS
144}
145
146STATIC ssize_t
147xfs_file_splice_write(
3a326a2c 148 struct pipe_inode_info *pipe,
1b895840 149 struct file *outfilp,
cbb7e577 150 loff_t *ppos,
1b895840
NS
151 size_t len,
152 unsigned int flags)
153{
739bfb2a
CH
154 return xfs_splice_write(XFS_I(outfilp->f_path.dentry->d_inode),
155 pipe, outfilp, ppos, len, flags, 0);
1b895840
NS
156}
157
158STATIC ssize_t
159xfs_file_splice_write_invis(
3a326a2c 160 struct pipe_inode_info *pipe,
1b895840 161 struct file *outfilp,
cbb7e577 162 loff_t *ppos,
1b895840
NS
163 size_t len,
164 unsigned int flags)
165{
739bfb2a
CH
166 return xfs_splice_write(XFS_I(outfilp->f_path.dentry->d_inode),
167 pipe, outfilp, ppos, len, flags, IO_INVIS);
1b895840 168}
1da177e4
LT
169
170STATIC int
3562fd45 171xfs_file_open(
1da177e4 172 struct inode *inode,
f999a5bf 173 struct file *file)
1da177e4 174{
f999a5bf 175 if (!(file->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS)
1da177e4 176 return -EFBIG;
f999a5bf
CH
177 if (XFS_FORCED_SHUTDOWN(XFS_M(inode->i_sb)))
178 return -EIO;
179 return 0;
180}
181
182STATIC int
183xfs_dir_open(
184 struct inode *inode,
185 struct file *file)
186{
187 struct xfs_inode *ip = XFS_I(inode);
188 int mode;
189 int error;
190
191 error = xfs_file_open(inode, file);
192 if (error)
193 return error;
194
195 /*
196 * If there are any blocks, read-ahead block 0 as we're almost
197 * certain to have the next operation be a read there.
198 */
199 mode = xfs_ilock_map_shared(ip);
200 if (ip->i_d.di_nextents > 0)
201 xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK);
202 xfs_iunlock(ip, mode);
203 return 0;
1da177e4
LT
204}
205
1da177e4 206STATIC int
3562fd45 207xfs_file_release(
1da177e4
LT
208 struct inode *inode,
209 struct file *filp)
210{
739bfb2a 211 return -xfs_release(XFS_I(inode));
1da177e4
LT
212}
213
978b7237
DC
214/*
215 * We ignore the datasync flag here because a datasync is effectively
216 * identical to an fsync. That is, datasync implies that we need to write
217 * only the metadata needed to be able to access the data that is written
218 * if we crash after the call completes. Hence if we are writing beyond
219 * EOF we have to log the inode size change as well, which makes it a
220 * full fsync. If we don't write beyond EOF, the inode core will be
221 * clean in memory and so we don't need to log the inode, just like
222 * fsync.
223 */
1da177e4 224STATIC int
3562fd45 225xfs_file_fsync(
1da177e4
LT
226 struct file *filp,
227 struct dentry *dentry,
228 int datasync)
229{
b3aea4ed 230 xfs_iflags_clear(XFS_I(dentry->d_inode), XFS_ITRUNCATED);
978b7237 231 return -xfs_fsync(XFS_I(dentry->d_inode));
1da177e4
LT
232}
233
1da177e4 234STATIC int
3562fd45 235xfs_file_readdir(
1da177e4
LT
236 struct file *filp,
237 void *dirent,
238 filldir_t filldir)
239{
051e7cd4 240 struct inode *inode = filp->f_path.dentry->d_inode;
739bfb2a 241 xfs_inode_t *ip = XFS_I(inode);
051e7cd4
CH
242 int error;
243 size_t bufsize;
244
245 /*
246 * The Linux API doesn't pass down the total size of the buffer
247 * we read into down to the filesystem. With the filldir concept
248 * it's not needed for correct information, but the XFS dir2 leaf
249 * code wants an estimate of the buffer size to calculate it's
250 * readahead window and size the buffers used for mapping to
251 * physical blocks.
252 *
253 * Try to give it an estimate that's good enough, maybe at some
254 * point we can change the ->readdir prototype to include the
255 * buffer size.
256 */
257 bufsize = (size_t)min_t(loff_t, PAGE_SIZE, inode->i_size);
258
739bfb2a 259 error = xfs_readdir(ip, dirent, bufsize,
051e7cd4
CH
260 (xfs_off_t *)&filp->f_pos, filldir);
261 if (error)
262 return -error;
263 return 0;
1da177e4
LT
264}
265
1da177e4 266STATIC int
3562fd45 267xfs_file_mmap(
1da177e4
LT
268 struct file *filp,
269 struct vm_area_struct *vma)
270{
3562fd45 271 vma->vm_ops = &xfs_file_vm_ops;
d0217ac0 272 vma->vm_flags |= VM_CAN_NONLINEAR;
6fac0cb4 273
fbc1462b 274 file_accessed(filp);
1da177e4
LT
275 return 0;
276}
277
1da177e4 278STATIC long
3562fd45 279xfs_file_ioctl(
1da177e4
LT
280 struct file *filp,
281 unsigned int cmd,
67fcaa73 282 unsigned long p)
1da177e4
LT
283{
284 int error;
e678fb0d 285 struct inode *inode = filp->f_path.dentry->d_inode;
1da177e4 286
739bfb2a 287 error = xfs_ioctl(XFS_I(inode), filp, 0, cmd, (void __user *)p);
b3aea4ed 288 xfs_iflags_set(XFS_I(inode), XFS_IMODIFIED);
1da177e4
LT
289
290 /* NOTE: some of the ioctl's return positive #'s as a
291 * byte count indicating success, such as
292 * readlink_by_handle. So we don't "sign flip"
293 * like most other routines. This means true
294 * errors need to be returned as a negative value.
295 */
296 return error;
297}
298
299STATIC long
3562fd45 300xfs_file_ioctl_invis(
1da177e4
LT
301 struct file *filp,
302 unsigned int cmd,
67fcaa73 303 unsigned long p)
1da177e4 304{
1b895840 305 int error;
e678fb0d 306 struct inode *inode = filp->f_path.dentry->d_inode;
1da177e4 307
739bfb2a 308 error = xfs_ioctl(XFS_I(inode), filp, IO_INVIS, cmd, (void __user *)p);
b3aea4ed 309 xfs_iflags_set(XFS_I(inode), XFS_IMODIFIED);
1da177e4
LT
310
311 /* NOTE: some of the ioctl's return positive #'s as a
312 * byte count indicating success, such as
313 * readlink_by_handle. So we don't "sign flip"
314 * like most other routines. This means true
315 * errors need to be returned as a negative value.
316 */
317 return error;
318}
319
4f57dbc6
DC
320/*
321 * mmap()d file has taken write protection fault and is being made
322 * writable. We can set the page state up correctly for a writable
323 * page, which means we can do correct delalloc accounting (ENOSPC
324 * checking!) and unwritten extent mapping.
325 */
326STATIC int
327xfs_vm_page_mkwrite(
328 struct vm_area_struct *vma,
329 struct page *page)
330{
331 return block_page_mkwrite(vma, page, xfs_get_blocks);
332}
333
4b6f5d20 334const struct file_operations xfs_file_operations = {
1da177e4
LT
335 .llseek = generic_file_llseek,
336 .read = do_sync_read,
bb3f724e 337 .write = do_sync_write,
3562fd45
NS
338 .aio_read = xfs_file_aio_read,
339 .aio_write = xfs_file_aio_write,
1b895840
NS
340 .splice_read = xfs_file_splice_read,
341 .splice_write = xfs_file_splice_write,
3562fd45 342 .unlocked_ioctl = xfs_file_ioctl,
1da177e4 343#ifdef CONFIG_COMPAT
3562fd45 344 .compat_ioctl = xfs_file_compat_ioctl,
1da177e4 345#endif
3562fd45
NS
346 .mmap = xfs_file_mmap,
347 .open = xfs_file_open,
348 .release = xfs_file_release,
349 .fsync = xfs_file_fsync,
1da177e4 350#ifdef HAVE_FOP_OPEN_EXEC
3562fd45 351 .open_exec = xfs_file_open_exec,
1da177e4
LT
352#endif
353};
354
4b6f5d20 355const struct file_operations xfs_invis_file_operations = {
1da177e4
LT
356 .llseek = generic_file_llseek,
357 .read = do_sync_read,
bb3f724e 358 .write = do_sync_write,
3562fd45
NS
359 .aio_read = xfs_file_aio_read_invis,
360 .aio_write = xfs_file_aio_write_invis,
1b895840
NS
361 .splice_read = xfs_file_splice_read_invis,
362 .splice_write = xfs_file_splice_write_invis,
3562fd45 363 .unlocked_ioctl = xfs_file_ioctl_invis,
1da177e4 364#ifdef CONFIG_COMPAT
3562fd45 365 .compat_ioctl = xfs_file_compat_invis_ioctl,
1da177e4 366#endif
3562fd45
NS
367 .mmap = xfs_file_mmap,
368 .open = xfs_file_open,
369 .release = xfs_file_release,
370 .fsync = xfs_file_fsync,
1da177e4
LT
371};
372
373
4b6f5d20 374const struct file_operations xfs_dir_file_operations = {
f999a5bf 375 .open = xfs_dir_open,
1da177e4 376 .read = generic_read_dir,
3562fd45 377 .readdir = xfs_file_readdir,
59af1584 378 .llseek = generic_file_llseek,
3562fd45 379 .unlocked_ioctl = xfs_file_ioctl,
d3870398 380#ifdef CONFIG_COMPAT
3562fd45 381 .compat_ioctl = xfs_file_compat_ioctl,
d3870398 382#endif
3562fd45 383 .fsync = xfs_file_fsync,
1da177e4
LT
384};
385
3562fd45 386static struct vm_operations_struct xfs_file_vm_ops = {
54cb8821 387 .fault = filemap_fault,
4f57dbc6 388 .page_mkwrite = xfs_vm_page_mkwrite,
6fac0cb4 389};