]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - libxfs/logitem.c
xfs: convert a few more directory asserts to corruption
[thirdparty/xfsprogs-dev.git] / libxfs / logitem.c
1 /*
2 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
3 * All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include "libxfs_priv.h"
20 #include "xfs_fs.h"
21 #include "xfs_shared.h"
22 #include "xfs_format.h"
23 #include "xfs_log_format.h"
24 #include "xfs_trans_resv.h"
25 #include "xfs_mount.h"
26 #include "xfs_inode_buf.h"
27 #include "xfs_inode_fork.h"
28 #include "xfs_inode.h"
29 #include "xfs_trans.h"
30
31 kmem_zone_t *xfs_buf_item_zone;
32 kmem_zone_t *xfs_ili_zone; /* inode log item zone */
33
34 /*
35 * Following functions from fs/xfs/xfs_trans_buf.c
36 */
37
38 /*
39 * Check to see if a buffer matching the given parameters is already
40 * a part of the given transaction.
41 */
42 xfs_buf_t *
43 xfs_trans_buf_item_match(
44 xfs_trans_t *tp,
45 struct xfs_buftarg *btp,
46 struct xfs_buf_map *map,
47 int nmaps)
48 {
49 struct xfs_log_item_desc *lidp;
50 struct xfs_buf_log_item *blip;
51 int len = 0;
52 int i;
53
54 for (i = 0; i < nmaps; i++)
55 len += map[i].bm_len;
56
57 list_for_each_entry(lidp, &tp->t_items, lid_trans) {
58 blip = (struct xfs_buf_log_item *)lidp->lid_item;
59 if (blip->bli_item.li_type == XFS_LI_BUF &&
60 blip->bli_buf->b_target->dev == btp->dev &&
61 XFS_BUF_ADDR(blip->bli_buf) == map[0].bm_bn &&
62 blip->bli_buf->b_bcount == BBTOB(len)) {
63 ASSERT(blip->bli_buf->b_map_count == nmaps);
64 return blip->bli_buf;
65 }
66 }
67
68 return NULL;
69 }
70 /*
71 * The following are from fs/xfs/xfs_buf_item.c
72 */
73
74 /*
75 * Allocate a new buf log item to go with the given buffer.
76 * Set the buffer's b_log_item field to point to the new
77 * buf log item. If there are other item's attached to the
78 * buffer (see xfs_buf_attach_iodone() below), then put the
79 * buf log item at the front.
80 */
81 void
82 xfs_buf_item_init(
83 xfs_buf_t *bp,
84 xfs_mount_t *mp)
85 {
86 xfs_log_item_t *lip;
87 xfs_buf_log_item_t *bip;
88
89 #ifdef LI_DEBUG
90 fprintf(stderr, "buf_item_init for buffer %p\n", bp);
91 #endif
92
93 /*
94 * Check to see if there is already a buf log item for
95 * this buffer. If there is, it is guaranteed to be
96 * the first. If we do already have one, there is
97 * nothing to do here so return.
98 */
99 XFS_BUF_SET_BDSTRAT_FUNC(bp, xfs_bdstrat_cb);
100 if (bp->b_log_item != NULL) {
101 lip = bp->b_log_item;
102 if (lip->li_type == XFS_LI_BUF) {
103 #ifdef LI_DEBUG
104 fprintf(stderr,
105 "reused buf item %p for pre-logged buffer %p\n",
106 lip, bp);
107 #endif
108 return;
109 }
110 }
111
112 bip = (xfs_buf_log_item_t *)kmem_zone_zalloc(xfs_buf_item_zone,
113 KM_SLEEP);
114 #ifdef LI_DEBUG
115 fprintf(stderr, "adding buf item %p for not-logged buffer %p\n",
116 bip, bp);
117 #endif
118 bip->bli_item.li_type = XFS_LI_BUF;
119 bip->bli_item.li_mountp = mp;
120 bip->bli_buf = bp;
121 bip->bli_format.blf_type = XFS_LI_BUF;
122 bip->bli_format.blf_blkno = (int64_t)XFS_BUF_ADDR(bp);
123 bip->bli_format.blf_len = (unsigned short)BTOBB(XFS_BUF_COUNT(bp));
124 bp->b_log_item = bip;
125 }
126
127
128 /*
129 * Mark bytes first through last inclusive as dirty in the buf
130 * item's bitmap.
131 */
132 void
133 xfs_buf_item_log(
134 xfs_buf_log_item_t *bip,
135 uint first,
136 uint last)
137 {
138 /*
139 * Mark the item as having some dirty data for
140 * quick reference in xfs_buf_item_dirty.
141 */
142 bip->bli_flags |= XFS_BLI_DIRTY;
143 }
144
145 /*
146 * Initialize the inode log item for a newly allocated (in-core) inode.
147 */
148 void
149 xfs_inode_item_init(
150 xfs_inode_t *ip,
151 xfs_mount_t *mp)
152 {
153 xfs_inode_log_item_t *iip;
154
155 ASSERT(ip->i_itemp == NULL);
156 iip = ip->i_itemp = (xfs_inode_log_item_t *)
157 kmem_zone_zalloc(xfs_ili_zone, KM_SLEEP);
158 #ifdef LI_DEBUG
159 fprintf(stderr, "inode_item_init for inode %llu, iip=%p\n",
160 ip->i_ino, iip);
161 #endif
162
163 iip->ili_item.li_type = XFS_LI_INODE;
164 iip->ili_item.li_mountp = mp;
165 iip->ili_inode = ip;
166 }