LCOV - code coverage report
Current view: top level - fs/xfs - xfs_iops.c (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwa @ Mon Jul 31 20:08:17 PDT 2023 Lines: 438 466 94.0 %
Date: 2023-07-31 20:08:17 Functions: 25 26 96.2 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
       4             :  * All Rights Reserved.
       5             :  */
       6             : #include "xfs.h"
       7             : #include "xfs_fs.h"
       8             : #include "xfs_shared.h"
       9             : #include "xfs_format.h"
      10             : #include "xfs_log_format.h"
      11             : #include "xfs_trans_resv.h"
      12             : #include "xfs_mount.h"
      13             : #include "xfs_inode.h"
      14             : #include "xfs_acl.h"
      15             : #include "xfs_quota.h"
      16             : #include "xfs_da_format.h"
      17             : #include "xfs_da_btree.h"
      18             : #include "xfs_attr.h"
      19             : #include "xfs_trans.h"
      20             : #include "xfs_trace.h"
      21             : #include "xfs_icache.h"
      22             : #include "xfs_symlink.h"
      23             : #include "xfs_dir2.h"
      24             : #include "xfs_iomap.h"
      25             : #include "xfs_error.h"
      26             : #include "xfs_ioctl.h"
      27             : #include "xfs_xattr.h"
      28             : 
      29             : #include <linux/posix_acl.h>
      30             : #include <linux/security.h>
      31             : #include <linux/iversion.h>
      32             : #include <linux/fiemap.h>
      33             : 
      34             : /*
      35             :  * Directories have different lock order w.r.t. mmap_lock compared to regular
      36             :  * files. This is due to readdir potentially triggering page faults on a user
      37             :  * buffer inside filldir(), and this happens with the ilock on the directory
      38             :  * held. For regular files, the lock order is the other way around - the
      39             :  * mmap_lock is taken during the page fault, and then we lock the ilock to do
      40             :  * block mapping. Hence we need a different class for the directory ilock so
      41             :  * that lockdep can tell them apart.
      42             :  */
      43             : static struct lock_class_key xfs_nondir_ilock_class;
      44             : static struct lock_class_key xfs_dir_ilock_class;
      45             : 
      46             : static int
      47             : xfs_initxattrs(
      48             :         struct inode            *inode,
      49             :         const struct xattr      *xattr_array,
      50             :         void                    *fs_info)
      51             : {
      52             :         const struct xattr      *xattr;
      53             :         struct xfs_inode        *ip = XFS_I(inode);
      54             :         int                     error = 0;
      55             : 
      56             :         for (xattr = xattr_array; xattr->name != NULL; xattr++) {
      57             :                 struct xfs_da_args      args = {
      58             :                         .dp             = ip,
      59             :                         .attr_filter    = XFS_ATTR_SECURE,
      60             :                         .name           = xattr->name,
      61             :                         .namelen        = strlen(xattr->name),
      62             :                         .value          = xattr->value,
      63             :                         .valuelen       = xattr->value_len,
      64             :                 };
      65             :                 error = xfs_attr_change(&args);
      66             :                 if (error < 0)
      67             :                         break;
      68             :         }
      69             :         return error;
      70             : }
      71             : 
      72             : /*
      73             :  * Hook in SELinux.  This is not quite correct yet, what we really need
      74             :  * here (as we do for default ACLs) is a mechanism by which creation of
      75             :  * these attrs can be journalled at inode creation time (along with the
      76             :  * inode, of course, such that log replay can't cause these to be lost).
      77             :  */
      78             : int
      79     1443646 : xfs_inode_init_security(
      80             :         struct inode    *inode,
      81             :         struct inode    *dir,
      82             :         const struct qstr *qstr)
      83             : {
      84     1443646 :         return security_inode_init_security(inode, dir, qstr,
      85             :                                              &xfs_initxattrs, NULL);
      86             : }
      87             : 
      88             : static void
      89             : xfs_dentry_to_name(
      90             :         struct xfs_name *namep,
      91             :         struct dentry   *dentry)
      92             : {
      93   172284685 :         namep->name = dentry->d_name.name;
      94   172284685 :         namep->len = dentry->d_name.len;
      95   172284685 :         namep->type = XFS_DIR3_FT_UNKNOWN;
      96             : }
      97             : 
      98             : static int
      99             : xfs_dentry_mode_to_name(
     100             :         struct xfs_name *namep,
     101             :         struct dentry   *dentry,
     102             :         int             mode)
     103             : {
     104   305708632 :         namep->name = dentry->d_name.name;
     105   305708632 :         namep->len = dentry->d_name.len;
     106   611441774 :         namep->type = xfs_mode_to_ftype(mode);
     107             : 
     108   305733142 :         if (unlikely(namep->type == XFS_DIR3_FT_UNKNOWN))
     109    16064529 :                 return -EFSCORRUPTED;
     110             : 
     111             :         return 0;
     112             : }
     113             : 
     114             : STATIC void
     115           0 : xfs_cleanup_inode(
     116             :         struct inode    *dir,
     117             :         struct inode    *inode,
     118             :         struct dentry   *dentry)
     119             : {
     120           0 :         struct xfs_name teardown;
     121             : 
     122             :         /* Oh, the horror.
     123             :          * If we can't add the ACL or we fail in
     124             :          * xfs_inode_init_security we must back out.
     125             :          * ENOSPC can hit here, among other things.
     126             :          */
     127           0 :         xfs_dentry_to_name(&teardown, dentry);
     128             : 
     129           0 :         xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
     130           0 : }
     131             : 
     132             : /*
     133             :  * Check to see if we are likely to need an extended attribute to be added to
     134             :  * the inode we are about to allocate. This allows the attribute fork to be
     135             :  * created during the inode allocation, reducing the number of transactions we
     136             :  * need to do in this fast path.
     137             :  *
     138             :  * The security checks are optimistic, but not guaranteed. The two LSMs that
     139             :  * require xattrs to be added here (selinux and smack) are also the only two
     140             :  * LSMs that add a sb->s_security structure to the superblock. Hence if security
     141             :  * is enabled and sb->s_security is set, we have a pretty good idea that we are
     142             :  * going to be asked to add a security xattr immediately after allocating the
     143             :  * xfs inode and instantiating the VFS inode.
     144             :  */
     145             : static inline bool
     146             : xfs_create_need_xattr(
     147             :         struct inode    *dir,
     148             :         struct posix_acl *default_acl,
     149             :         struct posix_acl *acl)
     150             : {
     151    18065292 :         if (acl)
     152             :                 return true;
     153    18061697 :         if (default_acl)
     154           2 :                 return true;
     155             : #if IS_ENABLED(CONFIG_SECURITY)
     156             :         if (dir->i_sb->s_security)
     157             :                 return true;
     158             : #endif
     159             :         return false;
     160             : }
     161             : 
     162             : 
     163             : STATIC int
     164    19041214 : xfs_generic_create(
     165             :         struct mnt_idmap        *idmap,
     166             :         struct inode            *dir,
     167             :         struct dentry           *dentry,
     168             :         umode_t                 mode,
     169             :         dev_t                   rdev,
     170             :         struct file             *tmpfile)       /* unnamed file */
     171             : {
     172    19041214 :         struct inode    *inode;
     173    19041214 :         struct xfs_inode *ip = NULL;
     174    19041214 :         struct posix_acl *default_acl, *acl;
     175    19041214 :         struct xfs_name name;
     176    19041214 :         int             error;
     177             : 
     178             :         /*
     179             :          * Irix uses Missed'em'V split, but doesn't want to see
     180             :          * the upper 5 bits of (14bit) major.
     181             :          */
     182    19041214 :         if (S_ISCHR(mode) || S_ISBLK(mode)) {
     183     3052572 :                 if (unlikely(!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff))
     184             :                         return -EINVAL;
     185             :         } else {
     186             :                 rdev = 0;
     187             :         }
     188             : 
     189    19041214 :         error = posix_acl_create(dir, &mode, &default_acl, &acl);
     190    19041385 :         if (error)
     191             :                 return error;
     192             : 
     193             :         /* Verify mode is valid also for tmpfile case */
     194    19041398 :         error = xfs_dentry_mode_to_name(&name, dentry, mode);
     195    19041465 :         if (unlikely(error))
     196           0 :                 goto out_free_acl;
     197             : 
     198    19041465 :         if (!tmpfile) {
     199    36126989 :                 error = xfs_create(idmap, XFS_I(dir), &name, mode, rdev,
     200             :                                 xfs_create_need_xattr(dir, default_acl, acl),
     201             :                                 &ip);
     202             :         } else {
     203      976173 :                 error = xfs_create_tmpfile(idmap, XFS_I(dir), mode, &ip);
     204             :         }
     205    19041641 :         if (unlikely(error))
     206      428714 :                 goto out_free_acl;
     207             : 
     208    18612927 :         inode = VFS_I(ip);
     209             : 
     210    18612927 :         error = xfs_inode_init_security(inode, dir, &dentry->d_name);
     211    18612927 :         if (unlikely(error))
     212             :                 goto out_cleanup_inode;
     213             : 
     214    18612927 :         if (default_acl) {
     215          16 :                 error = __xfs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
     216          16 :                 if (error)
     217           0 :                         goto out_cleanup_inode;
     218             :         }
     219    18612927 :         if (acl) {
     220        3321 :                 error = __xfs_set_acl(inode, acl, ACL_TYPE_ACCESS);
     221        3321 :                 if (error)
     222           0 :                         goto out_cleanup_inode;
     223             :         }
     224             : 
     225    18612927 :         xfs_setup_iops(ip);
     226             : 
     227    18613246 :         if (tmpfile) {
     228             :                 /*
     229             :                  * The VFS requires that any inode fed to d_tmpfile must have
     230             :                  * nlink == 1 so that it can decrement the nlink in d_tmpfile.
     231             :                  * However, we created the temp file with nlink == 0 because
     232             :                  * we're not allowed to put an inode with nlink > 0 on the
     233             :                  * unlinked list.  Therefore we have to set nlink to 1 so that
     234             :                  * d_tmpfile can immediately set it back to zero.
     235             :                  */
     236      976334 :                 set_nlink(inode, 1);
     237      976334 :                 d_tmpfile(tmpfile, inode);
     238             :         } else
     239    17636912 :                 d_instantiate(dentry, inode);
     240             : 
     241    18611824 :         xfs_finish_inode_setup(ip);
     242             : 
     243    19041843 :  out_free_acl:
     244    19041843 :         posix_acl_release(default_acl);
     245    19041818 :         posix_acl_release(acl);
     246    19041818 :         return error;
     247             : 
     248           0 :  out_cleanup_inode:
     249           0 :         xfs_finish_inode_setup(ip);
     250           0 :         if (!tmpfile)
     251           0 :                 xfs_cleanup_inode(dir, inode, dentry);
     252           0 :         xfs_irele(ip);
     253           0 :         goto out_free_acl;
     254             : }
     255             : 
     256             : STATIC int
     257     3052624 : xfs_vn_mknod(
     258             :         struct mnt_idmap        *idmap,
     259             :         struct inode            *dir,
     260             :         struct dentry           *dentry,
     261             :         umode_t                 mode,
     262             :         dev_t                   rdev)
     263             : {
     264     3052624 :         return xfs_generic_create(idmap, dir, dentry, mode, rdev, NULL);
     265             : }
     266             : 
     267             : STATIC int
     268    11695673 : xfs_vn_create(
     269             :         struct mnt_idmap        *idmap,
     270             :         struct inode            *dir,
     271             :         struct dentry           *dentry,
     272             :         umode_t                 mode,
     273             :         bool                    flags)
     274             : {
     275    11695673 :         return xfs_generic_create(idmap, dir, dentry, mode, 0, NULL);
     276             : }
     277             : 
     278             : STATIC int
     279     3317290 : xfs_vn_mkdir(
     280             :         struct mnt_idmap        *idmap,
     281             :         struct inode            *dir,
     282             :         struct dentry           *dentry,
     283             :         umode_t                 mode)
     284             : {
     285     3317290 :         return xfs_generic_create(idmap, dir, dentry, mode | S_IFDIR, 0, NULL);
     286             : }
     287             : 
     288             : STATIC struct dentry *
     289   136348049 : xfs_vn_lookup(
     290             :         struct inode    *dir,
     291             :         struct dentry   *dentry,
     292             :         unsigned int flags)
     293             : {
     294   136348049 :         struct inode *inode;
     295   136348049 :         struct xfs_inode *cip;
     296   136348049 :         struct xfs_name name;
     297   136348049 :         int             error;
     298             : 
     299   136348049 :         if (dentry->d_name.len >= MAXNAMELEN)
     300             :                 return ERR_PTR(-ENAMETOOLONG);
     301             : 
     302   136352880 :         xfs_dentry_to_name(&name, dentry);
     303   136352880 :         error = xfs_lookup(XFS_I(dir), &name, &cip, NULL);
     304   136353309 :         if (likely(!error))
     305    85149322 :                 inode = VFS_I(cip);
     306    51203987 :         else if (likely(error == -ENOENT))
     307             :                 inode = NULL;
     308             :         else
     309       70370 :                 inode = ERR_PTR(error);
     310   136353309 :         return d_splice_alias(inode, dentry);
     311             : }
     312             : 
     313             : STATIC struct dentry *
     314      195894 : xfs_vn_ci_lookup(
     315             :         struct inode    *dir,
     316             :         struct dentry   *dentry,
     317             :         unsigned int flags)
     318             : {
     319      195894 :         struct xfs_inode *ip;
     320      195894 :         struct xfs_name xname;
     321      195894 :         struct xfs_name ci_name;
     322      195894 :         struct qstr     dname;
     323      195894 :         int             error;
     324             : 
     325      195894 :         if (dentry->d_name.len >= MAXNAMELEN)
     326             :                 return ERR_PTR(-ENAMETOOLONG);
     327             : 
     328      195894 :         xfs_dentry_to_name(&xname, dentry);
     329      195894 :         error = xfs_lookup(XFS_I(dir), &xname, &ip, &ci_name);
     330      195894 :         if (unlikely(error)) {
     331       93224 :                 if (unlikely(error != -ENOENT))
     332           0 :                         return ERR_PTR(error);
     333             :                 /*
     334             :                  * call d_add(dentry, NULL) here when d_drop_negative_children
     335             :                  * is called in xfs_vn_mknod (ie. allow negative dentries
     336             :                  * with CI filesystems).
     337             :                  */
     338             :                 return NULL;
     339             :         }
     340             : 
     341             :         /* if exact match, just splice and exit */
     342      102670 :         if (!ci_name.name)
     343       14574 :                 return d_splice_alias(VFS_I(ip), dentry);
     344             : 
     345             :         /* else case-insensitive match... */
     346       88096 :         dname.name = ci_name.name;
     347       88096 :         dname.len = ci_name.len;
     348       88096 :         dentry = d_add_ci(dentry, VFS_I(ip), &dname);
     349       88096 :         kmem_free(ci_name.name);
     350       88096 :         return dentry;
     351             : }
     352             : 
     353             : STATIC int
     354     3109960 : xfs_vn_link(
     355             :         struct dentry   *old_dentry,
     356             :         struct inode    *dir,
     357             :         struct dentry   *dentry)
     358             : {
     359     3109960 :         struct inode    *inode = d_inode(old_dentry);
     360     3109960 :         struct xfs_name name;
     361     3109960 :         int             error;
     362             : 
     363     3109960 :         error = xfs_dentry_mode_to_name(&name, dentry, inode->i_mode);
     364     3109974 :         if (unlikely(error))
     365             :                 return error;
     366             : 
     367     3109974 :         error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
     368     3109986 :         if (unlikely(error))
     369             :                 return error;
     370             : 
     371     3109817 :         ihold(inode);
     372     3109821 :         d_instantiate(dentry, inode);
     373     3109821 :         return 0;
     374             : }
     375             : 
     376             : STATIC int
     377    35735911 : xfs_vn_unlink(
     378             :         struct inode    *dir,
     379             :         struct dentry   *dentry)
     380             : {
     381    35735911 :         struct xfs_name name;
     382    35735911 :         int             error;
     383             : 
     384    35735911 :         xfs_dentry_to_name(&name, dentry);
     385             : 
     386    35735911 :         error = xfs_remove(XFS_I(dir), &name, XFS_I(d_inode(dentry)));
     387    35736108 :         if (error)
     388             :                 return error;
     389             : 
     390             :         /*
     391             :          * With unlink, the VFS makes the dentry "negative": no inode,
     392             :          * but still hashed. This is incompatible with case-insensitive
     393             :          * mode, so invalidate (unhash) the dentry in CI-mode.
     394             :          */
     395    34650776 :         if (xfs_has_asciici(XFS_M(dir->i_sb)))
     396       37640 :                 d_invalidate(dentry);
     397             :         return 0;
     398             : }
     399             : 
     400             : STATIC int
     401   238002986 : xfs_vn_symlink(
     402             :         struct mnt_idmap        *idmap,
     403             :         struct inode            *dir,
     404             :         struct dentry           *dentry,
     405             :         const char              *symname)
     406             : {
     407   238002986 :         struct inode    *inode;
     408   238002986 :         struct xfs_inode *cip = NULL;
     409   238002986 :         struct xfs_name name;
     410   238002986 :         int             error;
     411   238002986 :         umode_t         mode;
     412             : 
     413   238002986 :         mode = S_IFLNK |
     414   238002986 :                 (irix_symlink_mode ? 0777 & ~current_umask() : S_IRWXUGO);
     415   238002986 :         error = xfs_dentry_mode_to_name(&name, dentry, mode);
     416   238027417 :         if (unlikely(error))
     417           0 :                 goto out;
     418             : 
     419   238027417 :         error = xfs_symlink(idmap, XFS_I(dir), &name, symname, mode, &cip);
     420   238023041 :         if (unlikely(error))
     421   210744959 :                 goto out;
     422             : 
     423    27278082 :         inode = VFS_I(cip);
     424             : 
     425    27278082 :         error = xfs_inode_init_security(inode, dir, &dentry->d_name);
     426    27278082 :         if (unlikely(error))
     427             :                 goto out_cleanup_inode;
     428             : 
     429    27278082 :         xfs_setup_iops(cip);
     430             : 
     431    27279777 :         d_instantiate(dentry, inode);
     432    27277575 :         xfs_finish_inode_setup(cip);
     433    27277575 :         return 0;
     434             : 
     435             :  out_cleanup_inode:
     436             :         xfs_finish_inode_setup(cip);
     437             :         xfs_cleanup_inode(dir, inode, dentry);
     438             :         xfs_irele(cip);
     439             :  out:
     440             :         return error;
     441             : }
     442             : 
     443             : STATIC int
     444    22777144 : xfs_vn_rename(
     445             :         struct mnt_idmap        *idmap,
     446             :         struct inode            *odir,
     447             :         struct dentry           *odentry,
     448             :         struct inode            *ndir,
     449             :         struct dentry           *ndentry,
     450             :         unsigned int            flags)
     451             : {
     452    22777144 :         struct inode    *new_inode = d_inode(ndentry);
     453    22777144 :         int             omode = 0;
     454    22777144 :         int             error;
     455    22777144 :         struct xfs_name oname;
     456    22777144 :         struct xfs_name nname;
     457             : 
     458    22777144 :         if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
     459             :                 return -EINVAL;
     460             : 
     461             :         /* if we are exchanging files, we need to set i_mode of both files */
     462    22777144 :         if (flags & RENAME_EXCHANGE)
     463     6712613 :                 omode = d_inode(ndentry)->i_mode;
     464             : 
     465    22777144 :         error = xfs_dentry_mode_to_name(&oname, odentry, omode);
     466    22777144 :         if (omode && unlikely(error))
     467             :                 return error;
     468             : 
     469    22777144 :         error = xfs_dentry_mode_to_name(&nname, ndentry,
     470    22777144 :                                         d_inode(odentry)->i_mode);
     471    22777142 :         if (unlikely(error))
     472             :                 return error;
     473             : 
     474    29732284 :         return xfs_rename(idmap, XFS_I(odir), &oname,
     475             :                           XFS_I(d_inode(odentry)), XFS_I(ndir), &nname,
     476             :                           new_inode ? XFS_I(new_inode) : NULL, flags);
     477             : }
     478             : 
     479             : /*
     480             :  * careful here - this function can get called recursively, so
     481             :  * we need to be very careful about how much stack we use.
     482             :  * uio is kmalloced for this reason...
     483             :  */
     484             : STATIC const char *
     485   265931575 : xfs_vn_get_link(
     486             :         struct dentry           *dentry,
     487             :         struct inode            *inode,
     488             :         struct delayed_call     *done)
     489             : {
     490   265931575 :         char                    *link;
     491   265931575 :         int                     error = -ENOMEM;
     492             : 
     493   265931575 :         if (!dentry)
     494             :                 return ERR_PTR(-ECHILD);
     495             : 
     496   265913189 :         link = kmalloc(XFS_SYMLINK_MAXLEN+1, GFP_KERNEL);
     497   265970454 :         if (!link)
     498           0 :                 goto out_err;
     499             : 
     500   265970454 :         error = xfs_readlink(XFS_I(d_inode(dentry)), link);
     501   266009068 :         if (unlikely(error))
     502          38 :                 goto out_kfree;
     503             : 
     504   266009030 :         set_delayed_call(done, kfree_link, link);
     505   266009030 :         return link;
     506             : 
     507             :  out_kfree:
     508          38 :         kfree(link);
     509          38 :  out_err:
     510          38 :         return ERR_PTR(error);
     511             : }
     512             : 
     513             : static uint32_t
     514  1220042538 : xfs_stat_blksize(
     515             :         struct xfs_inode        *ip)
     516             : {
     517  1220042538 :         struct xfs_mount        *mp = ip->i_mount;
     518             : 
     519             :         /*
     520             :          * If the file blocks are being allocated from a realtime volume, then
     521             :          * always return the realtime extent size.
     522             :          */
     523  1220042538 :         if (XFS_IS_REALTIME_INODE(ip))
     524    71358274 :                 return XFS_FSB_TO_B(mp, xfs_get_extsz_hint(ip));
     525             : 
     526             :         /*
     527             :          * Allow large block sizes to be reported to userspace programs if the
     528             :          * "largeio" mount option is used.
     529             :          *
     530             :          * If compatibility mode is specified, simply return the basic unit of
     531             :          * caching so that we don't get inefficient read/modify/write I/O from
     532             :          * user apps. Otherwise....
     533             :          *
     534             :          * If the underlying volume is a stripe, then return the stripe width in
     535             :          * bytes as the recommended I/O size. It is not a stripe and we've set a
     536             :          * default buffered I/O size, return that, otherwise return the compat
     537             :          * default.
     538             :          */
     539  1148684264 :         if (xfs_has_large_iosize(mp)) {
     540           2 :                 if (mp->m_swidth)
     541           0 :                         return XFS_FSB_TO_B(mp, mp->m_swidth);
     542           2 :                 if (xfs_has_allocsize(mp))
     543           0 :                         return 1U << mp->m_allocsize_log;
     544             :         }
     545             : 
     546             :         return PAGE_SIZE;
     547             : }
     548             : 
     549             : STATIC int
     550  1221626415 : xfs_vn_getattr(
     551             :         struct mnt_idmap        *idmap,
     552             :         const struct path       *path,
     553             :         struct kstat            *stat,
     554             :         u32                     request_mask,
     555             :         unsigned int            query_flags)
     556             : {
     557  1221626415 :         struct inode            *inode = d_inode(path->dentry);
     558  1221626415 :         struct xfs_inode        *ip = XFS_I(inode);
     559  1221626415 :         struct xfs_mount        *mp = ip->i_mount;
     560  1221626415 :         vfsuid_t                vfsuid = i_uid_into_vfsuid(idmap, inode);
     561  1221804296 :         vfsgid_t                vfsgid = i_gid_into_vfsgid(idmap, inode);
     562             : 
     563  1221670473 :         trace_xfs_getattr(ip);
     564             : 
     565  2443634550 :         if (xfs_is_shutdown(mp))
     566             :                 return -EIO;
     567             : 
     568  1221784123 :         stat->size = XFS_ISIZE(ip);
     569  1221784123 :         stat->dev = inode->i_sb->s_dev;
     570  1221784123 :         stat->mode = inode->i_mode;
     571  1221784123 :         stat->nlink = inode->i_nlink;
     572  1221784123 :         stat->uid = vfsuid_into_kuid(vfsuid);
     573  1221784123 :         stat->gid = vfsgid_into_kgid(vfsgid);
     574  1221784123 :         stat->ino = ip->i_ino;
     575  1221784123 :         stat->atime = inode->i_atime;
     576  1221784123 :         stat->mtime = inode->i_mtime;
     577  1221784123 :         stat->ctime = inode->i_ctime;
     578  1221784123 :         stat->blocks = XFS_FSB_TO_BB(mp, ip->i_nblocks + ip->i_delayed_blks);
     579             : 
     580  1221784123 :         if (xfs_has_v3inodes(mp)) {
     581  1221652188 :                 if (request_mask & STATX_BTIME) {
     582     1578735 :                         stat->result_mask |= STATX_BTIME;
     583     1578735 :                         stat->btime = ip->i_crtime;
     584             :                 }
     585             :         }
     586             : 
     587             :         /*
     588             :          * Note: If you add another clause to set an attribute flag, please
     589             :          * update attributes_mask below.
     590             :          */
     591  1221784123 :         if (ip->i_diflags & XFS_DIFLAG_IMMUTABLE)
     592         354 :                 stat->attributes |= STATX_ATTR_IMMUTABLE;
     593  1221784123 :         if (ip->i_diflags & XFS_DIFLAG_APPEND)
     594         320 :                 stat->attributes |= STATX_ATTR_APPEND;
     595  1221784123 :         if (ip->i_diflags & XFS_DIFLAG_NODUMP)
     596          76 :                 stat->attributes |= STATX_ATTR_NODUMP;
     597             : 
     598  1221784123 :         stat->attributes_mask |= (STATX_ATTR_IMMUTABLE |
     599             :                                   STATX_ATTR_APPEND |
     600             :                                   STATX_ATTR_NODUMP);
     601             : 
     602  1221784123 :         switch (inode->i_mode & S_IFMT) {
     603     1657365 :         case S_IFBLK:
     604             :         case S_IFCHR:
     605     1657365 :                 stat->blksize = BLKDEV_IOSIZE;
     606     1657365 :                 stat->rdev = inode->i_rdev;
     607     1657365 :                 break;
     608   243194855 :         case S_IFREG:
     609   243194855 :                 if (request_mask & STATX_DIOALIGN) {
     610           0 :                         struct xfs_buftarg      *target = xfs_inode_buftarg(ip);
     611           0 :                         struct block_device     *bdev = target->bt_bdev;
     612             : 
     613           0 :                         stat->result_mask |= STATX_DIOALIGN;
     614           0 :                         stat->dio_mem_align = bdev_dma_alignment(bdev) + 1;
     615           0 :                         stat->dio_offset_align = bdev_logical_block_size(bdev);
     616             :                 }
     617  1220126758 :                 fallthrough;
     618             :         default:
     619  1220126758 :                 stat->blksize = xfs_stat_blksize(ip);
     620  1220116143 :                 stat->rdev = 0;
     621  1220116143 :                 break;
     622             :         }
     623             : 
     624             :         return 0;
     625             : }
     626             : 
     627             : static int
     628    12061139 : xfs_vn_change_ok(
     629             :         struct mnt_idmap        *idmap,
     630             :         struct dentry           *dentry,
     631             :         struct iattr            *iattr)
     632             : {
     633    12061139 :         struct xfs_mount        *mp = XFS_I(d_inode(dentry))->i_mount;
     634             : 
     635    24122278 :         if (xfs_is_readonly(mp))
     636             :                 return -EROFS;
     637             : 
     638    24122278 :         if (xfs_is_shutdown(mp))
     639             :                 return -EIO;
     640             : 
     641    12059273 :         return setattr_prepare(idmap, dentry, iattr);
     642             : }
     643             : 
     644             : /*
     645             :  * Set non-size attributes of an inode.
     646             :  *
     647             :  * Caution: The caller of this function is responsible for calling
     648             :  * setattr_prepare() or otherwise verifying the change is fine.
     649             :  */
     650             : static int
     651     7153143 : xfs_setattr_nonsize(
     652             :         struct mnt_idmap        *idmap,
     653             :         struct dentry           *dentry,
     654             :         struct xfs_inode        *ip,
     655             :         struct iattr            *iattr)
     656             : {
     657     7153143 :         xfs_mount_t             *mp = ip->i_mount;
     658     7153143 :         struct inode            *inode = VFS_I(ip);
     659     7153143 :         int                     mask = iattr->ia_valid;
     660     7153143 :         xfs_trans_t             *tp;
     661     7153143 :         int                     error;
     662     7153143 :         kuid_t                  uid = GLOBAL_ROOT_UID;
     663     7153143 :         kgid_t                  gid = GLOBAL_ROOT_GID;
     664     7153143 :         struct xfs_dquot        *udqp = NULL, *gdqp = NULL;
     665     7153143 :         struct xfs_dquot        *old_udqp = NULL, *old_gdqp = NULL;
     666             : 
     667     7153143 :         ASSERT((mask & ATTR_SIZE) == 0);
     668             : 
     669             :         /*
     670             :          * If disk quotas is on, we make sure that the dquots do exist on disk,
     671             :          * before we start any other transactions. Trying to do this later
     672             :          * is messy. We don't care to take a readlock to look at the ids
     673             :          * in inode here, because we can't hold it across the trans_reserve.
     674             :          * If the IDs do change before we take the ilock, we're covered
     675             :          * because the i_*dquot fields will get updated anyway.
     676             :          */
     677     7153143 :         if (XFS_IS_QUOTA_ON(mp) && (mask & (ATTR_UID|ATTR_GID))) {
     678     3899058 :                 uint    qflags = 0;
     679             : 
     680     3899058 :                 if ((mask & ATTR_UID) && XFS_IS_UQUOTA_ON(mp)) {
     681     3898916 :                         uid = from_vfsuid(idmap, i_user_ns(inode),
     682             :                                           iattr->ia_vfsuid);
     683     3898916 :                         qflags |= XFS_QMOPT_UQUOTA;
     684             :                 } else {
     685         142 :                         uid = inode->i_uid;
     686             :                 }
     687     3899063 :                 if ((mask & ATTR_GID) && XFS_IS_GQUOTA_ON(mp)) {
     688     3896259 :                         gid = from_vfsgid(idmap, i_user_ns(inode),
     689             :                                           iattr->ia_vfsgid);
     690     3896258 :                         qflags |= XFS_QMOPT_GQUOTA;
     691             :                 }  else {
     692        2804 :                         gid = inode->i_gid;
     693             :                 }
     694             : 
     695             :                 /*
     696             :                  * We take a reference when we initialize udqp and gdqp,
     697             :                  * so it is important that we never blindly double trip on
     698             :                  * the same variable. See xfs_create() for an example.
     699             :                  */
     700     3899062 :                 ASSERT(udqp == NULL);
     701     3899062 :                 ASSERT(gdqp == NULL);
     702     3899062 :                 error = xfs_qm_vop_dqalloc(ip, uid, gid, ip->i_projid,
     703             :                                            qflags, &udqp, &gdqp, NULL);
     704     3899047 :                 if (error)
     705             :                         return error;
     706             :         }
     707             : 
     708     7120194 :         error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
     709             :                         has_capability_noaudit(current, CAP_FOWNER), &tp);
     710     7120353 :         if (error)
     711         256 :                 goto out_dqrele;
     712             : 
     713             :         /*
     714             :          * Register quota modifications in the transaction.  Must be the owner
     715             :          * or privileged.  These IDs could have changed since we last looked at
     716             :          * them.  But, we're assured that if the ownership did change while we
     717             :          * didn't have the inode locked, inode's dquot(s) would have changed
     718             :          * also.
     719             :          */
     720    13474193 :         if (XFS_IS_UQUOTA_ON(mp) &&
     721     6354173 :             i_uid_needs_update(idmap, iattr, inode)) {
     722     3689268 :                 ASSERT(udqp);
     723     3689268 :                 old_udqp = xfs_qm_vop_chown(tp, ip, &ip->i_udquot, udqp);
     724             :         }
     725    13469932 :         if (XFS_IS_GQUOTA_ON(mp) &&
     726     6349859 :             i_gid_needs_update(idmap, iattr, inode)) {
     727     3686971 :                 ASSERT(xfs_has_pquotino(mp) || !XFS_IS_PQUOTA_ON(mp));
     728     3686971 :                 ASSERT(gdqp);
     729     3686971 :                 old_gdqp = xfs_qm_vop_chown(tp, ip, &ip->i_gdquot, gdqp);
     730             :         }
     731             : 
     732     7120065 :         setattr_copy(idmap, inode, iattr);
     733     7119959 :         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
     734             : 
     735     7120136 :         XFS_STATS_INC(mp, xs_ig_attrchg);
     736             : 
     737     7120136 :         if (xfs_has_wsync(mp))
     738         314 :                 xfs_trans_set_sync(tp);
     739     7120136 :         error = xfs_trans_commit(tp);
     740             : 
     741             :         /*
     742             :          * Release any dquot(s) the inode had kept before chown.
     743             :          */
     744     7119985 :         xfs_qm_dqrele(old_udqp);
     745     7119951 :         xfs_qm_dqrele(old_gdqp);
     746     7120079 :         xfs_qm_dqrele(udqp);
     747     7120121 :         xfs_qm_dqrele(gdqp);
     748             : 
     749     7120081 :         if (error)
     750             :                 return error;
     751             : 
     752             :         /*
     753             :          * XXX(hch): Updating the ACL entries is not atomic vs the i_mode
     754             :          *           update.  We could avoid this with linked transactions
     755             :          *           and passing down the transaction pointer all the way
     756             :          *           to attr_set.  No previous user of the generic
     757             :          *           Posix ACL code seems to care about this issue either.
     758             :          */
     759     7120079 :         if (mask & ATTR_MODE) {
     760       95066 :                 error = posix_acl_chmod(idmap, dentry, inode->i_mode);
     761       95066 :                 if (error)
     762           0 :                         return error;
     763             :         }
     764             : 
     765             :         return 0;
     766             : 
     767             : out_dqrele:
     768         256 :         xfs_qm_dqrele(udqp);
     769         256 :         xfs_qm_dqrele(gdqp);
     770         256 :         return error;
     771             : }
     772             : 
     773             : /*
     774             :  * Truncate file.  Must have write permission and not be a directory.
     775             :  *
     776             :  * Caution: The caller of this function is responsible for calling
     777             :  * setattr_prepare() or otherwise verifying the change is fine.
     778             :  */
     779             : STATIC int
     780     5034649 : xfs_setattr_size(
     781             :         struct mnt_idmap        *idmap,
     782             :         struct dentry           *dentry,
     783             :         struct xfs_inode        *ip,
     784             :         struct iattr            *iattr)
     785             : {
     786     5034649 :         struct xfs_mount        *mp = ip->i_mount;
     787     5034649 :         struct inode            *inode = VFS_I(ip);
     788     5034649 :         xfs_off_t               oldsize, newsize;
     789     5034649 :         struct xfs_trans        *tp;
     790     5034649 :         int                     error;
     791     5034649 :         uint                    lock_flags = 0;
     792     5034649 :         bool                    did_zeroing = false;
     793             : 
     794     5034649 :         ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
     795     5034650 :         ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL));
     796     5034645 :         ASSERT(S_ISREG(inode->i_mode));
     797     5034645 :         ASSERT((iattr->ia_valid & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET|
     798             :                 ATTR_MTIME_SET|ATTR_TIMES_SET)) == 0);
     799             : 
     800     5034645 :         oldsize = inode->i_size;
     801     5034645 :         newsize = iattr->ia_size;
     802             : 
     803             :         /*
     804             :          * Short circuit the truncate case for zero length files.
     805             :          */
     806     5034645 :         if (newsize == 0 && oldsize == 0 && ip->i_df.if_nextents == 0) {
     807      128640 :                 if (!(iattr->ia_valid & (ATTR_CTIME|ATTR_MTIME)))
     808             :                         return 0;
     809             : 
     810             :                 /*
     811             :                  * Use the regular setattr path to update the timestamps.
     812             :                  */
     813      128639 :                 iattr->ia_valid &= ~ATTR_SIZE;
     814      128639 :                 return xfs_setattr_nonsize(idmap, dentry, ip, iattr);
     815             :         }
     816             : 
     817             :         /*
     818             :          * Make sure that the dquots are attached to the inode.
     819             :          */
     820     4906005 :         error = xfs_qm_dqattach(ip);
     821     4905999 :         if (error)
     822             :                 return error;
     823             : 
     824             :         /*
     825             :          * Wait for all direct I/O to complete.
     826             :          */
     827     4904798 :         inode_dio_wait(inode);
     828             : 
     829             :         /*
     830             :          * File data changes must be complete before we start the transaction to
     831             :          * modify the inode.  This needs to be done before joining the inode to
     832             :          * the transaction because the inode cannot be unlocked once it is a
     833             :          * part of the transaction.
     834             :          *
     835             :          * Start with zeroing any data beyond EOF that we may expose on file
     836             :          * extension, or zeroing out the rest of the block on a downward
     837             :          * truncate.
     838             :          */
     839     4904799 :         if (newsize > oldsize) {
     840     2508860 :                 trace_xfs_zero_eof(ip, oldsize, newsize - oldsize);
     841     2508863 :                 error = xfs_zero_range(ip, oldsize, newsize - oldsize,
     842             :                                 &did_zeroing);
     843             :         } else {
     844             :                 /*
     845             :                  * iomap won't detect a dirty page over an unwritten block (or a
     846             :                  * cow block over a hole) and subsequently skips zeroing the
     847             :                  * newly post-EOF portion of the page. Flush the new EOF to
     848             :                  * convert the block before the pagecache truncate.
     849             :                  */
     850     2395939 :                 error = filemap_write_and_wait_range(inode->i_mapping, newsize,
     851             :                                                      newsize);
     852     2395941 :                 if (error)
     853             :                         return error;
     854     2395902 :                 error = xfs_truncate_page(ip, newsize, &did_zeroing);
     855             :         }
     856             : 
     857     4904765 :         if (error)
     858             :                 return error;
     859             : 
     860             :         /*
     861             :          * We've already locked out new page faults, so now we can safely remove
     862             :          * pages from the page cache knowing they won't get refaulted until we
     863             :          * drop the XFS_MMAP_EXCL lock after the extent manipulations are
     864             :          * complete. The truncate_setsize() call also cleans partial EOF page
     865             :          * PTEs on extending truncates and hence ensures sub-page block size
     866             :          * filesystems are correctly handled, too.
     867             :          *
     868             :          * We have to do all the page cache truncate work outside the
     869             :          * transaction context as the "lock" order is page lock->log space
     870             :          * reservation as defined by extent allocation in the writeback path.
     871             :          * Hence a truncate can fail with ENOMEM from xfs_trans_alloc(), but
     872             :          * having already truncated the in-memory version of the file (i.e. made
     873             :          * user visible changes). There's not much we can do about this, except
     874             :          * to hope that the caller sees ENOMEM and retries the truncate
     875             :          * operation.
     876             :          *
     877             :          * And we update in-core i_size and truncate page cache beyond newsize
     878             :          * before writeback the [i_disk_size, newsize] range, so we're
     879             :          * guaranteed not to write stale data past the new EOF on truncate down.
     880             :          */
     881     4904579 :         truncate_setsize(inode, newsize);
     882             : 
     883             :         /*
     884             :          * We are going to log the inode size change in this transaction so
     885             :          * any previous writes that are beyond the on disk EOF and the new
     886             :          * EOF that have not been written out need to be written here.  If we
     887             :          * do not write the data out, we expose ourselves to the null files
     888             :          * problem. Note that this includes any block zeroing we did above;
     889             :          * otherwise those blocks may not be zeroed after a crash.
     890             :          */
     891     4904578 :         if (did_zeroing ||
     892     3239765 :             (newsize > ip->i_disk_size && oldsize != ip->i_disk_size)) {
     893     1742687 :                 error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping,
     894             :                                                 ip->i_disk_size, newsize - 1);
     895     1742686 :                 if (error)
     896             :                         return error;
     897             :         }
     898             : 
     899     4904055 :         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
     900     4904066 :         if (error)
     901             :                 return error;
     902             : 
     903     4904032 :         lock_flags |= XFS_ILOCK_EXCL;
     904     4904032 :         xfs_ilock(ip, XFS_ILOCK_EXCL);
     905     4904029 :         xfs_trans_ijoin(tp, ip, 0);
     906             : 
     907             :         /*
     908             :          * Only change the c/mtime if we are changing the size or we are
     909             :          * explicitly asked to change it.  This handles the semantic difference
     910             :          * between truncate() and ftruncate() as implemented in the VFS.
     911             :          *
     912             :          * The regular truncate() case without ATTR_CTIME and ATTR_MTIME is a
     913             :          * special case where we need to update the times despite not having
     914             :          * these flags set.  For all other operations the VFS set these flags
     915             :          * explicitly if it wants a timestamp update.
     916             :          */
     917     4904022 :         if (newsize != oldsize &&
     918     4883730 :             !(iattr->ia_valid & (ATTR_CTIME | ATTR_MTIME))) {
     919     7307090 :                 iattr->ia_ctime = iattr->ia_mtime =
     920     3653544 :                         current_time(inode);
     921     3653546 :                 iattr->ia_valid |= ATTR_CTIME | ATTR_MTIME;
     922             :         }
     923             : 
     924             :         /*
     925             :          * The first thing we do is set the size to new_size permanently on
     926             :          * disk.  This way we don't have to worry about anyone ever being able
     927             :          * to look at the data being freed even in the face of a crash.
     928             :          * What we're getting around here is the case where we free a block, it
     929             :          * is allocated to another file, it is written to, and then we crash.
     930             :          * If the new data gets written to the file but the log buffers
     931             :          * containing the free and reallocation don't, then we'd end up with
     932             :          * garbage in the blocks being freed.  As long as we make the new size
     933             :          * permanent before actually freeing any blocks it doesn't matter if
     934             :          * they get written to.
     935             :          */
     936     4904024 :         ip->i_disk_size = newsize;
     937     4904024 :         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
     938             : 
     939     4904032 :         if (newsize <= oldsize) {
     940     2395677 :                 error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, newsize);
     941     2395675 :                 if (error)
     942         496 :                         goto out_trans_cancel;
     943             : 
     944             :                 /*
     945             :                  * Truncated "down", so we're removing references to old data
     946             :                  * here - if we delay flushing for a long time, we expose
     947             :                  * ourselves unduly to the notorious NULL files problem.  So,
     948             :                  * we mark this inode and flush it when the file is closed,
     949             :                  * and do not wait the usual (long) time for writeout.
     950             :                  */
     951     2395179 :                 xfs_iflags_set(ip, XFS_ITRUNCATED);
     952             : 
     953             :                 /* A truncate down always removes post-EOF blocks. */
     954     2395180 :                 xfs_inode_clear_eofblocks_tag(ip);
     955             :         }
     956             : 
     957     4903533 :         ASSERT(!(iattr->ia_valid & (ATTR_UID | ATTR_GID)));
     958     4903533 :         setattr_copy(idmap, inode, iattr);
     959     4903528 :         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
     960             : 
     961     4903533 :         XFS_STATS_INC(mp, xs_ig_attrchg);
     962             : 
     963     4903534 :         if (xfs_has_wsync(mp))
     964           0 :                 xfs_trans_set_sync(tp);
     965             : 
     966     4903534 :         error = xfs_trans_commit(tp);
     967     4904026 : out_unlock:
     968     4904026 :         if (lock_flags)
     969     4904026 :                 xfs_iunlock(ip, lock_flags);
     970     4904026 :         return error;
     971             : 
     972             : out_trans_cancel:
     973         496 :         xfs_trans_cancel(tp);
     974         496 :         goto out_unlock;
     975             : }
     976             : 
     977             : int
     978     5034653 : xfs_vn_setattr_size(
     979             :         struct mnt_idmap        *idmap,
     980             :         struct dentry           *dentry,
     981             :         struct iattr            *iattr)
     982             : {
     983     5034653 :         struct xfs_inode        *ip = XFS_I(d_inode(dentry));
     984     5034653 :         int error;
     985             : 
     986     5034653 :         trace_xfs_setattr(ip);
     987             : 
     988     5034654 :         error = xfs_vn_change_ok(idmap, dentry, iattr);
     989     5034646 :         if (error)
     990             :                 return error;
     991     5034632 :         return xfs_setattr_size(idmap, dentry, ip, iattr);
     992             : }
     993             : 
     994             : STATIC int
     995    10128226 : xfs_vn_setattr(
     996             :         struct mnt_idmap        *idmap,
     997             :         struct dentry           *dentry,
     998             :         struct iattr            *iattr)
     999             : {
    1000    10128226 :         struct inode            *inode = d_inode(dentry);
    1001    10128226 :         struct xfs_inode        *ip = XFS_I(inode);
    1002    10128226 :         int                     error;
    1003             : 
    1004    10128226 :         if (iattr->ia_valid & ATTR_SIZE) {
    1005     3101702 :                 uint                    iolock;
    1006             : 
    1007     3101702 :                 xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
    1008     3101709 :                 iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
    1009             : 
    1010     3101709 :                 error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP);
    1011     3101708 :                 if (error) {
    1012           0 :                         xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
    1013           0 :                         return error;
    1014             :                 }
    1015             : 
    1016     3101708 :                 error = xfs_vn_setattr_size(idmap, dentry, iattr);
    1017     3101712 :                 xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
    1018             :         } else {
    1019     7026524 :                 trace_xfs_setattr(ip);
    1020             : 
    1021     7026508 :                 error = xfs_vn_change_ok(idmap, dentry, iattr);
    1022     7026469 :                 if (!error)
    1023     7024504 :                         error = xfs_setattr_nonsize(idmap, dentry, ip, iattr);
    1024             :         }
    1025             : 
    1026             :         return error;
    1027             : }
    1028             : 
    1029             : STATIC int
    1030    59137892 : xfs_vn_update_time(
    1031             :         struct inode            *inode,
    1032             :         struct timespec64       *now,
    1033             :         int                     flags)
    1034             : {
    1035    59137892 :         struct xfs_inode        *ip = XFS_I(inode);
    1036    59137892 :         struct xfs_mount        *mp = ip->i_mount;
    1037    59137892 :         int                     log_flags = XFS_ILOG_TIMESTAMP;
    1038    59137892 :         struct xfs_trans        *tp;
    1039    59137892 :         int                     error;
    1040             : 
    1041    59137892 :         trace_xfs_update_time(ip);
    1042             : 
    1043    59138054 :         if (inode->i_sb->s_flags & SB_LAZYTIME) {
    1044          49 :                 if (!((flags & S_VERSION) &&
    1045          12 :                       inode_maybe_inc_iversion(inode, false)))
    1046          25 :                         return generic_update_time(inode, now, flags);
    1047             : 
    1048             :                 /* Capture the iversion update that just occurred */
    1049             :                 log_flags |= XFS_ILOG_CORE;
    1050             :         }
    1051             : 
    1052    59138029 :         error = xfs_trans_alloc(mp, &M_RES(mp)->tr_fsyncts, 0, 0, 0, &tp);
    1053    59140349 :         if (error)
    1054             :                 return error;
    1055             : 
    1056    59139665 :         xfs_ilock(ip, XFS_ILOCK_EXCL);
    1057    59139970 :         if (flags & S_CTIME)
    1058    22878181 :                 inode->i_ctime = *now;
    1059    59139970 :         if (flags & S_MTIME)
    1060    23072170 :                 inode->i_mtime = *now;
    1061    59139970 :         if (flags & S_ATIME)
    1062    36067723 :                 inode->i_atime = *now;
    1063             : 
    1064    59139970 :         xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
    1065    59138021 :         xfs_trans_log_inode(tp, ip, log_flags);
    1066    59139927 :         return xfs_trans_commit(tp);
    1067             : }
    1068             : 
    1069             : STATIC int
    1070      875096 : xfs_vn_fiemap(
    1071             :         struct inode            *inode,
    1072             :         struct fiemap_extent_info *fieinfo,
    1073             :         u64                     start,
    1074             :         u64                     length)
    1075             : {
    1076      875096 :         int                     error;
    1077             : 
    1078      875096 :         xfs_ilock(XFS_I(inode), XFS_IOLOCK_SHARED);
    1079      875095 :         if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) {
    1080      411314 :                 fieinfo->fi_flags &= ~FIEMAP_FLAG_XATTR;
    1081      411314 :                 error = iomap_fiemap(inode, fieinfo, start, length,
    1082             :                                 &xfs_xattr_iomap_ops);
    1083             :         } else {
    1084      463781 :                 error = iomap_fiemap(inode, fieinfo, start, length,
    1085             :                                 &xfs_read_iomap_ops);
    1086             :         }
    1087      875098 :         xfs_iunlock(XFS_I(inode), XFS_IOLOCK_SHARED);
    1088             : 
    1089      875097 :         return error;
    1090             : }
    1091             : 
    1092             : STATIC int
    1093      976289 : xfs_vn_tmpfile(
    1094             :         struct mnt_idmap        *idmap,
    1095             :         struct inode            *dir,
    1096             :         struct file             *file,
    1097             :         umode_t                 mode)
    1098             : {
    1099      976289 :         int err = xfs_generic_create(idmap, dir, file->f_path.dentry, mode, 0, file);
    1100             : 
    1101      976203 :         return finish_open_simple(file, err);
    1102             : }
    1103             : 
    1104             : static const struct inode_operations xfs_inode_operations = {
    1105             :         .get_inode_acl          = xfs_get_acl,
    1106             :         .set_acl                = xfs_set_acl,
    1107             :         .getattr                = xfs_vn_getattr,
    1108             :         .setattr                = xfs_vn_setattr,
    1109             :         .listxattr              = xfs_vn_listxattr,
    1110             :         .fiemap                 = xfs_vn_fiemap,
    1111             :         .update_time            = xfs_vn_update_time,
    1112             :         .fileattr_get           = xfs_fileattr_get,
    1113             :         .fileattr_set           = xfs_fileattr_set,
    1114             : };
    1115             : 
    1116             : static const struct inode_operations xfs_dir_inode_operations = {
    1117             :         .create                 = xfs_vn_create,
    1118             :         .lookup                 = xfs_vn_lookup,
    1119             :         .link                   = xfs_vn_link,
    1120             :         .unlink                 = xfs_vn_unlink,
    1121             :         .symlink                = xfs_vn_symlink,
    1122             :         .mkdir                  = xfs_vn_mkdir,
    1123             :         /*
    1124             :          * Yes, XFS uses the same method for rmdir and unlink.
    1125             :          *
    1126             :          * There are some subtile differences deeper in the code,
    1127             :          * but we use S_ISDIR to check for those.
    1128             :          */
    1129             :         .rmdir                  = xfs_vn_unlink,
    1130             :         .mknod                  = xfs_vn_mknod,
    1131             :         .rename                 = xfs_vn_rename,
    1132             :         .get_inode_acl          = xfs_get_acl,
    1133             :         .set_acl                = xfs_set_acl,
    1134             :         .getattr                = xfs_vn_getattr,
    1135             :         .setattr                = xfs_vn_setattr,
    1136             :         .listxattr              = xfs_vn_listxattr,
    1137             :         .update_time            = xfs_vn_update_time,
    1138             :         .tmpfile                = xfs_vn_tmpfile,
    1139             :         .fileattr_get           = xfs_fileattr_get,
    1140             :         .fileattr_set           = xfs_fileattr_set,
    1141             : };
    1142             : 
    1143             : static const struct inode_operations xfs_dir_ci_inode_operations = {
    1144             :         .create                 = xfs_vn_create,
    1145             :         .lookup                 = xfs_vn_ci_lookup,
    1146             :         .link                   = xfs_vn_link,
    1147             :         .unlink                 = xfs_vn_unlink,
    1148             :         .symlink                = xfs_vn_symlink,
    1149             :         .mkdir                  = xfs_vn_mkdir,
    1150             :         /*
    1151             :          * Yes, XFS uses the same method for rmdir and unlink.
    1152             :          *
    1153             :          * There are some subtile differences deeper in the code,
    1154             :          * but we use S_ISDIR to check for those.
    1155             :          */
    1156             :         .rmdir                  = xfs_vn_unlink,
    1157             :         .mknod                  = xfs_vn_mknod,
    1158             :         .rename                 = xfs_vn_rename,
    1159             :         .get_inode_acl          = xfs_get_acl,
    1160             :         .set_acl                = xfs_set_acl,
    1161             :         .getattr                = xfs_vn_getattr,
    1162             :         .setattr                = xfs_vn_setattr,
    1163             :         .listxattr              = xfs_vn_listxattr,
    1164             :         .update_time            = xfs_vn_update_time,
    1165             :         .tmpfile                = xfs_vn_tmpfile,
    1166             :         .fileattr_get           = xfs_fileattr_get,
    1167             :         .fileattr_set           = xfs_fileattr_set,
    1168             : };
    1169             : 
    1170             : static const struct inode_operations xfs_symlink_inode_operations = {
    1171             :         .get_link               = xfs_vn_get_link,
    1172             :         .getattr                = xfs_vn_getattr,
    1173             :         .setattr                = xfs_vn_setattr,
    1174             :         .listxattr              = xfs_vn_listxattr,
    1175             :         .update_time            = xfs_vn_update_time,
    1176             : };
    1177             : 
    1178             : /* Figure out if this file actually supports DAX. */
    1179             : static bool
    1180             : xfs_inode_supports_dax(
    1181             :         struct xfs_inode        *ip)
    1182             : {
    1183             :         struct xfs_mount        *mp = ip->i_mount;
    1184             : 
    1185             :         /* Only supported on regular files. */
    1186             :         if (!S_ISREG(VFS_I(ip)->i_mode))
    1187             :                 return false;
    1188             : 
    1189             :         /* Block size must match page size */
    1190             :         if (mp->m_sb.sb_blocksize != PAGE_SIZE)
    1191             :                 return false;
    1192             : 
    1193             :         /* Device has to support DAX too. */
    1194             :         return xfs_inode_buftarg(ip)->bt_daxdev != NULL;
    1195             : }
    1196             : 
    1197             : static bool
    1198             : xfs_inode_should_enable_dax(
    1199             :         struct xfs_inode *ip)
    1200             : {
    1201             :         if (!IS_ENABLED(CONFIG_FS_DAX))
    1202             :                 return false;
    1203             :         if (xfs_has_dax_never(ip->i_mount))
    1204             :                 return false;
    1205             :         if (!xfs_inode_supports_dax(ip))
    1206             :                 return false;
    1207             :         if (xfs_has_dax_always(ip->i_mount))
    1208             :                 return true;
    1209             :         if (ip->i_diflags2 & XFS_DIFLAG2_DAX)
    1210             :                 return true;
    1211             :         return false;
    1212             : }
    1213             : 
    1214             : void
    1215   989100876 : xfs_diflags_to_iflags(
    1216             :         struct xfs_inode        *ip,
    1217             :         bool init)
    1218             : {
    1219   989100876 :         struct inode            *inode = VFS_I(ip);
    1220   989100876 :         unsigned int            xflags = xfs_ip2xflags(ip);
    1221   989324369 :         unsigned int            flags = 0;
    1222             : 
    1223   989324369 :         ASSERT(!(IS_DAX(inode) && init));
    1224             : 
    1225   989324369 :         if (xflags & FS_XFLAG_IMMUTABLE)
    1226          54 :                 flags |= S_IMMUTABLE;
    1227   989324369 :         if (xflags & FS_XFLAG_APPEND)
    1228          46 :                 flags |= S_APPEND;
    1229   989324369 :         if (xflags & FS_XFLAG_SYNC)
    1230          28 :                 flags |= S_SYNC;
    1231   989324369 :         if (xflags & FS_XFLAG_NOATIME)
    1232          14 :                 flags |= S_NOATIME;
    1233   989324369 :         if (init && xfs_inode_should_enable_dax(ip))
    1234             :                 flags |= S_DAX;
    1235             : 
    1236             :         /*
    1237             :          * S_DAX can only be set during inode initialization and is never set by
    1238             :          * the VFS, so we cannot mask off S_DAX in i_flags.
    1239             :          */
    1240   989324369 :         inode->i_flags &= ~(S_IMMUTABLE | S_APPEND | S_SYNC | S_NOATIME);
    1241   989324369 :         inode->i_flags |= flags;
    1242   989324369 : }
    1243             : 
    1244             : /*
    1245             :  * Initialize the Linux inode.
    1246             :  *
    1247             :  * When reading existing inodes from disk this is called directly from xfs_iget,
    1248             :  * when creating a new inode it is called from xfs_init_new_inode after setting
    1249             :  * up the inode. These callers have different criteria for clearing XFS_INEW, so
    1250             :  * leave it up to the caller to deal with unlocking the inode appropriately.
    1251             :  */
    1252             : void
    1253   988491133 : xfs_setup_inode(
    1254             :         struct xfs_inode        *ip)
    1255             : {
    1256   988491133 :         struct inode            *inode = &ip->i_vnode;
    1257   988491133 :         gfp_t                   gfp_mask;
    1258             : 
    1259   988491133 :         inode->i_ino = ip->i_ino;
    1260   988491133 :         inode->i_state |= I_NEW;
    1261             : 
    1262   988491133 :         inode_sb_list_add(inode);
    1263             :         /* make the inode look hashed for the writeback code */
    1264   988854757 :         inode_fake_hash(inode);
    1265             : 
    1266   988854757 :         i_size_write(inode, ip->i_disk_size);
    1267   988854757 :         xfs_diflags_to_iflags(ip, true);
    1268             : 
    1269   988824970 :         if (S_ISDIR(inode->i_mode)) {
    1270             :                 /*
    1271             :                  * We set the i_rwsem class here to avoid potential races with
    1272             :                  * lockdep_annotate_inode_mutex_key() reinitialising the lock
    1273             :                  * after a filehandle lookup has already found the inode in
    1274             :                  * cache before it has been unlocked via unlock_new_inode().
    1275             :                  */
    1276             :                 lockdep_set_class(&inode->i_rwsem,
    1277             :                                   &inode->i_sb->s_type->i_mutex_dir_key);
    1278             :                 lockdep_set_class(&ip->i_lock.mr_lock, &xfs_dir_ilock_class);
    1279             :         } else {
    1280   988824970 :                 lockdep_set_class(&ip->i_lock.mr_lock, &xfs_nondir_ilock_class);
    1281             :         }
    1282             : 
    1283             :         /*
    1284             :          * Ensure all page cache allocations are done from GFP_NOFS context to
    1285             :          * prevent direct reclaim recursion back into the filesystem and blowing
    1286             :          * stacks or deadlocking.
    1287             :          */
    1288   988824970 :         gfp_mask = mapping_gfp_mask(inode->i_mapping);
    1289   988824970 :         mapping_set_gfp_mask(inode->i_mapping, (gfp_mask & ~(__GFP_FS)));
    1290             : 
    1291             :         /*
    1292             :          * If there is no attribute fork no ACL can exist on this inode,
    1293             :          * and it can't have any file capabilities attached to it either.
    1294             :          */
    1295   988824970 :         if (!xfs_inode_has_attr_fork(ip)) {
    1296   904416426 :                 inode_has_no_xattr(inode);
    1297   904431746 :                 cache_no_acl(inode);
    1298             :         }
    1299   988840290 : }
    1300             : 
    1301             : void
    1302   988830398 : xfs_setup_iops(
    1303             :         struct xfs_inode        *ip)
    1304             : {
    1305   988830398 :         struct inode            *inode = &ip->i_vnode;
    1306             : 
    1307   988830398 :         switch (inode->i_mode & S_IFMT) {
    1308   287310008 :         case S_IFREG:
    1309   287310008 :                 inode->i_op = &xfs_inode_operations;
    1310   287310008 :                 inode->i_fop = &xfs_file_operations;
    1311   287310008 :                 if (IS_DAX(inode))
    1312             :                         inode->i_mapping->a_ops = &xfs_dax_aops;
    1313             :                 else
    1314   287310008 :                         inode->i_mapping->a_ops = &xfs_address_space_operations;
    1315             :                 break;
    1316   143530553 :         case S_IFDIR:
    1317   143530553 :                 if (xfs_has_asciici(XFS_M(inode->i_sb)))
    1318         108 :                         inode->i_op = &xfs_dir_ci_inode_operations;
    1319             :                 else
    1320   143530445 :                         inode->i_op = &xfs_dir_inode_operations;
    1321   143530553 :                 inode->i_fop = &xfs_dir_file_operations;
    1322   143530553 :                 break;
    1323    92754734 :         case S_IFLNK:
    1324    92754734 :                 inode->i_op = &xfs_symlink_inode_operations;
    1325    92754734 :                 break;
    1326   465235103 :         default:
    1327   465235103 :                 inode->i_op = &xfs_inode_operations;
    1328   465235103 :                 init_special_inode(inode, inode->i_mode, inode->i_rdev);
    1329   465235103 :                 break;
    1330             :         }
    1331   988842967 : }

Generated by: LCOV version 1.14