Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / fs / xfs / linux-2.6 / xfs_file.c
1 /*
2  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
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
7  * published by the Free Software Foundation.
8  *
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.
13  *
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
17  */
18 #include "xfs.h"
19 #include "xfs_bit.h"
20 #include "xfs_log.h"
21 #include "xfs_inum.h"
22 #include "xfs_sb.h"
23 #include "xfs_ag.h"
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"
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"
40
41 #include <linux/dcache.h>
42 #include <linux/smp_lock.h>
43
44 static struct vm_operations_struct xfs_file_vm_ops;
45 #ifdef CONFIG_XFS_DMAPI
46 static struct vm_operations_struct xfs_dmapi_file_vm_ops;
47 #endif
48
49 STATIC inline ssize_t
50 __xfs_file_read(
51         struct kiocb            *iocb,
52         char                    __user *buf,
53         int                     ioflags,
54         size_t                  count,
55         loff_t                  pos)
56 {
57         struct iovec            iov = {buf, count};
58         struct file             *file = iocb->ki_filp;
59         bhv_vnode_t             *vp = vn_from_inode(file->f_dentry->d_inode);
60
61         BUG_ON(iocb->ki_pos != pos);
62         if (unlikely(file->f_flags & O_DIRECT))
63                 ioflags |= IO_ISDIRECT;
64         return bhv_vop_read(vp, iocb, &iov, 1, &iocb->ki_pos, ioflags, NULL);
65 }
66
67 STATIC ssize_t
68 xfs_file_aio_read(
69         struct kiocb            *iocb,
70         char                    __user *buf,
71         size_t                  count,
72         loff_t                  pos)
73 {
74         return __xfs_file_read(iocb, buf, IO_ISAIO, count, pos);
75 }
76
77 STATIC ssize_t
78 xfs_file_aio_read_invis(
79         struct kiocb            *iocb,
80         char                    __user *buf,
81         size_t                  count,
82         loff_t                  pos)
83 {
84         return __xfs_file_read(iocb, buf, IO_ISAIO|IO_INVIS, count, pos);
85 }
86
87 STATIC inline ssize_t
88 __xfs_file_write(
89         struct kiocb    *iocb,
90         const char      __user *buf,
91         int             ioflags,
92         size_t          count,
93         loff_t          pos)
94 {
95         struct iovec    iov = {(void __user *)buf, count};
96         struct file     *file = iocb->ki_filp;
97         struct inode    *inode = file->f_mapping->host;
98         bhv_vnode_t     *vp = vn_from_inode(inode);
99
100         BUG_ON(iocb->ki_pos != pos);
101         if (unlikely(file->f_flags & O_DIRECT))
102                 ioflags |= IO_ISDIRECT;
103         return bhv_vop_write(vp, iocb, &iov, 1, &iocb->ki_pos, ioflags, NULL);
104 }
105
106 STATIC ssize_t
107 xfs_file_aio_write(
108         struct kiocb            *iocb,
109         const char              __user *buf,
110         size_t                  count,
111         loff_t                  pos)
112 {
113         return __xfs_file_write(iocb, buf, IO_ISAIO, count, pos);
114 }
115
116 STATIC ssize_t
117 xfs_file_aio_write_invis(
118         struct kiocb            *iocb,
119         const char              __user *buf,
120         size_t                  count,
121         loff_t                  pos)
122 {
123         return __xfs_file_write(iocb, buf, IO_ISAIO|IO_INVIS, count, pos);
124 }
125
126 STATIC inline ssize_t
127 __xfs_file_readv(
128         struct file             *file,
129         const struct iovec      *iov,
130         int                     ioflags,
131         unsigned long           nr_segs,
132         loff_t                  *ppos)
133 {
134         struct inode    *inode = file->f_mapping->host;
135         bhv_vnode_t     *vp = vn_from_inode(inode);
136         struct kiocb    kiocb;
137         ssize_t         rval;
138
139         init_sync_kiocb(&kiocb, file);
140         kiocb.ki_pos = *ppos;
141
142         if (unlikely(file->f_flags & O_DIRECT))
143                 ioflags |= IO_ISDIRECT;
144         rval = bhv_vop_read(vp, &kiocb, iov, nr_segs,
145                                 &kiocb.ki_pos, ioflags, NULL);
146
147         *ppos = kiocb.ki_pos;
148         return rval;
149 }
150
151 STATIC ssize_t
152 xfs_file_readv(
153         struct file             *file,
154         const struct iovec      *iov,
155         unsigned long           nr_segs,
156         loff_t                  *ppos)
157 {
158         return __xfs_file_readv(file, iov, 0, nr_segs, ppos);
159 }
160
161 STATIC ssize_t
162 xfs_file_readv_invis(
163         struct file             *file,
164         const struct iovec      *iov,
165         unsigned long           nr_segs,
166         loff_t                  *ppos)
167 {
168         return __xfs_file_readv(file, iov, IO_INVIS, nr_segs, ppos);
169 }
170
171 STATIC inline ssize_t
172 __xfs_file_writev(
173         struct file             *file,
174         const struct iovec      *iov,
175         int                     ioflags,
176         unsigned long           nr_segs,
177         loff_t                  *ppos)
178 {
179         struct inode    *inode = file->f_mapping->host;
180         bhv_vnode_t     *vp = vn_from_inode(inode);
181         struct kiocb    kiocb;
182         ssize_t         rval;
183
184         init_sync_kiocb(&kiocb, file);
185         kiocb.ki_pos = *ppos;
186         if (unlikely(file->f_flags & O_DIRECT))
187                 ioflags |= IO_ISDIRECT;
188
189         rval = bhv_vop_write(vp, &kiocb, iov, nr_segs,
190                                  &kiocb.ki_pos, ioflags, NULL);
191
192         *ppos = kiocb.ki_pos;
193         return rval;
194 }
195
196 STATIC ssize_t
197 xfs_file_writev(
198         struct file             *file,
199         const struct iovec      *iov,
200         unsigned long           nr_segs,
201         loff_t                  *ppos)
202 {
203         return __xfs_file_writev(file, iov, 0, nr_segs, ppos);
204 }
205
206 STATIC ssize_t
207 xfs_file_writev_invis(
208         struct file             *file,
209         const struct iovec      *iov,
210         unsigned long           nr_segs,
211         loff_t                  *ppos)
212 {
213         return __xfs_file_writev(file, iov, IO_INVIS, nr_segs, ppos);
214 }
215
216 STATIC ssize_t
217 xfs_file_sendfile(
218         struct file             *filp,
219         loff_t                  *pos,
220         size_t                  count,
221         read_actor_t            actor,
222         void                    *target)
223 {
224         return bhv_vop_sendfile(vn_from_inode(filp->f_dentry->d_inode),
225                                 filp, pos, 0, count, actor, target, NULL);
226 }
227
228 STATIC ssize_t
229 xfs_file_sendfile_invis(
230         struct file             *filp,
231         loff_t                  *pos,
232         size_t                  count,
233         read_actor_t            actor,
234         void                    *target)
235 {
236         return bhv_vop_sendfile(vn_from_inode(filp->f_dentry->d_inode),
237                                 filp, pos, IO_INVIS, count, actor, target, NULL);
238 }
239
240 STATIC ssize_t
241 xfs_file_splice_read(
242         struct file             *infilp,
243         loff_t                  *ppos,
244         struct pipe_inode_info  *pipe,
245         size_t                  len,
246         unsigned int            flags)
247 {
248         return bhv_vop_splice_read(vn_from_inode(infilp->f_dentry->d_inode),
249                                    infilp, ppos, pipe, len, flags, 0, NULL);
250 }
251
252 STATIC ssize_t
253 xfs_file_splice_read_invis(
254         struct file             *infilp,
255         loff_t                  *ppos,
256         struct pipe_inode_info  *pipe,
257         size_t                  len,
258         unsigned int            flags)
259 {
260         return bhv_vop_splice_read(vn_from_inode(infilp->f_dentry->d_inode),
261                                    infilp, ppos, pipe, len, flags, IO_INVIS,
262                                    NULL);
263 }
264
265 STATIC ssize_t
266 xfs_file_splice_write(
267         struct pipe_inode_info  *pipe,
268         struct file             *outfilp,
269         loff_t                  *ppos,
270         size_t                  len,
271         unsigned int            flags)
272 {
273         return bhv_vop_splice_write(vn_from_inode(outfilp->f_dentry->d_inode),
274                                     pipe, outfilp, ppos, len, flags, 0, NULL);
275 }
276
277 STATIC ssize_t
278 xfs_file_splice_write_invis(
279         struct pipe_inode_info  *pipe,
280         struct file             *outfilp,
281         loff_t                  *ppos,
282         size_t                  len,
283         unsigned int            flags)
284 {
285         return bhv_vop_splice_write(vn_from_inode(outfilp->f_dentry->d_inode),
286                                     pipe, outfilp, ppos, len, flags, IO_INVIS,
287                                     NULL);
288 }
289
290 STATIC int
291 xfs_file_open(
292         struct inode    *inode,
293         struct file     *filp)
294 {
295         if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS)
296                 return -EFBIG;
297         return -bhv_vop_open(vn_from_inode(inode), NULL);
298 }
299
300 STATIC int
301 xfs_file_close(
302         struct file     *filp,
303         fl_owner_t      id)
304 {
305         return -bhv_vop_close(vn_from_inode(filp->f_dentry->d_inode), 0,
306                                 file_count(filp) > 1 ? L_FALSE : L_TRUE, NULL);
307 }
308
309 STATIC int
310 xfs_file_release(
311         struct inode    *inode,
312         struct file     *filp)
313 {
314         bhv_vnode_t     *vp = vn_from_inode(inode);
315
316         if (vp)
317                 return -bhv_vop_release(vp);
318         return 0;
319 }
320
321 STATIC int
322 xfs_file_fsync(
323         struct file     *filp,
324         struct dentry   *dentry,
325         int             datasync)
326 {
327         bhv_vnode_t     *vp = vn_from_inode(dentry->d_inode);
328         int             flags = FSYNC_WAIT;
329
330         if (datasync)
331                 flags |= FSYNC_DATA;
332         if (VN_TRUNC(vp))
333                 VUNTRUNCATE(vp);
334         return -bhv_vop_fsync(vp, flags, NULL, (xfs_off_t)0, (xfs_off_t)-1);
335 }
336
337 #ifdef CONFIG_XFS_DMAPI
338 STATIC struct page *
339 xfs_vm_nopage(
340         struct vm_area_struct   *area,
341         unsigned long           address,
342         int                     *type)
343 {
344         struct inode    *inode = area->vm_file->f_dentry->d_inode;
345         bhv_vnode_t     *vp = vn_from_inode(inode);
346
347         ASSERT_ALWAYS(vp->v_vfsp->vfs_flag & VFS_DMI);
348         if (XFS_SEND_MMAP(XFS_VFSTOM(vp->v_vfsp), area, 0))
349                 return NULL;
350         return filemap_nopage(area, address, type);
351 }
352 #endif /* CONFIG_XFS_DMAPI */
353
354 STATIC int
355 xfs_file_readdir(
356         struct file     *filp,
357         void            *dirent,
358         filldir_t       filldir)
359 {
360         int             error = 0;
361         bhv_vnode_t     *vp = vn_from_inode(filp->f_dentry->d_inode);
362         uio_t           uio;
363         iovec_t         iov;
364         int             eof = 0;
365         caddr_t         read_buf;
366         int             namelen, size = 0;
367         size_t          rlen = PAGE_CACHE_SIZE;
368         xfs_off_t       start_offset, curr_offset;
369         xfs_dirent_t    *dbp = NULL;
370
371         /* Try fairly hard to get memory */
372         do {
373                 if ((read_buf = (caddr_t)kmalloc(rlen, GFP_KERNEL)))
374                         break;
375                 rlen >>= 1;
376         } while (rlen >= 1024);
377
378         if (read_buf == NULL)
379                 return -ENOMEM;
380
381         uio.uio_iov = &iov;
382         uio.uio_segflg = UIO_SYSSPACE;
383         curr_offset = filp->f_pos;
384         if (filp->f_pos != 0x7fffffff)
385                 uio.uio_offset = filp->f_pos;
386         else
387                 uio.uio_offset = 0xffffffff;
388
389         while (!eof) {
390                 uio.uio_resid = iov.iov_len = rlen;
391                 iov.iov_base = read_buf;
392                 uio.uio_iovcnt = 1;
393
394                 start_offset = uio.uio_offset;
395
396                 error = bhv_vop_readdir(vp, &uio, NULL, &eof);
397                 if ((uio.uio_offset == start_offset) || error) {
398                         size = 0;
399                         break;
400                 }
401
402                 size = rlen - uio.uio_resid;
403                 dbp = (xfs_dirent_t *)read_buf;
404                 while (size > 0) {
405                         namelen = strlen(dbp->d_name);
406
407                         if (filldir(dirent, dbp->d_name, namelen,
408                                         (loff_t) curr_offset & 0x7fffffff,
409                                         (ino_t) dbp->d_ino,
410                                         DT_UNKNOWN)) {
411                                 goto done;
412                         }
413                         size -= dbp->d_reclen;
414                         curr_offset = (loff_t)dbp->d_off /* & 0x7fffffff */;
415                         dbp = (xfs_dirent_t *)((char *)dbp + dbp->d_reclen);
416                 }
417         }
418 done:
419         if (!error) {
420                 if (size == 0)
421                         filp->f_pos = uio.uio_offset & 0x7fffffff;
422                 else if (dbp)
423                         filp->f_pos = curr_offset;
424         }
425
426         kfree(read_buf);
427         return -error;
428 }
429
430 STATIC int
431 xfs_file_mmap(
432         struct file     *filp,
433         struct vm_area_struct *vma)
434 {
435         vma->vm_ops = &xfs_file_vm_ops;
436
437 #ifdef CONFIG_XFS_DMAPI
438         if (vn_from_inode(filp->f_dentry->d_inode)->v_vfsp->vfs_flag & VFS_DMI)
439                 vma->vm_ops = &xfs_dmapi_file_vm_ops;
440 #endif /* CONFIG_XFS_DMAPI */
441
442         file_accessed(filp);
443         return 0;
444 }
445
446 STATIC long
447 xfs_file_ioctl(
448         struct file     *filp,
449         unsigned int    cmd,
450         unsigned long   p)
451 {
452         int             error;
453         struct inode    *inode = filp->f_dentry->d_inode;
454         bhv_vnode_t     *vp = vn_from_inode(inode);
455
456         error = bhv_vop_ioctl(vp, inode, filp, 0, cmd, (void __user *)p);
457         VMODIFY(vp);
458
459         /* NOTE:  some of the ioctl's return positive #'s as a
460          *        byte count indicating success, such as
461          *        readlink_by_handle.  So we don't "sign flip"
462          *        like most other routines.  This means true
463          *        errors need to be returned as a negative value.
464          */
465         return error;
466 }
467
468 STATIC long
469 xfs_file_ioctl_invis(
470         struct file     *filp,
471         unsigned int    cmd,
472         unsigned long   p)
473 {
474         int             error;
475         struct inode    *inode = filp->f_dentry->d_inode;
476         bhv_vnode_t     *vp = vn_from_inode(inode);
477
478         error = bhv_vop_ioctl(vp, inode, filp, IO_INVIS, cmd, (void __user *)p);
479         VMODIFY(vp);
480
481         /* NOTE:  some of the ioctl's return positive #'s as a
482          *        byte count indicating success, such as
483          *        readlink_by_handle.  So we don't "sign flip"
484          *        like most other routines.  This means true
485          *        errors need to be returned as a negative value.
486          */
487         return error;
488 }
489
490 #ifdef CONFIG_XFS_DMAPI
491 #ifdef HAVE_VMOP_MPROTECT
492 STATIC int
493 xfs_vm_mprotect(
494         struct vm_area_struct *vma,
495         unsigned int    newflags)
496 {
497         bhv_vnode_t     *vp = vn_from_inode(vma->vm_file->f_dentry->d_inode);
498         int             error = 0;
499
500         if (vp->v_vfsp->vfs_flag & VFS_DMI) {
501                 if ((vma->vm_flags & VM_MAYSHARE) &&
502                     (newflags & VM_WRITE) && !(vma->vm_flags & VM_WRITE)) {
503                         xfs_mount_t     *mp = XFS_VFSTOM(vp->v_vfsp);
504
505                         error = XFS_SEND_MMAP(mp, vma, VM_WRITE);
506                     }
507         }
508         return error;
509 }
510 #endif /* HAVE_VMOP_MPROTECT */
511 #endif /* CONFIG_XFS_DMAPI */
512
513 #ifdef HAVE_FOP_OPEN_EXEC
514 /* If the user is attempting to execute a file that is offline then
515  * we have to trigger a DMAPI READ event before the file is marked as busy
516  * otherwise the invisible I/O will not be able to write to the file to bring
517  * it back online.
518  */
519 STATIC int
520 xfs_file_open_exec(
521         struct inode    *inode)
522 {
523         bhv_vnode_t     *vp = vn_from_inode(inode);
524
525         if (unlikely(vp->v_vfsp->vfs_flag & VFS_DMI)) {
526                 xfs_mount_t     *mp = XFS_VFSTOM(vp->v_vfsp);
527                 xfs_inode_t     *ip = xfs_vtoi(vp);
528
529                 if (!ip)
530                         return -EINVAL;
531                 if (DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ))
532                         return -XFS_SEND_DATA(mp, DM_EVENT_READ, vp,
533                                                0, 0, 0, NULL);
534         }
535         return 0;
536 }
537 #endif /* HAVE_FOP_OPEN_EXEC */
538
539 const struct file_operations xfs_file_operations = {
540         .llseek         = generic_file_llseek,
541         .read           = do_sync_read,
542         .write          = do_sync_write,
543         .readv          = xfs_file_readv,
544         .writev         = xfs_file_writev,
545         .aio_read       = xfs_file_aio_read,
546         .aio_write      = xfs_file_aio_write,
547         .sendfile       = xfs_file_sendfile,
548         .splice_read    = xfs_file_splice_read,
549         .splice_write   = xfs_file_splice_write,
550         .unlocked_ioctl = xfs_file_ioctl,
551 #ifdef CONFIG_COMPAT
552         .compat_ioctl   = xfs_file_compat_ioctl,
553 #endif
554         .mmap           = xfs_file_mmap,
555         .open           = xfs_file_open,
556         .flush          = xfs_file_close,
557         .release        = xfs_file_release,
558         .fsync          = xfs_file_fsync,
559 #ifdef HAVE_FOP_OPEN_EXEC
560         .open_exec      = xfs_file_open_exec,
561 #endif
562 };
563
564 const struct file_operations xfs_invis_file_operations = {
565         .llseek         = generic_file_llseek,
566         .read           = do_sync_read,
567         .write          = do_sync_write,
568         .readv          = xfs_file_readv_invis,
569         .writev         = xfs_file_writev_invis,
570         .aio_read       = xfs_file_aio_read_invis,
571         .aio_write      = xfs_file_aio_write_invis,
572         .sendfile       = xfs_file_sendfile_invis,
573         .splice_read    = xfs_file_splice_read_invis,
574         .splice_write   = xfs_file_splice_write_invis,
575         .unlocked_ioctl = xfs_file_ioctl_invis,
576 #ifdef CONFIG_COMPAT
577         .compat_ioctl   = xfs_file_compat_invis_ioctl,
578 #endif
579         .mmap           = xfs_file_mmap,
580         .open           = xfs_file_open,
581         .flush          = xfs_file_close,
582         .release        = xfs_file_release,
583         .fsync          = xfs_file_fsync,
584 };
585
586
587 const struct file_operations xfs_dir_file_operations = {
588         .read           = generic_read_dir,
589         .readdir        = xfs_file_readdir,
590         .unlocked_ioctl = xfs_file_ioctl,
591 #ifdef CONFIG_COMPAT
592         .compat_ioctl   = xfs_file_compat_ioctl,
593 #endif
594         .fsync          = xfs_file_fsync,
595 };
596
597 static struct vm_operations_struct xfs_file_vm_ops = {
598         .nopage         = filemap_nopage,
599         .populate       = filemap_populate,
600 };
601
602 #ifdef CONFIG_XFS_DMAPI
603 static struct vm_operations_struct xfs_dmapi_file_vm_ops = {
604         .nopage         = xfs_vm_nopage,
605         .populate       = filemap_populate,
606 #ifdef HAVE_VMOP_MPROTECT
607         .mprotect       = xfs_vm_mprotect,
608 #endif
609 };
610 #endif /* CONFIG_XFS_DMAPI */