JFS fixes for 5.14

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEIodevzQLVs53l6BhNqiEXrVAjGQFAmDeGXwACgkQNqiEXrVA
 jGTONw/+J9mdqQW4zrrIotoO49wKpPv0Ub/XJqT+cDrae91w/lrOct2g0U12aG/e
 zkVeGDhWF4iqsVhyAPx1U6Dh0/rg3JlCSr3l2NYk7WKGwQSOFINtrXPMUfz1P9h1
 M/Cvz9XIkIzATeEd6yrGdQyw5bcSQu3uF8o71ufdKJfeNkAxlhigw690vePMXPFp
 YSmBgLVM1ntp2apJyJiFYVNJqfbDL2bVWG3a+ENGXjD+b/8IsShTKM6VyEXRWGKa
 M1RjEW7i5kvoPtmbV5tLkySete+Bumv8ZRGoAv306tgABjWRkAZN31EzdZfBe5Io
 8pK5USGaSVauP9E0wXV4irfaAuYPp1uAsZqzhxbRXLtTsLKJKrZKxjq9kZON3FPd
 tGY1v462zBrj79oN++Z7/bDxwbcfJ+OPid2Fev6SlsYfTndTp1cseLDsef574/vo
 1P6DgCHNabHWZcjeI2ubMIM+W3+pAwjWUeeLOedCa7IZ6VKTwx+8RPEDNAxMq7lO
 6fs+NUtbEd/veaTmicJnllvld1HcqS+H/sPSS7tHhTtoMTVG2bdpzyvvxGzKOxq+
 IQNnNOLwg6LsH3z+uenU+fhnm5Z/b+iZsMG3LgXALu6JCDaZf/ygvyQfhhJS5n5r
 MJfWP2ZSpEf3yYcsoKvgFafVXv6p2fnibfB/2ecmyQ6Lz54U6hc=
 =li00
 -----END PGP SIGNATURE-----

Merge tag 'jfs-5.14' of git://github.com/kleikamp/linux-shaggy

Pull jfs updates from David Kleikamp:
 "JFS fixes for 5.14"

* tag 'jfs-5.14' of git://github.com/kleikamp/linux-shaggy:
  jfs: Avoid field-overflowing memcpy()
  jfs: remove unnecessary oom message
  jfs: fix GPF in diFree
  fs/jfs: Fix missing error code in lmLogInit()
  jfs: Remove trailing semicolon in macros
  fs: Fix typo issue
This commit is contained in:
Linus Torvalds 2021-07-02 14:25:17 -07:00
commit e4aa67b023
8 changed files with 30 additions and 15 deletions

View File

@ -151,7 +151,8 @@ void jfs_evict_inode(struct inode *inode)
if (test_cflag(COMMIT_Freewmap, inode)) if (test_cflag(COMMIT_Freewmap, inode))
jfs_free_zero_link(inode); jfs_free_zero_link(inode);
diFree(inode); if (JFS_SBI(inode->i_sb)->ipimap)
diFree(inode);
/* /*
* Free the inode from the quota allocation. * Free the inode from the quota allocation.

View File

@ -101,7 +101,6 @@ struct dinode {
u8 unused[16]; /* 16: */ u8 unused[16]; /* 16: */
dxd_t _dxd; /* 16: */ dxd_t _dxd; /* 16: */
union { union {
__le32 _rdev; /* 4: */
/* /*
* The fast symlink area * The fast symlink area
* is expected to overflow * is expected to overflow
@ -109,9 +108,15 @@ struct dinode {
* needed (which will clear * needed (which will clear
* INLINEEA). * INLINEEA).
*/ */
u8 _fastsymlink[128]; struct {
} _u; union {
u8 _inlineea[128]; __le32 _rdev; /* 4: */
u8 _fastsymlink[128];
} _u;
u8 _inlineea[128];
};
u8 _inline_all[256];
};
} _special; } _special;
} _u2; } _u2;
} _file; } _file;
@ -122,6 +127,7 @@ struct dinode {
#define di_rdev u._file._u2._special._u._rdev #define di_rdev u._file._u2._special._u._rdev
#define di_fastsymlink u._file._u2._special._u._fastsymlink #define di_fastsymlink u._file._u2._special._u._fastsymlink
#define di_inlineea u._file._u2._special._inlineea #define di_inlineea u._file._u2._special._inlineea
#define di_inline_all u._file._u2._special._inline_all
} u; } u;
}; };

View File

@ -3660,7 +3660,7 @@ void dbFinalizeBmap(struct inode *ipbmap)
* (the leftmost ag with average free space in it); * (the leftmost ag with average free space in it);
*/ */
//agpref: //agpref:
/* get the number of active ags and inacitve ags */ /* get the number of active ags and inactive ags */
actags = bmp->db_maxag + 1; actags = bmp->db_maxag + 1;
inactags = bmp->db_numag - actags; inactags = bmp->db_numag - actags;
ag_rem = bmp->db_mapsize & (bmp->db_agsize - 1); /* ??? */ ag_rem = bmp->db_mapsize & (bmp->db_agsize - 1); /* ??? */

View File

