mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
xfs: add support for large btree blocks
Add support for larger btree blocks that contains a CRC32C checksum, a filesystem uuid and block number for detecting filesystem consistency and out of place writes. [dchinner@redhat.com] Also include an owner field to allow reverse mappings to be implemented for improved repairability and a LSN field to so that log recovery can easily determine the last modification that made it to disk for each buffer. [dchinner@redhat.com] Add buffer log format flags to indicate the type of buffer to recovery so that we don't have to do blind magic number tests to determine what the buffer is. [dchinner@redhat.com] Modified to fit into the verifier structure. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
a2050646f6
commit
ee1a47ab0e
17 changed files with 642 additions and 206 deletions
|
@ -786,6 +786,7 @@ xfs_iformat_btree(
|
|||
xfs_dinode_t *dip,
|
||||
int whichfork)
|
||||
{
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
xfs_bmdr_block_t *dfp;
|
||||
xfs_ifork_t *ifp;
|
||||
/* REFERENCED */
|
||||
|
@ -794,7 +795,7 @@ xfs_iformat_btree(
|
|||
|
||||
ifp = XFS_IFORK_PTR(ip, whichfork);
|
||||
dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork);
|
||||
size = XFS_BMAP_BROOT_SPACE(dfp);
|
||||
size = XFS_BMAP_BROOT_SPACE(mp, dfp);
|
||||
nrecs = be16_to_cpu(dfp->bb_numrecs);
|
||||
|
||||
/*
|
||||
|
@ -805,14 +806,14 @@ xfs_iformat_btree(
|
|||
* blocks.
|
||||
*/
|
||||
if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <=
|
||||
XFS_IFORK_MAXEXT(ip, whichfork) ||
|
||||
XFS_IFORK_MAXEXT(ip, whichfork) ||
|
||||
XFS_BMDR_SPACE_CALC(nrecs) >
|
||||
XFS_DFORK_SIZE(dip, ip->i_mount, whichfork) ||
|
||||
XFS_DFORK_SIZE(dip, mp, whichfork) ||
|
||||
XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) {
|
||||
xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).",
|
||||
(unsigned long long) ip->i_ino);
|
||||
xfs_warn(mp, "corrupt inode %Lu (btree).",
|
||||
(unsigned long long) ip->i_ino);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW,
|
||||
ip->i_mount, dip);
|
||||
mp, dip);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
|
@ -823,8 +824,7 @@ xfs_iformat_btree(
|
|||
* Copy and convert from the on-disk structure
|
||||
* to the in-memory structure.
|
||||
*/
|
||||
xfs_bmdr_to_bmbt(ip->i_mount, dfp,
|
||||
XFS_DFORK_SIZE(dip, ip->i_mount, whichfork),
|
||||
xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork),
|
||||
ifp->if_broot, size);
|
||||
ifp->if_flags &= ~XFS_IFEXTENTS;
|
||||
ifp->if_flags |= XFS_IFBROOT;
|
||||
|
@ -2037,7 +2037,7 @@ xfs_iroot_realloc(
|
|||
* allocate it now and get out.
|
||||
*/
|
||||
if (ifp->if_broot_bytes == 0) {
|
||||
new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(rec_diff);
|
||||
new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff);
|
||||
ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS);
|
||||
ifp->if_broot_bytes = (int)new_size;
|
||||
return;
|
||||
|
@ -2051,9 +2051,9 @@ xfs_iroot_realloc(
|
|||
*/
|
||||
cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0);
|
||||
new_max = cur_max + rec_diff;
|
||||
new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max);
|
||||
new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max);
|
||||
ifp->if_broot = kmem_realloc(ifp->if_broot, new_size,
|
||||
(size_t)XFS_BMAP_BROOT_SPACE_CALC(cur_max), /* old size */
|
||||
XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max),
|
||||
KM_SLEEP | KM_NOFS);
|
||||
op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
|
||||
ifp->if_broot_bytes);
|
||||
|
@ -2061,7 +2061,7 @@ xfs_iroot_realloc(
|
|||
(int)new_size);
|
||||
ifp->if_broot_bytes = (int)new_size;
|
||||
ASSERT(ifp->if_broot_bytes <=
|
||||
XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ);
|
||||
XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip));
|
||||
memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t));
|
||||
return;
|
||||
}
|
||||
|
@ -2076,7 +2076,7 @@ xfs_iroot_realloc(
|
|||
new_max = cur_max + rec_diff;
|
||||
ASSERT(new_max >= 0);
|
||||
if (new_max > 0)
|
||||
new_size = (size_t)XFS_BMAP_BROOT_SPACE_CALC(new_max);
|
||||
new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max);
|
||||
else
|
||||
new_size = 0;
|
||||
if (new_size > 0) {
|
||||
|
@ -2084,7 +2084,8 @@ xfs_iroot_realloc(
|
|||
/*
|
||||
* First copy over the btree block header.
|
||||
*/
|
||||
memcpy(new_broot, ifp->if_broot, XFS_BTREE_LBLOCK_LEN);
|
||||
memcpy(new_broot, ifp->if_broot,
|
||||
XFS_BMBT_BLOCK_LEN(ip->i_mount));
|
||||
} else {
|
||||
new_broot = NULL;
|
||||
ifp->if_flags &= ~XFS_IFBROOT;
|
||||
|
@ -2114,7 +2115,7 @@ xfs_iroot_realloc(
|
|||
ifp->if_broot = new_broot;
|
||||
ifp->if_broot_bytes = (int)new_size;
|
||||
ASSERT(ifp->if_broot_bytes <=
|
||||
XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ);
|
||||
XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2427,7 +2428,7 @@ xfs_iflush_fork(
|
|||
ASSERT(ifp->if_broot != NULL);
|
||||
ASSERT(ifp->if_broot_bytes <=
|
||||
(XFS_IFORK_SIZE(ip, whichfork) +
|
||||
XFS_BROOT_SIZE_ADJ));
|
||||
XFS_BROOT_SIZE_ADJ(ip)));
|
||||
xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes,
|
||||
(xfs_bmdr_block_t *)cp,
|
||||
XFS_DFORK_SIZE(dip, mp, whichfork));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue