xfs: log tickets don't need log client id
authorDave Chinner <dchinner@redhat.com>
Thu, 21 Apr 2022 00:34:33 +0000 (10:34 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 21 Apr 2022 00:34:33 +0000 (10:34 +1000)
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: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_log_format.h
fs/xfs/xfs_log.c
fs/xfs/xfs_log.h
fs/xfs/xfs_log_cil.c
fs/xfs/xfs_log_priv.h
fs/xfs/xfs_trans.c

index b322db523d65c849fc7bee35f0df1f9c37e81126..2b89141ae81af25db1fdda7a37c3c33098d383b3 100644 (file)
@@ -69,7 +69,6 @@ static inline uint xlog_get_cycle(char *ptr)
 
 /* Log Clients */
 #define XFS_TRANSACTION                0x69
-#define XFS_VOLUME             0x2
 #define XFS_LOG                        0xaa
 
 #define XLOG_UNMOUNT_TYPE      0x556e  /* Un for Unmount */
index c23a15c56ef102dda19762eb1d1446ca334e0670..1f6e7092ec76b8c791c4dd8cff3b3b0d3540d7a8 100644 (file)
@@ -434,10 +434,9 @@ out_error:
 int
 xfs_log_reserve(
        struct xfs_mount        *mp,
-       int                     unit_bytes,
-       int                     cnt,
+       int                     unit_bytes,
+       int                     cnt,
        struct xlog_ticket      **ticp,
-       uint8_t                 client,
        bool                    permanent)
 {
        struct xlog             *log = mp->m_log;
@@ -445,15 +444,13 @@ xfs_log_reserve(
        int                     need_bytes;
        int                     error = 0;
 
-       ASSERT(client == XFS_TRANSACTION || client == XFS_LOG);
-
        if (xlog_is_shutdown(log))
                return -EIO;
 
        XFS_STATS_INC(mp, xs_try_logspace);
 
        ASSERT(*ticp == NULL);
-       tic = xlog_ticket_alloc(log, unit_bytes, cnt, client, permanent);
+       tic = xlog_ticket_alloc(log, unit_bytes, cnt, permanent);
        *ticp = tic;
 
        xlog_grant_push_ail(log, tic->t_cnt ? tic->t_unit_res * tic->t_cnt
@@ -947,7 +944,7 @@ xlog_unmount_write(
        struct xlog_ticket      *tic = NULL;
        int                     error;
 
-       error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0);
+       error = xfs_log_reserve(mp, 600, 1, &tic, 0);
        if (error)
                goto out_err;
 
@@ -2282,35 +2279,13 @@ xlog_write_calc_vec_length(
 
 static xlog_op_header_t *
 xlog_write_setup_ophdr(
-       struct xlog             *log,
        struct xlog_op_header   *ophdr,
-       struct xlog_ticket      *ticket,
-       uint                    flags)
+       struct xlog_ticket      *ticket)
 {
        ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
-       ophdr->oh_clientid = ticket->t_clientid;
+       ophdr->oh_clientid = XFS_TRANSACTION;
        ophdr->oh_res2 = 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;
-       }
-
+       ophdr->oh_flags = 0;
        return ophdr;
 }
 
@@ -2535,11 +2510,7 @@ xlog_write(
                                if (index)
                                        optype &= ~XLOG_START_TRANS;
                        } else {
-                               ophdr = xlog_write_setup_ophdr(log, ptr,
-                                                       ticket, optype);
-                               if (!ophdr)
-                                       return -EIO;
-
+                                ophdr = xlog_write_setup_ophdr(ptr, ticket);
                                xlog_write_adv_cnt(&ptr, &len, &log_offset,
                                           sizeof(struct xlog_op_header));
                                added_ophdr = true;
@@ -3598,7 +3569,6 @@ xlog_ticket_alloc(
        struct xlog             *log,
        int                     unit_bytes,
        int                     cnt,
-       char                    client,
        bool                    permanent)
 {
        struct xlog_ticket      *tic;
@@ -3616,7 +3586,6 @@ xlog_ticket_alloc(
        tic->t_cnt              = cnt;
        tic->t_ocnt             = cnt;
        tic->t_tid              = prandom_u32();
-       tic->t_clientid         = client;
        if (permanent)
                tic->t_flags |= XLOG_TIC_PERM_RESERV;
 
index dc1b77b92fc1756d7941f1757429e6e85a314dfc..09b8fe9994f219c953e65afb09a5515df716918d 100644 (file)
@@ -117,15 +117,11 @@ int         xfs_log_mount_finish(struct xfs_mount *mp);
 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_locked(struct xfs_mount *mp);
-void     xfs_log_space_wake(struct xfs_mount *mp);
-int      xfs_log_reserve(struct xfs_mount *mp,
-                         int              length,
-                         int              count,
-                         struct xlog_ticket **ticket,
-                         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);
+void   xfs_log_space_wake(struct xfs_mount *mp);
+int    xfs_log_reserve(struct xfs_mount *mp, int length, int count,
+                       struct xlog_ticket **ticket, 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);
 
 struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket);
index 53dc5add5359592cc933847b979de7e2a577f1aa..2403a7bbb91304374d4b46258223bd52ae8c5dfe 100644 (file)
@@ -37,7 +37,7 @@ xlog_cil_ticket_alloc(
 {
        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
index 401cdc400980b07bba88fc1a6be6576c70e6a9d7..6f247561588b74b881f9768af19afcea1b33a71b 100644 (file)
@@ -164,7 +164,6 @@ typedef struct xlog_ticket {
        int                t_unit_res;   /* unit reservation in bytes    : 4  */
        char               t_ocnt;       /* original count               : 1  */
        char               t_cnt;        /* current count                : 1  */
-       char               t_clientid;   /* who does this belong to;     : 1  */
        char               t_flags;      /* properties of reservation    : 1  */
 
         /* reservation array fields */
@@ -509,13 +508,8 @@ extern __le32       xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead,
                            char *dp, int size);
 
 extern struct kmem_cache *xfs_log_ticket_cache;
-struct xlog_ticket *
-xlog_ticket_alloc(
-       struct xlog     *log,
-       int             unit_bytes,
-       int             count,
-       char            client,
-       bool            permanent);
+struct xlog_ticket *xlog_ticket_alloc(struct xlog *log, int unit_bytes,
+               int count, bool permanent);
 
 static inline void
 xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes)
index 0ac717aad380075848af3fc8157e0e5b3c9ed631..8b9d36b19ae4ce1f008a9ec13601a9b6e01f5a51 100644 (file)
@@ -194,11 +194,9 @@ xfs_trans_reserve(
                        ASSERT(resp->tr_logflags & XFS_TRANS_PERM_LOG_RES);
                        error = xfs_log_regrant(mp, tp->t_ticket);
                } else {
-                       error = xfs_log_reserve(mp,
-                                               resp->tr_logres,
+                       error = xfs_log_reserve(mp, resp->tr_logres,
                                                resp->tr_logcount,
-                                               &tp->t_ticket, XFS_TRANSACTION,
-                                               permanent);
+                                               &tp->t_ticket, permanent);
                }
 
                if (error)