Commit c7610dce authored by Dave Chinner's avatar Dave Chinner Committed by Dave Chinner

xfs: log tickets don't need log client id

We currently set the log ticket client ID when we reserve a
transaction. This client ID is only ever written to the log by
a CIL checkpoint or unmount records, and so anything using a high
level transaction allocated through xfs_trans_alloc() does not need
a log ticket client ID to be set.

For the CIL checkpoint, the client ID written to the journal is
always XFS_TRANSACTION, and for the unmount record it is always
XFS_LOG, and nothing else writes to the log. All of these operations
tell xlog_write() exactly what they need to write to the log (the
optype) and build their own opheaders for start, commit and unmount
records. Hence we no longer need to set the client id in either the
log ticket or the xfs_trans.
Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChandan Babu R <chandan.babu@oracle.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 54021b62
...@@ -69,7 +69,6 @@ static inline uint xlog_get_cycle(char *ptr) ...@@ -69,7 +69,6 @@ static inline uint xlog_get_cycle(char *ptr)
/* Log Clients */ /* Log Clients */
#define XFS_TRANSACTION 0x69 #define XFS_TRANSACTION 0x69
#define XFS_VOLUME 0x2
#define XFS_LOG 0xaa #define XFS_LOG 0xaa
#define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */ #define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */
......
...@@ -434,10 +434,9 @@ xfs_log_regrant( ...@@ -434,10 +434,9 @@ xfs_log_regrant(
int int
xfs_log_reserve( xfs_log_reserve(
struct xfs_mount *mp, struct xfs_mount *mp,
int unit_bytes, int unit_bytes,
int cnt, int cnt,
struct xlog_ticket **ticp, struct xlog_ticket **ticp,
uint8_t client,
bool permanent) bool permanent)
{ {
struct xlog *log = mp->m_log; struct xlog *log = mp->m_log;
...@@ -445,15 +444,13 @@ xfs_log_reserve( ...@@ -445,15 +444,13 @@ xfs_log_reserve(
int need_bytes; int need_bytes;
int error = 0; int error = 0;
ASSERT(client == XFS_TRANSACTION || client == XFS_LOG);
if (xlog_is_shutdown(log)) if (xlog_is_shutdown(log))
return -EIO; return -EIO;
XFS_STATS_INC(mp, xs_try_logspace); XFS_STATS_INC(mp, xs_try_logspace);
ASSERT(*ticp == NULL); ASSERT(*ticp == NULL);
tic = xlog_ticket_alloc(log, unit_bytes, cnt, client, permanent); tic = xlog_ticket_alloc(log, unit_bytes, cnt, permanent);
*ticp = tic; *ticp = tic;
xlog_grant_push_ail(log, tic->t_cnt ? tic->t_unit_res * tic->t_cnt xlog_grant_push_ail(log, tic->t_cnt ? tic->t_unit_res * tic->t_cnt
...@@ -947,7 +944,7 @@ xlog_unmount_write( ...@@ -947,7 +944,7 @@ xlog_unmount_write(
struct xlog_ticket *tic = NULL; struct xlog_ticket *tic = NULL;
int error; int error;
error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0); error = xfs_log_reserve(mp, 600, 1, &tic, 0);
if (error) if (error)
goto out_err; goto out_err;
...@@ -2282,35 +2279,13 @@ xlog_write_calc_vec_length( ...@@ -2282,35 +2279,13 @@ xlog_write_calc_vec_length(
static xlog_op_header_t * static xlog_op_header_t *
xlog_write_setup_ophdr( xlog_write_setup_ophdr(
struct xlog *log,
struct xlog_op_header *ophdr, struct xlog_op_header *ophdr,
struct xlog_ticket *ticket, struct xlog_ticket *ticket)
uint flags)
{ {
ophdr->oh_tid = cpu_to_be32(ticket->t_tid); ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
ophdr->oh_clientid = ticket->t_clientid; ophdr->oh_clientid = XFS_TRANSACTION;
ophdr->oh_res2 = 0; ophdr->oh_res2 = 0;
ophdr->oh_flags = 0;
/* are we copying a commit or unmount record? */
ophdr->oh_flags = flags;
/*
* We've seen logs corrupted with bad transaction client ids. This
* makes sure that XFS doesn't generate them on. Turn this into an EIO
* and shut down the filesystem.
*/
switch (ophdr->oh_clientid) {
case XFS_TRANSACTION:
case XFS_VOLUME:
case XFS_LOG:
break;
default:
xfs_warn(log->l_mp,
"Bad XFS transaction clientid 0x%x in ticket "PTR_FMT,
ophdr->oh_clientid, ticket);
return NULL;
}
return ophdr; return ophdr;
} }
...@@ -2535,11 +2510,7 @@ xlog_write( ...@@ -2535,11 +2510,7 @@ xlog_write(
if (index) if (index)
optype &= ~XLOG_START_TRANS; optype &= ~XLOG_START_TRANS;
} else { } else {
ophdr = xlog_write_setup_ophdr(log, ptr, ophdr = xlog_write_setup_ophdr(ptr, ticket);
ticket, optype);
if (!ophdr)
return -EIO;
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));
added_ophdr = true; added_ophdr = true;
...@@ -3598,7 +3569,6 @@ xlog_ticket_alloc( ...@@ -3598,7 +3569,6 @@ xlog_ticket_alloc(
struct xlog *log, struct xlog *log,
int unit_bytes, int unit_bytes,
int cnt, int cnt,
char client,
bool permanent) bool permanent)
{ {
struct xlog_ticket *tic; struct xlog_ticket *tic;
...@@ -3616,7 +3586,6 @@ xlog_ticket_alloc( ...@@ -3616,7 +3586,6 @@ xlog_ticket_alloc(
tic->t_cnt = cnt; tic->t_cnt = cnt;
tic->t_ocnt = cnt; tic->t_ocnt = cnt;
tic->t_tid = prandom_u32(); tic->t_tid = prandom_u32();
tic->t_clientid = client;
if (permanent) if (permanent)
tic->t_flags |= XLOG_TIC_PERM_RESERV; tic->t_flags |= XLOG_TIC_PERM_RESERV;
......
...@@ -117,15 +117,11 @@ int xfs_log_mount_finish(struct xfs_mount *mp); ...@@ -117,15 +117,11 @@ int xfs_log_mount_finish(struct xfs_mount *mp);
void xfs_log_mount_cancel(struct xfs_mount *); void xfs_log_mount_cancel(struct xfs_mount *);
xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp);
xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp);
void xfs_log_space_wake(struct xfs_mount *mp); void xfs_log_space_wake(struct xfs_mount *mp);
int xfs_log_reserve(struct xfs_mount *mp, int xfs_log_reserve(struct xfs_mount *mp, int length, int count,
int length, struct xlog_ticket **ticket, bool permanent);
int count, int xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic);
struct xlog_ticket **ticket, void xfs_log_unmount(struct xfs_mount *mp);
uint8_t clientid,
bool permanent);
int xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic);
void xfs_log_unmount(struct xfs_mount *mp);
bool xfs_log_writable(struct xfs_mount *mp); bool xfs_log_writable(struct xfs_mount *mp);
struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket);
......
...@@ -37,7 +37,7 @@ xlog_cil_ticket_alloc( ...@@ -37,7 +37,7 @@ xlog_cil_ticket_alloc(
{ {
struct xlog_ticket *tic; struct xlog_ticket *tic;
tic = xlog_ticket_alloc(log, 0, 1, XFS_TRANSACTION, 0); tic = xlog_ticket_alloc(log, 0, 1, 0);
/* /*
* set the current reservation to zero so we know to steal the basic * set the current reservation to zero so we know to steal the basic
......
...@@ -164,7 +164,6 @@ typedef struct xlog_ticket { ...@@ -164,7 +164,6 @@ typedef struct xlog_ticket {
int t_unit_res; /* unit reservation in bytes : 4 */ int t_unit_res; /* unit reservation in bytes : 4 */
char t_ocnt; /* original count : 1 */ char t_ocnt; /* original count : 1 */
char t_cnt; /* current count : 1 */ char t_cnt; /* current count : 1 */
char t_clientid; /* who does this belong to; : 1 */
char t_flags; /* properties of reservation : 1 */ char t_flags; /* properties of reservation : 1 */
/* reservation array fields */ /* reservation array fields */
...@@ -509,13 +508,8 @@ extern __le32 xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead, ...@@ -509,13 +508,8 @@ extern __le32 xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead,
char *dp, int size); char *dp, int size);
extern struct kmem_cache *xfs_log_ticket_cache; extern struct kmem_cache *xfs_log_ticket_cache;
struct xlog_ticket * struct xlog_ticket *xlog_ticket_alloc(struct xlog *log, int unit_bytes,
xlog_ticket_alloc( int count, bool permanent);
struct xlog *log,
int unit_bytes,
int count,
char client,
bool permanent);
static inline void static inline void
xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes)
......
...@@ -194,11 +194,9 @@ xfs_trans_reserve( ...@@ -194,11 +194,9 @@ xfs_trans_reserve(
ASSERT(resp->tr_logflags & XFS_TRANS_PERM_LOG_RES); ASSERT(resp->tr_logflags & XFS_TRANS_PERM_LOG_RES);
error = xfs_log_regrant(mp, tp->t_ticket); error = xfs_log_regrant(mp, tp->t_ticket);
} else { } else {
error = xfs_log_reserve(mp, error = xfs_log_reserve(mp, resp->tr_logres,
resp->tr_logres,
resp->tr_logcount, resp->tr_logcount,
&tp->t_ticket, XFS_TRANSACTION, &tp->t_ticket, permanent);
permanent);
} }
if (error) if (error)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment