Fixes for 5.5-rc1:
- Fix a crash in the log setup code when log mounting fails - Fix a hang when allocating space on the realtime device - Fix a block leak when freeing space on the realtime device -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEUzaAxoMeQq6m2jMV+H93GTRKtOsFAl3n5OkACgkQ+H93GTRK tOtUvw/+Lxnwx1AaYT7hSMS4p1buJnAV7aM6Ofm+F+GkRISWlxSEYLIjrj3NFxeI Fv4jnPWMGHtBzW2c4OXv9zhW7vQeuU0Z72sgxA+Wqccf53sfR5Qum+Tya+Bo8X0X LPeDEuA+k4UUUHvSLqscPFPZYbXgwp3dJ2i7JeuH0vx3BhFeTjV1nlOeo1z3QBzN LLVjuBg7Zms+TPorrOgS67LAWfzqCAiQDauvyODB5EW+UElK6pvpOklFzc7TUPr2 PIvmjEE8UNN2y9QuEEKJ26t43ejAzG016yGMxyW74i5wU33R7PHkdgG1pWwWRZzr yvNClg2CMtLu+Bcx8Lc9X23mW0DqPkUYDohWCe/Tytvz5kaKCEq3WlqwaG5EdMOg gSJlivpoOTduQ26V4fPvD1/fjGpJLWyfHPs9p43wie+K/NuUcTIvr4BGGQszjS/n 5Zr630g6Tq5VrBMl0f1P2NuEbeQEvmbWNTW2TIvvHZTgMd8mZdvX28IXj0dAhBb/ 2U5o1NF8F6VeRGYoZFJI70RIfiLYzOQEmsA5hAyJfUQQ18u8zDJuPV4isO4/XjQf d32E36cvP3CKVQYn7hAiMD5O8jOFckYL287qd4uDYutmleHEcfzc0H4pTW+66IHp IuzkPCgvOkd4h4qnhtHSDoSlKd7kc1Ai3hBhCdA9zd6IUAVsZ6Y= =Ps4B -----END PGP SIGNATURE----- Merge tag 'xfs-5.5-merge-17' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux Pull xfs fixes from Darrick Wong: "Fix a couple of resource management errors and a hang: - fix a crash in the log setup code when log mounting fails - fix a hang when allocating space on the realtime device - fix a block leak when freeing space on the realtime device" * tag 'xfs-5.5-merge-17' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: xfs: fix mount failure crash on invalid iclog memory access xfs: don't check for AG deadlock for realtime files in bunmapi xfs: fix realtime file data space leak
This commit is contained in:
commit
50caca9d7f
|
@ -5404,7 +5404,7 @@ __xfs_bunmapi(
|
|||
* Make sure we don't touch multiple AGF headers out of order
|
||||
* in a single transaction, as that could cause AB-BA deadlocks.
|
||||
*/
|
||||
if (!wasdel) {
|
||||
if (!wasdel && !isrt) {
|
||||
agno = XFS_FSB_TO_AGNO(mp, del.br_startblock);
|
||||
if (prev_agno != NULLAGNUMBER && prev_agno > agno)
|
||||
break;
|
||||
|
@ -5480,16 +5480,17 @@ __xfs_bunmapi(
|
|||
}
|
||||
div_u64_rem(del.br_startblock, mp->m_sb.sb_rextsize, &mod);
|
||||
if (mod) {
|
||||
xfs_extlen_t off = mp->m_sb.sb_rextsize - mod;
|
||||
|
||||
/*
|
||||
* Realtime extent is lined up at the end but not
|
||||
* at the front. We'll get rid of full extents if
|
||||
* we can.
|
||||
*/
|
||||
mod = mp->m_sb.sb_rextsize - mod;
|
||||
if (del.br_blockcount > mod) {
|
||||
del.br_blockcount -= mod;
|
||||
del.br_startoff += mod;
|
||||
del.br_startblock += mod;
|
||||
if (del.br_blockcount > off) {
|
||||
del.br_blockcount -= off;
|
||||
del.br_startoff += off;
|
||||
del.br_startblock += off;
|
||||
} else if (del.br_startoff == start &&
|
||||
(del.br_state == XFS_EXT_UNWRITTEN ||
|
||||
tp->t_blk_res == 0)) {
|
||||
|
@ -5507,6 +5508,7 @@ __xfs_bunmapi(
|
|||
continue;
|
||||
} else if (del.br_state == XFS_EXT_UNWRITTEN) {
|
||||
struct xfs_bmbt_irec prev;
|
||||
xfs_fileoff_t unwrite_start;
|
||||
|
||||
/*
|
||||
* This one is already unwritten.
|
||||
|
@ -5520,12 +5522,13 @@ __xfs_bunmapi(
|
|||
ASSERT(!isnullstartblock(prev.br_startblock));
|
||||
ASSERT(del.br_startblock ==
|
||||
prev.br_startblock + prev.br_blockcount);
|
||||
if (prev.br_startoff < start) {
|
||||
mod = start - prev.br_startoff;
|
||||
prev.br_blockcount -= mod;
|
||||
prev.br_startblock += mod;
|
||||
prev.br_startoff = start;
|
||||
}
|
||||
unwrite_start = max3(start,
|
||||
del.br_startoff - mod,
|
||||
prev.br_startoff);
|
||||
mod = unwrite_start - prev.br_startoff;
|
||||
prev.br_startoff = unwrite_start;
|
||||
prev.br_startblock += mod;
|
||||
prev.br_blockcount -= mod;
|
||||
prev.br_state = XFS_EXT_UNWRITTEN;
|
||||
error = xfs_bmap_add_extent_unwritten_real(tp,
|
||||
ip, whichfork, &icur, &cur,
|
||||
|
|
|
@ -1542,6 +1542,8 @@ out_free_iclog:
|
|||
prev_iclog = iclog->ic_next;
|
||||
kmem_free(iclog->ic_data);
|
||||
kmem_free(iclog);
|
||||
if (prev_iclog == log->l_iclog)
|
||||
break;
|
||||
}
|
||||
out_free_log:
|
||||
kmem_free(log);
|
||||
|
|
Loading…
Reference in New Issue