diff options
| author | Christoph Hellwig <hch@sgi.com> | 2005-06-21 01:41:19 -0400 |
|---|---|---|
| committer | Nathan Scott <nathans@sgi.com> | 2005-06-21 01:41:19 -0400 |
| commit | 7d795ca3442c7a562c45aeb7a7a808c79992a589 (patch) | |
| tree | b18bf1ccbca3cb59b9fb31d0072de24c276aba9f | |
| parent | f898d6c09caa40d82203acd72e9fda3cd5aeae74 (diff) | |
[XFS] consolidate extent item freeing
SGI-PV: 938062
SGI-Modid: xfs-linux:xfs-kern:194415a
Signed-off-by: Christoph Hellwig <hch@sgi.com>
Signed-off-by: Nathan Scott <nathans@sgi.com>
| -rw-r--r-- | fs/xfs/xfs_extfree_item.c | 122 | ||||
| -rw-r--r-- | fs/xfs/xfs_extfree_item.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_log_recover.c | 14 |
3 files changed, 35 insertions, 103 deletions
diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 4b45ff739e6b..db7cbd1bc857 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c | |||
| @@ -59,6 +59,18 @@ STATIC void xfs_efi_item_abort(xfs_efi_log_item_t *); | |||
| 59 | STATIC void xfs_efd_item_abort(xfs_efd_log_item_t *); | 59 | STATIC void xfs_efd_item_abort(xfs_efd_log_item_t *); |
| 60 | 60 | ||
| 61 | 61 | ||
| 62 | void | ||
| 63 | xfs_efi_item_free(xfs_efi_log_item_t *efip) | ||
| 64 | { | ||
| 65 | int nexts = efip->efi_format.efi_nextents; | ||
| 66 | |||
| 67 | if (nexts > XFS_EFI_MAX_FAST_EXTENTS) { | ||
| 68 | kmem_free(efip, sizeof(xfs_efi_log_item_t) + | ||
| 69 | (nexts - 1) * sizeof(xfs_extent_t)); | ||
| 70 | } else { | ||
| 71 | kmem_zone_free(xfs_efi_zone, efip); | ||
| 72 | } | ||
| 73 | } | ||
| 62 | 74 | ||
| 63 | /* | 75 | /* |
| 64 | * This returns the number of iovecs needed to log the given efi item. | 76 | * This returns the number of iovecs needed to log the given efi item. |
| @@ -120,8 +132,6 @@ xfs_efi_item_pin(xfs_efi_log_item_t *efip) | |||
| 120 | STATIC void | 132 | STATIC void |
| 121 | xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) | 133 | xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) |
| 122 | { | 134 | { |
| 123 | int nexts; | ||
| 124 | int size; | ||
| 125 | xfs_mount_t *mp; | 135 | xfs_mount_t *mp; |
| 126 | SPLDECL(s); | 136 | SPLDECL(s); |
| 127 | 137 | ||
| @@ -132,21 +142,11 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) | |||
| 132 | * xfs_trans_delete_ail() drops the AIL lock. | 142 | * xfs_trans_delete_ail() drops the AIL lock. |
| 133 | */ | 143 | */ |
| 134 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); | 144 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); |
| 135 | 145 | xfs_efi_item_free(efip); | |
| 136 | nexts = efip->efi_format.efi_nextents; | ||
| 137 | if (nexts > XFS_EFI_MAX_FAST_EXTENTS) { | ||
| 138 | size = sizeof(xfs_efi_log_item_t); | ||
| 139 | size += (nexts - 1) * sizeof(xfs_extent_t); | ||
| 140 | kmem_free(efip, size); | ||
| 141 | } else { | ||
| 142 | kmem_zone_free(xfs_efi_zone, efip); | ||
| 143 | } | ||
| 144 | } else { | 146 | } else { |
| 145 | efip->efi_flags |= XFS_EFI_COMMITTED; | 147 | efip->efi_flags |= XFS_EFI_COMMITTED; |
| 146 | AIL_UNLOCK(mp, s); | 148 | AIL_UNLOCK(mp, s); |
| 147 | } | 149 | } |
| 148 | |||
| 149 | return; | ||
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | /* | 152 | /* |
| @@ -159,8 +159,6 @@ xfs_efi_item_unpin(xfs_efi_log_item_t *efip, int stale) | |||
| 159 | STATIC void | 159 | STATIC void |
| 160 | xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) | 160 | xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) |
| 161 | { | 161 | { |
| 162 | int nexts; | ||
| 163 | int size; | ||
| 164 | xfs_mount_t *mp; | 162 | xfs_mount_t *mp; |
| 165 | xfs_log_item_desc_t *lidp; | 163 | xfs_log_item_desc_t *lidp; |
| 166 | SPLDECL(s); | 164 | SPLDECL(s); |
| @@ -178,23 +176,11 @@ xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) | |||
| 178 | * xfs_trans_delete_ail() drops the AIL lock. | 176 | * xfs_trans_delete_ail() drops the AIL lock. |
| 179 | */ | 177 | */ |
| 180 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); | 178 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); |
| 181 | /* | 179 | xfs_efi_item_free(efip); |
| 182 | * now free the item itself | ||
| 183 | */ | ||
| 184 | nexts = efip->efi_format.efi_nextents; | ||
| 185 | if (nexts > XFS_EFI_MAX_FAST_EXTENTS) { | ||
| 186 | size = sizeof(xfs_efi_log_item_t); | ||
| 187 | size += (nexts - 1) * sizeof(xfs_extent_t); | ||
| 188 | kmem_free(efip, size); | ||
| 189 | } else { | ||
| 190 | kmem_zone_free(xfs_efi_zone, efip); | ||
| 191 | } | ||
| 192 | } else { | 180 | } else { |
| 193 | efip->efi_flags |= XFS_EFI_COMMITTED; | 181 | efip->efi_flags |= XFS_EFI_COMMITTED; |
| 194 | AIL_UNLOCK(mp, s); | 182 | AIL_UNLOCK(mp, s); |
| 195 | } | 183 | } |
| 196 | |||
| 197 | return; | ||
| 198 | } | 184 | } |
| 199 | 185 | ||
| 200 | /* | 186 | /* |
| @@ -245,18 +231,7 @@ xfs_efi_item_committed(xfs_efi_log_item_t *efip, xfs_lsn_t lsn) | |||
| 245 | STATIC void | 231 | STATIC void |
| 246 | xfs_efi_item_abort(xfs_efi_log_item_t *efip) | 232 | xfs_efi_item_abort(xfs_efi_log_item_t *efip) |
| 247 | { | 233 | { |
| 248 | int nexts; | 234 | xfs_efi_item_free(efip); |
| 249 | int size; | ||
| 250 | |||
| 251 | nexts = efip->efi_format.efi_nextents; | ||
| 252 | if (nexts > XFS_EFI_MAX_FAST_EXTENTS) { | ||
| 253 | size = sizeof(xfs_efi_log_item_t); | ||
| 254 | size += (nexts - 1) * sizeof(xfs_extent_t); | ||
| 255 | kmem_free(efip, size); | ||
| 256 | } else { | ||
| 257 | kmem_zone_free(xfs_efi_zone, efip); | ||
| 258 | } | ||
| 259 | return; | ||
| 260 | } | 235 | } |
| 261 | 236 | ||
| 262 | /* | 237 | /* |
| @@ -355,8 +330,6 @@ xfs_efi_release(xfs_efi_log_item_t *efip, | |||
| 355 | { | 330 | { |
| 356 | xfs_mount_t *mp; | 331 | xfs_mount_t *mp; |
| 357 | int extents_left; | 332 | int extents_left; |
| 358 | uint size; | ||
| 359 | int nexts; | ||
| 360 | SPLDECL(s); | 333 | SPLDECL(s); |
| 361 | 334 | ||
| 362 | mp = efip->efi_item.li_mountp; | 335 | mp = efip->efi_item.li_mountp; |
| @@ -372,20 +345,10 @@ xfs_efi_release(xfs_efi_log_item_t *efip, | |||
| 372 | * xfs_trans_delete_ail() drops the AIL lock. | 345 | * xfs_trans_delete_ail() drops the AIL lock. |
| 373 | */ | 346 | */ |
| 374 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); | 347 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); |
| 348 | xfs_efi_item_free(efip); | ||
| 375 | } else { | 349 | } else { |
| 376 | AIL_UNLOCK(mp, s); | 350 | AIL_UNLOCK(mp, s); |
| 377 | } | 351 | } |
| 378 | |||
| 379 | if (extents_left == 0) { | ||
| 380 | nexts = efip->efi_format.efi_nextents; | ||
| 381 | if (nexts > XFS_EFI_MAX_FAST_EXTENTS) { | ||
| 382 | size = sizeof(xfs_efi_log_item_t); | ||
| 383 | size += (nexts - 1) * sizeof(xfs_extent_t); | ||
| 384 | kmem_free(efip, size); | ||
| 385 | } else { | ||
| 386 | kmem_zone_free(xfs_efi_zone, efip); | ||
| 387 | } | ||
| 388 | } | ||
| 389 | } | 352 | } |
| 390 | 353 | ||
| 391 | /* | 354 | /* |
| @@ -398,8 +361,6 @@ STATIC void | |||
| 398 | xfs_efi_cancel( | 361 | xfs_efi_cancel( |
| 399 | xfs_efi_log_item_t *efip) | 362 | xfs_efi_log_item_t *efip) |
| 400 | { | 363 | { |
| 401 | int nexts; | ||
| 402 | int size; | ||
| 403 | xfs_mount_t *mp; | 364 | xfs_mount_t *mp; |
| 404 | SPLDECL(s); | 365 | SPLDECL(s); |
| 405 | 366 | ||
| @@ -410,26 +371,25 @@ xfs_efi_cancel( | |||
| 410 | * xfs_trans_delete_ail() drops the AIL lock. | 371 | * xfs_trans_delete_ail() drops the AIL lock. |
| 411 | */ | 372 | */ |
| 412 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); | 373 | xfs_trans_delete_ail(mp, (xfs_log_item_t *)efip, s); |
| 413 | 374 | xfs_efi_item_free(efip); | |
| 414 | nexts = efip->efi_format.efi_nextents; | ||
| 415 | if (nexts > XFS_EFI_MAX_FAST_EXTENTS) { | ||
| 416 | size = sizeof(xfs_efi_log_item_t); | ||
| 417 | size += (nexts - 1) * sizeof(xfs_extent_t); | ||
| 418 | kmem_free(efip, size); | ||
| 419 | } else { | ||
| 420 | kmem_zone_free(xfs_efi_zone, efip); | ||
| 421 | } | ||
| 422 | } else { | 375 | } else { |
| 423 | efip->efi_flags |= XFS_EFI_CANCELED; | 376 | efip->efi_flags |= XFS_EFI_CANCELED; |
| 424 | AIL_UNLOCK(mp, s); | 377 | AIL_UNLOCK(mp, s); |
| 425 | } | 378 | } |
| 426 | |||
| 427 | return; | ||
| 428 | } | 379 | } |
| 429 | 380 | ||
| 381 | STATIC void | ||
| 382 | xfs_efd_item_free(xfs_efd_log_item_t *efdp) | ||
| 383 | { | ||
| 384 | int nexts = efdp->efd_format.efd_nextents; | ||
| 430 | 385 | ||
| 431 | 386 | if (nexts > XFS_EFD_MAX_FAST_EXTENTS) { | |
| 432 | 387 | kmem_free(efdp, sizeof(xfs_efd_log_item_t) + | |
| 388 | (nexts - 1) * sizeof(xfs_extent_t)); | ||
| 389 | } else { | ||
| 390 | kmem_zone_free(xfs_efd_zone, efdp); | ||
| 391 | } | ||
| 392 | } | ||
| 433 | 393 | ||
| 434 | /* | 394 | /* |
| 435 | * This returns the number of iovecs needed to log the given efd item. | 395 | * This returns the number of iovecs needed to log the given efd item. |
| @@ -533,9 +493,6 @@ xfs_efd_item_unlock(xfs_efd_log_item_t *efdp) | |||
| 533 | STATIC xfs_lsn_t | 493 | STATIC xfs_lsn_t |
| 534 | xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn) | 494 | xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn) |
| 535 | { | 495 | { |
| 536 | uint size; | ||
| 537 | int nexts; | ||
| 538 | |||
| 539 | /* | 496 | /* |
| 540 | * If we got a log I/O error, it's always the case that the LR with the | 497 | * If we got a log I/O error, it's always the case that the LR with the |
| 541 | * EFI got unpinned and freed before the EFD got aborted. | 498 | * EFI got unpinned and freed before the EFD got aborted. |
| @@ -543,15 +500,7 @@ xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn) | |||
| 543 | if ((efdp->efd_item.li_flags & XFS_LI_ABORTED) == 0) | 500 | if ((efdp->efd_item.li_flags & XFS_LI_ABORTED) == 0) |
| 544 | xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); | 501 | xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); |
| 545 | 502 | ||
| 546 | nexts = efdp->efd_format.efd_nextents; | 503 | xfs_efd_item_free(efdp); |
| 547 | if (nexts > XFS_EFD_MAX_FAST_EXTENTS) { | ||
| 548 | size = sizeof(xfs_efd_log_item_t); | ||
| 549 | size += (nexts - 1) * sizeof(xfs_extent_t); | ||
| 550 | kmem_free(efdp, size); | ||
| 551 | } else { | ||
| 552 | kmem_zone_free(xfs_efd_zone, efdp); | ||
| 553 | } | ||
| 554 | |||
| 555 | return (xfs_lsn_t)-1; | 504 | return (xfs_lsn_t)-1; |
| 556 | } | 505 | } |
| 557 | 506 | ||
| @@ -565,9 +514,6 @@ xfs_efd_item_committed(xfs_efd_log_item_t *efdp, xfs_lsn_t lsn) | |||
| 565 | STATIC void | 514 | STATIC void |
| 566 | xfs_efd_item_abort(xfs_efd_log_item_t *efdp) | 515 | xfs_efd_item_abort(xfs_efd_log_item_t *efdp) |
| 567 | { | 516 | { |
| 568 | int nexts; | ||
| 569 | int size; | ||
| 570 | |||
| 571 | /* | 517 | /* |
| 572 | * If we got a log I/O error, it's always the case that the LR with the | 518 | * If we got a log I/O error, it's always the case that the LR with the |
| 573 | * EFI got unpinned and freed before the EFD got aborted. So don't | 519 | * EFI got unpinned and freed before the EFD got aborted. So don't |
| @@ -576,15 +522,7 @@ xfs_efd_item_abort(xfs_efd_log_item_t *efdp) | |||
| 576 | if ((efdp->efd_item.li_flags & XFS_LI_ABORTED) == 0) | 522 | if ((efdp->efd_item.li_flags & XFS_LI_ABORTED) == 0) |
| 577 | xfs_efi_cancel(efdp->efd_efip); | 523 | xfs_efi_cancel(efdp->efd_efip); |
| 578 | 524 | ||
| 579 | nexts = efdp->efd_format.efd_nextents; | 525 | xfs_efd_item_free(efdp); |
| 580 | if (nexts > XFS_EFD_MAX_FAST_EXTENTS) { | ||
| 581 | size = sizeof(xfs_efd_log_item_t); | ||
| 582 | size += (nexts - 1) * sizeof(xfs_extent_t); | ||
| 583 | kmem_free(efdp, size); | ||
| 584 | } else { | ||
| 585 | kmem_zone_free(xfs_efd_zone, efdp); | ||
| 586 | } | ||
| 587 | return; | ||
| 588 | } | 526 | } |
| 589 | 527 | ||
| 590 | /* | 528 | /* |
diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 7122d6101d15..d433bac9f59d 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h | |||
| @@ -118,6 +118,8 @@ xfs_efi_log_item_t *xfs_efi_init(struct xfs_mount *, uint); | |||
| 118 | xfs_efd_log_item_t *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *, | 118 | xfs_efd_log_item_t *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *, |
| 119 | uint); | 119 | uint); |
| 120 | 120 | ||
| 121 | void xfs_efi_item_free(xfs_efi_log_item_t *); | ||
| 122 | |||
| 121 | #endif /* __KERNEL__ */ | 123 | #endif /* __KERNEL__ */ |
| 122 | 124 | ||
| 123 | #endif /* __XFS_EXTFREE_ITEM_H__ */ | 125 | #endif /* __XFS_EXTFREE_ITEM_H__ */ |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 91d764a5a9b2..0aac28ddb81c 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -2747,7 +2747,6 @@ xlog_recover_do_efd_trans( | |||
| 2747 | xfs_efi_log_item_t *efip = NULL; | 2747 | xfs_efi_log_item_t *efip = NULL; |
| 2748 | xfs_log_item_t *lip; | 2748 | xfs_log_item_t *lip; |
| 2749 | int gen; | 2749 | int gen; |
| 2750 | int nexts; | ||
| 2751 | __uint64_t efi_id; | 2750 | __uint64_t efi_id; |
| 2752 | SPLDECL(s); | 2751 | SPLDECL(s); |
| 2753 | 2752 | ||
| @@ -2782,22 +2781,15 @@ xlog_recover_do_efd_trans( | |||
| 2782 | } | 2781 | } |
| 2783 | lip = xfs_trans_next_ail(mp, lip, &gen, NULL); | 2782 | lip = xfs_trans_next_ail(mp, lip, &gen, NULL); |
| 2784 | } | 2783 | } |
| 2785 | if (lip == NULL) { | ||
| 2786 | AIL_UNLOCK(mp, s); | ||
| 2787 | } | ||
| 2788 | 2784 | ||
| 2789 | /* | 2785 | /* |
| 2790 | * If we found it, then free it up. If it wasn't there, it | 2786 | * If we found it, then free it up. If it wasn't there, it |
| 2791 | * must have been overwritten in the log. Oh well. | 2787 | * must have been overwritten in the log. Oh well. |
| 2792 | */ | 2788 | */ |
| 2793 | if (lip != NULL) { | 2789 | if (lip != NULL) { |
| 2794 | nexts = efip->efi_format.efi_nextents; | 2790 | xfs_efi_item_free(efip); |
| 2795 | if (nexts > XFS_EFI_MAX_FAST_EXTENTS) { | 2791 | } else { |
| 2796 | kmem_free(lip, sizeof(xfs_efi_log_item_t) + | 2792 | AIL_UNLOCK(mp, s); |
| 2797 | ((nexts - 1) * sizeof(xfs_extent_t))); | ||
| 2798 | } else { | ||
| 2799 | kmem_zone_free(xfs_efi_zone, efip); | ||
| 2800 | } | ||
| 2801 | } | 2793 | } |
| 2802 | } | 2794 | } |
| 2803 | 2795 | ||
