]>
git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - libxfs/logitem.c
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
7 #include "libxfs_priv.h"
9 #include "xfs_shared.h"
10 #include "xfs_format.h"
11 #include "xfs_log_format.h"
12 #include "xfs_trans_resv.h"
13 #include "xfs_mount.h"
14 #include "xfs_inode_buf.h"
15 #include "xfs_inode_fork.h"
16 #include "xfs_inode.h"
17 #include "xfs_trans.h"
19 kmem_zone_t
*xfs_buf_item_zone
;
20 kmem_zone_t
*xfs_ili_zone
; /* inode log item zone */
23 * Following functions from fs/xfs/xfs_trans_buf.c
27 * Check to see if a buffer matching the given parameters is already
28 * a part of the given transaction.
31 xfs_trans_buf_item_match(
33 struct xfs_buftarg
*btp
,
34 struct xfs_buf_map
*map
,
37 struct xfs_log_item
*lip
;
38 struct xfs_buf_log_item
*blip
;
42 for (i
= 0; i
< nmaps
; i
++)
45 list_for_each_entry(lip
, &tp
->t_items
, li_trans
) {
46 blip
= (struct xfs_buf_log_item
*)lip
;
47 if (blip
->bli_item
.li_type
== XFS_LI_BUF
&&
48 blip
->bli_buf
->b_target
->dev
== btp
->dev
&&
49 XFS_BUF_ADDR(blip
->bli_buf
) == map
[0].bm_bn
&&
50 blip
->bli_buf
->b_bcount
== BBTOB(len
)) {
51 ASSERT(blip
->bli_buf
->b_map_count
== nmaps
);
59 * The following are from fs/xfs/xfs_buf_item.c
63 * Allocate a new buf log item to go with the given buffer.
64 * Set the buffer's b_log_item field to point to the new
65 * buf log item. If there are other item's attached to the
66 * buffer (see xfs_buf_attach_iodone() below), then put the
67 * buf log item at the front.
75 xfs_buf_log_item_t
*bip
;
78 fprintf(stderr
, "buf_item_init for buffer %p\n", bp
);
82 * Check to see if there is already a buf log item for
83 * this buffer. If there is, it is guaranteed to be
84 * the first. If we do already have one, there is
85 * nothing to do here so return.
87 XFS_BUF_SET_BDSTRAT_FUNC(bp
, xfs_bdstrat_cb
);
88 if (bp
->b_log_item
!= NULL
) {
90 if (lip
->li_type
== XFS_LI_BUF
) {
93 "reused buf item %p for pre-logged buffer %p\n",
100 bip
= (xfs_buf_log_item_t
*)kmem_zone_zalloc(xfs_buf_item_zone
,
103 fprintf(stderr
, "adding buf item %p for not-logged buffer %p\n",
106 bip
->bli_item
.li_type
= XFS_LI_BUF
;
107 bip
->bli_item
.li_mountp
= mp
;
108 INIT_LIST_HEAD(&bip
->bli_item
.li_trans
);
110 bip
->bli_format
.blf_type
= XFS_LI_BUF
;
111 bip
->bli_format
.blf_blkno
= (int64_t)XFS_BUF_ADDR(bp
);
112 bip
->bli_format
.blf_len
= (unsigned short)BTOBB(bp
->b_bcount
);
113 bp
->b_log_item
= bip
;
118 * Mark bytes first through last inclusive as dirty in the buf
123 xfs_buf_log_item_t
*bip
,
128 * Mark the item as having some dirty data for
129 * quick reference in xfs_buf_item_dirty.
131 bip
->bli_flags
|= XFS_BLI_DIRTY
;
135 * Initialize the inode log item for a newly allocated (in-core) inode.
142 xfs_inode_log_item_t
*iip
;
144 ASSERT(ip
->i_itemp
== NULL
);
145 iip
= ip
->i_itemp
= (xfs_inode_log_item_t
*)
146 kmem_zone_zalloc(xfs_ili_zone
, KM_SLEEP
);
148 fprintf(stderr
, "inode_item_init for inode %llu, iip=%p\n",
152 iip
->ili_item
.li_type
= XFS_LI_INODE
;
153 iip
->ili_item
.li_mountp
= mp
;
154 INIT_LIST_HEAD(&iip
->ili_item
.li_trans
);