xref: /openbmc/linux/fs/xfs/xfs_extfree_item.c (revision 77a87824)
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 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_format.h"
21 #include "xfs_log_format.h"
22 #include "xfs_trans_resv.h"
23 #include "xfs_mount.h"
24 #include "xfs_trans.h"
25 #include "xfs_trans_priv.h"
26 #include "xfs_buf_item.h"
27 #include "xfs_extfree_item.h"
28 #include "xfs_log.h"
29 
30 
31 kmem_zone_t	*xfs_efi_zone;
32 kmem_zone_t	*xfs_efd_zone;
33 
34 static inline struct xfs_efi_log_item *EFI_ITEM(struct xfs_log_item *lip)
35 {
36 	return container_of(lip, struct xfs_efi_log_item, efi_item);
37 }
38 
39 void
40 xfs_efi_item_free(
41 	struct xfs_efi_log_item	*efip)
42 {
43 	kmem_free(efip->efi_item.li_lv_shadow);
44 	if (efip->efi_format.efi_nextents > XFS_EFI_MAX_FAST_EXTENTS)
45 		kmem_free(efip);
46 	else
47 		kmem_zone_free(xfs_efi_zone, efip);
48 }
49 
50 /*
51  * This returns the number of iovecs needed to log the given efi item.
52  * We only need 1 iovec for an efi item.  It just logs the efi_log_format
53  * structure.
54  */
55 static inline int
56 xfs_efi_item_sizeof(
57 	struct xfs_efi_log_item *efip)
58 {
59 	return sizeof(struct xfs_efi_log_format) +
60 	       (efip->efi_format.efi_nextents - 1) * sizeof(xfs_extent_t);
61 }
62 
63 STATIC void
64 xfs_efi_item_size(
65 	struct xfs_log_item	*lip,
66 	int			*nvecs,
67 	int			*nbytes)
68 {
69 	*nvecs += 1;
70 	*nbytes += xfs_efi_item_sizeof(EFI_ITEM(lip));
71 }
72 
73 /*
74  * This is called to fill in the vector of log iovecs for the
75  * given efi log item. We use only 1 iovec, and we point that
76  * at the efi_log_format structure embedded in the efi item.
77  * It is at this point that we assert that all of the extent
78  * slots in the efi item have been filled.
79  */
80 STATIC void
81 xfs_efi_item_format(
82 	struct xfs_log_item	*lip,
83 	struct xfs_log_vec	*lv)
84 {
85 	struct xfs_efi_log_item	*efip = EFI_ITEM(lip);
86 	struct xfs_log_iovec	*vecp = NULL;
87 
88 	ASSERT(atomic_read(&efip->efi_next_extent) ==
89 				efip->efi_format.efi_nextents);
90 
91 	efip->efi_format.efi_type = XFS_LI_EFI;
92 	efip->efi_format.efi_size = 1;
93 
94 	xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_EFI_FORMAT,
95 			&efip->efi_format,
96 			xfs_efi_item_sizeof(efip));
97 }
98 
99 
100 /*
101  * Pinning has no meaning for an efi item, so just return.
102  */
103 STATIC void
104 xfs_efi_item_pin(
105 	struct xfs_log_item	*lip)
106 {
107 }
108 
109 /*
110  * The unpin operation is the last place an EFI is manipulated in the log. It is
111  * either inserted in the AIL or aborted in the event of a log I/O error. In
112  * either case, the EFI transaction has been successfully committed to make it
113  * this far. Therefore, we expect whoever committed the EFI to either construct
114  * and commit the EFD or drop the EFD's reference in the event of error. Simply
115  * drop the log's EFI reference now that the log is done with it.
116  */
117 STATIC void
118 xfs_efi_item_unpin(
119 	struct xfs_log_item	*lip,
120 	int			remove)
121 {
122 	struct xfs_efi_log_item	*efip = EFI_ITEM(lip);
123 	xfs_efi_release(efip);
124 }
125 
126 /*
127  * Efi items have no locking or pushing.  However, since EFIs are pulled from
128  * the AIL when their corresponding EFDs are committed to disk, their situation
129  * is very similar to being pinned.  Return XFS_ITEM_PINNED so that the caller
130  * will eventually flush the log.  This should help in getting the EFI out of
131  * the AIL.
132  */
133 STATIC uint
134 xfs_efi_item_push(
135 	struct xfs_log_item	*lip,
136 	struct list_head	*buffer_list)
137 {
138 	return XFS_ITEM_PINNED;
139 }
140 
141 /*
142  * The EFI has been either committed or aborted if the transaction has been
143  * cancelled. If the transaction was cancelled, an EFD isn't going to be
144  * constructed and thus we free the EFI here directly.
145  */
146 STATIC void
147 xfs_efi_item_unlock(
148 	struct xfs_log_item	*lip)
149 {
150 	if (lip->li_flags & XFS_LI_ABORTED)
151 		xfs_efi_item_free(EFI_ITEM(lip));
152 }
153 
154 /*
155  * The EFI is logged only once and cannot be moved in the log, so simply return
156  * the lsn at which it's been logged.
157  */
158 STATIC xfs_lsn_t
159 xfs_efi_item_committed(
160 	struct xfs_log_item	*lip,
161 	xfs_lsn_t		lsn)
162 {
163 	return lsn;
164 }
165 
166 /*
167  * The EFI dependency tracking op doesn't do squat.  It can't because
168  * it doesn't know where the free extent is coming from.  The dependency
169  * tracking has to be handled by the "enclosing" metadata object.  For
170  * example, for inodes, the inode is locked throughout the extent freeing
171  * so the dependency should be recorded there.
172  */
173 STATIC void
174 xfs_efi_item_committing(
175 	struct xfs_log_item	*lip,
176 	xfs_lsn_t		lsn)
177 {
178 }
179 
180 /*
181  * This is the ops vector shared by all efi log items.
182  */
183 static const struct xfs_item_ops xfs_efi_item_ops = {
184 	.iop_size	= xfs_efi_item_size,
185 	.iop_format	= xfs_efi_item_format,
186 	.iop_pin	= xfs_efi_item_pin,
187 	.iop_unpin	= xfs_efi_item_unpin,
188 	.iop_unlock	= xfs_efi_item_unlock,
189 	.iop_committed	= xfs_efi_item_committed,
190 	.iop_push	= xfs_efi_item_push,
191 	.iop_committing = xfs_efi_item_committing
192 };
193 
194 
195 /*
196  * Allocate and initialize an efi item with the given number of extents.
197  */
198 struct xfs_efi_log_item *
199 xfs_efi_init(
200 	struct xfs_mount	*mp,
201 	uint			nextents)
202 
203 {
204 	struct xfs_efi_log_item	*efip;
205 	uint			size;
206 
207 	ASSERT(nextents > 0);
208 	if (nextents > XFS_EFI_MAX_FAST_EXTENTS) {
209 		size = (uint)(sizeof(xfs_efi_log_item_t) +
210 			((nextents - 1) * sizeof(xfs_extent_t)));
211 		efip = kmem_zalloc(size, KM_SLEEP);
212 	} else {
213 		efip = kmem_zone_zalloc(xfs_efi_zone, KM_SLEEP);
214 	}
215 
216 	xfs_log_item_init(mp, &efip->efi_item, XFS_LI_EFI, &xfs_efi_item_ops);
217 	efip->efi_format.efi_nextents = nextents;
218 	efip->efi_format.efi_id = (uintptr_t)(void *)efip;
219 	atomic_set(&efip->efi_next_extent, 0);
220 	atomic_set(&efip->efi_refcount, 2);
221 
222 	return efip;
223 }
224 
225 /*
226  * Copy an EFI format buffer from the given buf, and into the destination
227  * EFI format structure.
228  * The given buffer can be in 32 bit or 64 bit form (which has different padding),
229  * one of which will be the native format for this kernel.
230  * It will handle the conversion of formats if necessary.
231  */
232 int
233 xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt)
234 {
235 	xfs_efi_log_format_t *src_efi_fmt = buf->i_addr;
236 	uint i;
237 	uint len = sizeof(xfs_efi_log_format_t) +
238 		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_t);
239 	uint len32 = sizeof(xfs_efi_log_format_32_t) +
240 		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_32_t);
241 	uint len64 = sizeof(xfs_efi_log_format_64_t) +
242 		(src_efi_fmt->efi_nextents - 1) * sizeof(xfs_extent_64_t);
243 
244 	if (buf->i_len == len) {
245 		memcpy((char *)dst_efi_fmt, (char*)src_efi_fmt, len);
246 		return 0;
247 	} else if (buf->i_len == len32) {
248 		xfs_efi_log_format_32_t *src_efi_fmt_32 = buf->i_addr;
249 
250 		dst_efi_fmt->efi_type     = src_efi_fmt_32->efi_type;
251 		dst_efi_fmt->efi_size     = src_efi_fmt_32->efi_size;
252 		dst_efi_fmt->efi_nextents = src_efi_fmt_32->efi_nextents;
253 		dst_efi_fmt->efi_id       = src_efi_fmt_32->efi_id;
254 		for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
255 			dst_efi_fmt->efi_extents[i].ext_start =
256 				src_efi_fmt_32->efi_extents[i].ext_start;
257 			dst_efi_fmt->efi_extents[i].ext_len =
258 				src_efi_fmt_32->efi_extents[i].ext_len;
259 		}
260 		return 0;
261 	} else if (buf->i_len == len64) {
262 		xfs_efi_log_format_64_t *src_efi_fmt_64 = buf->i_addr;
263 
264 		dst_efi_fmt->efi_type     = src_efi_fmt_64->efi_type;
265 		dst_efi_fmt->efi_size     = src_efi_fmt_64->efi_size;
266 		dst_efi_fmt->efi_nextents = src_efi_fmt_64->efi_nextents;
267 		dst_efi_fmt->efi_id       = src_efi_fmt_64->efi_id;
268 		for (i = 0; i < dst_efi_fmt->efi_nextents; i++) {
269 			dst_efi_fmt->efi_extents[i].ext_start =
270 				src_efi_fmt_64->efi_extents[i].ext_start;
271 			dst_efi_fmt->efi_extents[i].ext_len =
272 				src_efi_fmt_64->efi_extents[i].ext_len;
273 		}
274 		return 0;
275 	}
276 	return -EFSCORRUPTED;
277 }
278 
279 /*
280  * Freeing the efi requires that we remove it from the AIL if it has already
281  * been placed there. However, the EFI may not yet have been placed in the AIL
282  * when called by xfs_efi_release() from EFD processing due to the ordering of
283  * committed vs unpin operations in bulk insert operations. Hence the reference
284  * count to ensure only the last caller frees the EFI.
285  */
286 void
287 xfs_efi_release(
288 	struct xfs_efi_log_item	*efip)
289 {
290 	if (atomic_dec_and_test(&efip->efi_refcount)) {
291 		xfs_trans_ail_remove(&efip->efi_item, SHUTDOWN_LOG_IO_ERROR);
292 		xfs_efi_item_free(efip);
293 	}
294 }
295 
296 static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip)
297 {
298 	return container_of(lip, struct xfs_efd_log_item, efd_item);
299 }
300 
301 STATIC void
302 xfs_efd_item_free(struct xfs_efd_log_item *efdp)
303 {
304 	kmem_free(efdp->efd_item.li_lv_shadow);
305 	if (efdp->efd_format.efd_nextents > XFS_EFD_MAX_FAST_EXTENTS)
306 		kmem_free(efdp);
307 	else
308 		kmem_zone_free(xfs_efd_zone, efdp);
309 }
310 
311 /*
312  * This returns the number of iovecs needed to log the given efd item.
313  * We only need 1 iovec for an efd item.  It just logs the efd_log_format
314  * structure.
315  */
316 static inline int
317 xfs_efd_item_sizeof(
318 	struct xfs_efd_log_item *efdp)
319 {
320 	return sizeof(xfs_efd_log_format_t) +
321 	       (efdp->efd_format.efd_nextents - 1) * sizeof(xfs_extent_t);
322 }
323 
324 STATIC void
325 xfs_efd_item_size(
326 	struct xfs_log_item	*lip,
327 	int			*nvecs,
328 	int			*nbytes)
329 {
330 	*nvecs += 1;
331 	*nbytes += xfs_efd_item_sizeof(EFD_ITEM(lip));
332 }
333 
334 /*
335  * This is called to fill in the vector of log iovecs for the
336  * given efd log item. We use only 1 iovec, and we point that
337  * at the efd_log_format structure embedded in the efd item.
338  * It is at this point that we assert that all of the extent
339  * slots in the efd item have been filled.
340  */
341 STATIC void
342 xfs_efd_item_format(
343 	struct xfs_log_item	*lip,
344 	struct xfs_log_vec	*lv)
345 {
346 	struct xfs_efd_log_item	*efdp = EFD_ITEM(lip);
347 	struct xfs_log_iovec	*vecp = NULL;
348 
349 	ASSERT(efdp->efd_next_extent == efdp->efd_format.efd_nextents);
350 
351 	efdp->efd_format.efd_type = XFS_LI_EFD;
352 	efdp->efd_format.efd_size = 1;
353 
354 	xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_EFD_FORMAT,
355 			&efdp->efd_format,
356 			xfs_efd_item_sizeof(efdp));
357 }
358 
359 /*
360  * Pinning has no meaning for an efd item, so just return.
361  */
362 STATIC void
363 xfs_efd_item_pin(
364 	struct xfs_log_item	*lip)
365 {
366 }
367 
368 /*
369  * Since pinning has no meaning for an efd item, unpinning does
370  * not either.
371  */
372 STATIC void
373 xfs_efd_item_unpin(
374 	struct xfs_log_item	*lip,
375 	int			remove)
376 {
377 }
378 
379 /*
380  * There isn't much you can do to push on an efd item.  It is simply stuck
381  * waiting for the log to be flushed to disk.
382  */
383 STATIC uint
384 xfs_efd_item_push(
385 	struct xfs_log_item	*lip,
386 	struct list_head	*buffer_list)
387 {
388 	return XFS_ITEM_PINNED;
389 }
390 
391 /*
392  * The EFD is either committed or aborted if the transaction is cancelled. If
393  * the transaction is cancelled, drop our reference to the EFI and free the EFD.
394  */
395 STATIC void
396 xfs_efd_item_unlock(
397 	struct xfs_log_item	*lip)
398 {
399 	struct xfs_efd_log_item	*efdp = EFD_ITEM(lip);
400 
401 	if (lip->li_flags & XFS_LI_ABORTED) {
402 		xfs_efi_release(efdp->efd_efip);
403 		xfs_efd_item_free(efdp);
404 	}
405 }
406 
407 /*
408  * When the efd item is committed to disk, all we need to do is delete our
409  * reference to our partner efi item and then free ourselves. Since we're
410  * freeing ourselves we must return -1 to keep the transaction code from further
411  * referencing this item.
412  */
413 STATIC xfs_lsn_t
414 xfs_efd_item_committed(
415 	struct xfs_log_item	*lip,
416 	xfs_lsn_t		lsn)
417 {
418 	struct xfs_efd_log_item	*efdp = EFD_ITEM(lip);
419 
420 	/*
421 	 * Drop the EFI reference regardless of whether the EFD has been
422 	 * aborted. Once the EFD transaction is constructed, it is the sole
423 	 * responsibility of the EFD to release the EFI (even if the EFI is
424 	 * aborted due to log I/O error).
425 	 */
426 	xfs_efi_release(efdp->efd_efip);
427 	xfs_efd_item_free(efdp);
428 
429 	return (xfs_lsn_t)-1;
430 }
431 
432 /*
433  * The EFD dependency tracking op doesn't do squat.  It can't because
434  * it doesn't know where the free extent is coming from.  The dependency
435  * tracking has to be handled by the "enclosing" metadata object.  For
436  * example, for inodes, the inode is locked throughout the extent freeing
437  * so the dependency should be recorded there.
438  */
439 STATIC void
440 xfs_efd_item_committing(
441 	struct xfs_log_item	*lip,
442 	xfs_lsn_t		lsn)
443 {
444 }
445 
446 /*
447  * This is the ops vector shared by all efd log items.
448  */
449 static const struct xfs_item_ops xfs_efd_item_ops = {
450 	.iop_size	= xfs_efd_item_size,
451 	.iop_format	= xfs_efd_item_format,
452 	.iop_pin	= xfs_efd_item_pin,
453 	.iop_unpin	= xfs_efd_item_unpin,
454 	.iop_unlock	= xfs_efd_item_unlock,
455 	.iop_committed	= xfs_efd_item_committed,
456 	.iop_push	= xfs_efd_item_push,
457 	.iop_committing = xfs_efd_item_committing
458 };
459 
460 /*
461  * Allocate and initialize an efd item with the given number of extents.
462  */
463 struct xfs_efd_log_item *
464 xfs_efd_init(
465 	struct xfs_mount	*mp,
466 	struct xfs_efi_log_item	*efip,
467 	uint			nextents)
468 
469 {
470 	struct xfs_efd_log_item	*efdp;
471 	uint			size;
472 
473 	ASSERT(nextents > 0);
474 	if (nextents > XFS_EFD_MAX_FAST_EXTENTS) {
475 		size = (uint)(sizeof(xfs_efd_log_item_t) +
476 			((nextents - 1) * sizeof(xfs_extent_t)));
477 		efdp = kmem_zalloc(size, KM_SLEEP);
478 	} else {
479 		efdp = kmem_zone_zalloc(xfs_efd_zone, KM_SLEEP);
480 	}
481 
482 	xfs_log_item_init(mp, &efdp->efd_item, XFS_LI_EFD, &xfs_efd_item_ops);
483 	efdp->efd_efip = efip;
484 	efdp->efd_format.efd_nextents = nextents;
485 	efdp->efd_format.efd_efi_id = efip->efi_format.efi_id;
486 
487 	return efdp;
488 }
489