LCOV - code coverage report
Current view: top level - fs/xfs - xfs_quota.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc4-xfsx @ Mon Jul 31 20:08:34 PDT 2023 Lines: 2 2 100.0 %
Date: 2023-07-31 20:08:34 Functions: 0 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_IS_DQDETACHED(mp, ip) \
      33             :         ((ip)->i_udquot == NULL || \
      34             :          (ip)->i_gdquot == NULL || \
      35             :          (ip)->i_pdquot == NULL)
      36             : 
      37             : #define XFS_QM_NEED_QUOTACHECK(mp) \
      38             :         ((XFS_IS_UQUOTA_ON(mp) && \
      39             :                 (mp->m_sb.sb_qflags & XFS_UQUOTA_CHKD) == 0) || \
      40             :          (XFS_IS_GQUOTA_ON(mp) && \
      41             :                 (mp->m_sb.sb_qflags & XFS_GQUOTA_CHKD) == 0) || \
      42             :          (XFS_IS_PQUOTA_ON(mp) && \
      43             :                 (mp->m_sb.sb_qflags & XFS_PQUOTA_CHKD) == 0))
      44             : 
      45             : static inline uint
      46             : xfs_quota_chkd_flag(
      47             :         xfs_dqtype_t            type)
      48             : {
      49      103416 :         switch (type) {
      50             :         case XFS_DQTYPE_USER:
      51             :                 return XFS_UQUOTA_CHKD;
      52             :         case XFS_DQTYPE_GROUP:
      53             :                 return XFS_GQUOTA_CHKD;
      54             :         case XFS_DQTYPE_PROJ:
      55             :                 return XFS_PQUOTA_CHKD;
      56             :         default:
      57             :                 return 0;
      58             :         }
      59             : }
      60             : 
      61             : /*
      62             :  * The structure kept inside the xfs_trans_t keep track of dquot changes
      63             :  * within a transaction and apply them later.
      64             :  */
      65             : struct xfs_dqtrx {
      66             :         struct xfs_dquot *qt_dquot;       /* the dquot this refers to */
      67             : 
      68             :         uint64_t        qt_blk_res;       /* blks reserved on a dquot */
      69             :         int64_t         qt_bcount_delta;  /* dquot blk count changes */
      70             :         int64_t         qt_delbcnt_delta; /* delayed dquot blk count changes */
      71             : 
      72             :         uint64_t        qt_rtblk_res;     /* # blks reserved on a dquot */
      73             :         uint64_t        qt_rtblk_res_used;/* # blks used from reservation */
      74             :         int64_t         qt_rtbcount_delta;/* dquot realtime blk changes */
      75             :         int64_t         qt_delrtb_delta;  /* delayed RT blk count changes */
      76             : 
      77             :         uint64_t        qt_ino_res;       /* inode reserved on a dquot */
      78             :         uint64_t        qt_ino_res_used;  /* inodes used from the reservation */
      79             :         int64_t         qt_icount_delta;  /* dquot inode count changes */
      80             : };
      81             : 
      82             : enum xfs_apply_dqtrx_type {
      83             :         XFS_APPLY_DQTRX_COMMIT = 0,
      84             :         XFS_APPLY_DQTRX_UNRESERVE,
      85             : };
      86             : 
      87             : /*
      88             :  * Parameters for applying dqtrx changes to a dquot.  The hook function arg
      89             :  * parameter is enum xfs_apply_dqtrx_type.
      90             :  */
      91             : struct xfs_apply_dqtrx_params {
      92             :         uintptr_t               tx_id;
      93             :         xfs_ino_t               ino;
      94             :         xfs_dqtype_t            q_type;
      95             :         xfs_dqid_t              q_id;
      96             : };
      97             : 
      98             : #ifdef CONFIG_XFS_QUOTA
      99             : extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *);
     100             : extern void xfs_trans_free_dqinfo(struct xfs_trans *);
     101             : extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *,
     102             :                 uint, int64_t);
     103             : extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *);
     104             : extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *);
     105             : int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, struct xfs_inode *ip,
     106             :                 int64_t dblocks, int64_t rblocks, bool force);
     107             : extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
     108             :                 struct xfs_mount *, struct xfs_dquot *,
     109             :                 struct xfs_dquot *, struct xfs_dquot *, int64_t, long, uint);
     110             : int xfs_trans_reserve_quota_icreate(struct xfs_trans *tp,
     111             :                 struct xfs_dquot *udqp, struct xfs_dquot *gdqp,
     112             :                 struct xfs_dquot *pdqp, int64_t dblocks);
     113             : 
     114             : extern int xfs_qm_vop_dqalloc(struct xfs_inode *, kuid_t, kgid_t,
     115             :                 prid_t, uint, struct xfs_dquot **, struct xfs_dquot **,
     116             :                 struct xfs_dquot **);
     117             : extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *,
     118             :                 struct xfs_dquot *, struct xfs_dquot *, struct xfs_dquot *);
     119             : extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **);
     120             : extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *,
     121             :                 struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *);
     122             : extern int xfs_qm_dqattach(struct xfs_inode *);
     123             : extern int xfs_qm_dqattach_locked(struct xfs_inode *ip, bool doalloc);
     124             : extern void xfs_qm_dqdetach(struct xfs_inode *);
     125             : extern void xfs_qm_dqrele(struct xfs_dquot *);
     126             : extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
     127             : extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
     128             : int xfs_qm_mount_quotas(struct xfs_mount *mp);
     129             : extern void xfs_qm_unmount(struct xfs_mount *);
     130             : extern void xfs_qm_unmount_quotas(struct xfs_mount *);
     131             : 
     132             : int xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t blocks);
     133             : bool xfs_inode_near_dquot_enforcement(struct xfs_inode *ip, xfs_dqtype_t type);
     134             : 
     135             : # ifdef CONFIG_XFS_LIVE_HOOKS
     136             : void xfs_trans_mod_ino_dquot(struct xfs_trans *tp, struct xfs_inode *ip,
     137             :                 struct xfs_dquot *dqp, unsigned int field, int64_t delta);
     138             : 
     139             : struct xfs_quotainfo;
     140             : 
     141             : struct xfs_dqtrx_hook {
     142             :         struct xfs_hook         mod_hook;
     143             :         struct xfs_hook         apply_hook;
     144             : };
     145             : 
     146             : void xfs_dqtrx_hook_disable(void);
     147             : void xfs_dqtrx_hook_enable(void);
     148             : 
     149             : int xfs_dqtrx_hook_add(struct xfs_quotainfo *qi, struct xfs_dqtrx_hook *hook);
     150             : void xfs_dqtrx_hook_del(struct xfs_quotainfo *qi, struct xfs_dqtrx_hook *hook);
     151             : 
     152             : # else
     153             : #  define xfs_trans_mod_ino_dquot(tp, ip, dqp, field, delta) \
     154             :                 xfs_trans_mod_dquot((tp), (dqp), (field), (delta))
     155             : # endif /* CONFIG_XFS_LIVE_HOOKS */
     156             : 
     157             : #else
     158             : static inline int
     159             : xfs_qm_vop_dqalloc(struct xfs_inode *ip, kuid_t kuid, kgid_t kgid,
     160             :                 prid_t prid, uint flags, struct xfs_dquot **udqp,
     161             :                 struct xfs_dquot **gdqp, struct xfs_dquot **pdqp)
     162             : {
     163             :         *udqp = NULL;
     164             :         *gdqp = NULL;
     165             :         *pdqp = NULL;
     166             :         return 0;
     167             : }
     168             : #define xfs_trans_dup_dqinfo(tp, tp2)
     169             : #define xfs_trans_free_dqinfo(tp)
     170             : #define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) do { } while (0)
     171             : #define xfs_trans_apply_dquot_deltas(tp)
     172             : #define xfs_trans_unreserve_and_mod_dquots(tp)
     173             : static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp,
     174             :                 struct xfs_inode *ip, int64_t dblocks, int64_t rblocks,
     175             :                 bool force)
     176             : {
     177             :         return 0;
     178             : }
     179             : static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp,
     180             :                 struct xfs_mount *mp, struct xfs_dquot *udqp,
     181             :                 struct xfs_dquot *gdqp, struct xfs_dquot *pdqp,
     182             :                 int64_t nblks, long nions, uint flags)
     183             : {
     184             :         return 0;
     185             : }
     186             : 
     187             : static inline int
     188             : xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t blocks)
     189             : {
     190             :         return 0;
     191             : }
     192             : 
     193             : static inline int
     194             : xfs_trans_reserve_quota_icreate(struct xfs_trans *tp, struct xfs_dquot *udqp,
     195             :                 struct xfs_dquot *gdqp, struct xfs_dquot *pdqp, int64_t dblocks)
     196             : {
     197             :         return 0;
     198             : }
     199             : 
     200             : #define xfs_qm_vop_create_dqattach(tp, ip, u, g, p)
     201             : #define xfs_qm_vop_rename_dqattach(it)                                  (0)
     202             : #define xfs_qm_vop_chown(tp, ip, old, new)                              (NULL)
     203             : #define xfs_qm_dqattach(ip)                                             (0)
     204             : #define xfs_qm_dqattach_locked(ip, fl)                                  (0)
     205             : #define xfs_qm_dqdetach(ip)
     206             : #define xfs_qm_dqrele(d)                        do { (d) = (d); } while(0)
     207             : #define xfs_qm_statvfs(ip, s)                   do { } while(0)
     208             : #define xfs_qm_newmount(mp, a, b)                                       (0)
     209             : #define xfs_qm_mount_quotas(mp)                                         (0)
     210             : #define xfs_qm_unmount(mp)
     211             : #define xfs_qm_unmount_quotas(mp)
     212             : #define xfs_inode_near_dquot_enforcement(ip, type)                      (false)
     213             : 
     214             : # ifdef CONFIG_XFS_LIVE_HOOKS
     215             : #  define xfs_dqtrx_hook_enable()               ((void)0)
     216             : #  define xfs_dqtrx_hook_disable()              ((void)0)
     217             : # endif /* CONFIG_XFS_LIVE_HOOKS */
     218             : 
     219             : #endif /* CONFIG_XFS_QUOTA */
     220             : 
     221             : static inline int
     222             : xfs_quota_unreserve_blkres(struct xfs_inode *ip, int64_t blocks)
     223             : {
     224    17356859 :         return xfs_quota_reserve_blkres(ip, -blocks);
     225             : }
     226             : 
     227             : extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
     228             : 
     229             : #endif  /* __XFS_QUOTA_H__ */

Generated by: LCOV version 1.14