]> granicus.if.org Git - zfs/blob - module/zfs/zpl_file.c
Direct IO support
[zfs] / module / zfs / zpl_file.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2011, Lawrence Livermore National Security, LLC.
23  * Copyright (c) 2015 by Chunwei Chen. All rights reserved.
24  */
25
26
27 #ifdef CONFIG_COMPAT
28 #include <linux/compat.h>
29 #endif
30 #include <sys/file.h>
31 #include <sys/dmu_objset.h>
32 #include <sys/zfs_vfsops.h>
33 #include <sys/zfs_vnops.h>
34 #include <sys/zfs_znode.h>
35 #include <sys/zfs_project.h>
36
37
38 static int
39 zpl_open(struct inode *ip, struct file *filp)
40 {
41         cred_t *cr = CRED();
42         int error;
43         fstrans_cookie_t cookie;
44
45         error = generic_file_open(ip, filp);
46         if (error)
47                 return (error);
48
49         crhold(cr);
50         cookie = spl_fstrans_mark();
51         error = -zfs_open(ip, filp->f_mode, filp->f_flags, cr);
52         spl_fstrans_unmark(cookie);
53         crfree(cr);
54         ASSERT3S(error, <=, 0);
55
56         return (error);
57 }
58
59 static int
60 zpl_release(struct inode *ip, struct file *filp)
61 {
62         cred_t *cr = CRED();
63         int error;
64         fstrans_cookie_t cookie;
65
66         cookie = spl_fstrans_mark();
67         if (ITOZ(ip)->z_atime_dirty)
68                 zfs_mark_inode_dirty(ip);
69
70         crhold(cr);
71         error = -zfs_close(ip, filp->f_flags, cr);
72         spl_fstrans_unmark(cookie);
73         crfree(cr);
74         ASSERT3S(error, <=, 0);
75
76         return (error);
77 }
78
79 static int
80 zpl_iterate(struct file *filp, zpl_dir_context_t *ctx)
81 {
82         cred_t *cr = CRED();
83         int error;
84         fstrans_cookie_t cookie;
85
86         crhold(cr);
87         cookie = spl_fstrans_mark();
88         error = -zfs_readdir(file_inode(filp), ctx, cr);
89         spl_fstrans_unmark(cookie);
90         crfree(cr);
91         ASSERT3S(error, <=, 0);
92
93         return (error);
94 }
95
96 #if !defined(HAVE_VFS_ITERATE) && !defined(HAVE_VFS_ITERATE_SHARED)
97 static int
98 zpl_readdir(struct file *filp, void *dirent, filldir_t filldir)
99 {
100         zpl_dir_context_t ctx =
101             ZPL_DIR_CONTEXT_INIT(dirent, filldir, filp->f_pos);
102         int error;
103
104         error = zpl_iterate(filp, &ctx);
105         filp->f_pos = ctx.pos;
106
107         return (error);
108 }
109 #endif /* !HAVE_VFS_ITERATE && !HAVE_VFS_ITERATE_SHARED */
110
111 #if defined(HAVE_FSYNC_WITH_DENTRY)
112 /*
113  * Linux 2.6.x - 2.6.34 API,
114  * Through 2.6.34 the nfsd kernel server would pass a NULL 'file struct *'
115  * to the fops->fsync() hook.  For this reason, we must be careful not to
116  * use filp unconditionally.
117  */
118 static int
119 zpl_fsync(struct file *filp, struct dentry *dentry, int datasync)
120 {
121         cred_t *cr = CRED();
122         int error;
123         fstrans_cookie_t cookie;
124
125         crhold(cr);
126         cookie = spl_fstrans_mark();
127         error = -zfs_fsync(dentry->d_inode, datasync, cr);
128         spl_fstrans_unmark(cookie);
129         crfree(cr);
130         ASSERT3S(error, <=, 0);
131
132         return (error);
133 }
134
135 #ifdef HAVE_FILE_AIO_FSYNC
136 static int
137 zpl_aio_fsync(struct kiocb *kiocb, int datasync)
138 {
139         struct file *filp = kiocb->ki_filp;
140         return (zpl_fsync(filp, file_dentry(filp), datasync));
141 }
142 #endif
143
144 #elif defined(HAVE_FSYNC_WITHOUT_DENTRY)
145 /*
146  * Linux 2.6.35 - 3.0 API,
147  * As of 2.6.35 the dentry argument to the fops->fsync() hook was deemed
148  * redundant.  The dentry is still accessible via filp->f_path.dentry,
149  * and we are guaranteed that filp will never be NULL.
150  */
151 static int
152 zpl_fsync(struct file *filp, int datasync)
153 {
154         struct inode *inode = filp->f_mapping->host;
155         cred_t *cr = CRED();
156         int error;
157         fstrans_cookie_t cookie;
158
159         crhold(cr);
160         cookie = spl_fstrans_mark();
161         error = -zfs_fsync(inode, datasync, cr);
162         spl_fstrans_unmark(cookie);
163         crfree(cr);
164         ASSERT3S(error, <=, 0);
165
166         return (error);
167 }
168
169 #ifdef HAVE_FILE_AIO_FSYNC
170 static int
171 zpl_aio_fsync(struct kiocb *kiocb, int datasync)
172 {
173         return (zpl_fsync(kiocb->ki_filp, datasync));
174 }
175 #endif
176
177 #elif defined(HAVE_FSYNC_RANGE)
178 /*
179  * Linux 3.1 - 3.x API,
180  * As of 3.1 the responsibility to call filemap_write_and_wait_range() has
181  * been pushed down in to the .fsync() vfs hook.  Additionally, the i_mutex
182  * lock is no longer held by the caller, for zfs we don't require the lock
183  * to be held so we don't acquire it.
184  */
185 static int
186 zpl_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
187 {
188         struct inode *inode = filp->f_mapping->host;
189         cred_t *cr = CRED();
190         int error;
191         fstrans_cookie_t cookie;
192
193         error = filemap_write_and_wait_range(inode->i_mapping, start, end);
194         if (error)
195                 return (error);
196
197         crhold(cr);
198         cookie = spl_fstrans_mark();
199         error = -zfs_fsync(inode, datasync, cr);
200         spl_fstrans_unmark(cookie);
201         crfree(cr);
202         ASSERT3S(error, <=, 0);
203
204         return (error);
205 }
206
207 #ifdef HAVE_FILE_AIO_FSYNC
208 static int
209 zpl_aio_fsync(struct kiocb *kiocb, int datasync)
210 {
211         return (zpl_fsync(kiocb->ki_filp, kiocb->ki_pos, -1, datasync));
212 }
213 #endif
214
215 #else
216 #error "Unsupported fops->fsync() implementation"
217 #endif
218
219 static ssize_t
220 zpl_read_common_iovec(struct inode *ip, const struct iovec *iovp, size_t count,
221     unsigned long nr_segs, loff_t *ppos, uio_seg_t segment, int flags,
222     cred_t *cr, size_t skip)
223 {
224         ssize_t read;
225         uio_t uio;
226         int error;
227         fstrans_cookie_t cookie;
228
229         uio.uio_iov = iovp;
230         uio.uio_skip = skip;
231         uio.uio_resid = count;
232         uio.uio_iovcnt = nr_segs;
233         uio.uio_loffset = *ppos;
234         uio.uio_limit = MAXOFFSET_T;
235         uio.uio_segflg = segment;
236
237         cookie = spl_fstrans_mark();
238         error = -zfs_read(ip, &uio, flags, cr);
239         spl_fstrans_unmark(cookie);
240         if (error < 0)
241                 return (error);
242
243         read = count - uio.uio_resid;
244         *ppos += read;
245
246         return (read);
247 }
248
249 inline ssize_t
250 zpl_read_common(struct inode *ip, const char *buf, size_t len, loff_t *ppos,
251     uio_seg_t segment, int flags, cred_t *cr)
252 {
253         struct iovec iov;
254
255         iov.iov_base = (void *)buf;
256         iov.iov_len = len;
257
258         return (zpl_read_common_iovec(ip, &iov, len, 1, ppos, segment,
259             flags, cr, 0));
260 }
261
262 static ssize_t
263 zpl_iter_read_common(struct kiocb *kiocb, const struct iovec *iovp,
264     unsigned long nr_segs, size_t count, uio_seg_t seg, size_t skip)
265 {
266         cred_t *cr = CRED();
267         struct file *filp = kiocb->ki_filp;
268         ssize_t read;
269
270         crhold(cr);
271         read = zpl_read_common_iovec(filp->f_mapping->host, iovp, count,
272             nr_segs, &kiocb->ki_pos, seg, filp->f_flags, cr, skip);
273         crfree(cr);
274
275         file_accessed(filp);
276         return (read);
277 }
278
279 #if defined(HAVE_VFS_RW_ITERATE)
280 static ssize_t
281 zpl_iter_read(struct kiocb *kiocb, struct iov_iter *to)
282 {
283         ssize_t ret;
284         uio_seg_t seg = UIO_USERSPACE;
285         if (to->type & ITER_KVEC)
286                 seg = UIO_SYSSPACE;
287         if (to->type & ITER_BVEC)
288                 seg = UIO_BVEC;
289         ret = zpl_iter_read_common(kiocb, to->iov, to->nr_segs,
290             iov_iter_count(to), seg, to->iov_offset);
291         if (ret > 0)
292                 iov_iter_advance(to, ret);
293         return (ret);
294 }
295 #else
296 static ssize_t
297 zpl_aio_read(struct kiocb *kiocb, const struct iovec *iovp,
298     unsigned long nr_segs, loff_t pos)
299 {
300         ssize_t ret;
301         size_t count;
302
303         ret = generic_segment_checks(iovp, &nr_segs, &count, VERIFY_WRITE);
304         if (ret)
305                 return (ret);
306
307         return (zpl_iter_read_common(kiocb, iovp, nr_segs, count,
308             UIO_USERSPACE, 0));
309 }
310 #endif /* HAVE_VFS_RW_ITERATE */
311
312 static ssize_t
313 zpl_write_common_iovec(struct inode *ip, const struct iovec *iovp, size_t count,
314     unsigned long nr_segs, loff_t *ppos, uio_seg_t segment, int flags,
315     cred_t *cr, size_t skip)
316 {
317         ssize_t wrote;
318         uio_t uio;
319         int error;
320         fstrans_cookie_t cookie;
321
322         if (flags & O_APPEND)
323                 *ppos = i_size_read(ip);
324
325         uio.uio_iov = iovp;
326         uio.uio_skip = skip;
327         uio.uio_resid = count;
328         uio.uio_iovcnt = nr_segs;
329         uio.uio_loffset = *ppos;
330         uio.uio_limit = MAXOFFSET_T;
331         uio.uio_segflg = segment;
332
333         cookie = spl_fstrans_mark();
334         error = -zfs_write(ip, &uio, flags, cr);
335         spl_fstrans_unmark(cookie);
336         if (error < 0)
337                 return (error);
338
339         wrote = count - uio.uio_resid;
340         *ppos += wrote;
341
342         return (wrote);
343 }
344
345 inline ssize_t
346 zpl_write_common(struct inode *ip, const char *buf, size_t len, loff_t *ppos,
347     uio_seg_t segment, int flags, cred_t *cr)
348 {
349         struct iovec iov;
350
351         iov.iov_base = (void *)buf;
352         iov.iov_len = len;
353
354         return (zpl_write_common_iovec(ip, &iov, len, 1, ppos, segment,
355             flags, cr, 0));
356 }
357
358 static ssize_t
359 zpl_iter_write_common(struct kiocb *kiocb, const struct iovec *iovp,
360     unsigned long nr_segs, size_t count, uio_seg_t seg, size_t skip)
361 {
362         cred_t *cr = CRED();
363         struct file *filp = kiocb->ki_filp;
364         ssize_t wrote;
365
366         crhold(cr);
367         wrote = zpl_write_common_iovec(filp->f_mapping->host, iovp, count,
368             nr_segs, &kiocb->ki_pos, seg, filp->f_flags, cr, skip);
369         crfree(cr);
370
371         return (wrote);
372 }
373
374 #if defined(HAVE_VFS_RW_ITERATE)
375 static ssize_t
376 zpl_iter_write(struct kiocb *kiocb, struct iov_iter *from)
377 {
378         size_t count;
379         ssize_t ret;
380         uio_seg_t seg = UIO_USERSPACE;
381
382 #ifndef HAVE_GENERIC_WRITE_CHECKS_KIOCB
383         struct file *file = kiocb->ki_filp;
384         struct address_space *mapping = file->f_mapping;
385         struct inode *ip = mapping->host;
386         int isblk = S_ISBLK(ip->i_mode);
387
388         count = iov_iter_count(from);
389         ret = generic_write_checks(file, &kiocb->ki_pos, &count, isblk);
390         if (ret)
391                 return (ret);
392 #else
393         /*
394          * XXX - ideally this check should be in the same lock region with
395          * write operations, so that there's no TOCTTOU race when doing
396          * append and someone else grow the file.
397          */
398         ret = generic_write_checks(kiocb, from);
399         if (ret <= 0)
400                 return (ret);
401         count = ret;
402 #endif
403
404         if (from->type & ITER_KVEC)
405                 seg = UIO_SYSSPACE;
406         if (from->type & ITER_BVEC)
407                 seg = UIO_BVEC;
408
409         ret = zpl_iter_write_common(kiocb, from->iov, from->nr_segs,
410             count, seg, from->iov_offset);
411         if (ret > 0)
412                 iov_iter_advance(from, ret);
413
414         return (ret);
415 }
416 #else
417 static ssize_t
418 zpl_aio_write(struct kiocb *kiocb, const struct iovec *iovp,
419     unsigned long nr_segs, loff_t pos)
420 {
421         struct file *file = kiocb->ki_filp;
422         struct address_space *mapping = file->f_mapping;
423         struct inode *ip = mapping->host;
424         int isblk = S_ISBLK(ip->i_mode);
425         size_t count;
426         ssize_t ret;
427
428         ret = generic_segment_checks(iovp, &nr_segs, &count, VERIFY_READ);
429         if (ret)
430                 return (ret);
431
432         ret = generic_write_checks(file, &pos, &count, isblk);
433         if (ret)
434                 return (ret);
435
436         return (zpl_iter_write_common(kiocb, iovp, nr_segs, count,
437             UIO_USERSPACE, 0));
438 }
439 #endif /* HAVE_VFS_RW_ITERATE */
440
441 #if defined(HAVE_VFS_RW_ITERATE)
442 static ssize_t
443 zpl_direct_IO_impl(int rw, struct kiocb *kiocb, struct iov_iter *iter)
444 {
445         if (rw == WRITE)
446                 return (zpl_iter_write(kiocb, iter));
447         else
448                 return (zpl_iter_read(kiocb, iter));
449 }
450 #if defined(HAVE_VFS_DIRECT_IO_ITER)
451 static ssize_t
452 zpl_direct_IO(struct kiocb *kiocb, struct iov_iter *iter)
453 {
454         return (zpl_direct_IO_impl(iov_iter_rw(iter), kiocb, iter));
455 }
456 #elif defined(HAVE_VFS_DIRECT_IO_ITER_OFFSET)
457 static ssize_t
458 zpl_direct_IO(struct kiocb *kiocb, struct iov_iter *iter, loff_t pos)
459 {
460         ASSERT3S(pos, ==, kiocb->ki_pos);
461         return (zpl_direct_IO_impl(iov_iter_rw(iter), kiocb, iter));
462 }
463 #elif defined(HAVE_VFS_DIRECT_IO_ITER_RW_OFFSET)
464 static ssize_t
465 zpl_direct_IO(int rw, struct kiocb *kiocb, struct iov_iter *iter, loff_t pos)
466 {
467         ASSERT3S(pos, ==, kiocb->ki_pos);
468         return (zpl_direct_IO_impl(rw, kiocb, iter));
469 }
470 #else
471 #error "Unknown direct IO interface"
472 #endif
473
474 #else
475
476 #if defined(HAVE_VFS_DIRECT_IO_IOVEC)
477 static ssize_t
478 zpl_direct_IO(int rw, struct kiocb *kiocb, const struct iovec *iovp,
479     loff_t pos, unsigned long nr_segs)
480 {
481         if (rw == WRITE)
482                 return (zpl_aio_write(kiocb, iovp, nr_segs, pos));
483         else
484                 return (zpl_aio_read(kiocb, iovp, nr_segs, pos));
485 }
486 #else
487 #error "Unknown direct IO interface"
488 #endif
489
490 #endif /* HAVE_VFS_RW_ITERATE */
491
492 static loff_t
493 zpl_llseek(struct file *filp, loff_t offset, int whence)
494 {
495 #if defined(SEEK_HOLE) && defined(SEEK_DATA)
496         fstrans_cookie_t cookie;
497
498         if (whence == SEEK_DATA || whence == SEEK_HOLE) {
499                 struct inode *ip = filp->f_mapping->host;
500                 loff_t maxbytes = ip->i_sb->s_maxbytes;
501                 loff_t error;
502
503                 spl_inode_lock_shared(ip);
504                 cookie = spl_fstrans_mark();
505                 error = -zfs_holey(ip, whence, &offset);
506                 spl_fstrans_unmark(cookie);
507                 if (error == 0)
508                         error = lseek_execute(filp, ip, offset, maxbytes);
509                 spl_inode_unlock_shared(ip);
510
511                 return (error);
512         }
513 #endif /* SEEK_HOLE && SEEK_DATA */
514
515         return (generic_file_llseek(filp, offset, whence));
516 }
517
518 /*
519  * It's worth taking a moment to describe how mmap is implemented
520  * for zfs because it differs considerably from other Linux filesystems.
521  * However, this issue is handled the same way under OpenSolaris.
522  *
523  * The issue is that by design zfs bypasses the Linux page cache and
524  * leaves all caching up to the ARC.  This has been shown to work
525  * well for the common read(2)/write(2) case.  However, mmap(2)
526  * is problem because it relies on being tightly integrated with the
527  * page cache.  To handle this we cache mmap'ed files twice, once in
528  * the ARC and a second time in the page cache.  The code is careful
529  * to keep both copies synchronized.
530  *
531  * When a file with an mmap'ed region is written to using write(2)
532  * both the data in the ARC and existing pages in the page cache
533  * are updated.  For a read(2) data will be read first from the page
534  * cache then the ARC if needed.  Neither a write(2) or read(2) will
535  * will ever result in new pages being added to the page cache.
536  *
537  * New pages are added to the page cache only via .readpage() which
538  * is called when the vfs needs to read a page off disk to back the
539  * virtual memory region.  These pages may be modified without
540  * notifying the ARC and will be written out periodically via
541  * .writepage().  This will occur due to either a sync or the usual
542  * page aging behavior.  Note because a read(2) of a mmap'ed file
543  * will always check the page cache first even when the ARC is out
544  * of date correct data will still be returned.
545  *
546  * While this implementation ensures correct behavior it does have
547  * have some drawbacks.  The most obvious of which is that it
548  * increases the required memory footprint when access mmap'ed
549  * files.  It also adds additional complexity to the code keeping
550  * both caches synchronized.
551  *
552  * Longer term it may be possible to cleanly resolve this wart by
553  * mapping page cache pages directly on to the ARC buffers.  The
554  * Linux address space operations are flexible enough to allow
555  * selection of which pages back a particular index.  The trick
556  * would be working out the details of which subsystem is in
557  * charge, the ARC, the page cache, or both.  It may also prove
558  * helpful to move the ARC buffers to a scatter-gather lists
559  * rather than a vmalloc'ed region.
560  */
561 static int
562 zpl_mmap(struct file *filp, struct vm_area_struct *vma)
563 {
564         struct inode *ip = filp->f_mapping->host;
565         znode_t *zp = ITOZ(ip);
566         int error;
567         fstrans_cookie_t cookie;
568
569         cookie = spl_fstrans_mark();
570         error = -zfs_map(ip, vma->vm_pgoff, (caddr_t *)vma->vm_start,
571             (size_t)(vma->vm_end - vma->vm_start), vma->vm_flags);
572         spl_fstrans_unmark(cookie);
573         if (error)
574                 return (error);
575
576         error = generic_file_mmap(filp, vma);
577         if (error)
578                 return (error);
579
580         mutex_enter(&zp->z_lock);
581         zp->z_is_mapped = B_TRUE;
582         mutex_exit(&zp->z_lock);
583
584         return (error);
585 }
586
587 /*
588  * Populate a page with data for the Linux page cache.  This function is
589  * only used to support mmap(2).  There will be an identical copy of the
590  * data in the ARC which is kept up to date via .write() and .writepage().
591  *
592  * Current this function relies on zpl_read_common() and the O_DIRECT
593  * flag to read in a page.  This works but the more correct way is to
594  * update zfs_fillpage() to be Linux friendly and use that interface.
595  */
596 static int
597 zpl_readpage(struct file *filp, struct page *pp)
598 {
599         struct inode *ip;
600         struct page *pl[1];
601         int error = 0;
602         fstrans_cookie_t cookie;
603
604         ASSERT(PageLocked(pp));
605         ip = pp->mapping->host;
606         pl[0] = pp;
607
608         cookie = spl_fstrans_mark();
609         error = -zfs_getpage(ip, pl, 1);
610         spl_fstrans_unmark(cookie);
611
612         if (error) {
613                 SetPageError(pp);
614                 ClearPageUptodate(pp);
615         } else {
616                 ClearPageError(pp);
617                 SetPageUptodate(pp);
618                 flush_dcache_page(pp);
619         }
620
621         unlock_page(pp);
622         return (error);
623 }
624
625 /*
626  * Populate a set of pages with data for the Linux page cache.  This
627  * function will only be called for read ahead and never for demand
628  * paging.  For simplicity, the code relies on read_cache_pages() to
629  * correctly lock each page for IO and call zpl_readpage().
630  */
631 static int
632 zpl_readpages(struct file *filp, struct address_space *mapping,
633     struct list_head *pages, unsigned nr_pages)
634 {
635         return (read_cache_pages(mapping, pages,
636             (filler_t *)zpl_readpage, filp));
637 }
638
639 int
640 zpl_putpage(struct page *pp, struct writeback_control *wbc, void *data)
641 {
642         struct address_space *mapping = data;
643         fstrans_cookie_t cookie;
644
645         ASSERT(PageLocked(pp));
646         ASSERT(!PageWriteback(pp));
647
648         cookie = spl_fstrans_mark();
649         (void) zfs_putpage(mapping->host, pp, wbc);
650         spl_fstrans_unmark(cookie);
651
652         return (0);
653 }
654
655 static int
656 zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
657 {
658         znode_t         *zp = ITOZ(mapping->host);
659         zfsvfs_t        *zfsvfs = ITOZSB(mapping->host);
660         enum writeback_sync_modes sync_mode;
661         int result;
662
663         ZFS_ENTER(zfsvfs);
664         if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
665                 wbc->sync_mode = WB_SYNC_ALL;
666         ZFS_EXIT(zfsvfs);
667         sync_mode = wbc->sync_mode;
668
669         /*
670          * We don't want to run write_cache_pages() in SYNC mode here, because
671          * that would make putpage() wait for a single page to be committed to
672          * disk every single time, resulting in atrocious performance. Instead
673          * we run it once in non-SYNC mode so that the ZIL gets all the data,
674          * and then we commit it all in one go.
675          */
676         wbc->sync_mode = WB_SYNC_NONE;
677         result = write_cache_pages(mapping, wbc, zpl_putpage, mapping);
678         if (sync_mode != wbc->sync_mode) {
679                 ZFS_ENTER(zfsvfs);
680                 ZFS_VERIFY_ZP(zp);
681                 if (zfsvfs->z_log != NULL)
682                         zil_commit(zfsvfs->z_log, zp->z_id);
683                 ZFS_EXIT(zfsvfs);
684
685                 /*
686                  * We need to call write_cache_pages() again (we can't just
687                  * return after the commit) because the previous call in
688                  * non-SYNC mode does not guarantee that we got all the dirty
689                  * pages (see the implementation of write_cache_pages() for
690                  * details). That being said, this is a no-op in most cases.
691                  */
692                 wbc->sync_mode = sync_mode;
693                 result = write_cache_pages(mapping, wbc, zpl_putpage, mapping);
694         }
695         return (result);
696 }
697
698 /*
699  * Write out dirty pages to the ARC, this function is only required to
700  * support mmap(2).  Mapped pages may be dirtied by memory operations
701  * which never call .write().  These dirty pages are kept in sync with
702  * the ARC buffers via this hook.
703  */
704 static int
705 zpl_writepage(struct page *pp, struct writeback_control *wbc)
706 {
707         if (ITOZSB(pp->mapping->host)->z_os->os_sync == ZFS_SYNC_ALWAYS)
708                 wbc->sync_mode = WB_SYNC_ALL;
709
710         return (zpl_putpage(pp, wbc, pp->mapping));
711 }
712
713 /*
714  * The only flag combination which matches the behavior of zfs_space()
715  * is FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE.  The FALLOC_FL_PUNCH_HOLE
716  * flag was introduced in the 2.6.38 kernel.
717  */
718 #if defined(HAVE_FILE_FALLOCATE) || defined(HAVE_INODE_FALLOCATE)
719 long
720 zpl_fallocate_common(struct inode *ip, int mode, loff_t offset, loff_t len)
721 {
722         int error = -EOPNOTSUPP;
723
724 #if defined(FALLOC_FL_PUNCH_HOLE) && defined(FALLOC_FL_KEEP_SIZE)
725         cred_t *cr = CRED();
726         flock64_t bf;
727         loff_t olen;
728         fstrans_cookie_t cookie;
729
730         if (mode != (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
731                 return (error);
732
733         if (offset < 0 || len <= 0)
734                 return (-EINVAL);
735
736         spl_inode_lock(ip);
737         olen = i_size_read(ip);
738
739         if (offset > olen) {
740                 spl_inode_unlock(ip);
741                 return (0);
742         }
743         if (offset + len > olen)
744                 len = olen - offset;
745         bf.l_type = F_WRLCK;
746         bf.l_whence = 0;
747         bf.l_start = offset;
748         bf.l_len = len;
749         bf.l_pid = 0;
750
751         crhold(cr);
752         cookie = spl_fstrans_mark();
753         error = -zfs_space(ip, F_FREESP, &bf, FWRITE, offset, cr);
754         spl_fstrans_unmark(cookie);
755         spl_inode_unlock(ip);
756
757         crfree(cr);
758 #endif /* defined(FALLOC_FL_PUNCH_HOLE) && defined(FALLOC_FL_KEEP_SIZE) */
759
760         ASSERT3S(error, <=, 0);
761         return (error);
762 }
763 #endif /* defined(HAVE_FILE_FALLOCATE) || defined(HAVE_INODE_FALLOCATE) */
764
765 #ifdef HAVE_FILE_FALLOCATE
766 static long
767 zpl_fallocate(struct file *filp, int mode, loff_t offset, loff_t len)
768 {
769         return zpl_fallocate_common(file_inode(filp),
770             mode, offset, len);
771 }
772 #endif /* HAVE_FILE_FALLOCATE */
773
774 #define ZFS_FL_USER_VISIBLE     (FS_FL_USER_VISIBLE | ZFS_PROJINHERIT_FL)
775 #define ZFS_FL_USER_MODIFIABLE  (FS_FL_USER_MODIFIABLE | ZFS_PROJINHERIT_FL)
776
777 static uint32_t
778 __zpl_ioctl_getflags(struct inode *ip)
779 {
780         uint64_t zfs_flags = ITOZ(ip)->z_pflags;
781         uint32_t ioctl_flags = 0;
782
783         if (zfs_flags & ZFS_IMMUTABLE)
784                 ioctl_flags |= FS_IMMUTABLE_FL;
785
786         if (zfs_flags & ZFS_APPENDONLY)
787                 ioctl_flags |= FS_APPEND_FL;
788
789         if (zfs_flags & ZFS_NODUMP)
790                 ioctl_flags |= FS_NODUMP_FL;
791
792         if (zfs_flags & ZFS_PROJINHERIT)
793                 ioctl_flags |= ZFS_PROJINHERIT_FL;
794
795         return (ioctl_flags & ZFS_FL_USER_VISIBLE);
796 }
797
798 /*
799  * Map zfs file z_pflags (xvattr_t) to linux file attributes. Only file
800  * attributes common to both Linux and Solaris are mapped.
801  */
802 static int
803 zpl_ioctl_getflags(struct file *filp, void __user *arg)
804 {
805         uint32_t flags;
806         int err;
807
808         flags = __zpl_ioctl_getflags(file_inode(filp));
809         err = copy_to_user(arg, &flags, sizeof (flags));
810
811         return (err);
812 }
813
814 /*
815  * fchange() is a helper macro to detect if we have been asked to change a
816  * flag. This is ugly, but the requirement that we do this is a consequence of
817  * how the Linux file attribute interface was designed. Another consequence is
818  * that concurrent modification of files suffers from a TOCTOU race. Neither
819  * are things we can fix without modifying the kernel-userland interface, which
820  * is outside of our jurisdiction.
821  */
822
823 #define fchange(f0, f1, b0, b1) (!((f0) & (b0)) != !((f1) & (b1)))
824
825 static int
826 __zpl_ioctl_setflags(struct inode *ip, uint32_t ioctl_flags, xvattr_t *xva)
827 {
828         uint64_t zfs_flags = ITOZ(ip)->z_pflags;
829         xoptattr_t *xoap;
830
831         if (ioctl_flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NODUMP_FL |
832             ZFS_PROJINHERIT_FL))
833                 return (-EOPNOTSUPP);
834
835         if (ioctl_flags & ~ZFS_FL_USER_MODIFIABLE)
836                 return (-EACCES);
837
838         if ((fchange(ioctl_flags, zfs_flags, FS_IMMUTABLE_FL, ZFS_IMMUTABLE) ||
839             fchange(ioctl_flags, zfs_flags, FS_APPEND_FL, ZFS_APPENDONLY)) &&
840             !capable(CAP_LINUX_IMMUTABLE))
841                 return (-EACCES);
842
843         if (!zpl_inode_owner_or_capable(ip))
844                 return (-EACCES);
845
846         xva_init(xva);
847         xoap = xva_getxoptattr(xva);
848
849         XVA_SET_REQ(xva, XAT_IMMUTABLE);
850         if (ioctl_flags & FS_IMMUTABLE_FL)
851                 xoap->xoa_immutable = B_TRUE;
852
853         XVA_SET_REQ(xva, XAT_APPENDONLY);
854         if (ioctl_flags & FS_APPEND_FL)
855                 xoap->xoa_appendonly = B_TRUE;
856
857         XVA_SET_REQ(xva, XAT_NODUMP);
858         if (ioctl_flags & FS_NODUMP_FL)
859                 xoap->xoa_nodump = B_TRUE;
860
861         XVA_SET_REQ(xva, XAT_PROJINHERIT);
862         if (ioctl_flags & ZFS_PROJINHERIT_FL)
863                 xoap->xoa_projinherit = B_TRUE;
864
865         return (0);
866 }
867
868 static int
869 zpl_ioctl_setflags(struct file *filp, void __user *arg)
870 {
871         struct inode *ip = file_inode(filp);
872         uint32_t flags;
873         cred_t *cr = CRED();
874         xvattr_t xva;
875         int err;
876         fstrans_cookie_t cookie;
877
878         if (copy_from_user(&flags, arg, sizeof (flags)))
879                 return (-EFAULT);
880
881         err = __zpl_ioctl_setflags(ip, flags, &xva);
882         if (err)
883                 return (err);
884
885         crhold(cr);
886         cookie = spl_fstrans_mark();
887         err = -zfs_setattr(ip, (vattr_t *)&xva, 0, cr);
888         spl_fstrans_unmark(cookie);
889         crfree(cr);
890
891         return (err);
892 }
893
894 static int
895 zpl_ioctl_getxattr(struct file *filp, void __user *arg)
896 {
897         zfsxattr_t fsx = { 0 };
898         struct inode *ip = file_inode(filp);
899         int err;
900
901         fsx.fsx_xflags = __zpl_ioctl_getflags(ip);
902         fsx.fsx_projid = ITOZ(ip)->z_projid;
903         err = copy_to_user(arg, &fsx, sizeof (fsx));
904
905         return (err);
906 }
907
908 static int
909 zpl_ioctl_setxattr(struct file *filp, void __user *arg)
910 {
911         struct inode *ip = file_inode(filp);
912         zfsxattr_t fsx;
913         cred_t *cr = CRED();
914         xvattr_t xva;
915         xoptattr_t *xoap;
916         int err;
917         fstrans_cookie_t cookie;
918
919         if (copy_from_user(&fsx, arg, sizeof (fsx)))
920                 return (-EFAULT);
921
922         if (!zpl_is_valid_projid(fsx.fsx_projid))
923                 return (-EINVAL);
924
925         err = __zpl_ioctl_setflags(ip, fsx.fsx_xflags, &xva);
926         if (err)
927                 return (err);
928
929         xoap = xva_getxoptattr(&xva);
930         XVA_SET_REQ(&xva, XAT_PROJID);
931         xoap->xoa_projid = fsx.fsx_projid;
932
933         crhold(cr);
934         cookie = spl_fstrans_mark();
935         err = -zfs_setattr(ip, (vattr_t *)&xva, 0, cr);
936         spl_fstrans_unmark(cookie);
937         crfree(cr);
938
939         return (err);
940 }
941
942 static long
943 zpl_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
944 {
945         switch (cmd) {
946         case FS_IOC_GETFLAGS:
947                 return (zpl_ioctl_getflags(filp, (void *)arg));
948         case FS_IOC_SETFLAGS:
949                 return (zpl_ioctl_setflags(filp, (void *)arg));
950         case ZFS_IOC_FSGETXATTR:
951                 return (zpl_ioctl_getxattr(filp, (void *)arg));
952         case ZFS_IOC_FSSETXATTR:
953                 return (zpl_ioctl_setxattr(filp, (void *)arg));
954         default:
955                 return (-ENOTTY);
956         }
957 }
958
959 #ifdef CONFIG_COMPAT
960 static long
961 zpl_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
962 {
963         switch (cmd) {
964         case FS_IOC32_GETFLAGS:
965                 cmd = FS_IOC_GETFLAGS;
966                 break;
967         case FS_IOC32_SETFLAGS:
968                 cmd = FS_IOC_SETFLAGS;
969                 break;
970         default:
971                 return (-ENOTTY);
972         }
973         return (zpl_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)));
974 }
975 #endif /* CONFIG_COMPAT */
976
977
978 const struct address_space_operations zpl_address_space_operations = {
979         .readpages      = zpl_readpages,
980         .readpage       = zpl_readpage,
981         .writepage      = zpl_writepage,
982         .writepages     = zpl_writepages,
983         .direct_IO      = zpl_direct_IO,
984 };
985
986 const struct file_operations zpl_file_operations = {
987         .open           = zpl_open,
988         .release        = zpl_release,
989         .llseek         = zpl_llseek,
990 #ifdef HAVE_VFS_RW_ITERATE
991 #ifdef HAVE_NEW_SYNC_READ
992         .read           = new_sync_read,
993         .write          = new_sync_write,
994 #endif
995         .read_iter      = zpl_iter_read,
996         .write_iter     = zpl_iter_write,
997 #else
998         .read           = do_sync_read,
999         .write          = do_sync_write,
1000         .aio_read       = zpl_aio_read,
1001         .aio_write      = zpl_aio_write,
1002 #endif
1003         .mmap           = zpl_mmap,
1004         .fsync          = zpl_fsync,
1005 #ifdef HAVE_FILE_AIO_FSYNC
1006         .aio_fsync      = zpl_aio_fsync,
1007 #endif
1008 #ifdef HAVE_FILE_FALLOCATE
1009         .fallocate      = zpl_fallocate,
1010 #endif /* HAVE_FILE_FALLOCATE */
1011         .unlocked_ioctl = zpl_ioctl,
1012 #ifdef CONFIG_COMPAT
1013         .compat_ioctl   = zpl_compat_ioctl,
1014 #endif
1015 };
1016
1017 const struct file_operations zpl_dir_file_operations = {
1018         .llseek         = generic_file_llseek,
1019         .read           = generic_read_dir,
1020 #if defined(HAVE_VFS_ITERATE_SHARED)
1021         .iterate_shared = zpl_iterate,
1022 #elif defined(HAVE_VFS_ITERATE)
1023         .iterate        = zpl_iterate,
1024 #else
1025         .readdir        = zpl_readdir,
1026 #endif
1027         .fsync          = zpl_fsync,
1028         .unlocked_ioctl = zpl_ioctl,
1029 #ifdef CONFIG_COMPAT
1030         .compat_ioctl   = zpl_compat_ioctl,
1031 #endif
1032 };