LCOV - code coverage report
Current view: top level - fs/xfs - xfs_quota.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwa @ Mon Jul 31 20:08:17 PDT 2023 Lines: 3 4 75.0 %
Date: 2023-07-31 20:08:17 Functions: 1 1 100.0 %

          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             : #ifndef __XFS_QUOTA_H__
       7             : #define __XFS_QUOTA_H__
       8             : 
       9             : #include "xfs_quota_defs.h"
      10             : 
      11             : /*
      12             :  * Kernel only quota definitions and functions
      13             :  */
      14             : 
      15             : struct xfs_trans;
      16             : struct xfs_buf;
      17             : 
      18             : /*
      19             :  * This check is done typically without holding the inode lock;
      20             :  * that may seem racy, but it is harmless in the context that it is used.
      21             :  * The inode cannot go inactive as long a reference is kept, and
      22             :  * therefore if dquot(s) were attached, they'll stay consistent.
      23             :  * If, for example, the ownership of the inode changes while
      24             :  * we didn't have the inode locked, the appropriate dquot(s) will be
      25             :  * attached atomically.
      26             :  */
      27             : #define XFS_NOT_DQATTACHED(mp, ip) \
      28             :         ((XFS_IS_UQUOTA_ON(mp) && (ip)->i_udquot == NULL) || \
      29             :          (XFS_IS_GQUOTA_ON(mp) && (ip)->i_gdquot == NULL) || \
      30             :          (XFS_IS_PQUOTA_ON(mp) && (ip)->i_pdquot == NULL))
      31             : 
      32             : #define XFS_QM_NEED_QUOTACHECK(mp) \
      33             :         ((XFS_IS_UQUOTA_ON(mp) && \
      34             :                 (mp->m_sb.sb_qflags & XFS_UQUOTA_CHKD) == 0) || \
      35             :          (XFS_IS_GQUOTA_ON(mp) && \
      36             :                 (mp->m_sb.sb_qflags & XFS_GQUOTA_CHKD) == 0) || \
      37             :          (XFS_IS_PQUOTA_ON(mp) && \
      38             :                 (mp->m_sb.sb_qflags & XFS_PQUOTA_CHKD) == 0))
      39             : 
      40             : static inline uint
      41             : xfs_quota_chkd_flag(
      42             :         xfs_dqtype_t            type)
      43             : {
      44           0 :         switch (type) {
      45             :         case XFS_DQTYPE_USER:
      46             :                 return XFS_UQUOTA_CHKD;
      47             :         case XFS_DQTYPE_GROUP:
      48             :                 return XFS_GQUOTA_CHKD;
      49             :         case XFS_DQTYPE_PROJ:
      50             :                 return XFS_PQUOTA_CHKD;
      51             :         default:
      52             :                 return 0;
      53             :         }
      54             : }
      55             : 
      56             : /*
      57             :  * The structure kept inside the xfs_trans_t keep track of dquot changes
      58             :  * within a transaction and apply them later.
      59             :  */
      60             : struct xfs_dqtrx {
      61             :         struct xfs_dquot *qt_dquot;       /* the dquot this refers to */
      62             : 
      63             :         uint64_t        qt_blk_res;       /* blks reserved on a dquot */
      64             :         int64_t         qt_bcount_delta;  /* dquot blk count changes */
      65             :         int64_t         qt_delbcnt_delta; /* delayed dquot blk count changes */
      66             : 
      67             :         uint64_t        qt_rtblk_res;     /* # blks reserved on a dquot */
      68             :         uint64_t        qt_rtblk_res_used;/* # blks used from reservation */
      69             :         int64_t         qt_rtbcount_delta;/* dquot realtime blk changes */
      70             :         int64_t         qt_delrtb_delta;  /* delayed RT blk count changes */
      71             : 
      72             :         uint64_t        qt_ino_res;       /* inode reserved on a dquot */
      73             :         uint64_t        qt_ino_res_used;  /* inodes used from the reservation */
      74             :         int64_t         qt_icount_delta;  /* dquot inode count changes */
      75             : };
      76             : 
      77             : #ifdef CONFIG_XFS_QUOTA
      78             : extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *);
      79             : extern void xfs_trans_free_dqinfo(struct xfs_trans *);
      80             : extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *,
      81             :                 uint, int64_t);
      82             : extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *);
      83             : extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *);
      84             : int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, struct xfs_inode *ip,
      85             :                 int64_t dblocks, int64_t rblocks, bool force);
      86             : extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
      87             :                 struct xfs_mount *, struct xfs_dquot *,
      88             :                 struct xfs_dquot *, struct xfs_dquot *, int64_t, long, uint);
      89             : int xfs_trans_reserve_quota_icreate(struct xfs_trans *tp,
      90             :                 struct xfs_dquot *udqp, struct xfs_dquot *gdqp,
      91             :                 struct xfs_dquot *pdqp, int64_t dblocks);
      92             : 
      93             : extern int xfs_qm_vop_dqalloc(struct xfs_inode *, kuid_t, kgid_t,
      94             :                 prid_t, uint, struct xfs_dquot **, struct xfs_dquot **,
      95             :                 struct xfs_dquot **);
      96             : extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *,
      97             :                 struct xfs_dquot *, struct xfs_dquot *, struct xfs_dquot *);
      98             : extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **);
      99             : extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *,
     100             :                 struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *);
     101             : extern int xfs_qm_dqattach(struct xfs_inode *);
     102             : extern int xfs_qm_dqattach_locked(struct xfs_inode *ip, bool doalloc);
     103             : extern void xfs_qm_dqdetach(struct xfs_inode *);
     104             : extern void xfs_qm_dqrele(struct xfs_dquot *);
     105             : extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
     106             : extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
     107             : extern void xfs_qm_mount_quotas(struct xfs_mount *);
     108             : extern void xfs_qm_unmount(struct xfs_mount *);
     109             : extern void xfs_qm_unmount_quotas(struct xfs_mount *);
     110             : 
     111             : static inline int
     112             : xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t blocks)
     113             : {
     114    16737770 :         return xfs_trans_reserve_quota_nblks(NULL, ip, blocks, 0, false);
     115             : }
     116             : bool xfs_inode_near_dquot_enforcement(struct xfs_inode *ip, xfs_dqtype_t type);
     117             : #else
     118             : static inline int
     119             : xfs_qm_vop_dqalloc(struct xfs_inode *ip, kuid_t kuid, kgid_t kgid,
     120             :                 prid_t prid, uint flags, struct xfs_dquot **udqp,
     121             :                 struct xfs_dquot **gdqp, struct xfs_dquot **pdqp)
     122             : {
     123             :         *udqp = NULL;
     124             :         *gdqp = NULL;
     125             :         *pdqp = NULL;
     126             :         return 0;
     127             : }
     128             : #define xfs_trans_dup_dqinfo(tp, tp2)
     129             : #define xfs_trans_free_dqinfo(tp)
     130             : #define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) do { } while (0)
     131             : #define xfs_trans_apply_dquot_deltas(tp)
     132             : #define xfs_trans_unreserve_and_mod_dquots(tp)
     133             : static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp,
     134             :                 struct xfs_inode *ip, int64_t dblocks, int64_t rblocks,
     135             :                 bool force)
     136             : {
     137             :         return 0;
     138             : }
     139             : static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp,
     140             :                 struct xfs_mount *mp, struct xfs_dquot *udqp,
     141             :                 struct xfs_dquot *gdqp, struct xfs_dquot *pdqp,
     142             :                 int64_t nblks, long nions, uint flags)
     143             : {
     144             :         return 0;
     145             : }
     146             : 
     147             : static inline int
     148             : xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t blocks)
     149             : {
     150             :         return 0;
     151             : }
     152             : 
     153             : static inline int
     154             : xfs_trans_reserve_quota_icreate(struct xfs_trans *tp, struct xfs_dquot *udqp,
     155             :                 struct xfs_dquot *gdqp, struct xfs_dquot *pdqp, int64_t dblocks)
     156             : {
     157             :         return 0;
     158             : }
     159             : 
     160             : #define xfs_qm_vop_create_dqattach(tp, ip, u, g, p)
     161             : #define xfs_qm_vop_rename_dqattach(it)                                  (0)
     162             : #define xfs_qm_vop_chown(tp, ip, old, new)                              (NULL)
     163             : #define xfs_qm_dqattach(ip)                                             (0)
     164             : #define xfs_qm_dqattach_locked(ip, fl)                                  (0)
     165             : #define xfs_qm_dqdetach(ip)
     166             : #define xfs_qm_dqrele(d)                        do { (d) = (d); } while(0)
     167             : #define xfs_qm_statvfs(ip, s)                   do { } while(0)
     168             : #define xfs_qm_newmount(mp, a, b)                                       (0)
     169             : #define xfs_qm_mount_quotas(mp)
     170             : #define xfs_qm_unmount(mp)
     171             : #define xfs_qm_unmount_quotas(mp)
     172             : #define xfs_inode_near_dquot_enforcement(ip, type)                      (false)
     173             : #endif /* CONFIG_XFS_QUOTA */
     174             : 
     175             : static inline int
     176     2246940 : xfs_quota_unreserve_blkres(struct xfs_inode *ip, int64_t blocks)
     177             : {
     178     2246940 :         return xfs_quota_reserve_blkres(ip, -blocks);
     179             : }
     180             : 
     181             : extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
     182             : 
     183             : #endif  /* __XFS_QUOTA_H__ */

Generated by: LCOV version 1.14