xfs: re-order initial space accounting checks in xlog_write
authorDave Chinner <dchinner@redhat.com>
Thu, 26 Mar 2020 01:18:21 +0000 (18:18 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Fri, 27 Mar 2020 15:32:53 +0000 (08:32 -0700)
Commit and unmount records records do not need start records to be
written, so rearrange the logic in xlog_write() to remove the need
to check for XLOG_TIC_INITED to determine if we should account for
the space used by a start record.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_log.c

index 33f089aa2a25b7ded6a3ec77fa4f2dace0837a94..3a4fe4e2e73648e6eca8db0a12630cbd0b317791 100644 (file)
@@ -2356,10 +2356,10 @@ xlog_write(
        bool                    need_start_rec)
 {
        struct xlog_in_core     *iclog = NULL;
-       struct xfs_log_iovec    *vecp;
-       struct xfs_log_vec      *lv;
+       struct xfs_log_vec      *lv = log_vector;
+       struct xfs_log_iovec    *vecp = lv->lv_iovecp;
+       int                     index = 0;
        int                     len;
-       int                     index;
        int                     partial_copy = 0;
        int                     partial_copy_len = 0;
        int                     contwr = 0;
@@ -2367,24 +2367,16 @@ xlog_write(
        int                     data_cnt = 0;
        int                     error = 0;
 
-       *start_lsn = 0;
-
-
        /*
-        * Region headers and bytes are already accounted for.  We only need to
-        * take into account start records and split regions in this function.
+        * If this is a commit or unmount transaction, we don't need a start
+        * record to be written.  We do, however, have to account for the
+        * commit or unmount header that gets written. Hence we always have
+        * to account for an extra xlog_op_header here.
         */
-       if (ticket->t_flags & XLOG_TIC_INITED) {
-               ticket->t_curr_res -= sizeof(struct xlog_op_header);
+       ticket->t_curr_res -= sizeof(struct xlog_op_header);
+       if (ticket->t_flags & XLOG_TIC_INITED)
                ticket->t_flags &= ~XLOG_TIC_INITED;
-       }
 
-       /*
-        * Commit record headers and unmount records need to be accounted for.
-        * These come in as separate writes so are easy to detect.
-        */
-       if (!need_start_rec)
-               ticket->t_curr_res -= sizeof(struct xlog_op_header);
        if (ticket->t_curr_res < 0) {
                xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
                     "ctx ticket reservation ran out. Need to up reservation");
@@ -2393,10 +2385,7 @@ xlog_write(
        }
 
        len = xlog_write_calc_vec_length(ticket, log_vector, need_start_rec);
-
-       index = 0;
-       lv = log_vector;
-       vecp = lv->lv_iovecp;
+       *start_lsn = 0;
        while (lv && (!lv->lv_niovecs || index < lv->lv_niovecs)) {
                void            *ptr;
                int             log_offset;