]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - libxfs/logitem.c
libxfs: refactor manage_zones()
[thirdparty/xfsprogs-dev.git] / libxfs / logitem.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
5 */
6
7 #include "libxfs_priv.h"
8 #include "xfs_fs.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"
18
19 kmem_zone_t *xfs_buf_item_zone;
20 kmem_zone_t *xfs_ili_zone; /* inode log item zone */
21
22 /*
23 * Following functions from fs/xfs/xfs_trans_buf.c
24 */
25
26 /*
27 * Check to see if a buffer matching the given parameters is already
28 * a part of the given transaction.
29 */
30 xfs_buf_t *
31 xfs_trans_buf_item_match(
32 xfs_trans_t *tp,
33 struct xfs_buftarg *btp,
34 struct xfs_buf_map *map,
35 int nmaps)
36 {
37 struct xfs_log_item *lip;
38 struct xfs_buf_log_item *blip;
39 int len = 0;
40 int i;
41
42 for (i = 0; i < nmaps; i++)
43 len += map[i].bm_len;
44
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);
52 return blip->bli_buf;
53 }
54 }
55
56 return NULL;
57 }
58 /*
59 * The following are from fs/xfs/xfs_buf_item.c
60 */
61
62 /*
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.
68 */
69 void
70 xfs_buf_item_init(
71 xfs_buf_t *bp,
72 xfs_mount_t *mp)
73 {
74 xfs_log_item_t *lip;
75 xfs_buf_log_item_t *bip;
76
77 #ifdef LI_DEBUG
78 fprintf(stderr, "buf_item_init for buffer %p\n", bp);
79 #endif
80
81 /*
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.
86 */
87 XFS_BUF_SET_BDSTRAT_FUNC(bp, xfs_bdstrat_cb);
88 if (bp->b_log_item != NULL) {
89 lip = bp->b_log_item;
90 if (lip->li_type == XFS_LI_BUF) {
91 #ifdef LI_DEBUG
92 fprintf(stderr,
93 "reused buf item %p for pre-logged buffer %p\n",
94 lip, bp);
95 #endif
96 return;
97 }
98 }
99
100 bip = (xfs_buf_log_item_t *)kmem_zone_zalloc(xfs_buf_item_zone,
101 KM_SLEEP);
102 #ifdef LI_DEBUG
103 fprintf(stderr, "adding buf item %p for not-logged buffer %p\n",
104 bip, bp);
105 #endif
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);
109 bip->bli_buf = bp;
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;
114 }
115
116
117 /*
118 * Mark bytes first through last inclusive as dirty in the buf
119 * item's bitmap.
120 */
121 void
122 xfs_buf_item_log(
123 xfs_buf_log_item_t *bip,
124 uint first,
125 uint last)
126 {
127 /*
128 * Mark the item as having some dirty data for
129 * quick reference in xfs_buf_item_dirty.
130 */
131 bip->bli_flags |= XFS_BLI_DIRTY;
132 }
133
134 /*
135 * Initialize the inode log item for a newly allocated (in-core) inode.
136 */
137 void
138 xfs_inode_item_init(
139 xfs_inode_t *ip,
140 xfs_mount_t *mp)
141 {
142 xfs_inode_log_item_t *iip;
143
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);
147 #ifdef LI_DEBUG
148 fprintf(stderr, "inode_item_init for inode %llu, iip=%p\n",
149 ip->i_ino, iip);
150 #endif
151
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);
155 iip->ili_inode = ip;
156 }