@ -103,10 +103,8 @@ int diMount(struct inode *ipimap)
*/ */
/* allocate the in-memory inode map control structure. */ /* allocate the in-memory inode map control structure. */
imap = kmalloc(sizeof(struct inomap), GFP_KERNEL); imap = kmalloc(sizeof(struct inomap), GFP_KERNEL);
if (imap == NULL) { if (imap == NULL)
jfs_err("diMount: kmalloc returned NULL!");
return -ENOMEM; return -ENOMEM;
}
/* read the on-disk inode map control structure. */ /* read the on-disk inode map control structure. */
@ -763,7 +761,7 @@ int diWrite(tid_t tid, struct inode *ip)
lv = & dilinelock->lv[dilinelock->index]; lv = & dilinelock->lv[dilinelock->index];
lv->offset = (dioffset + 2 * 128) >> L2INODESLOTSIZE; lv->offset = (dioffset + 2 * 128) >> L2INODESLOTSIZE;
lv->length = 2; lv->length = 2;
memcpy(&dp->di_fastsymlink, jfs_ip->i_inline, IDATASIZE); memcpy(&dp->di_inline_all, jfs_ip->i_inline_all, IDATASIZE);
dilinelock->index++; dilinelock->index++;
} }
/* /*
@ -3084,7 +3082,7 @@ static int copy_from_dinode(struct dinode * dip, struct inode *ip)
} }
if (S_ISDIR(ip->i_mode)) { if (S_ISDIR(ip->i_mode)) {
memcpy(&jfs_ip->i_dirtable, &dip->di_dirtable, 384); memcpy(&jfs_ip->u.dir, &dip->u._dir, 384);
} else if (S_ISREG(ip->i_mode) || S_ISLNK(ip->i_mode)) { } else if (S_ISREG(ip->i_mode) || S_ISLNK(ip->i_mode)) {
memcpy(&jfs_ip->i_xtroot, &dip->di_xtroot, 288); memcpy(&jfs_ip->i_xtroot, &dip->di_xtroot, 288);
} else } else

View File

@ -77,11 +77,18 @@ struct jfs_inode_info {
unchar _unused[16]; /* 16: */ unchar _unused[16]; /* 16: */
dxd_t _dxd; /* 16: */ dxd_t _dxd; /* 16: */
/* _inline may overflow into _inline_ea when needed */ /* _inline may overflow into _inline_ea when needed */
unchar _inline[128]; /* 128: inline symlink */
/* _inline_ea may overlay the last part of /* _inline_ea may overlay the last part of
* file._xtroot if maxentry = XTROOTINITSLOT * file._xtroot if maxentry = XTROOTINITSLOT
*/ */
unchar _inline_ea[128]; /* 128: inline extended attr */ union {
struct {
/* 128: inline symlink */
unchar _inline[128];
/* 128: inline extended attr */
unchar _inline_ea[128];
};
unchar _inline_all[256];
};
} link; } link;
} u; } u;
#ifdef CONFIG_QUOTA #ifdef CONFIG_QUOTA
@ -96,6 +103,7 @@ struct jfs_inode_info {
#define i_dtroot u.dir._dtroot #define i_dtroot u.dir._dtroot
#define i_inline u.link._inline #define i_inline u.link._inline
#define i_inline_ea u.link._inline_ea #define i_inline_ea u.link._inline_ea
#define i_inline_all u.link._inline_all
#define IREAD_LOCK(ip, subclass) \ #define IREAD_LOCK(ip, subclass) \
down_read_nested(&JFS_IP(ip)->rdwrlock, subclass) down_read_nested(&JFS_IP(ip)->rdwrlock, subclass)

View File

@ -1324,6 +1324,7 @@ int lmLogInit(struct jfs_log * log)
} else { } else {
if (!uuid_equal(&logsuper->uuid, &log->uuid)) { if (!uuid_equal(&logsuper->uuid, &log->uuid)) {
jfs_warn("wrong uuid on JFS log device"); jfs_warn("wrong uuid on JFS log device");
rc = -EINVAL;
goto errout20; goto errout20;
} }
log->size = le32_to_cpu(logsuper->size); log->size = le32_to_cpu(logsuper->size);

View File

@ -105,7 +105,7 @@ static DEFINE_SPINLOCK(jfsTxnLock);
#define TXN_LOCK() spin_lock(&jfsTxnLock) #define TXN_LOCK() spin_lock(&jfsTxnLock)
#define TXN_UNLOCK() spin_unlock(&jfsTxnLock) #define TXN_UNLOCK() spin_unlock(&jfsTxnLock)
#define LAZY_LOCK_INIT() spin_lock_init(&TxAnchor.LazyLock); #define LAZY_LOCK_INIT() spin_lock_init(&TxAnchor.LazyLock)
#define LAZY_LOCK(flags) spin_lock_irqsave(&TxAnchor.LazyLock, flags) #define LAZY_LOCK(flags) spin_lock_irqsave(&TxAnchor.LazyLock, flags)
#define LAZY_UNLOCK(flags) spin_unlock_irqrestore(&TxAnchor.LazyLock, flags) #define LAZY_UNLOCK(flags) spin_unlock_irqrestore(&TxAnchor.LazyLock, flags)

View File

@ -939,7 +939,8 @@ static int __init init_jfs_fs(void)
jfs_inode_cachep = jfs_inode_cachep =
kmem_cache_create_usercopy("jfs_ip", sizeof(struct jfs_inode_info), kmem_cache_create_usercopy("jfs_ip", sizeof(struct jfs_inode_info),
0, SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|SLAB_ACCOUNT, 0, SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|SLAB_ACCOUNT,
offsetof(struct jfs_inode_info, i_inline), IDATASIZE, offsetof(struct jfs_inode_info, i_inline_all),
sizeof_field(struct jfs_inode_info, i_inline_all),
init_once); init_once);
if (jfs_inode_cachep == NULL) if (jfs_inode_cachep == NULL)
return -ENOMEM; return -ENOMEM;