linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Brian Foster <bfoster@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>,
	linux-xfs@vger.kernel.org, Dave Chinner <dchinner@redhat.com>
Subject: Re: [PATCH 1/8] xfs: don't try to write a start record into every iclog
Date: Thu, 26 Mar 2020 10:25:00 +1100	[thread overview]
Message-ID: <20200325232500.GK10776@dread.disaster.area> (raw)
In-Reply-To: <20200325123314.GC10922@bfoster>

On Wed, Mar 25, 2020 at 08:33:14AM -0400, Brian Foster wrote:
> On Tue, Mar 24, 2020 at 06:44:52PM +0100, Christoph Hellwig wrote:
> > From: Dave Chinner <dchinner@redhat.com>
> > 
> > The xlog_write() function iterates over iclogs until it completes
> > writing all the log vectors passed in. The ticket tracks whether
> > a start record has been written or not, so only the first iclog gets
> > a start record. We only ever pass single use tickets to
> > xlog_write() so we only ever need to write a start record once per
> > xlog_write() call.
> > 
> > Hence we don't need to store whether we should write a start record
> > in the ticket as the callers provide all the information we need to
> > determine if a start record should be written. For the moment, we
> > have to ensure that we clear the XLOG_TIC_INITED appropriately so
> > the code in xfs_log_done() still works correctly for committing
> > transactions.
> > 
> > Signed-off-by: Dave Chinner <dchinner@redhat.com>
> > [hch: use an need_start_rec bool]
> > Signed-off-by: Christoph Hellwig <hch@lst.de>
> > ---
> >  fs/xfs/xfs_log.c | 63 ++++++++++++++++++++++++------------------------
> >  1 file changed, 32 insertions(+), 31 deletions(-)
> > 
> > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
> > index 2a90a483c2d6..bf071552094a 100644
> > --- a/fs/xfs/xfs_log.c
> > +++ b/fs/xfs/xfs_log.c
> ...
> > @@ -2372,25 +2359,29 @@ xlog_write(
> >  	int			record_cnt = 0;
> >  	int			data_cnt = 0;
> >  	int			error = 0;
> > +	bool			need_start_rec = true;
> >  
> >  	*start_lsn = 0;
> >  
> > -	len = xlog_write_calc_vec_length(ticket, log_vector);
> >  
> >  	/*
> >  	 * Region headers and bytes are already accounted for.
> >  	 * We only need to take into account start records and
> >  	 * split regions in this function.
> >  	 */
> > -	if (ticket->t_flags & XLOG_TIC_INITED)
> > -		ticket->t_curr_res -= sizeof(xlog_op_header_t);
> > +	if (ticket->t_flags & XLOG_TIC_INITED) {
> > +		ticket->t_curr_res -= sizeof(struct xlog_op_header);
> > +		ticket->t_flags &= ~XLOG_TIC_INITED;
> > +	}
> >  
> >  	/*
> >  	 * Commit record headers need to be accounted for. These
> >  	 * come in as separate writes so are easy to detect.
> >  	 */
> > -	if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS))
> > -		ticket->t_curr_res -= sizeof(xlog_op_header_t);
> > +	if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS)) {
> > +		ticket->t_curr_res -= sizeof(struct xlog_op_header);
> > +		need_start_rec = false;
> > +	}
> 
> Hmm.. I was asking for a comment update in v1 for this logic change.
> Looking through it again, what happens here if
> xfs_log_write_unmount_record() clears the UNMOUNT_TRANS flag for that
> summary counter check? That looks like a potential behavior change wrt
> to the start record..

xfs_log_write_unmount_record() clears the XLOG_TIC_INITED
flag before calling xlog_write(), so the current code never writes
out a start record for the unmount record. i.e. the unmount
record is a single region with the unmount log item in it, and
AFAICT this code does not change the behaviour of the unmount record
write at all.

FWIW, that error injection code looks dodgy - it turns the unmount
record into an XFS_LOG transaction type with an invalid log item
type (0). That probably should be flagged as corruption, not be
silently ignored by recovery. IOWs, I think the error injection code
was wrong to begin with - if we want to ensure the log is dirty at
unmount, we should just skip writing the unmount record altogether.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

  reply	other threads:[~2020-03-25 23:25 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-24 17:44 xfs: clean up log tickets and record writes v3 Christoph Hellwig
2020-03-24 17:44 ` [PATCH 1/8] xfs: don't try to write a start record into every iclog Christoph Hellwig
2020-03-24 20:39   ` Darrick J. Wong
2020-03-25 12:33   ` Brian Foster
2020-03-25 23:25     ` Dave Chinner [this message]
2020-03-26 11:08       ` Brian Foster
2020-03-26 15:41         ` Darrick J. Wong
2020-03-24 17:44 ` [PATCH 2/8] xfs: re-order initial space accounting checks in xlog_write Christoph Hellwig
2020-03-24 20:39   ` Darrick J. Wong
2020-03-24 17:44 ` [PATCH 3/8] xfs: refactor and split xfs_log_done() Christoph Hellwig
2020-03-24 20:39   ` Darrick J. Wong
2020-03-25 12:33   ` Brian Foster
2020-03-24 17:44 ` [PATCH 4/8] xfs: kill XLOG_TIC_INITED Christoph Hellwig
2020-03-24 20:40   ` Darrick J. Wong
2020-03-24 17:44 ` [PATCH 5/8] xfs: split xlog_ticket_done Christoph Hellwig
2020-03-24 20:41   ` Darrick J. Wong
2020-03-25 12:34   ` Brian Foster
2020-03-24 17:44 ` [PATCH 6/8] xfs: merge xlog_commit_record with xlog_write_done() Christoph Hellwig
2020-03-24 20:41   ` Darrick J. Wong
2020-03-24 17:44 ` [PATCH 7/8] xfs: refactor unmount record writing Christoph Hellwig
2020-03-24 20:41   ` Darrick J. Wong
2020-03-24 17:44 ` [PATCH 8/8] xfs: remove some stale comments from the log code Christoph Hellwig
2020-03-24 20:42   ` Darrick J. Wong
2020-03-25 18:42 xfs: clean up log tickets and record writes v4 Christoph Hellwig
2020-03-25 18:42 ` [PATCH 1/8] xfs: don't try to write a start record into every iclog Christoph Hellwig
2020-03-26  4:49   ` Darrick J. Wong
2020-03-26 11:09   ` Brian Foster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200325232500.GK10776@dread.disaster.area \
    --to=david@fromorbit.com \
    --cc=bfoster@redhat.com \
    --cc=dchinner@redhat.com \
    --cc=hch@lst.de \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).