Unverified Commit f1f1dc93 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!7837 [sync] PR-7681: xfs: three bug fix recently

Merge Pull Request from: @openeuler-sync-bot 
 

Origin pull request: 
https://gitee.com/openeuler/kernel/pulls/7681 
 
PR sync from: Long Li <leo.lilong@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/SN7PDO6H3RTKHZIAPJTBDWAD7VCY5JZK/ 
This patch set fix three bug:

Jiachen Zhang (1):
  xfs: ensure logflagsp is initialized in xfs_bmap_del_extent_real

Long Li (1):
  iomap: fix warning in xfs_iomap_write_delalloc_release()

Zhang Tianci (1):
  xfs: update dir3 leaf block metadata after swap


-- 
2.31.1
 
https://gitee.com/openeuler/kernel/issues/I76JSK 
 
Link:https://gitee.com/openeuler/kernel/pulls/7837

 

Reviewed-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents a28e81b0 a263146a
Loading
Loading
Loading
Loading
+32 −44
Original line number Diff line number Diff line
@@ -4952,7 +4952,6 @@ xfs_bmap_del_extent_real(
	xfs_fileoff_t		del_endoff;	/* first offset past del */
	int			do_fx;	/* free extent at end of routine */
	int			error;	/* error return value */
	int			flags = 0;/* inode logging flags */
	struct xfs_bmbt_irec	got;	/* current extent entry */
	xfs_fileoff_t		got_endoff;	/* first offset past got */
	int			i;	/* temp state */
@@ -4965,6 +4964,8 @@ xfs_bmap_del_extent_real(
	int			state = xfs_bmap_fork_to_state(whichfork);
	struct xfs_bmbt_irec	old;

	*logflagsp = 0;

	mp = ip->i_mount;
	XFS_STATS_INC(mp, xs_del_exlist);

@@ -4977,7 +4978,6 @@ xfs_bmap_del_extent_real(
	ASSERT(got_endoff >= del_endoff);
	ASSERT(!isnullstartblock(got.br_startblock));
	qfield = 0;
	error = 0;

	/*
	 * If it's the case where the directory code is running with no block
@@ -4993,7 +4993,7 @@ xfs_bmap_del_extent_real(
	    del->br_startoff > got.br_startoff && del_endoff < got_endoff)
		return -ENOSPC;

	flags = XFS_ILOG_CORE;
	*logflagsp = XFS_ILOG_CORE;
	if (whichfork == XFS_DATA_FORK && XFS_IS_REALTIME_INODE(ip)) {
		xfs_filblks_t	len;
		xfs_extlen_t	mod;
@@ -5011,7 +5011,7 @@ xfs_bmap_del_extent_real(

			error = xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len);
			if (error)
				goto done;
				return error;
		}

		do_fx = 0;
@@ -5027,11 +5027,9 @@ xfs_bmap_del_extent_real(
	if (cur) {
		error = xfs_bmbt_lookup_eq(cur, &got, &i);
		if (error)
			goto done;
		if (XFS_IS_CORRUPT(mp, i != 1)) {
			error = -EFSCORRUPTED;
			goto done;
		}
			return error;
		if (XFS_IS_CORRUPT(mp, i != 1))
			return -EFSCORRUPTED;
	}

	if (got.br_startoff == del->br_startoff)
@@ -5048,17 +5046,15 @@ xfs_bmap_del_extent_real(
		xfs_iext_prev(ifp, icur);
		ifp->if_nextents--;

		flags |= XFS_ILOG_CORE;
		*logflagsp |= XFS_ILOG_CORE;
		if (!cur) {
			flags |= xfs_ilog_fext(whichfork);
			*logflagsp |= xfs_ilog_fext(whichfork);
			break;
		}
		if ((error = xfs_btree_delete(cur, &i)))
			goto done;
		if (XFS_IS_CORRUPT(mp, i != 1)) {
			error = -EFSCORRUPTED;
			goto done;
		}
			return error;
		if (XFS_IS_CORRUPT(mp, i != 1))
			return -EFSCORRUPTED;
		break;
	case BMAP_LEFT_FILLING:
		/*
@@ -5069,12 +5065,12 @@ xfs_bmap_del_extent_real(
		got.br_blockcount -= del->br_blockcount;
		xfs_iext_update_extent(ip, state, icur, &got);
		if (!cur) {
			flags |= xfs_ilog_fext(whichfork);
			*logflagsp |= xfs_ilog_fext(whichfork);
			break;
		}
		error = xfs_bmbt_update(cur, &got);
		if (error)
			goto done;
			return error;
		break;
	case BMAP_RIGHT_FILLING:
		/*
@@ -5083,12 +5079,12 @@ xfs_bmap_del_extent_real(
		got.br_blockcount -= del->br_blockcount;
		xfs_iext_update_extent(ip, state, icur, &got);
		if (!cur) {
			flags |= xfs_ilog_fext(whichfork);
			*logflagsp |= xfs_ilog_fext(whichfork);
			break;
		}
		error = xfs_bmbt_update(cur, &got);
		if (error)
			goto done;
			return error;
		break;
	case 0:
		/*
@@ -5111,8 +5107,7 @@ xfs_bmap_del_extent_real(
		if (error) {
			ASSERT(S_ISDIR(VFS_I(ip)->i_mode) &&
				whichfork == XFS_DATA_FORK);
			error = -ENOSPC;
			goto done;
			return -ENOSPC;
		}

		old = got;
@@ -5125,18 +5120,18 @@ xfs_bmap_del_extent_real(
		new.br_state = got.br_state;
		new.br_startblock = del_endblock;

		flags |= XFS_ILOG_CORE;
		*logflagsp |= XFS_ILOG_CORE;
		if (cur) {
			error = xfs_bmbt_update(cur, &got);
			if (error)
				goto done;
				return error;
			error = xfs_btree_increment(cur, 0, &i);
			if (error)
				goto done;
				return error;
			cur->bc_rec.b = new;
			error = xfs_btree_insert(cur, &i);
			if (error && error != -ENOSPC)
				goto done;
				return error;
			/*
			 * If get no-space back from btree insert, it tried a
			 * split, and we have a zero block reservation.  Fix up
@@ -5149,33 +5144,28 @@ xfs_bmap_del_extent_real(
				 */
				error = xfs_bmbt_lookup_eq(cur, &got, &i);
				if (error)
					goto done;
				if (XFS_IS_CORRUPT(mp, i != 1)) {
					error = -EFSCORRUPTED;
					goto done;
				}
					return error;
				if (XFS_IS_CORRUPT(mp, i != 1))
					return -EFSCORRUPTED;
				/*
				 * Update the btree record back
				 * to the original value.
				 */
				error = xfs_bmbt_update(cur, &old);
				if (error)
					goto done;
					return error;
				/*
				 * Reset the extent record back
				 * to the original value.
				 */
				xfs_iext_update_extent(ip, state, icur, &old);
				flags = 0;
				error = -ENOSPC;
				goto done;
			}
			if (XFS_IS_CORRUPT(mp, i != 1)) {
				error = -EFSCORRUPTED;
				goto done;
				*logflagsp = 0;
				return -ENOSPC;
			}
			if (XFS_IS_CORRUPT(mp, i != 1))
				return -EFSCORRUPTED;
		} else
			flags |= xfs_ilog_fext(whichfork);
			*logflagsp |= xfs_ilog_fext(whichfork);

		ifp->if_nextents++;
		xfs_iext_next(ifp, icur);
@@ -5199,7 +5189,7 @@ xfs_bmap_del_extent_real(
					((bflags & XFS_BMAPI_NODISCARD) ||
					del->br_state == XFS_EXT_UNWRITTEN));
			if (error)
				goto done;
				return error;
		}
	}

