提交 c34ba460 编写于 作者: D Dave Chinner 提交者: Zheng Zengkai

xfs: remove need_start_rec parameter from xlog_write()

mainline-inclusion
from mainline-v5.13-rc4
commit 3468bb1c
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I4KIAO
CVE: NA

Reference:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3468bb1ca6e8840789e13c7b9d8b0c556b4fbe79

-------------------------------------------------

The CIL push is the only call to xlog_write that sets this variable
to true. The other callers don't need a start rec, and they tell
xlog_write what to do by passing the type of ophdr they need written
in the flags field. The need_start_rec parameter essentially tells
xlog_write to to write an extra ophdr with a XLOG_START_TRANS type,
so get rid of the variable to do this and pass XLOG_START_TRANS as
the flag value into xlog_write() from the CIL push.

$ size fs/xfs/xfs_log.o*
  text	   data	    bss	    dec	    hex	filename
 27595	    560	      8	  28163	   6e03	fs/xfs/xfs_log.o.orig
 27454	    560	      8	  28022	   6d76	fs/xfs/xfs_log.o.patched
Signed-off-by: NDave Chinner <dchinner@redhat.com>
Reviewed-by: NChandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: NDarrick J. Wong <djwong@kernel.org>
Reviewed-by: NAllison Henderson <allison.henderson@oracle.com>
Signed-off-by: NDarrick J. Wong <djwong@kernel.org>
Signed-off-by: NGuo Xuenan <guoxuenan@huawei.com>
Reviewed-by: NLihong Kou <koulihong@huawei.com>
Reviewed-by: NZhang Yi <yi.zhang@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 707c70d7
...@@ -796,9 +796,7 @@ xlog_wait_on_iclog( ...@@ -796,9 +796,7 @@ xlog_wait_on_iclog(
static int static int
xlog_write_unmount_record( xlog_write_unmount_record(
struct xlog *log, struct xlog *log,
struct xlog_ticket *ticket, struct xlog_ticket *ticket)
xfs_lsn_t *lsn,
uint flags)
{ {
struct xfs_unmount_log_format ulf = { struct xfs_unmount_log_format ulf = {
.magic = XLOG_UNMOUNT_TYPE, .magic = XLOG_UNMOUNT_TYPE,
...@@ -815,7 +813,7 @@ xlog_write_unmount_record( ...@@ -815,7 +813,7 @@ xlog_write_unmount_record(
/* account for space used by record data */ /* account for space used by record data */
ticket->t_curr_res -= sizeof(ulf); ticket->t_curr_res -= sizeof(ulf);
return xlog_write(log, &vec, ticket, lsn, NULL, flags, false); return xlog_write(log, &vec, ticket, NULL, NULL, XLOG_UNMOUNT_TRANS);
} }
/* /*
...@@ -829,15 +827,13 @@ xlog_unmount_write( ...@@ -829,15 +827,13 @@ xlog_unmount_write(
struct xfs_mount *mp = log->l_mp; struct xfs_mount *mp = log->l_mp;
struct xlog_in_core *iclog; struct xlog_in_core *iclog;
struct xlog_ticket *tic = NULL; struct xlog_ticket *tic = NULL;
xfs_lsn_t lsn;
uint flags = XLOG_UNMOUNT_TRANS;
int error; int error;
error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0); error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0);
if (error) if (error)
goto out_err; goto out_err;
error = xlog_write_unmount_record(log, tic, &lsn, flags); error = xlog_write_unmount_record(log, tic);
/* /*
* At this point, we're umounting anyway, so there's no point in * At this point, we're umounting anyway, so there's no point in
* transitioning log state to IOERROR. Just continue... * transitioning log state to IOERROR. Just continue...
...@@ -1474,8 +1470,7 @@ xlog_commit_record( ...@@ -1474,8 +1470,7 @@ xlog_commit_record(
if (XLOG_FORCED_SHUTDOWN(log)) if (XLOG_FORCED_SHUTDOWN(log))
return -EIO; return -EIO;
error = xlog_write(log, &vec, ticket, lsn, iclog, XLOG_COMMIT_TRANS, error = xlog_write(log, &vec, ticket, lsn, iclog, XLOG_COMMIT_TRANS);
false);
if (error) if (error)
xfs_force_shutdown(log->l_mp, SHUTDOWN_LOG_IO_ERROR); xfs_force_shutdown(log->l_mp, SHUTDOWN_LOG_IO_ERROR);
return error; return error;
...@@ -2072,13 +2067,16 @@ static int ...@@ -2072,13 +2067,16 @@ static int
xlog_write_calc_vec_length( xlog_write_calc_vec_length(
struct xlog_ticket *ticket, struct xlog_ticket *ticket,
struct xfs_log_vec *log_vector, struct xfs_log_vec *log_vector,
bool need_start_rec) uint optype)
{ {
struct xfs_log_vec *lv; struct xfs_log_vec *lv;
int headers = need_start_rec ? 1 : 0; int headers = 0;
int len = 0; int len = 0;
int i; int i;
if (optype & XLOG_START_TRANS)
headers++;
for (lv = log_vector; lv; lv = lv->lv_next) { for (lv = log_vector; lv; lv = lv->lv_next) {
/* we don't write ordered log vectors */ /* we don't write ordered log vectors */
if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED) if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED)
...@@ -2298,8 +2296,7 @@ xlog_write( ...@@ -2298,8 +2296,7 @@ xlog_write(
struct xlog_ticket *ticket, struct xlog_ticket *ticket,
xfs_lsn_t *start_lsn, xfs_lsn_t *start_lsn,
struct xlog_in_core **commit_iclog, struct xlog_in_core **commit_iclog,
uint flags, uint optype)
bool need_start_rec)
{ {
struct xlog_in_core *iclog = NULL; struct xlog_in_core *iclog = NULL;
struct xfs_log_vec *lv = log_vector; struct xfs_log_vec *lv = log_vector;
...@@ -2327,8 +2324,9 @@ xlog_write( ...@@ -2327,8 +2324,9 @@ xlog_write(
xfs_force_shutdown(log->l_mp, SHUTDOWN_LOG_IO_ERROR); xfs_force_shutdown(log->l_mp, SHUTDOWN_LOG_IO_ERROR);
} }
len = xlog_write_calc_vec_length(ticket, log_vector, need_start_rec); len = xlog_write_calc_vec_length(ticket, log_vector, optype);
*start_lsn = 0; if (start_lsn)
*start_lsn = 0;
while (lv && (!lv->lv_niovecs || index < lv->lv_niovecs)) { while (lv && (!lv->lv_niovecs || index < lv->lv_niovecs)) {
void *ptr; void *ptr;
int log_offset; int log_offset;
...@@ -2342,7 +2340,7 @@ xlog_write( ...@@ -2342,7 +2340,7 @@ xlog_write(
ptr = iclog->ic_datap + log_offset; ptr = iclog->ic_datap + log_offset;
/* start_lsn is the first lsn written to. That's all we need. */ /* start_lsn is the first lsn written to. That's all we need. */
if (!*start_lsn) if (start_lsn && !*start_lsn)
*start_lsn = be64_to_cpu(iclog->ic_header.h_lsn); *start_lsn = be64_to_cpu(iclog->ic_header.h_lsn);
/* /*
...@@ -2355,6 +2353,7 @@ xlog_write( ...@@ -2355,6 +2353,7 @@ xlog_write(
int copy_len; int copy_len;
int copy_off; int copy_off;
bool ordered = false; bool ordered = false;
bool wrote_start_rec = false;
/* ordered log vectors have no regions to write */ /* ordered log vectors have no regions to write */
if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED) { if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED) {
...@@ -2372,13 +2371,15 @@ xlog_write( ...@@ -2372,13 +2371,15 @@ xlog_write(
* write a start record. Only do this for the first * write a start record. Only do this for the first
* iclog we write to. * iclog we write to.
*/ */
if (need_start_rec) { if (optype & XLOG_START_TRANS) {
xlog_write_start_rec(ptr, ticket); xlog_write_start_rec(ptr, ticket);
xlog_write_adv_cnt(&ptr, &len, &log_offset, xlog_write_adv_cnt(&ptr, &len, &log_offset,
sizeof(struct xlog_op_header)); sizeof(struct xlog_op_header));
optype &= ~XLOG_START_TRANS;
wrote_start_rec = true;
} }
ophdr = xlog_write_setup_ophdr(log, ptr, ticket, flags); ophdr = xlog_write_setup_ophdr(log, ptr, ticket, optype);
if (!ophdr) if (!ophdr)
return -EIO; return -EIO;
...@@ -2409,14 +2410,13 @@ xlog_write( ...@@ -2409,14 +2410,13 @@ xlog_write(
} }
copy_len += sizeof(struct xlog_op_header); copy_len += sizeof(struct xlog_op_header);
record_cnt++; record_cnt++;
if (need_start_rec) { if (wrote_start_rec) {
copy_len += sizeof(struct xlog_op_header); copy_len += sizeof(struct xlog_op_header);
record_cnt++; record_cnt++;
need_start_rec = false;
} }
data_cnt += contwr ? copy_len : 0; data_cnt += contwr ? copy_len : 0;
error = xlog_write_copy_finish(log, iclog, flags, error = xlog_write_copy_finish(log, iclog, optype,
&record_cnt, &data_cnt, &record_cnt, &data_cnt,
&partial_copy, &partial_copy,
&partial_copy_len, &partial_copy_len,
...@@ -2460,7 +2460,7 @@ xlog_write( ...@@ -2460,7 +2460,7 @@ xlog_write(
spin_lock(&log->l_icloglock); spin_lock(&log->l_icloglock);
xlog_state_finish_copy(log, iclog, record_cnt, data_cnt); xlog_state_finish_copy(log, iclog, record_cnt, data_cnt);
if (commit_iclog) { if (commit_iclog) {
ASSERT(flags & XLOG_COMMIT_TRANS); ASSERT(optype & XLOG_COMMIT_TRANS);
*commit_iclog = iclog; *commit_iclog = iclog;
} else { } else {
error = xlog_state_release_iclog(log, iclog); error = xlog_state_release_iclog(log, iclog);
......
...@@ -823,7 +823,8 @@ xlog_cil_push_work( ...@@ -823,7 +823,8 @@ xlog_cil_push_work(
*/ */
wait_for_completion(&bdev_flush); wait_for_completion(&bdev_flush);
error = xlog_write(log, &lvhdr, tic, &ctx->start_lsn, NULL, 0, true); error = xlog_write(log, &lvhdr, tic, &ctx->start_lsn, NULL,
XLOG_START_TRANS);
if (error) if (error)
goto out_abort_free_ticket; goto out_abort_free_ticket;
......
...@@ -480,8 +480,7 @@ void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); ...@@ -480,8 +480,7 @@ void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket);
void xlog_print_trans(struct xfs_trans *); void xlog_print_trans(struct xfs_trans *);
int xlog_write(struct xlog *log, struct xfs_log_vec *log_vector, int xlog_write(struct xlog *log, struct xfs_log_vec *log_vector,
struct xlog_ticket *tic, xfs_lsn_t *start_lsn, struct xlog_ticket *tic, xfs_lsn_t *start_lsn,
struct xlog_in_core **commit_iclog, uint flags, struct xlog_in_core **commit_iclog, uint optype);
bool need_start_rec);
int xlog_commit_record(struct xlog *log, struct xlog_ticket *ticket, int xlog_commit_record(struct xlog *log, struct xlog_ticket *ticket,
struct xlog_in_core **iclog, xfs_lsn_t *lsn); struct xlog_in_core **iclog, xfs_lsn_t *lsn);
void xfs_log_ticket_ungrant(struct xlog *log, struct xlog_ticket *ticket); void xfs_log_ticket_ungrant(struct xlog *log, struct xlog_ticket *ticket);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册