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-acha @ Mon Jul 31 20:08:06 PDT 2023 Lines: 4 4 100.0 %
Date: 2023-07-31 20:08:07 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       22857 :         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             : enum xfs_apply_dqtrx_type {
      78             :         XFS_APPLY_DQTRX_COMMIT = 0,
      79             :         XFS_APPLY_DQTRX_UNRESERVE,
      80             : };
      81             : 
      82             : /*
      83             :  * Parameters for applying dqtrx changes to a dquot.  The hook function arg
      84             :  * parameter is enum xfs_apply_dqtrx_type.
      85             :  */
      86             : struct xfs_apply_dqtrx_params {
      87             :         uintptr_t               tx_id;
      88             :         xfs_ino_t               ino;
      89             :         xfs_dqtype_t            q_type;
      90             :         xfs_dqid_t              q_id;
      91             : };
      92             : 
      93             : #ifdef CONFIG_XFS_QUOTA
      94             : extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *);
      95             : extern void xfs_trans_free_dqinfo(struct xfs_trans *);
      96             : extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *,
      97             :                 uint, int64_t);
      98             : extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *);
      99             : extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *);
     100             : int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, struct xfs_inode *ip,
     101             :                 int64_t dblocks, int64_t rblocks, bool force);
     102             : extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
     103             :                 struct xfs_mount *, struct xfs_dquot *,
     104             :                 struct xfs_dquot *, struct xfs_dquot *, int64_t, long, uint);
     105             : int xfs_trans_reserve_quota_icreate(struct xfs_trans *tp,
     106             :                 struct xfs_dquot *udqp, struct xfs_dquot *gdqp,
     107             :                 struct xfs_dquot *pdqp, int64_t dblocks);
     108             : 
     109             : extern int xfs_qm_vop_dqalloc(struct xfs_inode *, kuid_t, kgid_t,
     110             :                 prid_t, uint, struct xfs_dquot **, struct xfs_dquot **,
     111             :                 struct xfs_dquot **);
     112             : extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *,
     113             :                 struct xfs_dquot *, struct xfs_dquot *, struct xfs_dquot *);
     114             : extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **);
     115             : extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *,
     116             :                 struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *);
     117             : extern int xfs_qm_dqattach(struct xfs_inode *);
     118             : extern int xfs_qm_dqattach_locked(struct xfs_inode *ip, bool doalloc);
     119             : extern void xfs_qm_dqdetach(struct xfs_inode *);
     120             : extern void xfs_qm_dqrele(struct xfs_dquot *);
     121             : extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
     122             : extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
     123             : extern void xfs_qm_mount_quotas(struct xfs_mount *);
     124             : extern void xfs_qm_unmount(struct xfs_mount *);
     125             : extern void xfs_qm_unmount_quotas(struct xfs_mount *);
     126             : 
     127             : static inline int
     128             : xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t blocks)
     129             : {
     130    18950631 :         return xfs_trans_reserve_quota_nblks(NULL, ip, blocks, 0, false);
     131             : }
     132             : bool xfs_inode_near_dquot_enforcement(struct xfs_inode *ip, xfs_dqtype_t type);
     133             : 
     134             : # ifdef CONFIG_XFS_LIVE_HOOKS
     135             : void xfs_trans_mod_ino_dquot(struct xfs_trans *tp, struct xfs_inode *ip,
     136             :                 struct xfs_dquot *dqp, unsigned int field, int64_t delta);
     137             : 
     138             : struct xfs_quotainfo;
     139             : 
     140             : struct xfs_dqtrx_hook {
     141             :         struct xfs_hook         mod_hook;
     142             :         struct xfs_hook         apply_hook;
     143             : };
     144             : 
     145             : void xfs_dqtrx_hook_disable(void);
     146             : void xfs_dqtrx_hook_enable(void);
     147             : 
     148             : int xfs_dqtrx_hook_add(struct xfs_quotainfo *qi, struct xfs_dqtrx_hook *hook);
     149             : void xfs_dqtrx_hook_del(struct xfs_quotainfo *qi, struct xfs_dqtrx_hook *hook);
     150             : 
     151             : # else
     152             : #  define xfs_trans_mod_ino_dquot(tp, ip, dqp, field, delta) \
     153             :                 xfs_trans_mod_dquot((tp), (dqp), (field), (delta))
     154             : # endif /* CONFIG_XFS_LIVE_HOOKS */
     155             : 
     156             : #else
     157             : static inline int
     158             : xfs_qm_vop_dqalloc(struct xfs_inode *ip, kuid_t kuid, kgid_t kgid,
     159             :                 prid_t prid, uint flags, struct xfs_dquot **udqp,
     160             :                 struct xfs_dquot **gdqp, struct xfs_dquot **pdqp)
     161             : {
     162             :         *udqp = NULL;
     163             :         *gdqp = NULL;
     164             :         *pdqp = NULL;
     165             :         return 0;
     166             : }
     167             : #define xfs_trans_dup_dqinfo(tp, tp2)
     168             : #define xfs_trans_free_dqinfo(tp)
     169             : #define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) do { } while (0)
     170             : #define xfs_trans_apply_dquot_deltas(tp)
     171             : #define xfs_trans_unreserve_and_mod_dquots(tp)
     172             : static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp,
     173             :                 struct xfs_inode *ip, int64_t dblocks, int64_t rblocks,
     174             :                 bool force)
     175             : {
     176             :         return 0;
     177             : }
     178             : static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp,
     179             :                 struct xfs_mount *mp, struct xfs_dquot *udqp,
     180             :                 struct xfs_dquot *gdqp, struct xfs_dquot *pdqp,
     181             :                 int64_t nblks, long nions, uint flags)
     182             : {
     183             :         return 0;
     184             : }
     185             : 
     186             : static inline int
     187             : xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t blocks)
     188             : {
     189             :         return 0;
     190             : }
     191             : 
     192             : static inline int
     193             : xfs_trans_reserve_quota_icreate(struct xfs_trans *tp, struct xfs_dquot *udqp,
     194             :                 struct xfs_dquot *gdqp, struct xfs_dquot *pdqp, int64_t dblocks)
     195             : {
     196             :         return 0;
     197             : }
     198             : 
     199             : #define xfs_qm_vop_create_dqattach(tp, ip, u, g, p)
     200             : #define xfs_qm_vop_rename_dqattach(it)                                  (0)
     201             : #define xfs_qm_vop_chown(tp, ip, old, new)                              (NULL)
     202             : #define xfs_qm_dqattach(ip)                                             (0)
     203             : #define xfs_qm_dqattach_locked(ip, fl)                                  (0)
     204             : #define xfs_qm_dqdetach(ip)
     205             : #define xfs_qm_dqrele(d)                        do { (d) = (d); } while(0)
     206             : #define xfs_qm_statvfs(ip, s)                   do { } while(0)
     207             : #define xfs_qm_newmount(mp, a, b)                                       (0)
     208             : #define xfs_qm_mount_quotas(mp)
     209             : #define xfs_qm_unmount(mp)
     210             : #define xfs_qm_unmount_quotas(mp)
     211             : #define xfs_inode_near_dquot_enforcement(ip, type)                      (false)
     212             : 
     213             : # ifdef CONFIG_XFS_LIVE_HOOKS
     214             : #  define xfs_dqtrx_hook_enable()               ((void)0)
     215             : #  define xfs_dqtrx_hook_disable()              ((void)0)
     216             : # endif /* CONFIG_XFS_LIVE_HOOKS */
     217             : 
     218             : #endif /* CONFIG_XFS_QUOTA */
     219             : 
     220             : static inline int
     221     2063936 : xfs_quota_unreserve_blkres(struct xfs_inode *ip, int64_t blocks)
     222             : {
     223     2063936 :         return xfs_quota_reserve_blkres(ip, -blocks);
     224             : }
     225             : 
     226             : extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
     227             : 
     228             : #endif  /* __XFS_QUOTA_H__ */

Generated by: LCOV version 1.14