+ /*
+ * If we have a CIL context, record the LSN of the iclog we were just
+ * granted space to start writing into. If the context doesn't have
+ * a start_lsn recorded, then this iclog will contain the start record
+ * for the checkpoint. Otherwise this write contains the commit record
+ * for the checkpoint.
+ */
+ if (ctx) {
+ spin_lock(&ctx->cil->xc_push_lock);
+ if (!ctx->start_lsn)
+ ctx->start_lsn = be64_to_cpu(iclog->ic_header.h_lsn);
+ else
+ ctx->commit_lsn = be64_to_cpu(iclog->ic_header.h_lsn);
+ spin_unlock(&ctx->cil->xc_push_lock);
+ }
I have to say that having this cil_ctx specific logic that somehow
reverse eingeer what the callers is doing here seems pretty awkware.
To me the logical interface would be to pass a function pointer and
private data except for the performance penalty of indirect calls.
But to make this somewhat bearable I think you should start with the
above block as a helper implemented in xfs_log_cil.c.