1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
8 #include "xfs_format.h"
9 #include "xfs_log_format.h"
10 #include "xfs_trans_resv.h"
12 #include "xfs_shared.h"
13 #include "xfs_mount.h"
15 #include "xfs_defer.h"
16 #include "xfs_trans.h"
17 #include "xfs_trans_priv.h"
18 #include "xfs_extfree_item.h"
20 #include "xfs_btree.h"
22 #include "xfs_alloc.h"
24 #include "xfs_trace.h"
25 #include "xfs_error.h"
26 #include "xfs_log_priv.h"
27 #include "xfs_log_recover.h"
28 #include "xfs_rtalloc.h"
29 #include "xfs_inode.h"
30 #include "xfs_rtbitmap.h"
31 #include "xfs_rtgroup.h"
33 struct kmem_cache
*xfs_efi_cache
;
34 struct kmem_cache
*xfs_efd_cache
;
36 static const struct xfs_item_ops xfs_efi_item_ops
;
38 static inline struct xfs_efi_log_item
*EFI_ITEM(struct xfs_log_item
*lip
)
40 return container_of(lip
, struct xfs_efi_log_item
, efi_item
);
45 struct xfs_efi_log_item
*efip
)
47 kvfree(efip
->efi_item
.li_lv_shadow
);
48 if (efip
->efi_format
.efi_nextents
> XFS_EFI_MAX_FAST_EXTENTS
)
51 kmem_cache_free(xfs_efi_cache
, efip
);
55 * Freeing the efi requires that we remove it from the AIL if it has already
56 * been placed there. However, the EFI may not yet have been placed in the AIL
57 * when called by xfs_efi_release() from EFD processing due to the ordering of
58 * committed vs unpin operations in bulk insert operations. Hence the reference
59 * count to ensure only the last caller frees the EFI.
63 struct xfs_efi_log_item
*efip
)
65 ASSERT(atomic_read(&efip
->efi_refcount
) > 0);
66 if (!atomic_dec_and_test(&efip
->efi_refcount
))
69 xfs_trans_ail_delete(&efip
->efi_item
, 0);
70 xfs_efi_item_free(efip
);
75 struct xfs_log_item
*lip
,
79 struct xfs_efi_log_item
*efip
= EFI_ITEM(lip
);
82 *nbytes
+= xfs_efi_log_format_sizeof(efip
->efi_format
.efi_nextents
);
86 * This is called to fill in the vector of log iovecs for the
87 * given efi log item. We use only 1 iovec, and we point that
88 * at the efi_log_format structure embedded in the efi item.
89 * It is at this point that we assert that all of the extent
90 * slots in the efi item have been filled.
94 struct xfs_log_item
*lip
,
95 struct xfs_log_vec
*lv
)
97 struct xfs_efi_log_item
*efip
= EFI_ITEM(lip
);
98 struct xfs_log_iovec
*vecp
= NULL
;
100 ASSERT(atomic_read(&efip
->efi_next_extent
) ==
101 efip
->efi_format
.efi_nextents
);
102 ASSERT(lip
->li_type
== XFS_LI_EFI
|| lip
->li_type
== XFS_LI_EFI_RT
);
104 efip
->efi_format
.efi_type
= lip
->li_type
;
105 efip
->efi_format
.efi_size
= 1;
107 xlog_copy_iovec(lv
, &vecp
, XLOG_REG_TYPE_EFI_FORMAT
, &efip
->efi_format
,
108 xfs_efi_log_format_sizeof(efip
->efi_format
.efi_nextents
));
112 * The unpin operation is the last place an EFI is manipulated in the log. It is
113 * either inserted in the AIL or aborted in the event of a log I/O error. In
114 * either case, the EFI transaction has been successfully committed to make it
115 * this far. Therefore, we expect whoever committed the EFI to either construct
116 * and commit the EFD or drop the EFD's reference in the event of error. Simply
117 * drop the log's EFI reference now that the log is done with it.
121 struct xfs_log_item
*lip
,
124 struct xfs_efi_log_item
*efip
= EFI_ITEM(lip
);
125 xfs_efi_release(efip
);
129 * The EFI has been either committed or aborted if the transaction has been
130 * cancelled. If the transaction was cancelled, an EFD isn't going to be
131 * constructed and thus we free the EFI here directly.
134 xfs_efi_item_release(
135 struct xfs_log_item
*lip
)
137 xfs_efi_release(EFI_ITEM(lip
));
141 * Allocate and initialize an efi item with the given number of extents.
143 STATIC
struct xfs_efi_log_item
*
145 struct xfs_mount
*mp
,
146 unsigned short item_type
,
149 struct xfs_efi_log_item
*efip
;
151 ASSERT(item_type
== XFS_LI_EFI
|| item_type
== XFS_LI_EFI_RT
);
152 ASSERT(nextents
> 0);
154 if (nextents
> XFS_EFI_MAX_FAST_EXTENTS
) {
155 efip
= kzalloc(xfs_efi_log_item_sizeof(nextents
),
156 GFP_KERNEL
| __GFP_NOFAIL
);
158 efip
= kmem_cache_zalloc(xfs_efi_cache
,
159 GFP_KERNEL
| __GFP_NOFAIL
);
162 xfs_log_item_init(mp
, &efip
->efi_item
, item_type
, &xfs_efi_item_ops
);
163 efip
->efi_format
.efi_nextents
= nextents
;
164 efip
->efi_format
.efi_id
= (uintptr_t)(void *)efip
;
165 atomic_set(&efip
->efi_next_extent
, 0);
166 atomic_set(&efip
->efi_refcount
, 2);
172 * Copy an EFI format buffer from the given buf, and into the destination
173 * EFI format structure.
174 * The given buffer can be in 32 bit or 64 bit form (which has different padding),
175 * one of which will be the native format for this kernel.
176 * It will handle the conversion of formats if necessary.
179 xfs_efi_copy_format(xfs_log_iovec_t
*buf
, xfs_efi_log_format_t
*dst_efi_fmt
)
181 xfs_efi_log_format_t
*src_efi_fmt
= buf
->i_addr
;
183 uint len
= xfs_efi_log_format_sizeof(src_efi_fmt
->efi_nextents
);
184 uint len32
= xfs_efi_log_format32_sizeof(src_efi_fmt
->efi_nextents
);
185 uint len64
= xfs_efi_log_format64_sizeof(src_efi_fmt
->efi_nextents
);
187 if (buf
->i_len
== len
) {
188 memcpy(dst_efi_fmt
, src_efi_fmt
,
189 offsetof(struct xfs_efi_log_format
, efi_extents
));
190 for (i
= 0; i
< src_efi_fmt
->efi_nextents
; i
++)
191 memcpy(&dst_efi_fmt
->efi_extents
[i
],
192 &src_efi_fmt
->efi_extents
[i
],
193 sizeof(struct xfs_extent
));
195 } else if (buf
->i_len
== len32
) {
196 xfs_efi_log_format_32_t
*src_efi_fmt_32
= buf
->i_addr
;
198 dst_efi_fmt
->efi_type
= src_efi_fmt_32
->efi_type
;
199 dst_efi_fmt
->efi_size
= src_efi_fmt_32
->efi_size
;
200 dst_efi_fmt
->efi_nextents
= src_efi_fmt_32
->efi_nextents
;
201 dst_efi_fmt
->efi_id
= src_efi_fmt_32
->efi_id
;
202 for (i
= 0; i
< dst_efi_fmt
->efi_nextents
; i
++) {
203 dst_efi_fmt
->efi_extents
[i
].ext_start
=
204 src_efi_fmt_32
->efi_extents
[i
].ext_start
;
205 dst_efi_fmt
->efi_extents
[i
].ext_len
=
206 src_efi_fmt_32
->efi_extents
[i
].ext_len
;
209 } else if (buf
->i_len
== len64
) {
210 xfs_efi_log_format_64_t
*src_efi_fmt_64
= buf
->i_addr
;
212 dst_efi_fmt
->efi_type
= src_efi_fmt_64
->efi_type
;
213 dst_efi_fmt
->efi_size
= src_efi_fmt_64
->efi_size
;
214 dst_efi_fmt
->efi_nextents
= src_efi_fmt_64
->efi_nextents
;
215 dst_efi_fmt
->efi_id
= src_efi_fmt_64
->efi_id
;
216 for (i
= 0; i
< dst_efi_fmt
->efi_nextents
; i
++) {
217 dst_efi_fmt
->efi_extents
[i
].ext_start
=
218 src_efi_fmt_64
->efi_extents
[i
].ext_start
;
219 dst_efi_fmt
->efi_extents
[i
].ext_len
=
220 src_efi_fmt_64
->efi_extents
[i
].ext_len
;
224 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, NULL
, buf
->i_addr
,
226 return -EFSCORRUPTED
;
229 static inline struct xfs_efd_log_item
*EFD_ITEM(struct xfs_log_item
*lip
)
231 return container_of(lip
, struct xfs_efd_log_item
, efd_item
);
235 xfs_efd_item_free(struct xfs_efd_log_item
*efdp
)
237 kvfree(efdp
->efd_item
.li_lv_shadow
);
238 if (efdp
->efd_format
.efd_nextents
> XFS_EFD_MAX_FAST_EXTENTS
)
241 kmem_cache_free(xfs_efd_cache
, efdp
);
246 struct xfs_log_item
*lip
,
250 struct xfs_efd_log_item
*efdp
= EFD_ITEM(lip
);
253 *nbytes
+= xfs_efd_log_format_sizeof(efdp
->efd_format
.efd_nextents
);
257 * This is called to fill in the vector of log iovecs for the
258 * given efd log item. We use only 1 iovec, and we point that
259 * at the efd_log_format structure embedded in the efd item.
260 * It is at this point that we assert that all of the extent
261 * slots in the efd item have been filled.
265 struct xfs_log_item
*lip
,
266 struct xfs_log_vec
*lv
)
268 struct xfs_efd_log_item
*efdp
= EFD_ITEM(lip
);
269 struct xfs_log_iovec
*vecp
= NULL
;
271 ASSERT(efdp
->efd_next_extent
== efdp
->efd_format
.efd_nextents
);
272 ASSERT(lip
->li_type
== XFS_LI_EFD
|| lip
->li_type
== XFS_LI_EFD_RT
);
274 efdp
->efd_format
.efd_type
= lip
->li_type
;
275 efdp
->efd_format
.efd_size
= 1;
277 xlog_copy_iovec(lv
, &vecp
, XLOG_REG_TYPE_EFD_FORMAT
, &efdp
->efd_format
,
278 xfs_efd_log_format_sizeof(efdp
->efd_format
.efd_nextents
));
282 * The EFD is either committed or aborted if the transaction is cancelled. If
283 * the transaction is cancelled, drop our reference to the EFI and free the EFD.
286 xfs_efd_item_release(
287 struct xfs_log_item
*lip
)
289 struct xfs_efd_log_item
*efdp
= EFD_ITEM(lip
);
291 xfs_efi_release(efdp
->efd_efip
);
292 xfs_efd_item_free(efdp
);
295 static struct xfs_log_item
*
297 struct xfs_log_item
*lip
)
299 return &EFD_ITEM(lip
)->efd_efip
->efi_item
;
302 static const struct xfs_item_ops xfs_efd_item_ops
= {
303 .flags
= XFS_ITEM_RELEASE_WHEN_COMMITTED
|
304 XFS_ITEM_INTENT_DONE
,
305 .iop_size
= xfs_efd_item_size
,
306 .iop_format
= xfs_efd_item_format
,
307 .iop_release
= xfs_efd_item_release
,
308 .iop_intent
= xfs_efd_item_intent
,
311 static inline struct xfs_extent_free_item
*xefi_entry(const struct list_head
*e
)
313 return list_entry(e
, struct xfs_extent_free_item
, xefi_list
);
317 xfs_efi_item_isrt(const struct xfs_log_item
*lip
)
319 ASSERT(lip
->li_type
== XFS_LI_EFI
|| lip
->li_type
== XFS_LI_EFI_RT
);
321 return lip
->li_type
== XFS_LI_EFI_RT
;
325 * Fill the EFD with all extents from the EFI when we need to roll the
326 * transaction and continue with a new EFI.
328 * This simply copies all the extents in the EFI to the EFD rather than make
329 * assumptions about which extents in the EFI have already been processed. We
330 * currently keep the xefi list in the same order as the EFI extent list, but
331 * that may not always be the case. Copying everything avoids leaving a landmine
332 * were we fail to cancel all the extents in an EFI if the xefi list is
333 * processed in a different order to the extents in the EFI.
337 struct xfs_efd_log_item
*efdp
)
339 struct xfs_efi_log_item
*efip
= efdp
->efd_efip
;
342 ASSERT(efip
->efi_format
.efi_nextents
> 0);
343 ASSERT(efdp
->efd_next_extent
< efip
->efi_format
.efi_nextents
);
345 for (i
= 0; i
< efip
->efi_format
.efi_nextents
; i
++) {
346 efdp
->efd_format
.efd_extents
[i
] =
347 efip
->efi_format
.efi_extents
[i
];
349 efdp
->efd_next_extent
= efip
->efi_format
.efi_nextents
;
354 struct xfs_efd_log_item
*efdp
,
355 struct xfs_extent_free_item
*xefi
)
357 struct xfs_extent
*extp
;
359 ASSERT(efdp
->efd_next_extent
< efdp
->efd_format
.efd_nextents
);
361 extp
= &efdp
->efd_format
.efd_extents
[efdp
->efd_next_extent
];
362 extp
->ext_start
= xefi
->xefi_startblock
;
363 extp
->ext_len
= xefi
->xefi_blockcount
;
365 efdp
->efd_next_extent
++;
368 /* Sort bmap items by AG. */
370 xfs_extent_free_diff_items(
372 const struct list_head
*a
,
373 const struct list_head
*b
)
375 struct xfs_extent_free_item
*ra
= xefi_entry(a
);
376 struct xfs_extent_free_item
*rb
= xefi_entry(b
);
378 return ra
->xefi_group
->xg_gno
- rb
->xefi_group
->xg_gno
;
381 /* Log a free extent to the intent item. */
383 xfs_extent_free_log_item(
384 struct xfs_trans
*tp
,
385 struct xfs_efi_log_item
*efip
,
386 struct xfs_extent_free_item
*xefi
)
389 struct xfs_extent
*extp
;
392 * atomic_inc_return gives us the value after the increment;
393 * we want to use it as an array index so we need to subtract 1 from
396 next_extent
= atomic_inc_return(&efip
->efi_next_extent
) - 1;
397 ASSERT(next_extent
< efip
->efi_format
.efi_nextents
);
398 extp
= &efip
->efi_format
.efi_extents
[next_extent
];
399 extp
->ext_start
= xefi
->xefi_startblock
;
400 extp
->ext_len
= xefi
->xefi_blockcount
;
403 static struct xfs_log_item
*
404 __xfs_extent_free_create_intent(
405 struct xfs_trans
*tp
,
406 struct list_head
*items
,
409 unsigned short item_type
)
411 struct xfs_mount
*mp
= tp
->t_mountp
;
412 struct xfs_efi_log_item
*efip
;
413 struct xfs_extent_free_item
*xefi
;
417 efip
= xfs_efi_init(mp
, item_type
, count
);
419 list_sort(mp
, items
, xfs_extent_free_diff_items
);
420 list_for_each_entry(xefi
, items
, xefi_list
)
421 xfs_extent_free_log_item(tp
, efip
, xefi
);
422 return &efip
->efi_item
;
425 static struct xfs_log_item
*
426 xfs_extent_free_create_intent(
427 struct xfs_trans
*tp
,
428 struct list_head
*items
,
432 return __xfs_extent_free_create_intent(tp
, items
, count
, sort
,
436 static inline unsigned short
437 xfs_efd_type_from_efi(const struct xfs_efi_log_item
*efip
)
439 return xfs_efi_item_isrt(&efip
->efi_item
) ? XFS_LI_EFD_RT
: XFS_LI_EFD
;
442 /* Get an EFD so we can process all the free extents. */
443 static struct xfs_log_item
*
444 xfs_extent_free_create_done(
445 struct xfs_trans
*tp
,
446 struct xfs_log_item
*intent
,
449 struct xfs_efi_log_item
*efip
= EFI_ITEM(intent
);
450 struct xfs_efd_log_item
*efdp
;
454 if (count
> XFS_EFD_MAX_FAST_EXTENTS
) {
455 efdp
= kzalloc(xfs_efd_log_item_sizeof(count
),
456 GFP_KERNEL
| __GFP_NOFAIL
);
458 efdp
= kmem_cache_zalloc(xfs_efd_cache
,
459 GFP_KERNEL
| __GFP_NOFAIL
);
462 xfs_log_item_init(tp
->t_mountp
, &efdp
->efd_item
,
463 xfs_efd_type_from_efi(efip
), &xfs_efd_item_ops
);
464 efdp
->efd_efip
= efip
;
465 efdp
->efd_format
.efd_nextents
= count
;
466 efdp
->efd_format
.efd_efi_id
= efip
->efi_format
.efi_id
;
468 return &efdp
->efd_item
;
471 static inline const struct xfs_defer_op_type
*
473 struct xfs_extent_free_item
*xefi
)
475 if (xfs_efi_is_realtime(xefi
))
476 return &xfs_rtextent_free_defer_type
;
477 if (xefi
->xefi_agresv
== XFS_AG_RESV_AGFL
)
478 return &xfs_agfl_free_defer_type
;
479 return &xfs_extent_free_defer_type
;
482 /* Add this deferred EFI to the transaction. */
484 xfs_extent_free_defer_add(
485 struct xfs_trans
*tp
,
486 struct xfs_extent_free_item
*xefi
,
487 struct xfs_defer_pending
**dfpp
)
489 struct xfs_mount
*mp
= tp
->t_mountp
;
491 xefi
->xefi_group
= xfs_group_intent_get(mp
, xefi
->xefi_startblock
,
492 xfs_efi_is_realtime(xefi
) ? XG_TYPE_RTG
: XG_TYPE_AG
);
494 trace_xfs_extent_free_defer(mp
, xefi
);
495 *dfpp
= xfs_defer_add(tp
, &xefi
->xefi_list
, xefi_ops(xefi
));
498 /* Cancel a free extent. */
500 xfs_extent_free_cancel_item(
501 struct list_head
*item
)
503 struct xfs_extent_free_item
*xefi
= xefi_entry(item
);
505 xfs_group_intent_put(xefi
->xefi_group
);
506 kmem_cache_free(xfs_extfree_item_cache
, xefi
);
509 /* Process a free extent. */
511 xfs_extent_free_finish_item(
512 struct xfs_trans
*tp
,
513 struct xfs_log_item
*done
,
514 struct list_head
*item
,
515 struct xfs_btree_cur
**state
)
517 struct xfs_owner_info oinfo
= { };
518 struct xfs_extent_free_item
*xefi
= xefi_entry(item
);
519 struct xfs_efd_log_item
*efdp
= EFD_ITEM(done
);
520 struct xfs_mount
*mp
= tp
->t_mountp
;
524 agbno
= XFS_FSB_TO_AGBNO(mp
, xefi
->xefi_startblock
);
526 oinfo
.oi_owner
= xefi
->xefi_owner
;
527 if (xefi
->xefi_flags
& XFS_EFI_ATTR_FORK
)
528 oinfo
.oi_flags
|= XFS_OWNER_INFO_ATTR_FORK
;
529 if (xefi
->xefi_flags
& XFS_EFI_BMBT_BLOCK
)
530 oinfo
.oi_flags
|= XFS_OWNER_INFO_BMBT_BLOCK
;
532 trace_xfs_extent_free_deferred(mp
, xefi
);
535 * If we need a new transaction to make progress, the caller will log a
536 * new EFI with the current contents. It will also log an EFD to cancel
537 * the existing EFI, and so we need to copy all the unprocessed extents
538 * in this EFI to the EFD so this works correctly.
540 if (!(xefi
->xefi_flags
& XFS_EFI_CANCELLED
))
541 error
= __xfs_free_extent(tp
, to_perag(xefi
->xefi_group
), agbno
,
542 xefi
->xefi_blockcount
, &oinfo
, xefi
->xefi_agresv
,
543 xefi
->xefi_flags
& XFS_EFI_SKIP_DISCARD
);
544 if (error
== -EAGAIN
) {
545 xfs_efd_from_efi(efdp
);
549 xfs_efd_add_extent(efdp
, xefi
);
550 xfs_extent_free_cancel_item(item
);
554 /* Abort all pending EFIs. */
556 xfs_extent_free_abort_intent(
557 struct xfs_log_item
*intent
)
559 xfs_efi_release(EFI_ITEM(intent
));
563 * AGFL blocks are accounted differently in the reserve pools and are not
564 * inserted into the busy extent list.
567 xfs_agfl_free_finish_item(
568 struct xfs_trans
*tp
,
569 struct xfs_log_item
*done
,
570 struct list_head
*item
,
571 struct xfs_btree_cur
**state
)
573 struct xfs_owner_info oinfo
= { };
574 struct xfs_mount
*mp
= tp
->t_mountp
;
575 struct xfs_efd_log_item
*efdp
= EFD_ITEM(done
);
576 struct xfs_extent_free_item
*xefi
= xefi_entry(item
);
577 struct xfs_buf
*agbp
;
581 ASSERT(xefi
->xefi_blockcount
== 1);
582 agbno
= XFS_FSB_TO_AGBNO(mp
, xefi
->xefi_startblock
);
583 oinfo
.oi_owner
= xefi
->xefi_owner
;
585 trace_xfs_agfl_free_deferred(mp
, xefi
);
587 error
= xfs_alloc_read_agf(to_perag(xefi
->xefi_group
), tp
, 0, &agbp
);
589 error
= xfs_free_ag_extent(tp
, agbp
, agbno
, 1, &oinfo
,
592 xfs_efd_add_extent(efdp
, xefi
);
593 xfs_extent_free_cancel_item(&xefi
->xefi_list
);
597 /* Is this recovered EFI ok? */
599 xfs_efi_validate_ext(
600 struct xfs_mount
*mp
,
602 struct xfs_extent
*extp
)
605 return xfs_verify_rtbext(mp
, extp
->ext_start
, extp
->ext_len
);
607 return xfs_verify_fsbext(mp
, extp
->ext_start
, extp
->ext_len
);
611 xfs_efi_recover_work(
612 struct xfs_mount
*mp
,
613 struct xfs_defer_pending
*dfp
,
615 struct xfs_extent
*extp
)
617 struct xfs_extent_free_item
*xefi
;
619 xefi
= kmem_cache_zalloc(xfs_extfree_item_cache
,
620 GFP_KERNEL
| __GFP_NOFAIL
);
621 xefi
->xefi_startblock
= extp
->ext_start
;
622 xefi
->xefi_blockcount
= extp
->ext_len
;
623 xefi
->xefi_agresv
= XFS_AG_RESV_NONE
;
624 xefi
->xefi_owner
= XFS_RMAP_OWN_UNKNOWN
;
625 xefi
->xefi_group
= xfs_group_intent_get(mp
, extp
->ext_start
,
626 isrt
? XG_TYPE_RTG
: XG_TYPE_AG
);
628 xefi
->xefi_flags
|= XFS_EFI_REALTIME
;
630 xfs_defer_add_item(dfp
, &xefi
->xefi_list
);
634 * Process an extent free intent item that was recovered from
635 * the log. We need to free the extents that it describes.
638 xfs_extent_free_recover_work(
639 struct xfs_defer_pending
*dfp
,
640 struct list_head
*capture_list
)
642 struct xfs_trans_res resv
;
643 struct xfs_log_item
*lip
= dfp
->dfp_intent
;
644 struct xfs_efi_log_item
*efip
= EFI_ITEM(lip
);
645 struct xfs_mount
*mp
= lip
->li_log
->l_mp
;
646 struct xfs_trans
*tp
;
649 bool isrt
= xfs_efi_item_isrt(lip
);
652 * First check the validity of the extents described by the EFI. If
653 * any are bad, then assume that all are bad and just toss the EFI.
654 * Mixing RT and non-RT extents in the same EFI item is not allowed.
656 for (i
= 0; i
< efip
->efi_format
.efi_nextents
; i
++) {
657 if (!xfs_efi_validate_ext(mp
, isrt
,
658 &efip
->efi_format
.efi_extents
[i
])) {
659 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, mp
,
661 sizeof(efip
->efi_format
));
662 return -EFSCORRUPTED
;
665 xfs_efi_recover_work(mp
, dfp
, isrt
,
666 &efip
->efi_format
.efi_extents
[i
]);
669 resv
= xlog_recover_resv(&M_RES(mp
)->tr_itruncate
);
670 error
= xfs_trans_alloc(mp
, &resv
, 0, 0, 0, &tp
);
674 error
= xlog_recover_finish_intent(tp
, dfp
);
675 if (error
== -EFSCORRUPTED
)
676 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, mp
,
678 sizeof(efip
->efi_format
));
682 return xfs_defer_ops_capture_and_commit(tp
, capture_list
);
685 xfs_trans_cancel(tp
);
689 /* Relog an intent item to push the log tail forward. */
690 static struct xfs_log_item
*
691 xfs_extent_free_relog_intent(
692 struct xfs_trans
*tp
,
693 struct xfs_log_item
*intent
,
694 struct xfs_log_item
*done_item
)
696 struct xfs_efd_log_item
*efdp
= EFD_ITEM(done_item
);
697 struct xfs_efi_log_item
*efip
;
698 struct xfs_extent
*extp
;
701 count
= EFI_ITEM(intent
)->efi_format
.efi_nextents
;
702 extp
= EFI_ITEM(intent
)->efi_format
.efi_extents
;
704 ASSERT(intent
->li_type
== XFS_LI_EFI
|| intent
->li_type
== XFS_LI_EFI_RT
);
706 efdp
->efd_next_extent
= count
;
707 memcpy(efdp
->efd_format
.efd_extents
, extp
, count
* sizeof(*extp
));
709 efip
= xfs_efi_init(tp
->t_mountp
, intent
->li_type
, count
);
710 memcpy(efip
->efi_format
.efi_extents
, extp
, count
* sizeof(*extp
));
711 atomic_set(&efip
->efi_next_extent
, count
);
713 return &efip
->efi_item
;
716 const struct xfs_defer_op_type xfs_extent_free_defer_type
= {
717 .name
= "extent_free",
718 .max_items
= XFS_EFI_MAX_FAST_EXTENTS
,
719 .create_intent
= xfs_extent_free_create_intent
,
720 .abort_intent
= xfs_extent_free_abort_intent
,
721 .create_done
= xfs_extent_free_create_done
,
722 .finish_item
= xfs_extent_free_finish_item
,
723 .cancel_item
= xfs_extent_free_cancel_item
,
724 .recover_work
= xfs_extent_free_recover_work
,
725 .relog_intent
= xfs_extent_free_relog_intent
,
728 /* sub-type with special handling for AGFL deferred frees */
729 const struct xfs_defer_op_type xfs_agfl_free_defer_type
= {
731 .max_items
= XFS_EFI_MAX_FAST_EXTENTS
,
732 .create_intent
= xfs_extent_free_create_intent
,
733 .abort_intent
= xfs_extent_free_abort_intent
,
734 .create_done
= xfs_extent_free_create_done
,
735 .finish_item
= xfs_agfl_free_finish_item
,
736 .cancel_item
= xfs_extent_free_cancel_item
,
737 .recover_work
= xfs_extent_free_recover_work
,
738 .relog_intent
= xfs_extent_free_relog_intent
,
742 /* Create a realtime extent freeing */
743 static struct xfs_log_item
*
744 xfs_rtextent_free_create_intent(
745 struct xfs_trans
*tp
,
746 struct list_head
*items
,
750 return __xfs_extent_free_create_intent(tp
, items
, count
, sort
,
754 /* Process a free realtime extent. */
756 xfs_rtextent_free_finish_item(
757 struct xfs_trans
*tp
,
758 struct xfs_log_item
*done
,
759 struct list_head
*item
,
760 struct xfs_btree_cur
**state
)
762 struct xfs_mount
*mp
= tp
->t_mountp
;
763 struct xfs_extent_free_item
*xefi
= xefi_entry(item
);
764 struct xfs_efd_log_item
*efdp
= EFD_ITEM(done
);
765 struct xfs_rtgroup
**rtgp
= (struct xfs_rtgroup
**)state
;
768 trace_xfs_extent_free_deferred(mp
, xefi
);
770 if (!(xefi
->xefi_flags
& XFS_EFI_CANCELLED
)) {
771 if (*rtgp
!= to_rtg(xefi
->xefi_group
)) {
772 *rtgp
= to_rtg(xefi
->xefi_group
);
773 xfs_rtgroup_lock(*rtgp
, XFS_RTGLOCK_BITMAP
);
774 xfs_rtgroup_trans_join(tp
, *rtgp
,
777 error
= xfs_rtfree_blocks(tp
, *rtgp
,
778 xefi
->xefi_startblock
, xefi
->xefi_blockcount
);
780 if (error
== -EAGAIN
) {
781 xfs_efd_from_efi(efdp
);
785 xfs_efd_add_extent(efdp
, xefi
);
786 xfs_extent_free_cancel_item(item
);
790 const struct xfs_defer_op_type xfs_rtextent_free_defer_type
= {
791 .name
= "rtextent_free",
792 .max_items
= XFS_EFI_MAX_FAST_EXTENTS
,
793 .create_intent
= xfs_rtextent_free_create_intent
,
794 .abort_intent
= xfs_extent_free_abort_intent
,
795 .create_done
= xfs_extent_free_create_done
,
796 .finish_item
= xfs_rtextent_free_finish_item
,
797 .cancel_item
= xfs_extent_free_cancel_item
,
798 .recover_work
= xfs_extent_free_recover_work
,
799 .relog_intent
= xfs_extent_free_relog_intent
,
802 const struct xfs_defer_op_type xfs_rtextent_free_defer_type
= {
803 .name
= "rtextent_free",
805 #endif /* CONFIG_XFS_RT */
809 struct xfs_log_item
*lip
,
812 return EFI_ITEM(lip
)->efi_format
.efi_id
== intent_id
;
815 static const struct xfs_item_ops xfs_efi_item_ops
= {
816 .flags
= XFS_ITEM_INTENT
,
817 .iop_size
= xfs_efi_item_size
,
818 .iop_format
= xfs_efi_item_format
,
819 .iop_unpin
= xfs_efi_item_unpin
,
820 .iop_release
= xfs_efi_item_release
,
821 .iop_match
= xfs_efi_item_match
,
825 * This routine is called to create an in-core extent free intent
826 * item from the efi format structure which was logged on disk.
827 * It allocates an in-core efi, copies the extents from the format
828 * structure into it, and adds the efi to the AIL with the given
832 xlog_recover_efi_commit_pass2(
834 struct list_head
*buffer_list
,
835 struct xlog_recover_item
*item
,
838 struct xfs_mount
*mp
= log
->l_mp
;
839 struct xfs_efi_log_item
*efip
;
840 struct xfs_efi_log_format
*efi_formatp
;
843 efi_formatp
= item
->ri_buf
[0].i_addr
;
845 if (item
->ri_buf
[0].i_len
< xfs_efi_log_format_sizeof(0)) {
846 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, mp
,
847 item
->ri_buf
[0].i_addr
, item
->ri_buf
[0].i_len
);
848 return -EFSCORRUPTED
;
851 efip
= xfs_efi_init(mp
, ITEM_TYPE(item
), efi_formatp
->efi_nextents
);
852 error
= xfs_efi_copy_format(&item
->ri_buf
[0], &efip
->efi_format
);
854 xfs_efi_item_free(efip
);
857 atomic_set(&efip
->efi_next_extent
, efi_formatp
->efi_nextents
);
859 xlog_recover_intent_item(log
, &efip
->efi_item
, lsn
,
860 &xfs_extent_free_defer_type
);
864 const struct xlog_recover_item_ops xlog_efi_item_ops
= {
865 .item_type
= XFS_LI_EFI
,
866 .commit_pass2
= xlog_recover_efi_commit_pass2
,
871 xlog_recover_rtefi_commit_pass2(
873 struct list_head
*buffer_list
,
874 struct xlog_recover_item
*item
,
877 struct xfs_mount
*mp
= log
->l_mp
;
878 struct xfs_efi_log_item
*efip
;
879 struct xfs_efi_log_format
*efi_formatp
;
882 efi_formatp
= item
->ri_buf
[0].i_addr
;
884 if (item
->ri_buf
[0].i_len
< xfs_efi_log_format_sizeof(0)) {
885 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, mp
,
886 item
->ri_buf
[0].i_addr
, item
->ri_buf
[0].i_len
);
887 return -EFSCORRUPTED
;
890 efip
= xfs_efi_init(mp
, ITEM_TYPE(item
), efi_formatp
->efi_nextents
);
891 error
= xfs_efi_copy_format(&item
->ri_buf
[0], &efip
->efi_format
);
893 xfs_efi_item_free(efip
);
896 atomic_set(&efip
->efi_next_extent
, efi_formatp
->efi_nextents
);
898 xlog_recover_intent_item(log
, &efip
->efi_item
, lsn
,
899 &xfs_rtextent_free_defer_type
);
904 xlog_recover_rtefi_commit_pass2(
906 struct list_head
*buffer_list
,
907 struct xlog_recover_item
*item
,
910 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, log
->l_mp
,
911 item
->ri_buf
[0].i_addr
, item
->ri_buf
[0].i_len
);
912 return -EFSCORRUPTED
;
916 const struct xlog_recover_item_ops xlog_rtefi_item_ops
= {
917 .item_type
= XFS_LI_EFI_RT
,
918 .commit_pass2
= xlog_recover_rtefi_commit_pass2
,
922 * This routine is called when an EFD format structure is found in a committed
923 * transaction in the log. Its purpose is to cancel the corresponding EFI if it
924 * was still in the log. To do this it searches the AIL for the EFI with an id
925 * equal to that in the EFD format structure. If we find it we drop the EFD
926 * reference, which removes the EFI from the AIL and frees it.
929 xlog_recover_efd_commit_pass2(
931 struct list_head
*buffer_list
,
932 struct xlog_recover_item
*item
,
935 struct xfs_efd_log_format
*efd_formatp
;
936 int buflen
= item
->ri_buf
[0].i_len
;
938 efd_formatp
= item
->ri_buf
[0].i_addr
;
940 if (buflen
< sizeof(struct xfs_efd_log_format
)) {
941 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, log
->l_mp
,
942 efd_formatp
, buflen
);
943 return -EFSCORRUPTED
;
946 if (item
->ri_buf
[0].i_len
!= xfs_efd_log_format32_sizeof(
947 efd_formatp
->efd_nextents
) &&
948 item
->ri_buf
[0].i_len
!= xfs_efd_log_format64_sizeof(
949 efd_formatp
->efd_nextents
)) {
950 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, log
->l_mp
,
951 efd_formatp
, buflen
);
952 return -EFSCORRUPTED
;
955 xlog_recover_release_intent(log
, XFS_LI_EFI
, efd_formatp
->efd_efi_id
);
959 const struct xlog_recover_item_ops xlog_efd_item_ops
= {
960 .item_type
= XFS_LI_EFD
,
961 .commit_pass2
= xlog_recover_efd_commit_pass2
,
966 xlog_recover_rtefd_commit_pass2(
968 struct list_head
*buffer_list
,
969 struct xlog_recover_item
*item
,
972 struct xfs_efd_log_format
*efd_formatp
;
973 int buflen
= item
->ri_buf
[0].i_len
;
975 efd_formatp
= item
->ri_buf
[0].i_addr
;
977 if (buflen
< sizeof(struct xfs_efd_log_format
)) {
978 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, log
->l_mp
,
979 efd_formatp
, buflen
);
980 return -EFSCORRUPTED
;
983 if (item
->ri_buf
[0].i_len
!= xfs_efd_log_format32_sizeof(
984 efd_formatp
->efd_nextents
) &&
985 item
->ri_buf
[0].i_len
!= xfs_efd_log_format64_sizeof(
986 efd_formatp
->efd_nextents
)) {
987 XFS_CORRUPTION_ERROR(__func__
, XFS_ERRLEVEL_LOW
, log
->l_mp
,
988 efd_formatp
, buflen
);
989 return -EFSCORRUPTED
;
992 xlog_recover_release_intent(log
, XFS_LI_EFI_RT
,
993 efd_formatp
->efd_efi_id
);
997 # define xlog_recover_rtefd_commit_pass2 xlog_recover_rtefi_commit_pass2
1000 const struct xlog_recover_item_ops xlog_rtefd_item_ops
= {
1001 .item_type
= XFS_LI_EFD_RT
,
1002 .commit_pass2
= xlog_recover_rtefd_commit_pass2
,