Loading fs/xfs/libxfs/xfs_bmap.c +1 −0 Original line number Diff line number Diff line Loading @@ -5945,6 +5945,7 @@ xfs_bmap_split_extent( return xfs_trans_commit(tp); out: xfs_bmap_cancel(&free_list); xfs_trans_cancel(tp); return error; } fs/xfs/libxfs/xfs_ialloc.c +1 −1 Original line number Diff line number Diff line Loading @@ -2233,7 +2233,7 @@ xfs_imap_lookup( } xfs_trans_brelse(tp, agbp); xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); if (error) return error; Loading fs/xfs/xfs_bmap_util.c +48 −39 Original line number Diff line number Diff line Loading @@ -67,16 +67,15 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) */ int /* error */ xfs_bmap_finish( xfs_trans_t **tp, /* transaction pointer addr */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ struct xfs_trans **tp, /* transaction pointer addr */ struct xfs_bmap_free *flist, /* i/o: list extents to free */ int *committed)/* xact committed or not */ { xfs_efd_log_item_t *efd; /* extent free data */ xfs_efi_log_item_t *efi; /* extent free intention */ struct xfs_efd_log_item *efd; /* extent free data */ struct xfs_efi_log_item *efi; /* extent free intention */ int error; /* error return value */ xfs_bmap_free_item_t *free; /* free extent item */ xfs_mount_t *mp; /* filesystem mount structure */ xfs_bmap_free_item_t *next; /* next item on free list */ struct xfs_bmap_free_item *free; /* free extent item */ struct xfs_bmap_free_item *next; /* next item on free list */ ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); if (flist->xbf_count == 0) { Loading @@ -88,40 +87,48 @@ xfs_bmap_finish( xfs_trans_log_efi_extent(*tp, efi, free->xbfi_startblock, free->xbfi_blockcount); error = xfs_trans_roll(tp, NULL); *committed = 1; error = __xfs_trans_roll(tp, NULL, committed); if (error) { /* * We have a new transaction, so we should return committed=1, * even though we're returning an error. */ if (error) return error; efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; if ((error = xfs_free_extent(*tp, free->xbfi_startblock, free->xbfi_blockcount))) { /* * The bmap free list will be cleaned up at a * higher level. The EFI will be canceled when * this transaction is aborted. * Need to force shutdown here to make sure it * happens, since this transaction may not be * dirty yet. */ mp = (*tp)->t_mountp; if (!XFS_FORCED_SHUTDOWN(mp)) xfs_force_shutdown(mp, * If the transaction was committed, drop the EFD reference * since we're bailing out of here. The other reference is * dropped when the EFI hits the AIL. * * If the transaction was not committed, the EFI is freed by the * EFI item unlock handler on abort. Also, we have a new * transaction so we should return committed=1 even though we're * returning an error. */ if (*committed) { xfs_efi_release(efi); xfs_force_shutdown((*tp)->t_mountp, (error == -EFSCORRUPTED) ? SHUTDOWN_CORRUPT_INCORE : SHUTDOWN_META_IO_ERROR); } else { *committed = 1; } return error; } xfs_trans_log_efd_extent(*tp, efd, free->xbfi_startblock, /* * Get an EFD and free each extent in the list, logging to the EFD in * the process. The remaining bmap free list is cleaned up by the caller * on error. */ efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; error = xfs_trans_free_extent(*tp, efd, free->xbfi_startblock, free->xbfi_blockcount); if (error) return error; xfs_bmap_del_free(flist, NULL, free); } return 0; } Loading Loading @@ -1467,7 +1474,7 @@ xfs_shift_file_space( XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, XFS_QMOPT_RES_REGBLKS); if (error) goto out; goto out_trans_cancel; xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); Loading @@ -1481,18 +1488,20 @@ xfs_shift_file_space( &done, stop_fsb, &first_block, &free_list, direction, XFS_BMAP_MAX_SHIFT_EXTENTS); if (error) goto out; goto out_bmap_cancel; error = xfs_bmap_finish(&tp, &free_list, &committed); if (error) goto out; goto out_bmap_cancel; error = xfs_trans_commit(tp); } return error; out: out_bmap_cancel: xfs_bmap_cancel(&free_list); out_trans_cancel: xfs_trans_cancel(tp); return error; } Loading fs/xfs/xfs_buf_item.c +1 −5 Original line number Diff line number Diff line Loading @@ -647,11 +647,7 @@ xfs_buf_item_unlock( xfs_buf_item_relse(bp); else if (aborted) { ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); if (lip->li_flags & XFS_LI_IN_AIL) { spin_lock(&lip->li_ailp->xa_lock); xfs_trans_ail_delete(lip->li_ailp, lip, SHUTDOWN_LOG_IO_ERROR); } xfs_trans_ail_remove(lip, SHUTDOWN_LOG_IO_ERROR); xfs_buf_item_relse(bp); } } Loading fs/xfs/xfs_dquot.c +2 −6 Original line number Diff line number Diff line Loading @@ -954,12 +954,8 @@ xfs_qm_dqflush( struct xfs_log_item *lip = &dqp->q_logitem.qli_item; dqp->dq_flags &= ~XFS_DQ_DIRTY; spin_lock(&mp->m_ail->xa_lock); if (lip->li_flags & XFS_LI_IN_AIL) xfs_trans_ail_delete(mp->m_ail, lip, SHUTDOWN_CORRUPT_INCORE); else spin_unlock(&mp->m_ail->xa_lock); xfs_trans_ail_remove(lip, SHUTDOWN_CORRUPT_INCORE); error = -EIO; goto out_unlock; } Loading Loading
fs/xfs/libxfs/xfs_bmap.c +1 −0 Original line number Diff line number Diff line Loading @@ -5945,6 +5945,7 @@ xfs_bmap_split_extent( return xfs_trans_commit(tp); out: xfs_bmap_cancel(&free_list); xfs_trans_cancel(tp); return error; }
fs/xfs/libxfs/xfs_ialloc.c +1 −1 Original line number Diff line number Diff line Loading @@ -2233,7 +2233,7 @@ xfs_imap_lookup( } xfs_trans_brelse(tp, agbp); xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); if (error) return error; Loading
fs/xfs/xfs_bmap_util.c +48 −39 Original line number Diff line number Diff line Loading @@ -67,16 +67,15 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) */ int /* error */ xfs_bmap_finish( xfs_trans_t **tp, /* transaction pointer addr */ xfs_bmap_free_t *flist, /* i/o: list extents to free */ struct xfs_trans **tp, /* transaction pointer addr */ struct xfs_bmap_free *flist, /* i/o: list extents to free */ int *committed)/* xact committed or not */ { xfs_efd_log_item_t *efd; /* extent free data */ xfs_efi_log_item_t *efi; /* extent free intention */ struct xfs_efd_log_item *efd; /* extent free data */ struct xfs_efi_log_item *efi; /* extent free intention */ int error; /* error return value */ xfs_bmap_free_item_t *free; /* free extent item */ xfs_mount_t *mp; /* filesystem mount structure */ xfs_bmap_free_item_t *next; /* next item on free list */ struct xfs_bmap_free_item *free; /* free extent item */ struct xfs_bmap_free_item *next; /* next item on free list */ ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); if (flist->xbf_count == 0) { Loading @@ -88,40 +87,48 @@ xfs_bmap_finish( xfs_trans_log_efi_extent(*tp, efi, free->xbfi_startblock, free->xbfi_blockcount); error = xfs_trans_roll(tp, NULL); *committed = 1; error = __xfs_trans_roll(tp, NULL, committed); if (error) { /* * We have a new transaction, so we should return committed=1, * even though we're returning an error. */ if (error) return error; efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; if ((error = xfs_free_extent(*tp, free->xbfi_startblock, free->xbfi_blockcount))) { /* * The bmap free list will be cleaned up at a * higher level. The EFI will be canceled when * this transaction is aborted. * Need to force shutdown here to make sure it * happens, since this transaction may not be * dirty yet. */ mp = (*tp)->t_mountp; if (!XFS_FORCED_SHUTDOWN(mp)) xfs_force_shutdown(mp, * If the transaction was committed, drop the EFD reference * since we're bailing out of here. The other reference is * dropped when the EFI hits the AIL. * * If the transaction was not committed, the EFI is freed by the * EFI item unlock handler on abort. Also, we have a new * transaction so we should return committed=1 even though we're * returning an error. */ if (*committed) { xfs_efi_release(efi); xfs_force_shutdown((*tp)->t_mountp, (error == -EFSCORRUPTED) ? SHUTDOWN_CORRUPT_INCORE : SHUTDOWN_META_IO_ERROR); } else { *committed = 1; } return error; } xfs_trans_log_efd_extent(*tp, efd, free->xbfi_startblock, /* * Get an EFD and free each extent in the list, logging to the EFD in * the process. The remaining bmap free list is cleaned up by the caller * on error. */ efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; error = xfs_trans_free_extent(*tp, efd, free->xbfi_startblock, free->xbfi_blockcount); if (error) return error; xfs_bmap_del_free(flist, NULL, free); } return 0; } Loading Loading @@ -1467,7 +1474,7 @@ xfs_shift_file_space( XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, XFS_QMOPT_RES_REGBLKS); if (error) goto out; goto out_trans_cancel; xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); Loading @@ -1481,18 +1488,20 @@ xfs_shift_file_space( &done, stop_fsb, &first_block, &free_list, direction, XFS_BMAP_MAX_SHIFT_EXTENTS); if (error) goto out; goto out_bmap_cancel; error = xfs_bmap_finish(&tp, &free_list, &committed); if (error) goto out; goto out_bmap_cancel; error = xfs_trans_commit(tp); } return error; out: out_bmap_cancel: xfs_bmap_cancel(&free_list); out_trans_cancel: xfs_trans_cancel(tp); return error; } Loading
fs/xfs/xfs_buf_item.c +1 −5 Original line number Diff line number Diff line Loading @@ -647,11 +647,7 @@ xfs_buf_item_unlock( xfs_buf_item_relse(bp); else if (aborted) { ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); if (lip->li_flags & XFS_LI_IN_AIL) { spin_lock(&lip->li_ailp->xa_lock); xfs_trans_ail_delete(lip->li_ailp, lip, SHUTDOWN_LOG_IO_ERROR); } xfs_trans_ail_remove(lip, SHUTDOWN_LOG_IO_ERROR); xfs_buf_item_relse(bp); } } Loading
fs/xfs/xfs_dquot.c +2 −6 Original line number Diff line number Diff line Loading @@ -954,12 +954,8 @@ xfs_qm_dqflush( struct xfs_log_item *lip = &dqp->q_logitem.qli_item; dqp->dq_flags &= ~XFS_DQ_DIRTY; spin_lock(&mp->m_ail->xa_lock); if (lip->li_flags & XFS_LI_IN_AIL) xfs_trans_ail_delete(mp->m_ail, lip, SHUTDOWN_CORRUPT_INCORE); else spin_unlock(&mp->m_ail->xa_lock); xfs_trans_ail_remove(lip, SHUTDOWN_CORRUPT_INCORE); error = -EIO; goto out_unlock; } Loading