]> Git Repo - linux.git/commitdiff
jfs: define xtree root and page independently
authorDave Kleikamp <[email protected]>
Thu, 5 Oct 2023 14:16:14 +0000 (09:16 -0500)
committerDave Kleikamp <[email protected]>
Fri, 13 Oct 2023 15:39:25 +0000 (10:39 -0500)
In order to make array bounds checking sane, provide a separate
definition of the in-inode xtree root and the external xtree page.

Signed-off-by: Dave Kleikamp <[email protected]>
Tested-by: Manas Ghandat <[email protected]>
fs/jfs/jfs_dinode.h
fs/jfs/jfs_imap.c
fs/jfs/jfs_incore.h
fs/jfs/jfs_txnmgr.c
fs/jfs/jfs_xtree.c
fs/jfs/jfs_xtree.h

index 6b231d0d0071ba6a06a66192882c99b4014f55a7..603aae17a69343fcd766d12dbf2231c4fe7cd173 100644 (file)
@@ -96,7 +96,7 @@ struct dinode {
 #define di_gengen      u._file._u1._imap._gengen
 
                        union {
-                               xtpage_t _xtroot;
+                               xtroot_t _xtroot;
                                struct {
                                        u8 unused[16];  /* 16: */
                                        dxd_t _dxd;     /* 16: */
index 1b267eec3f367c26910631da3bd0d708d0213d65..394e0af0e5df0c5dec25dcb905380adc94a9d926 100644 (file)
@@ -670,7 +670,7 @@ int diWrite(tid_t tid, struct inode *ip)
                 * This is the special xtree inside the directory for storing
                 * the directory table
                 */
-               xtpage_t *p, *xp;
+               xtroot_t *p, *xp;
                xad_t *xad;
 
                jfs_ip->xtlid = 0;
@@ -684,7 +684,7 @@ int diWrite(tid_t tid, struct inode *ip)
                 * copy xtree root from inode to dinode:
                 */
                p = &jfs_ip->i_xtroot;
-               xp = (xtpage_t *) &dp->di_dirtable;
+               xp = (xtroot_t *) &dp->di_dirtable;
                lv = ilinelock->lv;
                for (n = 0; n < ilinelock->index; n++, lv++) {
                        memcpy(&xp->xad[lv->offset], &p->xad[lv->offset],
@@ -713,7 +713,7 @@ int diWrite(tid_t tid, struct inode *ip)
         *      regular file: 16 byte (XAD slot) granularity
         */
        if (type & tlckXTREE) {
-               xtpage_t *p, *xp;
+               xtroot_t *p, *xp;
                xad_t *xad;
 
                /*
index 721def69e732e444c18bdde9ae271da98260ca02..dd4264aa9beddecd58e17cd44a730d30acba4176 100644 (file)
@@ -66,7 +66,7 @@ struct jfs_inode_info {
        lid_t   xtlid;          /* lid of xtree lock on directory */
        union {
                struct {
-                       xtpage_t _xtroot;       /* 288: xtree root */
+                       xtroot_t _xtroot;       /* 288: xtree root */
                        struct inomap *_imap;   /* 4: inode map header  */
                } file;
                struct {
index ce4b4760fcb1d6402a3220887e10fd9f97e61e4a..dccc8b3f104593a5f96c68f1e51b4a7fefdb3d8d 100644 (file)
@@ -783,7 +783,7 @@ struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp,
                        if (mp->xflag & COMMIT_PAGE)
                                p = (xtpage_t *) mp->data;
                        else
-                               p = &jfs_ip->i_xtroot;
+                               p = (xtpage_t *) &jfs_ip->i_xtroot;
                        xtlck->lwm.offset =
                            le16_to_cpu(p->header.nextindex);
                }
@@ -1676,7 +1676,7 @@ static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
 
        if (tlck->type & tlckBTROOT) {
                lrd->log.redopage.type |= cpu_to_le16(LOG_BTROOT);
-               p = &JFS_IP(ip)->i_xtroot;
+               p = (xtpage_t *) &JFS_IP(ip)->i_xtroot;
                if (S_ISDIR(ip->i_mode))
                        lrd->log.redopage.type |=
                            cpu_to_le16(LOG_DIR_XTREE);
index 2d304cee884c6ff2cad43a06433abe425876f97f..5ee618d17e77303226357939f3889b908f3c962a 100644 (file)
@@ -1213,7 +1213,7 @@ xtSplitRoot(tid_t tid,
        struct xtlock *xtlck;
        int rc;
 
-       sp = &JFS_IP(ip)->i_xtroot;
+       sp = (xtpage_t *) &JFS_IP(ip)->i_xtroot;
 
        INCREMENT(xtStat.split);
 
@@ -2098,7 +2098,7 @@ int xtAppend(tid_t tid,           /* transaction id */
  */
 void xtInitRoot(tid_t tid, struct inode *ip)
 {
-       xtpage_t *p;
+       xtroot_t *p;
 
        /*
         * acquire a transaction lock on the root
index ad7592191d7607d38d246a631550785c3487bd11..0f6cf5a1ce75bd3240fe23ffa9a06ea4b7d9771a 100644 (file)
@@ -65,24 +65,33 @@ struct xadlist {
 #define XTPAGEMAXSLOT  256
 #define XTENTRYSTART   2
 
-/*
- *     xtree page:
- */
-typedef union {
-       struct xtheader {
-               __le64 next;    /* 8: */
-               __le64 prev;    /* 8: */
+struct xtheader {
+       __le64 next;    /* 8: */
+       __le64 prev;    /* 8: */
 
-               u8 flag;        /* 1: */
-               u8 rsrvd1;      /* 1: */
-               __le16 nextindex;       /* 2: next index = number of entries */
-               __le16 maxentry;        /* 2: max number of entries */
-               __le16 rsrvd2;  /* 2: */
+       u8 flag;        /* 1: */
+       u8 rsrvd1;      /* 1: */
+       __le16 nextindex;       /* 2: next index = number of entries */
+       __le16 maxentry;        /* 2: max number of entries */
+       __le16 rsrvd2;  /* 2: */
 
-               pxd_t self;     /* 8: self */
-       } header;               /* (32) */
+       pxd_t self;     /* 8: self */
+};
 
+/*
+ *     xtree root (in inode):
+ */
+typedef union {
+       struct xtheader header;
        xad_t xad[XTROOTMAXSLOT];       /* 16 * maxentry: xad array */
+} xtroot_t;
+
+/*
+ *     xtree page:
+ */
+typedef union {
+       struct xtheader header;
+       xad_t xad[XTPAGEMAXSLOT];       /* 16 * maxentry: xad array */
 } xtpage_t;
 
 /*
This page took 0.075794 seconds and 4 git commands to generate.