LCOV - code coverage report
Current view: top level - fs/xfs - xfs_trans_priv.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-achx @ Mon Jul 31 20:08:12 PDT 2023 Lines: 17 18 94.4 %
Date: 2023-07-31 20:08:12 Functions: 2 2 100.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc.
       4             :  * All Rights Reserved.
       5             :  */
       6             : #ifndef __XFS_TRANS_PRIV_H__
       7             : #define __XFS_TRANS_PRIV_H__
       8             : 
       9             : struct xlog;
      10             : struct xfs_log_item;
      11             : struct xfs_mount;
      12             : struct xfs_trans;
      13             : struct xfs_ail;
      14             : struct xfs_log_vec;
      15             : 
      16             : 
      17             : void    xfs_trans_init(struct xfs_mount *);
      18             : void    xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *);
      19             : void    xfs_trans_del_item(struct xfs_log_item *);
      20             : void    xfs_trans_unreserve_and_mod_sb(struct xfs_trans *tp);
      21             : 
      22             : void    xfs_trans_committed_bulk(struct xfs_ail *ailp,
      23             :                                 struct list_head *lv_chain,
      24             :                                 xfs_lsn_t commit_lsn, bool aborted);
      25             : /*
      26             :  * AIL traversal cursor.
      27             :  *
      28             :  * Rather than using a generation number for detecting changes in the ail, use
      29             :  * a cursor that is protected by the ail lock. The aild cursor exists in the
      30             :  * struct xfs_ail, but other traversals can declare it on the stack and link it
      31             :  * to the ail list.
      32             :  *
      33             :  * When an object is deleted from or moved int the AIL, the cursor list is
      34             :  * searched to see if the object is a designated cursor item. If it is, it is
      35             :  * deleted from the cursor so that the next time the cursor is used traversal
      36             :  * will return to the start.
      37             :  *
      38             :  * This means a traversal colliding with a removal will cause a restart of the
      39             :  * list scan, rather than any insertion or deletion anywhere in the list. The
      40             :  * low bit of the item pointer is set if the cursor has been invalidated so
      41             :  * that we can tell the difference between invalidation and reaching the end
      42             :  * of the list to trigger traversal restarts.
      43             :  */
      44             : struct xfs_ail_cursor {
      45             :         struct list_head        list;
      46             :         struct xfs_log_item     *item;
      47             : };
      48             : 
      49             : /*
      50             :  * Private AIL structures.
      51             :  *
      52             :  * Eventually we need to drive the locking in here as well.
      53             :  */
      54             : struct xfs_ail {
      55             :         struct xlog             *ail_log;
      56             :         struct task_struct      *ail_task;
      57             :         struct list_head        ail_head;
      58             :         xfs_lsn_t               ail_target;
      59             :         xfs_lsn_t               ail_target_prev;
      60             :         struct list_head        ail_cursors;
      61             :         spinlock_t              ail_lock;
      62             :         xfs_lsn_t               ail_last_pushed_lsn;
      63             :         int                     ail_log_flush;
      64             :         struct list_head        ail_buf_list;
      65             :         wait_queue_head_t       ail_empty;
      66             : };
      67             : 
      68             : /*
      69             :  * From xfs_trans_ail.c
      70             :  */
      71             : void    xfs_trans_ail_update_bulk(struct xfs_ail *ailp,
      72             :                                 struct xfs_ail_cursor *cur,
      73             :                                 struct xfs_log_item **log_items, int nr_items,
      74             :                                 xfs_lsn_t lsn) __releases(ailp->ail_lock);
      75             : /*
      76             :  * Return a pointer to the first item in the AIL.  If the AIL is empty, then
      77             :  * return NULL.
      78             :  */
      79             : static inline struct xfs_log_item *
      80             : xfs_ail_min(
      81             :         struct xfs_ail  *ailp)
      82             : {
      83   485992625 :         return list_first_entry_or_null(&ailp->ail_head, struct xfs_log_item,
      84             :                                         li_ail);
      85             : }
      86             : 
      87             : static inline void
      88             : xfs_trans_ail_update(
      89             :         struct xfs_ail          *ailp,
      90             :         struct xfs_log_item     *lip,
      91             :         xfs_lsn_t               lsn) __releases(ailp->ail_lock)
      92             : {
      93           0 :         xfs_trans_ail_update_bulk(ailp, NULL, &lip, 1, lsn);
      94             : }
      95             : 
      96             : void xfs_trans_ail_insert(struct xfs_ail *ailp, struct xfs_log_item *lip,
      97             :                 xfs_lsn_t lsn);
      98             : 
      99             : xfs_lsn_t xfs_ail_delete_one(struct xfs_ail *ailp, struct xfs_log_item *lip);
     100             : void xfs_ail_update_finish(struct xfs_ail *ailp, xfs_lsn_t old_lsn)
     101             :                         __releases(ailp->ail_lock);
     102             : void xfs_trans_ail_delete(struct xfs_log_item *lip, int shutdown_type);
     103             : 
     104             : void                    xfs_ail_push(struct xfs_ail *, xfs_lsn_t);
     105             : void                    xfs_ail_push_all(struct xfs_ail *);
     106             : void                    xfs_ail_push_all_sync(struct xfs_ail *);
     107             : struct xfs_log_item     *xfs_ail_min(struct xfs_ail  *ailp);
     108             : xfs_lsn_t               xfs_ail_min_lsn(struct xfs_ail *ailp);
     109             : 
     110             : struct xfs_log_item *   xfs_trans_ail_cursor_first(struct xfs_ail *ailp,
     111             :                                         struct xfs_ail_cursor *cur,
     112             :                                         xfs_lsn_t lsn);
     113             : struct xfs_log_item *   xfs_trans_ail_cursor_last(struct xfs_ail *ailp,
     114             :                                         struct xfs_ail_cursor *cur,
     115             :                                         xfs_lsn_t lsn);
     116             : struct xfs_log_item *   xfs_trans_ail_cursor_next(struct xfs_ail *ailp,
     117             :                                         struct xfs_ail_cursor *cur);
     118             : void                    xfs_trans_ail_cursor_done(struct xfs_ail_cursor *cur);
     119             : 
     120             : #if BITS_PER_LONG != 64
     121             : static inline void
     122             : xfs_trans_ail_copy_lsn(
     123             :         struct xfs_ail  *ailp,
     124             :         xfs_lsn_t       *dst,
     125             :         xfs_lsn_t       *src)
     126             : {
     127             :         ASSERT(sizeof(xfs_lsn_t) == 8); /* don't lock if it shrinks */
     128             :         spin_lock(&ailp->ail_lock);
     129             :         *dst = *src;
     130             :         spin_unlock(&ailp->ail_lock);
     131             : }
     132             : #else
     133             : static inline void
     134             : xfs_trans_ail_copy_lsn(
     135             :         struct xfs_ail  *ailp,
     136             :         xfs_lsn_t       *dst,
     137             :         xfs_lsn_t       *src)
     138             : {
     139   273978428 :         ASSERT(sizeof(xfs_lsn_t) == 8);
     140   273978428 :         *dst = *src;
     141             : }
     142             : #endif
     143             : 
     144             : static inline void
     145   118523791 : xfs_clear_li_failed(
     146             :         struct xfs_log_item     *lip)
     147             : {
     148   118523791 :         struct xfs_buf  *bp = lip->li_buf;
     149             : 
     150   118523791 :         ASSERT(test_bit(XFS_LI_IN_AIL, &lip->li_flags));
     151   118523791 :         lockdep_assert_held(&lip->li_ailp->ail_lock);
     152             : 
     153   118523791 :         if (test_and_clear_bit(XFS_LI_FAILED, &lip->li_flags)) {
     154         107 :                 lip->li_buf = NULL;
     155         107 :                 xfs_buf_rele(bp);
     156             :         }
     157   118523791 : }
     158             : 
     159             : static inline void
     160         107 : xfs_set_li_failed(
     161             :         struct xfs_log_item     *lip,
     162             :         struct xfs_buf          *bp)
     163             : {
     164         107 :         lockdep_assert_held(&lip->li_ailp->ail_lock);
     165             : 
     166         107 :         if (!test_and_set_bit(XFS_LI_FAILED, &lip->li_flags)) {
     167         107 :                 xfs_buf_hold(bp);
     168         107 :                 lip->li_buf = bp;
     169             :         }
     170         107 : }
     171             : 
     172             : #endif  /* __XFS_TRANS_PRIV_H__ */

Generated by: LCOV version 1.14