@@ -5214,9 +5204,7 @@ xfs_bmap_del_extent_real(
	if (qfield && !(bflags & XFS_BMAPI_REMAP))
		xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks);

done:
	*logflagsp = flags;
	return error;
	return 0;
}

/*
+7 −0
Original line number Diff line number Diff line
@@ -2305,10 +2305,17 @@ xfs_da3_swap_lastblock(
		return error;
	/*
	 * Copy the last block into the dead buffer and log it.
	 * On CRC-enabled file systems, also update the stamped in blkno.
	 */
	memcpy(dead_buf->b_addr, last_buf->b_addr, args->geo->blksize);
	if (xfs_has_crc(mp)) {
		struct xfs_da3_blkinfo *da3 = dead_buf->b_addr;

		da3->blkno = cpu_to_be64(xfs_buf_daddr(dead_buf));
	}
	xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1);
	dead_info = dead_buf->b_addr;

	/*
	 * Get values from the moved block.
	 */
+1 −1
Original line number Diff line number Diff line
@@ -1269,7 +1269,7 @@ xfs_iomap_write_delalloc_release(
			error = data_end;
			goto out_unlock;
		}
		WARN_ON_ONCE(data_end <= start_byte);
		WARN_ON_ONCE(data_end < start_byte);
		WARN_ON_ONCE(data_end > scan_end_byte);

		error = xfs_iomap_write_delalloc_scan(inode, &punch_start_byte,