xfs: move the fork format fields into struct xfs_ifork
Both the data and attr fork have a format that is stored in the legacy idinode. Move it into the xfs_ifork structure instead, where it uses up padding. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:

committed by
Darrick J. Wong

parent
daf83964a3
commit
f7e67b20ec
@@ -123,7 +123,7 @@ static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfork)
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
|
||||
return whichfork != XFS_COW_FORK &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS &&
|
||||
ifp->if_format == XFS_DINODE_FMT_EXTENTS &&
|
||||
ifp->if_nextents > XFS_IFORK_MAXEXT(ip, whichfork);
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ static inline bool xfs_bmap_wants_extents(struct xfs_inode *ip, int whichfork)
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
|
||||
return whichfork != XFS_COW_FORK &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE &&
|
||||
ifp->if_format == XFS_DINODE_FMT_BTREE &&
|
||||
ifp->if_nextents <= XFS_IFORK_MAXEXT(ip, whichfork);
|
||||
}
|
||||
|
||||
@@ -215,8 +215,8 @@ xfs_bmap_forkoff_reset(
|
||||
int whichfork)
|
||||
{
|
||||
if (whichfork == XFS_ATTR_FORK &&
|
||||
ip->i_d.di_format != XFS_DINODE_FMT_DEV &&
|
||||
ip->i_d.di_format != XFS_DINODE_FMT_BTREE) {
|
||||
ip->i_df.if_format != XFS_DINODE_FMT_DEV &&
|
||||
ip->i_df.if_format != XFS_DINODE_FMT_BTREE) {
|
||||
uint dfl_forkoff = xfs_default_attroffset(ip) >> 3;
|
||||
|
||||
if (dfl_forkoff > ip->i_d.di_forkoff)
|
||||
@@ -317,31 +317,28 @@ xfs_bmap_check_leaf_extents(
|
||||
xfs_inode_t *ip, /* incore inode pointer */
|
||||
int whichfork) /* data or attr fork */
|
||||
{
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
struct xfs_btree_block *block; /* current btree block */
|
||||
xfs_fsblock_t bno; /* block # of "block" */
|
||||
xfs_buf_t *bp; /* buffer for "block" */
|
||||
int error; /* error return value */
|
||||
xfs_extnum_t i=0, j; /* index into the extents list */
|
||||
struct xfs_ifork *ifp; /* fork structure */
|
||||
int level; /* btree level, for checking */
|
||||
xfs_mount_t *mp; /* file system mount structure */
|
||||
__be64 *pp; /* pointer to block address */
|
||||
xfs_bmbt_rec_t *ep; /* pointer to current extent */
|
||||
xfs_bmbt_rec_t last = {0, 0}; /* last extent in prev block */
|
||||
xfs_bmbt_rec_t *nextp; /* pointer to next extent */
|
||||
int bp_release = 0;
|
||||
|
||||
if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE) {
|
||||
if (ifp->if_format != XFS_DINODE_FMT_BTREE)
|
||||
return;
|
||||
}
|
||||
|
||||
/* skip large extent count inodes */
|
||||
if (ip->i_df.if_nextents > 10000)
|
||||
return;
|
||||
|
||||
bno = NULLFSBLOCK;
|
||||
mp = ip->i_mount;
|
||||
ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
block = ifp->if_broot;
|
||||
/*
|
||||
* Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out.
|
||||
@@ -606,7 +603,7 @@ xfs_bmap_btree_to_extents(
|
||||
ASSERT(cur);
|
||||
ASSERT(whichfork != XFS_COW_FORK);
|
||||
ASSERT(ifp->if_flags & XFS_IFEXTENTS);
|
||||
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE);
|
||||
ASSERT(ifp->if_format == XFS_DINODE_FMT_BTREE);
|
||||
ASSERT(be16_to_cpu(rblock->bb_level) == 1);
|
||||
ASSERT(be16_to_cpu(rblock->bb_numrecs) == 1);
|
||||
ASSERT(xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0) == 1);
|
||||
@@ -634,7 +631,7 @@ xfs_bmap_btree_to_extents(
|
||||
xfs_iroot_realloc(ip, -1, whichfork);
|
||||
ASSERT(ifp->if_broot == NULL);
|
||||
ASSERT((ifp->if_flags & XFS_IFBROOT) == 0);
|
||||
XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS);
|
||||
ifp->if_format = XFS_DINODE_FMT_EXTENTS;
|
||||
*logflagsp |= XFS_ILOG_CORE | xfs_ilog_fext(whichfork);
|
||||
return 0;
|
||||
}
|
||||
@@ -670,7 +667,7 @@ xfs_bmap_extents_to_btree(
|
||||
mp = ip->i_mount;
|
||||
ASSERT(whichfork != XFS_COW_FORK);
|
||||
ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS);
|
||||
ASSERT(ifp->if_format == XFS_DINODE_FMT_EXTENTS);
|
||||
|
||||
/*
|
||||
* Make space in the inode incore. This needs to be undone if we fail
|
||||
@@ -694,7 +691,7 @@ xfs_bmap_extents_to_btree(
|
||||
/*
|
||||
* Convert to a btree with two levels, one record in root.
|
||||
*/
|
||||
XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE);
|
||||
ifp->if_format = XFS_DINODE_FMT_BTREE;
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.tp = tp;
|
||||
args.mp = mp;
|
||||
@@ -780,7 +777,7 @@ out_unreserve_dquot:
|
||||
xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
|
||||
out_root_realloc:
|
||||
xfs_iroot_realloc(ip, -1, whichfork);
|
||||
XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS);
|
||||
ifp->if_format = XFS_DINODE_FMT_EXTENTS;
|
||||
ASSERT(ifp->if_broot == NULL);
|
||||
xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
|
||||
|
||||
@@ -802,7 +799,7 @@ xfs_bmap_local_to_extents_empty(
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
|
||||
ASSERT(whichfork != XFS_COW_FORK);
|
||||
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL);
|
||||
ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL);
|
||||
ASSERT(ifp->if_bytes == 0);
|
||||
ASSERT(ifp->if_nextents == 0);
|
||||
|
||||
@@ -811,7 +808,7 @@ xfs_bmap_local_to_extents_empty(
|
||||
ifp->if_flags |= XFS_IFEXTENTS;
|
||||
ifp->if_u1.if_root = NULL;
|
||||
ifp->if_height = 0;
|
||||
XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS);
|
||||
ifp->if_format = XFS_DINODE_FMT_EXTENTS;
|
||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||
}
|
||||
|
||||
@@ -842,7 +839,7 @@ xfs_bmap_local_to_extents(
|
||||
*/
|
||||
ASSERT(!(S_ISREG(VFS_I(ip)->i_mode) && whichfork == XFS_DATA_FORK));
|
||||
ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL);
|
||||
ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL);
|
||||
|
||||
if (!ifp->if_bytes) {
|
||||
xfs_bmap_local_to_extents_empty(tp, ip, whichfork);
|
||||
@@ -1036,7 +1033,7 @@ xfs_bmap_set_attrforkoff(
|
||||
int size,
|
||||
int *version)
|
||||
{
|
||||
switch (ip->i_d.di_format) {
|
||||
switch (ip->i_df.if_format) {
|
||||
case XFS_DINODE_FMT_DEV:
|
||||
ip->i_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3;
|
||||
break;
|
||||
@@ -1094,13 +1091,6 @@ xfs_bmap_add_attrfork(
|
||||
goto trans_cancel;
|
||||
if (XFS_IFORK_Q(ip))
|
||||
goto trans_cancel;
|
||||
if (ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS) {
|
||||
/*
|
||||
* For inodes coming from pre-6.2 filesystems.
|
||||
*/
|
||||
ASSERT(ip->i_d.di_aformat == 0);
|
||||
ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
|
||||
}
|
||||
|
||||
xfs_trans_ijoin(tp, ip, 0);
|
||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||
@@ -1109,9 +1099,10 @@ xfs_bmap_add_attrfork(
|
||||
goto trans_cancel;
|
||||
ASSERT(ip->i_afp == NULL);
|
||||
ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, 0);
|
||||
ip->i_afp->if_format = XFS_DINODE_FMT_EXTENTS;
|
||||
ip->i_afp->if_flags = XFS_IFEXTENTS;
|
||||
logflags = 0;
|
||||
switch (ip->i_d.di_format) {
|
||||
switch (ip->i_df.if_format) {
|
||||
case XFS_DINODE_FMT_LOCAL:
|
||||
error = xfs_bmap_add_attrfork_local(tp, ip, &logflags);
|
||||
break;
|
||||
@@ -1237,9 +1228,7 @@ xfs_iread_extents(
|
||||
|
||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
||||
|
||||
if (XFS_IS_CORRUPT(mp,
|
||||
XFS_IFORK_FORMAT(ip, whichfork) !=
|
||||
XFS_DINODE_FMT_BTREE)) {
|
||||
if (XFS_IS_CORRUPT(mp, ifp->if_format != XFS_DINODE_FMT_BTREE)) {
|
||||
error = -EFSCORRUPTED;
|
||||
goto out;
|
||||
}
|
||||
@@ -1287,14 +1276,13 @@ xfs_bmap_first_unused(
|
||||
xfs_fileoff_t lowest, max;
|
||||
int error;
|
||||
|
||||
ASSERT(xfs_ifork_has_extents(ip, whichfork) ||
|
||||
XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL);
|
||||
|
||||
if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) {
|
||||
if (ifp->if_format == XFS_DINODE_FMT_LOCAL) {
|
||||
*first_unused = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ASSERT(xfs_ifork_has_extents(ifp));
|
||||
|
||||
if (!(ifp->if_flags & XFS_IFEXTENTS)) {
|
||||
error = xfs_iread_extents(tp, ip, whichfork);
|
||||
if (error)
|
||||
@@ -1335,7 +1323,7 @@ xfs_bmap_last_before(
|
||||
struct xfs_iext_cursor icur;
|
||||
int error;
|
||||
|
||||
switch (XFS_IFORK_FORMAT(ip, whichfork)) {
|
||||
switch (ifp->if_format) {
|
||||
case XFS_DINODE_FMT_LOCAL:
|
||||
*last_block = 0;
|
||||
return 0;
|
||||
@@ -1434,16 +1422,17 @@ xfs_bmap_last_offset(
|
||||
xfs_fileoff_t *last_block,
|
||||
int whichfork)
|
||||
{
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
struct xfs_bmbt_irec rec;
|
||||
int is_empty;
|
||||
int error;
|
||||
|
||||
*last_block = 0;
|
||||
|
||||
if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL)
|
||||
if (ifp->if_format == XFS_DINODE_FMT_LOCAL)
|
||||
return 0;
|
||||
|
||||
if (XFS_IS_CORRUPT(ip->i_mount, !xfs_ifork_has_extents(ip, whichfork)))
|
||||
if (XFS_IS_CORRUPT(ip->i_mount, !xfs_ifork_has_extents(ifp)))
|
||||
return -EFSCORRUPTED;
|
||||
|
||||
error = xfs_bmap_last_extent(NULL, ip, whichfork, &rec, &is_empty);
|
||||
@@ -1475,7 +1464,7 @@ xfs_bmap_one_block(
|
||||
#endif /* !DEBUG */
|
||||
if (ifp->if_nextents != 1)
|
||||
return 0;
|
||||
if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS)
|
||||
if (ifp->if_format != XFS_DINODE_FMT_EXTENTS)
|
||||
return 0;
|
||||
ASSERT(ifp->if_flags & XFS_IFEXTENTS);
|
||||
xfs_iext_first(ifp, &icur);
|
||||
@@ -3895,10 +3884,9 @@ xfs_bmapi_read(
|
||||
if (WARN_ON_ONCE(!ifp))
|
||||
return -EFSCORRUPTED;
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ip, whichfork)) ||
|
||||
XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT)) {
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp)) ||
|
||||
XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT))
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
|
||||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
return -EIO;
|
||||
@@ -4281,11 +4269,13 @@ xfs_bmapi_minleft(
|
||||
struct xfs_inode *ip,
|
||||
int fork)
|
||||
{
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, fork);
|
||||
|
||||
if (tp && tp->t_firstblock != NULLFSBLOCK)
|
||||
return 0;
|
||||
if (XFS_IFORK_FORMAT(ip, fork) != XFS_DINODE_FMT_BTREE)
|
||||
if (ifp->if_format != XFS_DINODE_FMT_BTREE)
|
||||
return 1;
|
||||
return be16_to_cpu(XFS_IFORK_PTR(ip, fork)->if_broot->bb_level) + 1;
|
||||
return be16_to_cpu(ifp->if_broot->bb_level) + 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4300,11 +4290,13 @@ xfs_bmapi_finish(
|
||||
int whichfork,
|
||||
int error)
|
||||
{
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork);
|
||||
|
||||
if ((bma->logflags & xfs_ilog_fext(whichfork)) &&
|
||||
XFS_IFORK_FORMAT(bma->ip, whichfork) != XFS_DINODE_FMT_EXTENTS)
|
||||
ifp->if_format != XFS_DINODE_FMT_EXTENTS)
|
||||
bma->logflags &= ~xfs_ilog_fext(whichfork);
|
||||
else if ((bma->logflags & xfs_ilog_fbroot(whichfork)) &&
|
||||
XFS_IFORK_FORMAT(bma->ip, whichfork) != XFS_DINODE_FMT_BTREE)
|
||||
ifp->if_format != XFS_DINODE_FMT_BTREE)
|
||||
bma->logflags &= ~xfs_ilog_fbroot(whichfork);
|
||||
|
||||
if (bma->logflags)
|
||||
@@ -4336,13 +4328,13 @@ xfs_bmapi_write(
|
||||
.total = total,
|
||||
};
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
struct xfs_ifork *ifp;
|
||||
int whichfork = xfs_bmapi_whichfork(flags);
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
xfs_fileoff_t end; /* end of mapped file region */
|
||||
bool eof = false; /* after the end of extents */
|
||||
int error; /* error return */
|
||||
int n; /* current extent index */
|
||||
xfs_fileoff_t obno; /* old block number (offset) */
|
||||
int whichfork; /* data or attr fork */
|
||||
|
||||
#ifdef DEBUG
|
||||
xfs_fileoff_t orig_bno; /* original block number value */
|
||||
@@ -4357,13 +4349,12 @@ xfs_bmapi_write(
|
||||
orig_mval = mval;
|
||||
orig_nmap = *nmap;
|
||||
#endif
|
||||
whichfork = xfs_bmapi_whichfork(flags);
|
||||
|
||||
ASSERT(*nmap >= 1);
|
||||
ASSERT(*nmap <= XFS_BMAP_MAX_NMAP);
|
||||
ASSERT(tp != NULL);
|
||||
ASSERT(len > 0);
|
||||
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL);
|
||||
ASSERT(ifp->if_format != XFS_DINODE_FMT_LOCAL);
|
||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
||||
ASSERT(!(flags & XFS_BMAPI_REMAP));
|
||||
|
||||
@@ -4379,7 +4370,7 @@ xfs_bmapi_write(
|
||||
ASSERT((flags & (XFS_BMAPI_PREALLOC | XFS_BMAPI_ZERO)) !=
|
||||
(XFS_BMAPI_PREALLOC | XFS_BMAPI_ZERO));
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ip, whichfork)) ||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp)) ||
|
||||
XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT)) {
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
@@ -4387,8 +4378,6 @@ xfs_bmapi_write(
|
||||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
return -EIO;
|
||||
|
||||
ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
|
||||
XFS_STATS_INC(mp, xs_blk_mapw);
|
||||
|
||||
if (!(ifp->if_flags & XFS_IFEXTENTS)) {
|
||||
@@ -4498,7 +4487,7 @@ xfs_bmapi_write(
|
||||
if (error)
|
||||
goto error0;
|
||||
|
||||
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE ||
|
||||
ASSERT(ifp->if_format != XFS_DINODE_FMT_BTREE ||
|
||||
ifp->if_nextents > XFS_IFORK_MAXEXT(ip, whichfork));
|
||||
xfs_bmapi_finish(&bma, whichfork, 0);
|
||||
xfs_bmap_validate_ret(orig_bno, orig_len, orig_flags, orig_mval,
|
||||
@@ -4645,7 +4634,7 @@ xfs_bmapi_remap(
|
||||
ASSERT((flags & (XFS_BMAPI_ATTRFORK | XFS_BMAPI_PREALLOC)) !=
|
||||
(XFS_BMAPI_ATTRFORK | XFS_BMAPI_PREALLOC));
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ip, whichfork)) ||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp)) ||
|
||||
XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT)) {
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
@@ -4689,9 +4678,9 @@ xfs_bmapi_remap(
|
||||
error = xfs_bmap_btree_to_extents(tp, ip, cur, &logflags, whichfork);
|
||||
|
||||
error0:
|
||||
if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS)
|
||||
if (ip->i_df.if_format != XFS_DINODE_FMT_EXTENTS)
|
||||
logflags &= ~XFS_ILOG_DEXT;
|
||||
else if (ip->i_d.di_format != XFS_DINODE_FMT_BTREE)
|
||||
else if (ip->i_df.if_format != XFS_DINODE_FMT_BTREE)
|
||||
logflags &= ~XFS_ILOG_DBROOT;
|
||||
|
||||
if (logflags)
|
||||
@@ -5041,7 +5030,7 @@ xfs_bmap_del_extent_real(
|
||||
* conversion to btree format, since the transaction will be dirty then.
|
||||
*/
|
||||
if (tp->t_blk_res == 0 &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS &&
|
||||
ifp->if_format == XFS_DINODE_FMT_EXTENTS &&
|
||||
ifp->if_nextents >= XFS_IFORK_MAXEXT(ip, whichfork) &&
|
||||
del->br_startoff > got.br_startoff && del_endoff < got_endoff)
|
||||
return -ENOSPC;
|
||||
@@ -5284,7 +5273,7 @@ __xfs_bunmapi(
|
||||
whichfork = xfs_bmapi_whichfork(flags);
|
||||
ASSERT(whichfork != XFS_COW_FORK);
|
||||
ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ip, whichfork)))
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp)))
|
||||
return -EFSCORRUPTED;
|
||||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
return -EIO;
|
||||
@@ -5322,7 +5311,7 @@ __xfs_bunmapi(
|
||||
|
||||
logflags = 0;
|
||||
if (ifp->if_flags & XFS_IFBROOT) {
|
||||
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE);
|
||||
ASSERT(ifp->if_format == XFS_DINODE_FMT_BTREE);
|
||||
cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
|
||||
cur->bc_ino.flags = 0;
|
||||
} else
|
||||
@@ -5567,10 +5556,10 @@ error0:
|
||||
* logging the extent records if we've converted to btree format.
|
||||
*/
|
||||
if ((logflags & xfs_ilog_fext(whichfork)) &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS)
|
||||
ifp->if_format != XFS_DINODE_FMT_EXTENTS)
|
||||
logflags &= ~xfs_ilog_fext(whichfork);
|
||||
else if ((logflags & xfs_ilog_fbroot(whichfork)) &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)
|
||||
ifp->if_format != XFS_DINODE_FMT_BTREE)
|
||||
logflags &= ~xfs_ilog_fbroot(whichfork);
|
||||
/*
|
||||
* Log inode even in the error case, if the transaction
|
||||
@@ -5781,7 +5770,7 @@ xfs_bmap_collapse_extents(
|
||||
int error = 0;
|
||||
int logflags = 0;
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ip, whichfork)) ||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp)) ||
|
||||
XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT)) {
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
@@ -5898,7 +5887,7 @@ xfs_bmap_insert_extents(
|
||||
int error = 0;
|
||||
int logflags = 0;
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ip, whichfork)) ||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp)) ||
|
||||
XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT)) {
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
@@ -5992,18 +5981,18 @@ xfs_bmap_split_extent(
|
||||
xfs_fileoff_t split_fsb)
|
||||
{
|
||||
int whichfork = XFS_DATA_FORK;
|
||||
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
struct xfs_btree_cur *cur = NULL;
|
||||
struct xfs_bmbt_irec got;
|
||||
struct xfs_bmbt_irec new; /* split extent */
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
struct xfs_ifork *ifp;
|
||||
xfs_fsblock_t gotblkcnt; /* new block count for got */
|
||||
struct xfs_iext_cursor icur;
|
||||
int error = 0;
|
||||
int logflags = 0;
|
||||
int i = 0;
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ip, whichfork)) ||
|
||||
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ifp)) ||
|
||||
XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT)) {
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
@@ -6011,7 +6000,6 @@ xfs_bmap_split_extent(
|
||||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
return -EIO;
|
||||
|
||||
ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
if (!(ifp->if_flags & XFS_IFEXTENTS)) {
|
||||
/* Read in all the extents */
|
||||
error = xfs_iread_extents(tp, ip, whichfork);
|
||||
|
Reference in New Issue
Block a user