diff options
Diffstat (limited to 'fs/xfs/xfs_bmap.c')
-rw-r--r-- | fs/xfs/xfs_bmap.c | 77 |
1 files changed, 40 insertions, 37 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 1c0a5a585a82..eb198c01c35d 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
@@ -323,13 +323,13 @@ xfs_bmap_trace_pre_update( | |||
323 | int whichfork); /* data or attr fork */ | 323 | int whichfork); /* data or attr fork */ |
324 | 324 | ||
325 | #define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) \ | 325 | #define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) \ |
326 | xfs_bmap_trace_delete(__FUNCTION__,d,ip,i,c,w) | 326 | xfs_bmap_trace_delete(__func__,d,ip,i,c,w) |
327 | #define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) \ | 327 | #define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) \ |
328 | xfs_bmap_trace_insert(__FUNCTION__,d,ip,i,c,r1,r2,w) | 328 | xfs_bmap_trace_insert(__func__,d,ip,i,c,r1,r2,w) |
329 | #define XFS_BMAP_TRACE_POST_UPDATE(d,ip,i,w) \ | 329 | #define XFS_BMAP_TRACE_POST_UPDATE(d,ip,i,w) \ |
330 | xfs_bmap_trace_post_update(__FUNCTION__,d,ip,i,w) | 330 | xfs_bmap_trace_post_update(__func__,d,ip,i,w) |
331 | #define XFS_BMAP_TRACE_PRE_UPDATE(d,ip,i,w) \ | 331 | #define XFS_BMAP_TRACE_PRE_UPDATE(d,ip,i,w) \ |
332 | xfs_bmap_trace_pre_update(__FUNCTION__,d,ip,i,w) | 332 | xfs_bmap_trace_pre_update(__func__,d,ip,i,w) |
333 | #else | 333 | #else |
334 | #define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) | 334 | #define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) |
335 | #define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) | 335 | #define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) |
@@ -2402,7 +2402,7 @@ xfs_bmap_extsize_align( | |||
2402 | 2402 | ||
2403 | #define XFS_ALLOC_GAP_UNITS 4 | 2403 | #define XFS_ALLOC_GAP_UNITS 4 |
2404 | 2404 | ||
2405 | STATIC int | 2405 | STATIC void |
2406 | xfs_bmap_adjacent( | 2406 | xfs_bmap_adjacent( |
2407 | xfs_bmalloca_t *ap) /* bmap alloc argument struct */ | 2407 | xfs_bmalloca_t *ap) /* bmap alloc argument struct */ |
2408 | { | 2408 | { |
@@ -2548,7 +2548,6 @@ xfs_bmap_adjacent( | |||
2548 | ap->rval = gotbno; | 2548 | ap->rval = gotbno; |
2549 | } | 2549 | } |
2550 | #undef ISVALID | 2550 | #undef ISVALID |
2551 | return 0; | ||
2552 | } | 2551 | } |
2553 | 2552 | ||
2554 | STATIC int | 2553 | STATIC int |
@@ -4047,17 +4046,17 @@ xfs_bmap_add_attrfork( | |||
4047 | xfs_trans_log_inode(tp, ip, logflags); | 4046 | xfs_trans_log_inode(tp, ip, logflags); |
4048 | if (error) | 4047 | if (error) |
4049 | goto error2; | 4048 | goto error2; |
4050 | if (!XFS_SB_VERSION_HASATTR(&mp->m_sb) || | 4049 | if (!xfs_sb_version_hasattr(&mp->m_sb) || |
4051 | (!XFS_SB_VERSION_HASATTR2(&mp->m_sb) && version == 2)) { | 4050 | (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) { |
4052 | __int64_t sbfields = 0; | 4051 | __int64_t sbfields = 0; |
4053 | 4052 | ||
4054 | spin_lock(&mp->m_sb_lock); | 4053 | spin_lock(&mp->m_sb_lock); |
4055 | if (!XFS_SB_VERSION_HASATTR(&mp->m_sb)) { | 4054 | if (!xfs_sb_version_hasattr(&mp->m_sb)) { |
4056 | XFS_SB_VERSION_ADDATTR(&mp->m_sb); | 4055 | xfs_sb_version_addattr(&mp->m_sb); |
4057 | sbfields |= XFS_SB_VERSIONNUM; | 4056 | sbfields |= XFS_SB_VERSIONNUM; |
4058 | } | 4057 | } |
4059 | if (!XFS_SB_VERSION_HASATTR2(&mp->m_sb) && version == 2) { | 4058 | if (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2) { |
4060 | XFS_SB_VERSION_ADDATTR2(&mp->m_sb); | 4059 | xfs_sb_version_addattr2(&mp->m_sb); |
4061 | sbfields |= (XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); | 4060 | sbfields |= (XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); |
4062 | } | 4061 | } |
4063 | if (sbfields) { | 4062 | if (sbfields) { |
@@ -4154,16 +4153,21 @@ xfs_bmap_compute_maxlevels( | |||
4154 | * number of leaf entries, is controlled by the type of di_nextents | 4153 | * number of leaf entries, is controlled by the type of di_nextents |
4155 | * (a signed 32-bit number, xfs_extnum_t), or by di_anextents | 4154 | * (a signed 32-bit number, xfs_extnum_t), or by di_anextents |
4156 | * (a signed 16-bit number, xfs_aextnum_t). | 4155 | * (a signed 16-bit number, xfs_aextnum_t). |
4156 | * | ||
4157 | * Note that we can no longer assume that if we are in ATTR1 that | ||
4158 | * the fork offset of all the inodes will be (m_attroffset >> 3) | ||
4159 | * because we could have mounted with ATTR2 and then mounted back | ||
4160 | * with ATTR1, keeping the di_forkoff's fixed but probably at | ||
4161 | * various positions. Therefore, for both ATTR1 and ATTR2 | ||
4162 | * we have to assume the worst case scenario of a minimum size | ||
4163 | * available. | ||
4157 | */ | 4164 | */ |
4158 | if (whichfork == XFS_DATA_FORK) { | 4165 | if (whichfork == XFS_DATA_FORK) { |
4159 | maxleafents = MAXEXTNUM; | 4166 | maxleafents = MAXEXTNUM; |
4160 | sz = (mp->m_flags & XFS_MOUNT_ATTR2) ? | 4167 | sz = XFS_BMDR_SPACE_CALC(MINDBTPTRS); |
4161 | XFS_BMDR_SPACE_CALC(MINDBTPTRS) : mp->m_attroffset; | ||
4162 | } else { | 4168 | } else { |
4163 | maxleafents = MAXAEXTNUM; | 4169 | maxleafents = MAXAEXTNUM; |
4164 | sz = (mp->m_flags & XFS_MOUNT_ATTR2) ? | 4170 | sz = XFS_BMDR_SPACE_CALC(MINABTPTRS); |
4165 | XFS_BMDR_SPACE_CALC(MINABTPTRS) : | ||
4166 | mp->m_sb.sb_inodesize - mp->m_attroffset; | ||
4167 | } | 4171 | } |
4168 | maxrootrecs = (int)XFS_BTREE_BLOCK_MAXRECS(sz, xfs_bmdr, 0); | 4172 | maxrootrecs = (int)XFS_BTREE_BLOCK_MAXRECS(sz, xfs_bmdr, 0); |
4169 | minleafrecs = mp->m_bmap_dmnr[0]; | 4173 | minleafrecs = mp->m_bmap_dmnr[0]; |
@@ -5043,7 +5047,7 @@ xfs_bmapi( | |||
5043 | * A wasdelay extent has been initialized, so | 5047 | * A wasdelay extent has been initialized, so |
5044 | * shouldn't be flagged as unwritten. | 5048 | * shouldn't be flagged as unwritten. |
5045 | */ | 5049 | */ |
5046 | if (wr && XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) { | 5050 | if (wr && xfs_sb_version_hasextflgbit(&mp->m_sb)) { |
5047 | if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) | 5051 | if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) |
5048 | got.br_state = XFS_EXT_UNWRITTEN; | 5052 | got.br_state = XFS_EXT_UNWRITTEN; |
5049 | } | 5053 | } |
@@ -5483,7 +5487,7 @@ xfs_bunmapi( | |||
5483 | * get rid of part of a realtime extent. | 5487 | * get rid of part of a realtime extent. |
5484 | */ | 5488 | */ |
5485 | if (del.br_state == XFS_EXT_UNWRITTEN || | 5489 | if (del.br_state == XFS_EXT_UNWRITTEN || |
5486 | !XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) { | 5490 | !xfs_sb_version_hasextflgbit(&mp->m_sb)) { |
5487 | /* | 5491 | /* |
5488 | * This piece is unwritten, or we're not | 5492 | * This piece is unwritten, or we're not |
5489 | * using unwritten extents. Skip over it. | 5493 | * using unwritten extents. Skip over it. |
@@ -5535,7 +5539,7 @@ xfs_bunmapi( | |||
5535 | } else if ((del.br_startoff == start && | 5539 | } else if ((del.br_startoff == start && |
5536 | (del.br_state == XFS_EXT_UNWRITTEN || | 5540 | (del.br_state == XFS_EXT_UNWRITTEN || |
5537 | xfs_trans_get_block_res(tp) == 0)) || | 5541 | xfs_trans_get_block_res(tp) == 0)) || |
5538 | !XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) { | 5542 | !xfs_sb_version_hasextflgbit(&mp->m_sb)) { |
5539 | /* | 5543 | /* |
5540 | * Can't make it unwritten. There isn't | 5544 | * Can't make it unwritten. There isn't |
5541 | * a full extent here so just skip it. | 5545 | * a full extent here so just skip it. |
@@ -5772,7 +5776,6 @@ xfs_getbmap( | |||
5772 | int error; /* return value */ | 5776 | int error; /* return value */ |
5773 | __int64_t fixlen; /* length for -1 case */ | 5777 | __int64_t fixlen; /* length for -1 case */ |
5774 | int i; /* extent number */ | 5778 | int i; /* extent number */ |
5775 | bhv_vnode_t *vp; /* corresponding vnode */ | ||
5776 | int lock; /* lock state */ | 5779 | int lock; /* lock state */ |
5777 | xfs_bmbt_irec_t *map; /* buffer for user's data */ | 5780 | xfs_bmbt_irec_t *map; /* buffer for user's data */ |
5778 | xfs_mount_t *mp; /* file system mount point */ | 5781 | xfs_mount_t *mp; /* file system mount point */ |
@@ -5789,7 +5792,6 @@ xfs_getbmap( | |||
5789 | int bmapi_flags; /* flags for xfs_bmapi */ | 5792 | int bmapi_flags; /* flags for xfs_bmapi */ |
5790 | __int32_t oflags; /* getbmapx bmv_oflags field */ | 5793 | __int32_t oflags; /* getbmapx bmv_oflags field */ |
5791 | 5794 | ||
5792 | vp = XFS_ITOV(ip); | ||
5793 | mp = ip->i_mount; | 5795 | mp = ip->i_mount; |
5794 | 5796 | ||
5795 | whichfork = interface & BMV_IF_ATTRFORK ? XFS_ATTR_FORK : XFS_DATA_FORK; | 5797 | whichfork = interface & BMV_IF_ATTRFORK ? XFS_ATTR_FORK : XFS_DATA_FORK; |
@@ -5811,7 +5813,7 @@ xfs_getbmap( | |||
5811 | if ((interface & BMV_IF_NO_DMAPI_READ) == 0 && | 5813 | if ((interface & BMV_IF_NO_DMAPI_READ) == 0 && |
5812 | DM_EVENT_ENABLED(ip, DM_EVENT_READ) && | 5814 | DM_EVENT_ENABLED(ip, DM_EVENT_READ) && |
5813 | whichfork == XFS_DATA_FORK) { | 5815 | whichfork == XFS_DATA_FORK) { |
5814 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, vp, 0, 0, 0, NULL); | 5816 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, 0, 0, 0, NULL); |
5815 | if (error) | 5817 | if (error) |
5816 | return XFS_ERROR(error); | 5818 | return XFS_ERROR(error); |
5817 | } | 5819 | } |
@@ -5869,6 +5871,10 @@ xfs_getbmap( | |||
5869 | /* xfs_fsize_t last_byte = xfs_file_last_byte(ip); */ | 5871 | /* xfs_fsize_t last_byte = xfs_file_last_byte(ip); */ |
5870 | error = xfs_flush_pages(ip, (xfs_off_t)0, | 5872 | error = xfs_flush_pages(ip, (xfs_off_t)0, |
5871 | -1, 0, FI_REMAPF); | 5873 | -1, 0, FI_REMAPF); |
5874 | if (error) { | ||
5875 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | ||
5876 | return error; | ||
5877 | } | ||
5872 | } | 5878 | } |
5873 | 5879 | ||
5874 | ASSERT(whichfork == XFS_ATTR_FORK || ip->i_delayed_blks == 0); | 5880 | ASSERT(whichfork == XFS_ATTR_FORK || ip->i_delayed_blks == 0); |
@@ -6162,10 +6168,10 @@ xfs_check_block( | |||
6162 | } | 6168 | } |
6163 | if (*thispa == *pp) { | 6169 | if (*thispa == *pp) { |
6164 | cmn_err(CE_WARN, "%s: thispa(%d) == pp(%d) %Ld", | 6170 | cmn_err(CE_WARN, "%s: thispa(%d) == pp(%d) %Ld", |
6165 | __FUNCTION__, j, i, | 6171 | __func__, j, i, |
6166 | (unsigned long long)be64_to_cpu(*thispa)); | 6172 | (unsigned long long)be64_to_cpu(*thispa)); |
6167 | panic("%s: ptrs are equal in node\n", | 6173 | panic("%s: ptrs are equal in node\n", |
6168 | __FUNCTION__); | 6174 | __func__); |
6169 | } | 6175 | } |
6170 | } | 6176 | } |
6171 | } | 6177 | } |
@@ -6192,7 +6198,7 @@ xfs_bmap_check_leaf_extents( | |||
6192 | xfs_mount_t *mp; /* file system mount structure */ | 6198 | xfs_mount_t *mp; /* file system mount structure */ |
6193 | __be64 *pp; /* pointer to block address */ | 6199 | __be64 *pp; /* pointer to block address */ |
6194 | xfs_bmbt_rec_t *ep; /* pointer to current extent */ | 6200 | xfs_bmbt_rec_t *ep; /* pointer to current extent */ |
6195 | xfs_bmbt_rec_t *lastp; /* pointer to previous extent */ | 6201 | xfs_bmbt_rec_t last = {0, 0}; /* last extent in prev block */ |
6196 | xfs_bmbt_rec_t *nextp; /* pointer to next extent */ | 6202 | xfs_bmbt_rec_t *nextp; /* pointer to next extent */ |
6197 | int bp_release = 0; | 6203 | int bp_release = 0; |
6198 | 6204 | ||
@@ -6262,7 +6268,6 @@ xfs_bmap_check_leaf_extents( | |||
6262 | /* | 6268 | /* |
6263 | * Loop over all leaf nodes checking that all extents are in the right order. | 6269 | * Loop over all leaf nodes checking that all extents are in the right order. |
6264 | */ | 6270 | */ |
6265 | lastp = NULL; | ||
6266 | for (;;) { | 6271 | for (;;) { |
6267 | xfs_fsblock_t nextbno; | 6272 | xfs_fsblock_t nextbno; |
6268 | xfs_extnum_t num_recs; | 6273 | xfs_extnum_t num_recs; |
@@ -6283,18 +6288,16 @@ xfs_bmap_check_leaf_extents( | |||
6283 | */ | 6288 | */ |
6284 | 6289 | ||
6285 | ep = XFS_BTREE_REC_ADDR(xfs_bmbt, block, 1); | 6290 | ep = XFS_BTREE_REC_ADDR(xfs_bmbt, block, 1); |
6291 | if (i) { | ||
6292 | xfs_btree_check_rec(XFS_BTNUM_BMAP, &last, ep); | ||
6293 | } | ||
6286 | for (j = 1; j < num_recs; j++) { | 6294 | for (j = 1; j < num_recs; j++) { |
6287 | nextp = XFS_BTREE_REC_ADDR(xfs_bmbt, block, j + 1); | 6295 | nextp = XFS_BTREE_REC_ADDR(xfs_bmbt, block, j + 1); |
6288 | if (lastp) { | 6296 | xfs_btree_check_rec(XFS_BTNUM_BMAP, ep, nextp); |
6289 | xfs_btree_check_rec(XFS_BTNUM_BMAP, | ||
6290 | (void *)lastp, (void *)ep); | ||
6291 | } | ||
6292 | xfs_btree_check_rec(XFS_BTNUM_BMAP, (void *)ep, | ||
6293 | (void *)(nextp)); | ||
6294 | lastp = ep; | ||
6295 | ep = nextp; | 6297 | ep = nextp; |
6296 | } | 6298 | } |
6297 | 6299 | ||
6300 | last = *ep; | ||
6298 | i += num_recs; | 6301 | i += num_recs; |
6299 | if (bp_release) { | 6302 | if (bp_release) { |
6300 | bp_release = 0; | 6303 | bp_release = 0; |
@@ -6325,13 +6328,13 @@ xfs_bmap_check_leaf_extents( | |||
6325 | return; | 6328 | return; |
6326 | 6329 | ||
6327 | error0: | 6330 | error0: |
6328 | cmn_err(CE_WARN, "%s: at error0", __FUNCTION__); | 6331 | cmn_err(CE_WARN, "%s: at error0", __func__); |
6329 | if (bp_release) | 6332 | if (bp_release) |
6330 | xfs_trans_brelse(NULL, bp); | 6333 | xfs_trans_brelse(NULL, bp); |
6331 | error_norelse: | 6334 | error_norelse: |
6332 | cmn_err(CE_WARN, "%s: BAD after btree leaves for %d extents", | 6335 | cmn_err(CE_WARN, "%s: BAD after btree leaves for %d extents", |
6333 | __FUNCTION__, i); | 6336 | __func__, i); |
6334 | panic("%s: CORRUPTED BTREE OR SOMETHING", __FUNCTION__); | 6337 | panic("%s: CORRUPTED BTREE OR SOMETHING", __func__); |
6335 | return; | 6338 | return; |
6336 | } | 6339 | } |
6337 | #endif | 6340 | #endif |