]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libxfs: propagate transaction block reservations
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 20 Jul 2017 15:51:46 +0000 (10:51 -0500)
committerEric Sandeen <sandeen@redhat.com>
Thu, 20 Jul 2017 15:51:46 +0000 (10:51 -0500)
Certain parts of the libxfs preemptively refuse to run if the
transaction block reservation has fallen to zero.  We leave t_blk_res at
its default of zero, which means that these code paths always fail even
if the transaction was allocated with a non-zero block reservation.  Set
t_blk_res and maintain it through transaction rolls, even though we
don't do much enforcement the transaction block limits.

[sandeen: This broke during a libxfs sync to userspace, see Fixes:]

Fixes: 0268fdc3 ("xfs: remove xfs_trans_get_block_res")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/trans.c

index e161c2852e0e5d9414e7f9c5109487c502c664cb..b9ee3cff7ed2d3448033cdbe801c6315bc771308 100644 (file)
@@ -106,6 +106,7 @@ libxfs_trans_roll(
        struct xfs_mount        *mp;
        struct xfs_trans        *trans;
        struct xfs_trans_res    tres;
+       unsigned int            old_blk_res;
        int                     error;
 
        /*
@@ -121,6 +122,7 @@ libxfs_trans_roll(
        mp = trans->t_mountp;
        tres.tr_logres = trans->t_log_res;
        tres.tr_logcount = trans->t_log_count;
+       old_blk_res = trans->t_blk_res;
 
        /*
         * Commit the current transaction.
@@ -145,6 +147,8 @@ libxfs_trans_roll(
        tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
        error = libxfs_trans_alloc(mp, &tres, 0, 0, 0, tpp);
        trans = *tpp;
+       trans->t_blk_res = old_blk_res;
+
        /*
         *  Ensure that the inode is in the new transaction and locked.
         */
@@ -185,6 +189,7 @@ libxfs_trans_alloc(
                exit(1);
        }
        ptr->t_mountp = mp;
+       ptr->t_blk_res = blocks;
        INIT_LIST_HEAD(&ptr->t_items);
 #ifdef XACT_DEBUG
        fprintf(stderr, "allocated new transaction %p\n", ptr);
@@ -750,7 +755,7 @@ trans_committed(
         list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) {
                struct xfs_log_item *lip = lidp->lid_item;
 
-                xfs_trans_del_item(lip);
+               xfs_trans_del_item(lip);
 
                if (lip->li_type == XFS_LI_BUF)
                        buf_item_done((xfs_buf_log_item_t *)lip);