xfs: xfs_log_force_lsn isn't passed a LSN
commit 5f9b4b0de8dc2fb8eb655463b438001c111570fe upstream. [backported from CIL scalability series for dependency] In doing an investigation into AIL push stalls, I was looking at the log force code to see if an async CIL push could be done instead. This lead me to xfs_log_force_lsn() and looking at how it works. xfs_log_force_lsn() is only called from inode synchronisation contexts such as fsync(), and it takes the ip->i_itemp->ili_last_lsn value as the LSN to sync the log to. This gets passed to xlog_cil_force_lsn() via xfs_log_force_lsn() to flush the CIL to the journal, and then used by xfs_log_force_lsn() to flush the iclogs to the journal. The problem is that ip->i_itemp->ili_last_lsn does not store a log sequence number. What it stores is passed to it from the ->iop_committing method, which is called by xfs_log_commit_cil(). The value this passes to the iop_committing method is the CIL context sequence number that the item was committed to. As it turns out, xlog_cil_force_lsn() converts the sequence to an actual commit LSN for the related context and returns that to xfs_log_force_lsn(). xfs_log_force_lsn() overwrites it's "lsn" variable that contained a sequence with an actual LSN and then uses that to sync the iclogs. This caused me some confusion for a while, even though I originally wrote all this code a decade ago. ->iop_committing is only used by a couple of log item types, and only inode items use the sequence number it is passed. Let's clean up the API, CIL structures and inode log item to call it a sequence number, and make it clear that the high level code is using CIL sequence numbers and not on-disk LSNs for integrity synchronisation purposes. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Allison Henderson <allison.henderson@oracle.com> Signed-off-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Amir Goldstein <amir73il@gmail.com> Acked-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
41fbfdaba9
commit
6d3605f84e
@@ -230,7 +230,7 @@ struct xfs_cil;
|
||||
|
||||
struct xfs_cil_ctx {
|
||||
struct xfs_cil *cil;
|
||||
xfs_lsn_t sequence; /* chkpt sequence # */
|
||||
xfs_csn_t sequence; /* chkpt sequence # */
|
||||
xfs_lsn_t start_lsn; /* first LSN of chkpt commit */
|
||||
xfs_lsn_t commit_lsn; /* chkpt commit record lsn */
|
||||
struct xlog_ticket *ticket; /* chkpt ticket */
|
||||
@@ -268,10 +268,10 @@ struct xfs_cil {
|
||||
struct xfs_cil_ctx *xc_ctx;
|
||||
|
||||
spinlock_t xc_push_lock ____cacheline_aligned_in_smp;
|
||||
xfs_lsn_t xc_push_seq;
|
||||
xfs_csn_t xc_push_seq;
|
||||
struct list_head xc_committing;
|
||||
wait_queue_head_t xc_commit_wait;
|
||||
xfs_lsn_t xc_current_sequence;
|
||||
xfs_csn_t xc_current_sequence;
|
||||
struct work_struct xc_push_work;
|
||||
wait_queue_head_t xc_push_wait; /* background push throttle */
|
||||
} ____cacheline_aligned_in_smp;
|
||||
@@ -547,19 +547,18 @@ int xlog_cil_init(struct xlog *log);
|
||||
void xlog_cil_init_post_recovery(struct xlog *log);
|
||||
void xlog_cil_destroy(struct xlog *log);
|
||||
bool xlog_cil_empty(struct xlog *log);
|
||||
void xlog_cil_commit(struct xlog *log, struct xfs_trans *tp,
|
||||
xfs_csn_t *commit_seq, bool regrant);
|
||||
|
||||
/*
|
||||
* CIL force routines
|
||||
*/
|
||||
xfs_lsn_t
|
||||
xlog_cil_force_lsn(
|
||||
struct xlog *log,
|
||||
xfs_lsn_t sequence);
|
||||
xfs_lsn_t xlog_cil_force_seq(struct xlog *log, xfs_csn_t sequence);
|
||||
|
||||
static inline void
|
||||
xlog_cil_force(struct xlog *log)
|
||||
{
|
||||
xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence);
|
||||
xlog_cil_force_seq(log, log->l_cilp->xc_current_sequence);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user