The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/module/os/linux/zfs/zpl_file.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 https://opensource.org/licenses/CDDL-1.0.
   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 <linux/fs.h>
   31 #include <sys/file.h>
   32 #include <sys/dmu_objset.h>
   33 #include <sys/zfs_znode.h>
   34 #include <sys/zfs_vfsops.h>
   35 #include <sys/zfs_vnops.h>
   36 #include <sys/zfs_project.h>
   37 #if defined(HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS) || \
   38     defined(HAVE_VFS_FILEMAP_DIRTY_FOLIO)
   39 #include <linux/pagemap.h>
   40 #endif
   41 #ifdef HAVE_FILE_FADVISE
   42 #include <linux/fadvise.h>
   43 #endif
   44 #ifdef HAVE_VFS_FILEMAP_DIRTY_FOLIO
   45 #include <linux/writeback.h>
   46 #endif
   47 
   48 /*
   49  * When using fallocate(2) to preallocate space, inflate the requested
   50  * capacity check by 10% to account for the required metadata blocks.
   51  */
   52 static unsigned int zfs_fallocate_reserve_percent = 110;
   53 
   54 static int
   55 zpl_open(struct inode *ip, struct file *filp)
   56 {
   57         cred_t *cr = CRED();
   58         int error;
   59         fstrans_cookie_t cookie;
   60 
   61         error = generic_file_open(ip, filp);
   62         if (error)
   63                 return (error);
   64 
   65         crhold(cr);
   66         cookie = spl_fstrans_mark();
   67         error = -zfs_open(ip, filp->f_mode, filp->f_flags, cr);
   68         spl_fstrans_unmark(cookie);
   69         crfree(cr);
   70         ASSERT3S(error, <=, 0);
   71 
   72         return (error);
   73 }
   74 
   75 static int
   76 zpl_release(struct inode *ip, struct file *filp)
   77 {
   78         cred_t *cr = CRED();
   79         int error;
   80         fstrans_cookie_t cookie;
   81 
   82         cookie = spl_fstrans_mark();
   83         if (ITOZ(ip)->z_atime_dirty)
   84                 zfs_mark_inode_dirty(ip);
   85 
   86         crhold(cr);
   87         error = -zfs_close(ip, filp->f_flags, cr);
   88         spl_fstrans_unmark(cookie);
   89         crfree(cr);
   90         ASSERT3S(error, <=, 0);
   91 
   92         return (error);
   93 }
   94 
   95 static int
   96 zpl_iterate(struct file *filp, zpl_dir_context_t *ctx)
   97 {
   98         cred_t *cr = CRED();
   99         int error;
  100         fstrans_cookie_t cookie;
  101 
  102         crhold(cr);
  103         cookie = spl_fstrans_mark();
  104         error = -zfs_readdir(file_inode(filp), ctx, cr);
  105         spl_fstrans_unmark(cookie);
  106         crfree(cr);
  107         ASSERT3S(error, <=, 0);
  108 
  109         return (error);
  110 }
  111 
  112 #if !defined(HAVE_VFS_ITERATE) && !defined(HAVE_VFS_ITERATE_SHARED)
  113 static int
  114 zpl_readdir(struct file *filp, void *dirent, filldir_t filldir)
  115 {
  116         zpl_dir_context_t ctx =
  117             ZPL_DIR_CONTEXT_INIT(dirent, filldir, filp->f_pos);
  118         int error;
  119 
  120         error = zpl_iterate(filp, &ctx);
  121         filp->f_pos = ctx.pos;
  122 
  123         return (error);
  124 }
  125 #endif /* !HAVE_VFS_ITERATE && !HAVE_VFS_ITERATE_SHARED */
  126 
  127 #if defined(HAVE_FSYNC_WITHOUT_DENTRY)
  128 /*
  129  * Linux 2.6.35 - 3.0 API,
  130  * As of 2.6.35 the dentry argument to the fops->fsync() hook was deemed
  131  * redundant.  The dentry is still accessible via filp->f_path.dentry,
  132  * and we are guaranteed that filp will never be NULL.
  133  */
  134 static int
  135 zpl_fsync(struct file *filp, int datasync)
  136 {
  137         struct inode *inode = filp->f_mapping->host;
  138         cred_t *cr = CRED();
  139         int error;
  140         fstrans_cookie_t cookie;
  141 
  142         crhold(cr);
  143         cookie = spl_fstrans_mark();
  144         error = -zfs_fsync(ITOZ(inode), datasync, cr);
  145         spl_fstrans_unmark(cookie);
  146         crfree(cr);
  147         ASSERT3S(error, <=, 0);
  148 
  149         return (error);
  150 }
  151 
  152 #ifdef HAVE_FILE_AIO_FSYNC
  153 static int
  154 zpl_aio_fsync(struct kiocb *kiocb, int datasync)
  155 {
  156         return (zpl_fsync(kiocb->ki_filp, datasync));
  157 }
  158 #endif
  159 
  160 #elif defined(HAVE_FSYNC_RANGE)
  161 /*
  162  * Linux 3.1 API,
  163  * As of 3.1 the responsibility to call filemap_write_and_wait_range() has
  164  * been pushed down in to the .fsync() vfs hook.  Additionally, the i_mutex
  165  * lock is no longer held by the caller, for zfs we don't require the lock
  166  * to be held so we don't acquire it.
  167  */
  168 static int
  169 zpl_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
  170 {
  171         struct inode *inode = filp->f_mapping->host;
  172         znode_t *zp = ITOZ(inode);
  173         zfsvfs_t *zfsvfs = ITOZSB(inode);
  174         cred_t *cr = CRED();
  175         int error;
  176         fstrans_cookie_t cookie;
  177 
  178         /*
  179          * The variables z_sync_writes_cnt and z_async_writes_cnt work in
  180          * tandem so that sync writes can detect if there are any non-sync
  181          * writes going on and vice-versa. The "vice-versa" part to this logic
  182          * is located in zfs_putpage() where non-sync writes check if there are
  183          * any ongoing sync writes. If any sync and non-sync writes overlap,
  184          * we do a commit to complete the non-sync writes since the latter can
  185          * potentially take several seconds to complete and thus block sync
  186          * writes in the upcoming call to filemap_write_and_wait_range().
  187          */
  188         atomic_inc_32(&zp->z_sync_writes_cnt);
  189         /*
  190          * If the following check does not detect an overlapping non-sync write
  191          * (say because it's just about to start), then it is guaranteed that
  192          * the non-sync write will detect this sync write. This is because we
  193          * always increment z_sync_writes_cnt / z_async_writes_cnt before doing
  194          * the check on z_async_writes_cnt / z_sync_writes_cnt here and in
  195          * zfs_putpage() respectively.
  196          */
  197         if (atomic_load_32(&zp->z_async_writes_cnt) > 0) {
  198                 if ((error = zpl_enter(zfsvfs, FTAG)) != 0) {
  199                         atomic_dec_32(&zp->z_sync_writes_cnt);
  200                         return (error);
  201                 }
  202                 zil_commit(zfsvfs->z_log, zp->z_id);
  203                 zpl_exit(zfsvfs, FTAG);
  204         }
  205 
  206         error = filemap_write_and_wait_range(inode->i_mapping, start, end);
  207 
  208         /*
  209          * The sync write is not complete yet but we decrement
  210          * z_sync_writes_cnt since zfs_fsync() increments and decrements
  211          * it internally. If a non-sync write starts just after the decrement
  212          * operation but before we call zfs_fsync(), it may not detect this
  213          * overlapping sync write but it does not matter since we have already
  214          * gone past filemap_write_and_wait_range() and we won't block due to
  215          * the non-sync write.
  216          */
  217         atomic_dec_32(&zp->z_sync_writes_cnt);
  218 
  219         if (error)
  220                 return (error);
  221 
  222         crhold(cr);
  223         cookie = spl_fstrans_mark();
  224         error = -zfs_fsync(zp, datasync, cr);
  225         spl_fstrans_unmark(cookie);
  226         crfree(cr);
  227         ASSERT3S(error, <=, 0);
  228 
  229         return (error);
  230 }
  231 
  232 #ifdef HAVE_FILE_AIO_FSYNC
  233 static int
  234 zpl_aio_fsync(struct kiocb *kiocb, int datasync)
  235 {
  236         return (zpl_fsync(kiocb->ki_filp, kiocb->ki_pos, -1, datasync));
  237 }
  238 #endif
  239 
  240 #else
  241 #error "Unsupported fops->fsync() implementation"
  242 #endif
  243 
  244 static inline int
  245 zfs_io_flags(struct kiocb *kiocb)
  246 {
  247         int flags = 0;
  248 
  249 #if defined(IOCB_DSYNC)
  250         if (kiocb->ki_flags & IOCB_DSYNC)
  251                 flags |= O_DSYNC;
  252 #endif
  253 #if defined(IOCB_SYNC)
  254         if (kiocb->ki_flags & IOCB_SYNC)
  255                 flags |= O_SYNC;
  256 #endif
  257 #if defined(IOCB_APPEND)
  258         if (kiocb->ki_flags & IOCB_APPEND)
  259                 flags |= O_APPEND;
  260 #endif
  261 #if defined(IOCB_DIRECT)
  262         if (kiocb->ki_flags & IOCB_DIRECT)
  263                 flags |= O_DIRECT;
  264 #endif
  265         return (flags);
  266 }
  267 
  268 /*
  269  * If relatime is enabled, call file_accessed() if zfs_relatime_need_update()
  270  * is true.  This is needed since datasets with inherited "relatime" property
  271  * aren't necessarily mounted with the MNT_RELATIME flag (e.g. after
  272  * `zfs set relatime=...`), which is what relatime test in VFS by
  273  * relatime_need_update() is based on.
  274  */
  275 static inline void
  276 zpl_file_accessed(struct file *filp)
  277 {
  278         struct inode *ip = filp->f_mapping->host;
  279 
  280         if (!IS_NOATIME(ip) && ITOZSB(ip)->z_relatime) {
  281                 if (zfs_relatime_need_update(ip))
  282                         file_accessed(filp);
  283         } else {
  284                 file_accessed(filp);
  285         }
  286 }
  287 
  288 #if defined(HAVE_VFS_RW_ITERATE)
  289 
  290 /*
  291  * When HAVE_VFS_IOV_ITER is defined the iov_iter structure supports
  292  * iovecs, kvevs, bvecs and pipes, plus all the required interfaces to
  293  * manipulate the iov_iter are available.  In which case the full iov_iter
  294  * can be attached to the uio and correctly handled in the lower layers.
  295  * Otherwise, for older kernels extract the iovec and pass it instead.
  296  */
  297 static void
  298 zpl_uio_init(zfs_uio_t *uio, struct kiocb *kiocb, struct iov_iter *to,
  299     loff_t pos, ssize_t count, size_t skip)
  300 {
  301 #if defined(HAVE_VFS_IOV_ITER)
  302         zfs_uio_iov_iter_init(uio, to, pos, count, skip);
  303 #else
  304 #ifdef HAVE_IOV_ITER_TYPE
  305         zfs_uio_iovec_init(uio, to->iov, to->nr_segs, pos,
  306             iov_iter_type(to) & ITER_KVEC ? UIO_SYSSPACE : UIO_USERSPACE,
  307             count, skip);
  308 #else
  309         zfs_uio_iovec_init(uio, to->iov, to->nr_segs, pos,
  310             to->type & ITER_KVEC ? UIO_SYSSPACE : UIO_USERSPACE,
  311             count, skip);
  312 #endif
  313 #endif
  314 }
  315 
  316 static ssize_t
  317 zpl_iter_read(struct kiocb *kiocb, struct iov_iter *to)
  318 {
  319         cred_t *cr = CRED();
  320         fstrans_cookie_t cookie;
  321         struct file *filp = kiocb->ki_filp;
  322         ssize_t count = iov_iter_count(to);
  323         zfs_uio_t uio;
  324 
  325         zpl_uio_init(&uio, kiocb, to, kiocb->ki_pos, count, 0);
  326 
  327         crhold(cr);
  328         cookie = spl_fstrans_mark();
  329 
  330         int error = -zfs_read(ITOZ(filp->f_mapping->host), &uio,
  331             filp->f_flags | zfs_io_flags(kiocb), cr);
  332 
  333         spl_fstrans_unmark(cookie);
  334         crfree(cr);
  335 
  336         if (error < 0)
  337                 return (error);
  338 
  339         ssize_t read = count - uio.uio_resid;
  340         kiocb->ki_pos += read;
  341 
  342         zpl_file_accessed(filp);
  343 
  344         return (read);
  345 }
  346 
  347 static inline ssize_t
  348 zpl_generic_write_checks(struct kiocb *kiocb, struct iov_iter *from,
  349     size_t *countp)
  350 {
  351 #ifdef HAVE_GENERIC_WRITE_CHECKS_KIOCB
  352         ssize_t ret = generic_write_checks(kiocb, from);
  353         if (ret <= 0)
  354                 return (ret);
  355 
  356         *countp = ret;
  357 #else
  358         struct file *file = kiocb->ki_filp;
  359         struct address_space *mapping = file->f_mapping;
  360         struct inode *ip = mapping->host;
  361         int isblk = S_ISBLK(ip->i_mode);
  362 
  363         *countp = iov_iter_count(from);
  364         ssize_t ret = generic_write_checks(file, &kiocb->ki_pos, countp, isblk);
  365         if (ret)
  366                 return (ret);
  367 #endif
  368 
  369         return (0);
  370 }
  371 
  372 static ssize_t
  373 zpl_iter_write(struct kiocb *kiocb, struct iov_iter *from)
  374 {
  375         cred_t *cr = CRED();
  376         fstrans_cookie_t cookie;
  377         struct file *filp = kiocb->ki_filp;
  378         struct inode *ip = filp->f_mapping->host;
  379         zfs_uio_t uio;
  380         size_t count = 0;
  381         ssize_t ret;
  382 
  383         ret = zpl_generic_write_checks(kiocb, from, &count);
  384         if (ret)
  385                 return (ret);
  386 
  387         zpl_uio_init(&uio, kiocb, from, kiocb->ki_pos, count, from->iov_offset);
  388 
  389         crhold(cr);
  390         cookie = spl_fstrans_mark();
  391 
  392         int error = -zfs_write(ITOZ(ip), &uio,
  393             filp->f_flags | zfs_io_flags(kiocb), cr);
  394 
  395         spl_fstrans_unmark(cookie);
  396         crfree(cr);
  397 
  398         if (error < 0)
  399                 return (error);
  400 
  401         ssize_t wrote = count - uio.uio_resid;
  402         kiocb->ki_pos += wrote;
  403 
  404         return (wrote);
  405 }
  406 
  407 #else /* !HAVE_VFS_RW_ITERATE */
  408 
  409 static ssize_t
  410 zpl_aio_read(struct kiocb *kiocb, const struct iovec *iov,
  411     unsigned long nr_segs, loff_t pos)
  412 {
  413         cred_t *cr = CRED();
  414         fstrans_cookie_t cookie;
  415         struct file *filp = kiocb->ki_filp;
  416         size_t count;
  417         ssize_t ret;
  418 
  419         ret = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE);
  420         if (ret)
  421                 return (ret);
  422 
  423         zfs_uio_t uio;
  424         zfs_uio_iovec_init(&uio, iov, nr_segs, kiocb->ki_pos, UIO_USERSPACE,
  425             count, 0);
  426 
  427         crhold(cr);
  428         cookie = spl_fstrans_mark();
  429 
  430         int error = -zfs_read(ITOZ(filp->f_mapping->host), &uio,
  431             filp->f_flags | zfs_io_flags(kiocb), cr);
  432 
  433         spl_fstrans_unmark(cookie);
  434         crfree(cr);
  435 
  436         if (error < 0)
  437                 return (error);
  438 
  439         ssize_t read = count - uio.uio_resid;
  440         kiocb->ki_pos += read;
  441 
  442         zpl_file_accessed(filp);
  443 
  444         return (read);
  445 }
  446 
  447 static ssize_t
  448 zpl_aio_write(struct kiocb *kiocb, const struct iovec *iov,
  449     unsigned long nr_segs, loff_t pos)
  450 {
  451         cred_t *cr = CRED();
  452         fstrans_cookie_t cookie;
  453         struct file *filp = kiocb->ki_filp;
  454         struct inode *ip = filp->f_mapping->host;
  455         size_t count;
  456         ssize_t ret;
  457 
  458         ret = generic_segment_checks(iov, &nr_segs, &count, VERIFY_READ);
  459         if (ret)
  460                 return (ret);
  461 
  462         ret = generic_write_checks(filp, &pos, &count, S_ISBLK(ip->i_mode));
  463         if (ret)
  464                 return (ret);
  465 
  466         kiocb->ki_pos = pos;
  467 
  468         zfs_uio_t uio;
  469         zfs_uio_iovec_init(&uio, iov, nr_segs, kiocb->ki_pos, UIO_USERSPACE,
  470             count, 0);
  471 
  472         crhold(cr);
  473         cookie = spl_fstrans_mark();
  474 
  475         int error = -zfs_write(ITOZ(ip), &uio,
  476             filp->f_flags | zfs_io_flags(kiocb), cr);
  477 
  478         spl_fstrans_unmark(cookie);
  479         crfree(cr);
  480 
  481         if (error < 0)
  482                 return (error);
  483 
  484         ssize_t wrote = count - uio.uio_resid;
  485         kiocb->ki_pos += wrote;
  486 
  487         return (wrote);
  488 }
  489 #endif /* HAVE_VFS_RW_ITERATE */
  490 
  491 #if defined(HAVE_VFS_RW_ITERATE)
  492 static ssize_t
  493 zpl_direct_IO_impl(int rw, struct kiocb *kiocb, struct iov_iter *iter)
  494 {
  495         if (rw == WRITE)
  496                 return (zpl_iter_write(kiocb, iter));
  497         else
  498                 return (zpl_iter_read(kiocb, iter));
  499 }
  500 #if defined(HAVE_VFS_DIRECT_IO_ITER)
  501 static ssize_t
  502 zpl_direct_IO(struct kiocb *kiocb, struct iov_iter *iter)
  503 {
  504         return (zpl_direct_IO_impl(iov_iter_rw(iter), kiocb, iter));
  505 }
  506 #elif defined(HAVE_VFS_DIRECT_IO_ITER_OFFSET)
  507 static ssize_t
  508 zpl_direct_IO(struct kiocb *kiocb, struct iov_iter *iter, loff_t pos)
  509 {
  510         ASSERT3S(pos, ==, kiocb->ki_pos);
  511         return (zpl_direct_IO_impl(iov_iter_rw(iter), kiocb, iter));
  512 }
  513 #elif defined(HAVE_VFS_DIRECT_IO_ITER_RW_OFFSET)
  514 static ssize_t
  515 zpl_direct_IO(int rw, struct kiocb *kiocb, struct iov_iter *iter, loff_t pos)
  516 {
  517         ASSERT3S(pos, ==, kiocb->ki_pos);
  518         return (zpl_direct_IO_impl(rw, kiocb, iter));
  519 }
  520 #else
  521 #error "Unknown direct IO interface"
  522 #endif
  523 
  524 #else /* HAVE_VFS_RW_ITERATE */
  525 
  526 #if defined(HAVE_VFS_DIRECT_IO_IOVEC)
  527 static ssize_t
  528 zpl_direct_IO(int rw, struct kiocb *kiocb, const struct iovec *iov,
  529     loff_t pos, unsigned long nr_segs)
  530 {
  531         if (rw == WRITE)
  532                 return (zpl_aio_write(kiocb, iov, nr_segs, pos));
  533         else
  534                 return (zpl_aio_read(kiocb, iov, nr_segs, pos));
  535 }
  536 #elif defined(HAVE_VFS_DIRECT_IO_ITER_RW_OFFSET)
  537 static ssize_t
  538 zpl_direct_IO(int rw, struct kiocb *kiocb, struct iov_iter *iter, loff_t pos)
  539 {
  540         const struct iovec *iovp = iov_iter_iovec(iter);
  541         unsigned long nr_segs = iter->nr_segs;
  542 
  543         ASSERT3S(pos, ==, kiocb->ki_pos);
  544         if (rw == WRITE)
  545                 return (zpl_aio_write(kiocb, iovp, nr_segs, pos));
  546         else
  547                 return (zpl_aio_read(kiocb, iovp, nr_segs, pos));
  548 }
  549 #else
  550 #error "Unknown direct IO interface"
  551 #endif
  552 
  553 #endif /* HAVE_VFS_RW_ITERATE */
  554 
  555 static loff_t
  556 zpl_llseek(struct file *filp, loff_t offset, int whence)
  557 {
  558 #if defined(SEEK_HOLE) && defined(SEEK_DATA)
  559         fstrans_cookie_t cookie;
  560 
  561         if (whence == SEEK_DATA || whence == SEEK_HOLE) {
  562                 struct inode *ip = filp->f_mapping->host;
  563                 loff_t maxbytes = ip->i_sb->s_maxbytes;
  564                 loff_t error;
  565 
  566                 spl_inode_lock_shared(ip);
  567                 cookie = spl_fstrans_mark();
  568                 error = -zfs_holey(ITOZ(ip), whence, &offset);
  569                 spl_fstrans_unmark(cookie);
  570                 if (error == 0)
  571                         error = lseek_execute(filp, ip, offset, maxbytes);
  572                 spl_inode_unlock_shared(ip);
  573 
  574                 return (error);
  575         }
  576 #endif /* SEEK_HOLE && SEEK_DATA */
  577 
  578         return (generic_file_llseek(filp, offset, whence));
  579 }
  580 
  581 /*
  582  * It's worth taking a moment to describe how mmap is implemented
  583  * for zfs because it differs considerably from other Linux filesystems.
  584  * However, this issue is handled the same way under OpenSolaris.
  585  *
  586  * The issue is that by design zfs bypasses the Linux page cache and
  587  * leaves all caching up to the ARC.  This has been shown to work
  588  * well for the common read(2)/write(2) case.  However, mmap(2)
  589  * is problem because it relies on being tightly integrated with the
  590  * page cache.  To handle this we cache mmap'ed files twice, once in
  591  * the ARC and a second time in the page cache.  The code is careful
  592  * to keep both copies synchronized.
  593  *
  594  * When a file with an mmap'ed region is written to using write(2)
  595  * both the data in the ARC and existing pages in the page cache
  596  * are updated.  For a read(2) data will be read first from the page
  597  * cache then the ARC if needed.  Neither a write(2) or read(2) will
  598  * will ever result in new pages being added to the page cache.
  599  *
  600  * New pages are added to the page cache only via .readpage() which
  601  * is called when the vfs needs to read a page off disk to back the
  602  * virtual memory region.  These pages may be modified without
  603  * notifying the ARC and will be written out periodically via
  604  * .writepage().  This will occur due to either a sync or the usual
  605  * page aging behavior.  Note because a read(2) of a mmap'ed file
  606  * will always check the page cache first even when the ARC is out
  607  * of date correct data will still be returned.
  608  *
  609  * While this implementation ensures correct behavior it does have
  610  * have some drawbacks.  The most obvious of which is that it
  611  * increases the required memory footprint when access mmap'ed
  612  * files.  It also adds additional complexity to the code keeping
  613  * both caches synchronized.
  614  *
  615  * Longer term it may be possible to cleanly resolve this wart by
  616  * mapping page cache pages directly on to the ARC buffers.  The
  617  * Linux address space operations are flexible enough to allow
  618  * selection of which pages back a particular index.  The trick
  619  * would be working out the details of which subsystem is in
  620  * charge, the ARC, the page cache, or both.  It may also prove
  621  * helpful to move the ARC buffers to a scatter-gather lists
  622  * rather than a vmalloc'ed region.
  623  */
  624 static int
  625 zpl_mmap(struct file *filp, struct vm_area_struct *vma)
  626 {
  627         struct inode *ip = filp->f_mapping->host;
  628         znode_t *zp = ITOZ(ip);
  629         int error;
  630         fstrans_cookie_t cookie;
  631 
  632         cookie = spl_fstrans_mark();
  633         error = -zfs_map(ip, vma->vm_pgoff, (caddr_t *)vma->vm_start,
  634             (size_t)(vma->vm_end - vma->vm_start), vma->vm_flags);
  635         spl_fstrans_unmark(cookie);
  636         if (error)
  637                 return (error);
  638 
  639         error = generic_file_mmap(filp, vma);
  640         if (error)
  641                 return (error);
  642 
  643         mutex_enter(&zp->z_lock);
  644         zp->z_is_mapped = B_TRUE;
  645         mutex_exit(&zp->z_lock);
  646 
  647         return (error);
  648 }
  649 
  650 /*
  651  * Populate a page with data for the Linux page cache.  This function is
  652  * only used to support mmap(2).  There will be an identical copy of the
  653  * data in the ARC which is kept up to date via .write() and .writepage().
  654  */
  655 static inline int
  656 zpl_readpage_common(struct page *pp)
  657 {
  658         struct inode *ip;
  659         struct page *pl[1];
  660         int error = 0;
  661         fstrans_cookie_t cookie;
  662 
  663         ASSERT(PageLocked(pp));
  664         ip = pp->mapping->host;
  665         pl[0] = pp;
  666 
  667         cookie = spl_fstrans_mark();
  668         error = -zfs_getpage(ip, pl, 1);
  669         spl_fstrans_unmark(cookie);
  670 
  671         if (error) {
  672                 SetPageError(pp);
  673                 ClearPageUptodate(pp);
  674         } else {
  675                 ClearPageError(pp);
  676                 SetPageUptodate(pp);
  677                 flush_dcache_page(pp);
  678         }
  679 
  680         unlock_page(pp);
  681         return (error);
  682 }
  683 
  684 #ifdef HAVE_VFS_READ_FOLIO
  685 static int
  686 zpl_read_folio(struct file *filp, struct folio *folio)
  687 {
  688         return (zpl_readpage_common(&folio->page));
  689 }
  690 #else
  691 static int
  692 zpl_readpage(struct file *filp, struct page *pp)
  693 {
  694         return (zpl_readpage_common(pp));
  695 }
  696 #endif
  697 
  698 static int
  699 zpl_readpage_filler(void *data, struct page *pp)
  700 {
  701         return (zpl_readpage_common(pp));
  702 }
  703 
  704 /*
  705  * Populate a set of pages with data for the Linux page cache.  This
  706  * function will only be called for read ahead and never for demand
  707  * paging.  For simplicity, the code relies on read_cache_pages() to
  708  * correctly lock each page for IO and call zpl_readpage().
  709  */
  710 #ifdef HAVE_VFS_READPAGES
  711 static int
  712 zpl_readpages(struct file *filp, struct address_space *mapping,
  713     struct list_head *pages, unsigned nr_pages)
  714 {
  715         return (read_cache_pages(mapping, pages, zpl_readpage_filler, NULL));
  716 }
  717 #else
  718 static void
  719 zpl_readahead(struct readahead_control *ractl)
  720 {
  721         struct page *page;
  722 
  723         while ((page = readahead_page(ractl)) != NULL) {
  724                 int ret;
  725 
  726                 ret = zpl_readpage_filler(NULL, page);
  727                 put_page(page);
  728                 if (ret)
  729                         break;
  730         }
  731 }
  732 #endif
  733 
  734 static int
  735 zpl_putpage(struct page *pp, struct writeback_control *wbc, void *data)
  736 {
  737         boolean_t *for_sync = data;
  738         fstrans_cookie_t cookie;
  739 
  740         ASSERT(PageLocked(pp));
  741         ASSERT(!PageWriteback(pp));
  742 
  743         cookie = spl_fstrans_mark();
  744         (void) zfs_putpage(pp->mapping->host, pp, wbc, *for_sync);
  745         spl_fstrans_unmark(cookie);
  746 
  747         return (0);
  748 }
  749 
  750 static int
  751 zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
  752 {
  753         znode_t         *zp = ITOZ(mapping->host);
  754         zfsvfs_t        *zfsvfs = ITOZSB(mapping->host);
  755         enum writeback_sync_modes sync_mode;
  756         int result;
  757 
  758         if ((result = zpl_enter(zfsvfs, FTAG)) != 0)
  759                 return (result);
  760         if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
  761                 wbc->sync_mode = WB_SYNC_ALL;
  762         zpl_exit(zfsvfs, FTAG);
  763         sync_mode = wbc->sync_mode;
  764 
  765         /*
  766          * We don't want to run write_cache_pages() in SYNC mode here, because
  767          * that would make putpage() wait for a single page to be committed to
  768          * disk every single time, resulting in atrocious performance. Instead
  769          * we run it once in non-SYNC mode so that the ZIL gets all the data,
  770          * and then we commit it all in one go.
  771          */
  772         boolean_t for_sync = (sync_mode == WB_SYNC_ALL);
  773         wbc->sync_mode = WB_SYNC_NONE;
  774         result = write_cache_pages(mapping, wbc, zpl_putpage, &for_sync);
  775         if (sync_mode != wbc->sync_mode) {
  776                 if ((result = zpl_enter_verify_zp(zfsvfs, zp, FTAG)) != 0)
  777                         return (result);
  778                 if (zfsvfs->z_log != NULL)
  779                         zil_commit(zfsvfs->z_log, zp->z_id);
  780                 zpl_exit(zfsvfs, FTAG);
  781 
  782                 /*
  783                  * We need to call write_cache_pages() again (we can't just
  784                  * return after the commit) because the previous call in
  785                  * non-SYNC mode does not guarantee that we got all the dirty
  786                  * pages (see the implementation of write_cache_pages() for
  787                  * details). That being said, this is a no-op in most cases.
  788                  */
  789                 wbc->sync_mode = sync_mode;
  790                 result = write_cache_pages(mapping, wbc, zpl_putpage,
  791                     &for_sync);
  792         }
  793         return (result);
  794 }
  795 
  796 /*
  797  * Write out dirty pages to the ARC, this function is only required to
  798  * support mmap(2).  Mapped pages may be dirtied by memory operations
  799  * which never call .write().  These dirty pages are kept in sync with
  800  * the ARC buffers via this hook.
  801  */
  802 static int
  803 zpl_writepage(struct page *pp, struct writeback_control *wbc)
  804 {
  805         if (ITOZSB(pp->mapping->host)->z_os->os_sync == ZFS_SYNC_ALWAYS)
  806                 wbc->sync_mode = WB_SYNC_ALL;
  807 
  808         boolean_t for_sync = (wbc->sync_mode == WB_SYNC_ALL);
  809 
  810         return (zpl_putpage(pp, wbc, &for_sync));
  811 }
  812 
  813 /*
  814  * The flag combination which matches the behavior of zfs_space() is
  815  * FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE.  The FALLOC_FL_PUNCH_HOLE
  816  * flag was introduced in the 2.6.38 kernel.
  817  *
  818  * The original mode=0 (allocate space) behavior can be reasonably emulated
  819  * by checking if enough space exists and creating a sparse file, as real
  820  * persistent space reservation is not possible due to COW, snapshots, etc.
  821  */
  822 static long
  823 zpl_fallocate_common(struct inode *ip, int mode, loff_t offset, loff_t len)
  824 {
  825         cred_t *cr = CRED();
  826         loff_t olen;
  827         fstrans_cookie_t cookie;
  828         int error = 0;
  829 
  830         int test_mode = FALLOC_FL_PUNCH_HOLE;
  831 #ifdef HAVE_FALLOC_FL_ZERO_RANGE
  832         test_mode |= FALLOC_FL_ZERO_RANGE;
  833 #endif
  834 
  835         if ((mode & ~(FALLOC_FL_KEEP_SIZE | test_mode)) != 0)
  836                 return (-EOPNOTSUPP);
  837 
  838         if (offset < 0 || len <= 0)
  839                 return (-EINVAL);
  840 
  841         spl_inode_lock(ip);
  842         olen = i_size_read(ip);
  843 
  844         crhold(cr);
  845         cookie = spl_fstrans_mark();
  846         if (mode & (test_mode)) {
  847                 flock64_t bf;
  848 
  849                 if (mode & FALLOC_FL_KEEP_SIZE) {
  850                         if (offset > olen)
  851                                 goto out_unmark;
  852 
  853                         if (offset + len > olen)
  854                                 len = olen - offset;
  855                 }
  856                 bf.l_type = F_WRLCK;
  857                 bf.l_whence = SEEK_SET;
  858                 bf.l_start = offset;
  859                 bf.l_len = len;
  860                 bf.l_pid = 0;
  861 
  862                 error = -zfs_space(ITOZ(ip), F_FREESP, &bf, O_RDWR, offset, cr);
  863         } else if ((mode & ~FALLOC_FL_KEEP_SIZE) == 0) {
  864                 unsigned int percent = zfs_fallocate_reserve_percent;
  865                 struct kstatfs statfs;
  866 
  867                 /* Legacy mode, disable fallocate compatibility. */
  868                 if (percent == 0) {
  869                         error = -EOPNOTSUPP;
  870                         goto out_unmark;
  871                 }
  872 
  873                 /*
  874                  * Use zfs_statvfs() instead of dmu_objset_space() since it
  875                  * also checks project quota limits, which are relevant here.
  876                  */
  877                 error = zfs_statvfs(ip, &statfs);
  878                 if (error)
  879                         goto out_unmark;
  880 
  881                 /*
  882                  * Shrink available space a bit to account for overhead/races.
  883                  * We know the product previously fit into availbytes from
  884                  * dmu_objset_space(), so the smaller product will also fit.
  885                  */
  886                 if (len > statfs.f_bavail * (statfs.f_bsize * 100 / percent)) {
  887                         error = -ENOSPC;
  888                         goto out_unmark;
  889                 }
  890                 if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > olen)
  891                         error = zfs_freesp(ITOZ(ip), offset + len, 0, 0, FALSE);
  892         }
  893 out_unmark:
  894         spl_fstrans_unmark(cookie);
  895         spl_inode_unlock(ip);
  896 
  897         crfree(cr);
  898 
  899         return (error);
  900 }
  901 
  902 static long
  903 zpl_fallocate(struct file *filp, int mode, loff_t offset, loff_t len)
  904 {
  905         return zpl_fallocate_common(file_inode(filp),
  906             mode, offset, len);
  907 }
  908 
  909 static int
  910 zpl_ioctl_getversion(struct file *filp, void __user *arg)
  911 {
  912         uint32_t generation = file_inode(filp)->i_generation;
  913 
  914         return (copy_to_user(arg, &generation, sizeof (generation)));
  915 }
  916 
  917 #ifdef HAVE_FILE_FADVISE
  918 static int
  919 zpl_fadvise(struct file *filp, loff_t offset, loff_t len, int advice)
  920 {
  921         struct inode *ip = file_inode(filp);
  922         znode_t *zp = ITOZ(ip);
  923         zfsvfs_t *zfsvfs = ITOZSB(ip);
  924         objset_t *os = zfsvfs->z_os;
  925         int error = 0;
  926 
  927         if (S_ISFIFO(ip->i_mode))
  928                 return (-ESPIPE);
  929 
  930         if (offset < 0 || len < 0)
  931                 return (-EINVAL);
  932 
  933         if ((error = zpl_enter_verify_zp(zfsvfs, zp, FTAG)) != 0)
  934                 return (error);
  935 
  936         switch (advice) {
  937         case POSIX_FADV_SEQUENTIAL:
  938         case POSIX_FADV_WILLNEED:
  939 #ifdef HAVE_GENERIC_FADVISE
  940                 if (zn_has_cached_data(zp))
  941                         error = generic_fadvise(filp, offset, len, advice);
  942 #endif
  943                 /*
  944                  * Pass on the caller's size directly, but note that
  945                  * dmu_prefetch_max will effectively cap it.  If there
  946                  * really is a larger sequential access pattern, perhaps
  947                  * dmu_zfetch will detect it.
  948                  */
  949                 if (len == 0)
  950                         len = i_size_read(ip) - offset;
  951 
  952                 dmu_prefetch(os, zp->z_id, 0, offset, len,
  953                     ZIO_PRIORITY_ASYNC_READ);
  954                 break;
  955         case POSIX_FADV_NORMAL:
  956         case POSIX_FADV_RANDOM:
  957         case POSIX_FADV_DONTNEED:
  958         case POSIX_FADV_NOREUSE:
  959                 /* ignored for now */
  960                 break;
  961         default:
  962                 error = -EINVAL;
  963                 break;
  964         }
  965 
  966         zfs_exit(zfsvfs, FTAG);
  967 
  968         return (error);
  969 }
  970 #endif /* HAVE_FILE_FADVISE */
  971 
  972 #define ZFS_FL_USER_VISIBLE     (FS_FL_USER_VISIBLE | ZFS_PROJINHERIT_FL)
  973 #define ZFS_FL_USER_MODIFIABLE  (FS_FL_USER_MODIFIABLE | ZFS_PROJINHERIT_FL)
  974 
  975 static uint32_t
  976 __zpl_ioctl_getflags(struct inode *ip)
  977 {
  978         uint64_t zfs_flags = ITOZ(ip)->z_pflags;
  979         uint32_t ioctl_flags = 0;
  980 
  981         if (zfs_flags & ZFS_IMMUTABLE)
  982                 ioctl_flags |= FS_IMMUTABLE_FL;
  983 
  984         if (zfs_flags & ZFS_APPENDONLY)
  985                 ioctl_flags |= FS_APPEND_FL;
  986 
  987         if (zfs_flags & ZFS_NODUMP)
  988                 ioctl_flags |= FS_NODUMP_FL;
  989 
  990         if (zfs_flags & ZFS_PROJINHERIT)
  991                 ioctl_flags |= ZFS_PROJINHERIT_FL;
  992 
  993         return (ioctl_flags & ZFS_FL_USER_VISIBLE);
  994 }
  995 
  996 /*
  997  * Map zfs file z_pflags (xvattr_t) to linux file attributes. Only file
  998  * attributes common to both Linux and Solaris are mapped.
  999  */
 1000 static int
 1001 zpl_ioctl_getflags(struct file *filp, void __user *arg)
 1002 {
 1003         uint32_t flags;
 1004         int err;
 1005 
 1006         flags = __zpl_ioctl_getflags(file_inode(filp));
 1007         err = copy_to_user(arg, &flags, sizeof (flags));
 1008 
 1009         return (err);
 1010 }
 1011 
 1012 /*
 1013  * fchange() is a helper macro to detect if we have been asked to change a
 1014  * flag. This is ugly, but the requirement that we do this is a consequence of
 1015  * how the Linux file attribute interface was designed. Another consequence is
 1016  * that concurrent modification of files suffers from a TOCTOU race. Neither
 1017  * are things we can fix without modifying the kernel-userland interface, which
 1018  * is outside of our jurisdiction.
 1019  */
 1020 
 1021 #define fchange(f0, f1, b0, b1) (!((f0) & (b0)) != !((f1) & (b1)))
 1022 
 1023 static int
 1024 __zpl_ioctl_setflags(struct inode *ip, uint32_t ioctl_flags, xvattr_t *xva)
 1025 {
 1026         uint64_t zfs_flags = ITOZ(ip)->z_pflags;
 1027         xoptattr_t *xoap;
 1028 
 1029         if (ioctl_flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NODUMP_FL |
 1030             ZFS_PROJINHERIT_FL))
 1031                 return (-EOPNOTSUPP);
 1032 
 1033         if (ioctl_flags & ~ZFS_FL_USER_MODIFIABLE)
 1034                 return (-EACCES);
 1035 
 1036         if ((fchange(ioctl_flags, zfs_flags, FS_IMMUTABLE_FL, ZFS_IMMUTABLE) ||
 1037             fchange(ioctl_flags, zfs_flags, FS_APPEND_FL, ZFS_APPENDONLY)) &&
 1038             !capable(CAP_LINUX_IMMUTABLE))
 1039                 return (-EPERM);
 1040 
 1041         if (!zpl_inode_owner_or_capable(kcred->user_ns, ip))
 1042                 return (-EACCES);
 1043 
 1044         xva_init(xva);
 1045         xoap = xva_getxoptattr(xva);
 1046 
 1047 #define FLAG_CHANGE(iflag, zflag, xflag, xfield)        do {    \
 1048         if (((ioctl_flags & (iflag)) && !(zfs_flags & (zflag))) ||      \
 1049             ((zfs_flags & (zflag)) && !(ioctl_flags & (iflag)))) {      \
 1050                 XVA_SET_REQ(xva, (xflag));      \
 1051                 (xfield) = ((ioctl_flags & (iflag)) != 0);      \
 1052         }       \
 1053 } while (0)
 1054 
 1055         FLAG_CHANGE(FS_IMMUTABLE_FL, ZFS_IMMUTABLE, XAT_IMMUTABLE,
 1056             xoap->xoa_immutable);
 1057         FLAG_CHANGE(FS_APPEND_FL, ZFS_APPENDONLY, XAT_APPENDONLY,
 1058             xoap->xoa_appendonly);
 1059         FLAG_CHANGE(FS_NODUMP_FL, ZFS_NODUMP, XAT_NODUMP,
 1060             xoap->xoa_nodump);
 1061         FLAG_CHANGE(ZFS_PROJINHERIT_FL, ZFS_PROJINHERIT, XAT_PROJINHERIT,
 1062             xoap->xoa_projinherit);
 1063 
 1064 #undef  FLAG_CHANGE
 1065 
 1066         return (0);
 1067 }
 1068 
 1069 static int
 1070 zpl_ioctl_setflags(struct file *filp, void __user *arg)
 1071 {
 1072         struct inode *ip = file_inode(filp);
 1073         uint32_t flags;
 1074         cred_t *cr = CRED();
 1075         xvattr_t xva;
 1076         int err;
 1077         fstrans_cookie_t cookie;
 1078 
 1079         if (copy_from_user(&flags, arg, sizeof (flags)))
 1080                 return (-EFAULT);
 1081 
 1082         err = __zpl_ioctl_setflags(ip, flags, &xva);
 1083         if (err)
 1084                 return (err);
 1085 
 1086         crhold(cr);
 1087         cookie = spl_fstrans_mark();
 1088         err = -zfs_setattr(ITOZ(ip), (vattr_t *)&xva, 0, cr, kcred->user_ns);
 1089         spl_fstrans_unmark(cookie);
 1090         crfree(cr);
 1091 
 1092         return (err);
 1093 }
 1094 
 1095 static int
 1096 zpl_ioctl_getxattr(struct file *filp, void __user *arg)
 1097 {
 1098         zfsxattr_t fsx = { 0 };
 1099         struct inode *ip = file_inode(filp);
 1100         int err;
 1101 
 1102         fsx.fsx_xflags = __zpl_ioctl_getflags(ip);
 1103         fsx.fsx_projid = ITOZ(ip)->z_projid;
 1104         err = copy_to_user(arg, &fsx, sizeof (fsx));
 1105 
 1106         return (err);
 1107 }
 1108 
 1109 static int
 1110 zpl_ioctl_setxattr(struct file *filp, void __user *arg)
 1111 {
 1112         struct inode *ip = file_inode(filp);
 1113         zfsxattr_t fsx;
 1114         cred_t *cr = CRED();
 1115         xvattr_t xva;
 1116         xoptattr_t *xoap;
 1117         int err;
 1118         fstrans_cookie_t cookie;
 1119 
 1120         if (copy_from_user(&fsx, arg, sizeof (fsx)))
 1121                 return (-EFAULT);
 1122 
 1123         if (!zpl_is_valid_projid(fsx.fsx_projid))
 1124                 return (-EINVAL);
 1125 
 1126         err = __zpl_ioctl_setflags(ip, fsx.fsx_xflags, &xva);
 1127         if (err)
 1128                 return (err);
 1129 
 1130         xoap = xva_getxoptattr(&xva);
 1131         XVA_SET_REQ(&xva, XAT_PROJID);
 1132         xoap->xoa_projid = fsx.fsx_projid;
 1133 
 1134         crhold(cr);
 1135         cookie = spl_fstrans_mark();
 1136         err = -zfs_setattr(ITOZ(ip), (vattr_t *)&xva, 0, cr, kcred->user_ns);
 1137         spl_fstrans_unmark(cookie);
 1138         crfree(cr);
 1139 
 1140         return (err);
 1141 }
 1142 
 1143 /*
 1144  * Expose Additional File Level Attributes of ZFS.
 1145  */
 1146 static int
 1147 zpl_ioctl_getdosflags(struct file *filp, void __user *arg)
 1148 {
 1149         struct inode *ip = file_inode(filp);
 1150         uint64_t dosflags = ITOZ(ip)->z_pflags;
 1151         dosflags &= ZFS_DOS_FL_USER_VISIBLE;
 1152         int err = copy_to_user(arg, &dosflags, sizeof (dosflags));
 1153 
 1154         return (err);
 1155 }
 1156 
 1157 static int
 1158 __zpl_ioctl_setdosflags(struct inode *ip, uint64_t ioctl_flags, xvattr_t *xva)
 1159 {
 1160         uint64_t zfs_flags = ITOZ(ip)->z_pflags;
 1161         xoptattr_t *xoap;
 1162 
 1163         if (ioctl_flags & (~ZFS_DOS_FL_USER_VISIBLE))
 1164                 return (-EOPNOTSUPP);
 1165 
 1166         if ((fchange(ioctl_flags, zfs_flags, ZFS_IMMUTABLE, ZFS_IMMUTABLE) ||
 1167             fchange(ioctl_flags, zfs_flags, ZFS_APPENDONLY, ZFS_APPENDONLY)) &&
 1168             !capable(CAP_LINUX_IMMUTABLE))
 1169                 return (-EPERM);
 1170 
 1171         if (!zpl_inode_owner_or_capable(kcred->user_ns, ip))
 1172                 return (-EACCES);
 1173 
 1174         xva_init(xva);
 1175         xoap = xva_getxoptattr(xva);
 1176 
 1177 #define FLAG_CHANGE(iflag, xflag, xfield)       do {    \
 1178         if (((ioctl_flags & (iflag)) && !(zfs_flags & (iflag))) ||      \
 1179             ((zfs_flags & (iflag)) && !(ioctl_flags & (iflag)))) {      \
 1180                 XVA_SET_REQ(xva, (xflag));      \
 1181                 (xfield) = ((ioctl_flags & (iflag)) != 0);      \
 1182         }       \
 1183 } while (0)
 1184 
 1185         FLAG_CHANGE(ZFS_IMMUTABLE, XAT_IMMUTABLE, xoap->xoa_immutable);
 1186         FLAG_CHANGE(ZFS_APPENDONLY, XAT_APPENDONLY, xoap->xoa_appendonly);
 1187         FLAG_CHANGE(ZFS_NODUMP, XAT_NODUMP, xoap->xoa_nodump);
 1188         FLAG_CHANGE(ZFS_READONLY, XAT_READONLY, xoap->xoa_readonly);
 1189         FLAG_CHANGE(ZFS_HIDDEN, XAT_HIDDEN, xoap->xoa_hidden);
 1190         FLAG_CHANGE(ZFS_SYSTEM, XAT_SYSTEM, xoap->xoa_system);
 1191         FLAG_CHANGE(ZFS_ARCHIVE, XAT_ARCHIVE, xoap->xoa_archive);
 1192         FLAG_CHANGE(ZFS_NOUNLINK, XAT_NOUNLINK, xoap->xoa_nounlink);
 1193         FLAG_CHANGE(ZFS_REPARSE, XAT_REPARSE, xoap->xoa_reparse);
 1194         FLAG_CHANGE(ZFS_OFFLINE, XAT_OFFLINE, xoap->xoa_offline);
 1195         FLAG_CHANGE(ZFS_SPARSE, XAT_SPARSE, xoap->xoa_sparse);
 1196 
 1197 #undef  FLAG_CHANGE
 1198 
 1199         return (0);
 1200 }
 1201 
 1202 /*
 1203  * Set Additional File Level Attributes of ZFS.
 1204  */
 1205 static int
 1206 zpl_ioctl_setdosflags(struct file *filp, void __user *arg)
 1207 {
 1208         struct inode *ip = file_inode(filp);
 1209         uint64_t dosflags;
 1210         cred_t *cr = CRED();
 1211         xvattr_t xva;
 1212         int err;
 1213         fstrans_cookie_t cookie;
 1214 
 1215         if (copy_from_user(&dosflags, arg, sizeof (dosflags)))
 1216                 return (-EFAULT);
 1217 
 1218         err = __zpl_ioctl_setdosflags(ip, dosflags, &xva);
 1219         if (err)
 1220                 return (err);
 1221 
 1222         crhold(cr);
 1223         cookie = spl_fstrans_mark();
 1224         err = -zfs_setattr(ITOZ(ip), (vattr_t *)&xva, 0, cr, kcred->user_ns);
 1225         spl_fstrans_unmark(cookie);
 1226         crfree(cr);
 1227 
 1228         return (err);
 1229 }
 1230 
 1231 static long
 1232 zpl_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 1233 {
 1234         switch (cmd) {
 1235         case FS_IOC_GETVERSION:
 1236                 return (zpl_ioctl_getversion(filp, (void *)arg));
 1237         case FS_IOC_GETFLAGS:
 1238                 return (zpl_ioctl_getflags(filp, (void *)arg));
 1239         case FS_IOC_SETFLAGS:
 1240                 return (zpl_ioctl_setflags(filp, (void *)arg));
 1241         case ZFS_IOC_FSGETXATTR:
 1242                 return (zpl_ioctl_getxattr(filp, (void *)arg));
 1243         case ZFS_IOC_FSSETXATTR:
 1244                 return (zpl_ioctl_setxattr(filp, (void *)arg));
 1245         case ZFS_IOC_GETDOSFLAGS:
 1246                 return (zpl_ioctl_getdosflags(filp, (void *)arg));
 1247         case ZFS_IOC_SETDOSFLAGS:
 1248                 return (zpl_ioctl_setdosflags(filp, (void *)arg));
 1249         default:
 1250                 return (-ENOTTY);
 1251         }
 1252 }
 1253 
 1254 #ifdef CONFIG_COMPAT
 1255 static long
 1256 zpl_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 1257 {
 1258         switch (cmd) {
 1259         case FS_IOC32_GETVERSION:
 1260                 cmd = FS_IOC_GETVERSION;
 1261                 break;
 1262         case FS_IOC32_GETFLAGS:
 1263                 cmd = FS_IOC_GETFLAGS;
 1264                 break;
 1265         case FS_IOC32_SETFLAGS:
 1266                 cmd = FS_IOC_SETFLAGS;
 1267                 break;
 1268         default:
 1269                 return (-ENOTTY);
 1270         }
 1271         return (zpl_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)));
 1272 }
 1273 #endif /* CONFIG_COMPAT */
 1274 
 1275 
 1276 const struct address_space_operations zpl_address_space_operations = {
 1277 #ifdef HAVE_VFS_READPAGES
 1278         .readpages      = zpl_readpages,
 1279 #else
 1280         .readahead      = zpl_readahead,
 1281 #endif
 1282 #ifdef HAVE_VFS_READ_FOLIO
 1283         .read_folio     = zpl_read_folio,
 1284 #else
 1285         .readpage       = zpl_readpage,
 1286 #endif
 1287         .writepage      = zpl_writepage,
 1288         .writepages     = zpl_writepages,
 1289         .direct_IO      = zpl_direct_IO,
 1290 #ifdef HAVE_VFS_SET_PAGE_DIRTY_NOBUFFERS
 1291         .set_page_dirty = __set_page_dirty_nobuffers,
 1292 #endif
 1293 #ifdef HAVE_VFS_FILEMAP_DIRTY_FOLIO
 1294         .dirty_folio    = filemap_dirty_folio,
 1295 #endif
 1296 };
 1297 
 1298 const struct file_operations zpl_file_operations = {
 1299         .open           = zpl_open,
 1300         .release        = zpl_release,
 1301         .llseek         = zpl_llseek,
 1302 #ifdef HAVE_VFS_RW_ITERATE
 1303 #ifdef HAVE_NEW_SYNC_READ
 1304         .read           = new_sync_read,
 1305         .write          = new_sync_write,
 1306 #endif
 1307         .read_iter      = zpl_iter_read,
 1308         .write_iter     = zpl_iter_write,
 1309 #ifdef HAVE_VFS_IOV_ITER
 1310         .splice_read    = generic_file_splice_read,
 1311         .splice_write   = iter_file_splice_write,
 1312 #endif
 1313 #else
 1314         .read           = do_sync_read,
 1315         .write          = do_sync_write,
 1316         .aio_read       = zpl_aio_read,
 1317         .aio_write      = zpl_aio_write,
 1318 #endif
 1319         .mmap           = zpl_mmap,
 1320         .fsync          = zpl_fsync,
 1321 #ifdef HAVE_FILE_AIO_FSYNC
 1322         .aio_fsync      = zpl_aio_fsync,
 1323 #endif
 1324         .fallocate      = zpl_fallocate,
 1325 #ifdef HAVE_FILE_FADVISE
 1326         .fadvise        = zpl_fadvise,
 1327 #endif
 1328         .unlocked_ioctl = zpl_ioctl,
 1329 #ifdef CONFIG_COMPAT
 1330         .compat_ioctl   = zpl_compat_ioctl,
 1331 #endif
 1332 };
 1333 
 1334 const struct file_operations zpl_dir_file_operations = {
 1335         .llseek         = generic_file_llseek,
 1336         .read           = generic_read_dir,
 1337 #if defined(HAVE_VFS_ITERATE_SHARED)
 1338         .iterate_shared = zpl_iterate,
 1339 #elif defined(HAVE_VFS_ITERATE)
 1340         .iterate        = zpl_iterate,
 1341 #else
 1342         .readdir        = zpl_readdir,
 1343 #endif
 1344         .fsync          = zpl_fsync,
 1345         .unlocked_ioctl = zpl_ioctl,
 1346 #ifdef CONFIG_COMPAT
 1347         .compat_ioctl   = zpl_compat_ioctl,
 1348 #endif
 1349 };
 1350 
 1351 /* CSTYLED */
 1352 module_param(zfs_fallocate_reserve_percent, uint, 0644);
 1353 MODULE_PARM_DESC(zfs_fallocate_reserve_percent,
 1354         "Percentage of length to use for the available capacity check");

Cache object: 369b4877a390a2ea2baa2838ee0e67d4


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.