mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
Merge branch 'xfs-misc-fixes-4.6-3' into for-next
This commit is contained in:
commit
ab9d1e4f7b
@ -477,10 +477,7 @@ xfs_bmap_check_leaf_extents(
|
||||
}
|
||||
block = XFS_BUF_TO_BLOCK(bp);
|
||||
}
|
||||
if (bp_release) {
|
||||
bp_release = 0;
|
||||
xfs_trans_brelse(NULL, bp);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
error0:
|
||||
|
@ -2403,8 +2403,8 @@ xfs_ialloc_compute_maxlevels(
|
||||
|
||||
maxleafents = (1LL << XFS_INO_AGINO_BITS(mp)) >>
|
||||
XFS_INODES_PER_CHUNK_LOG;
|
||||
minleafrecs = mp->m_alloc_mnr[0];
|
||||
minnoderecs = mp->m_alloc_mnr[1];
|
||||
minleafrecs = mp->m_inobt_mnr[0];
|
||||
minnoderecs = mp->m_inobt_mnr[1];
|
||||
maxblocks = (maxleafents + minleafrecs - 1) / minleafrecs;
|
||||
for (level = 1; maxblocks > 1; level++)
|
||||
maxblocks = (maxblocks + minnoderecs - 1) / minnoderecs;
|
||||
|
132
fs/xfs/xfs_log.c
132
fs/xfs/xfs_log.c
@ -2008,77 +2008,81 @@ xlog_print_tic_res(
|
||||
uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t);
|
||||
|
||||
/* match with XLOG_REG_TYPE_* in xfs_log.h */
|
||||
static char *res_type_str[XLOG_REG_TYPE_MAX] = {
|
||||
"bformat",
|
||||
"bchunk",
|
||||
"efi_format",
|
||||
"efd_format",
|
||||
"iformat",
|
||||
"icore",
|
||||
"iext",
|
||||
"ibroot",
|
||||
"ilocal",
|
||||
"iattr_ext",
|
||||
"iattr_broot",
|
||||
"iattr_local",
|
||||
"qformat",
|
||||
"dquot",
|
||||
"quotaoff",
|
||||
"LR header",
|
||||
"unmount",
|
||||
"commit",
|
||||
"trans header"
|
||||
#define REG_TYPE_STR(type, str) [XLOG_REG_TYPE_##type] = str
|
||||
static char *res_type_str[XLOG_REG_TYPE_MAX + 1] = {
|
||||
REG_TYPE_STR(BFORMAT, "bformat"),
|
||||
REG_TYPE_STR(BCHUNK, "bchunk"),
|
||||
REG_TYPE_STR(EFI_FORMAT, "efi_format"),
|
||||
REG_TYPE_STR(EFD_FORMAT, "efd_format"),
|
||||
REG_TYPE_STR(IFORMAT, "iformat"),
|
||||
REG_TYPE_STR(ICORE, "icore"),
|
||||
REG_TYPE_STR(IEXT, "iext"),
|
||||
REG_TYPE_STR(IBROOT, "ibroot"),
|
||||
REG_TYPE_STR(ILOCAL, "ilocal"),
|
||||
REG_TYPE_STR(IATTR_EXT, "iattr_ext"),
|
||||
REG_TYPE_STR(IATTR_BROOT, "iattr_broot"),
|
||||
REG_TYPE_STR(IATTR_LOCAL, "iattr_local"),
|
||||
REG_TYPE_STR(QFORMAT, "qformat"),
|
||||
REG_TYPE_STR(DQUOT, "dquot"),
|
||||
REG_TYPE_STR(QUOTAOFF, "quotaoff"),
|
||||
REG_TYPE_STR(LRHEADER, "LR header"),
|
||||
REG_TYPE_STR(UNMOUNT, "unmount"),
|
||||
REG_TYPE_STR(COMMIT, "commit"),
|
||||
REG_TYPE_STR(TRANSHDR, "trans header"),
|
||||
REG_TYPE_STR(ICREATE, "inode create")
|
||||
};
|
||||
#undef REG_TYPE_STR
|
||||
#define TRANS_TYPE_STR(type) [XFS_TRANS_##type] = #type
|
||||
static char *trans_type_str[XFS_TRANS_TYPE_MAX] = {
|
||||
"SETATTR_NOT_SIZE",
|
||||
"SETATTR_SIZE",
|
||||
"INACTIVE",
|
||||
"CREATE",
|
||||
"CREATE_TRUNC",
|
||||
"TRUNCATE_FILE",
|
||||
"REMOVE",
|
||||
"LINK",
|
||||
"RENAME",
|
||||
"MKDIR",
|
||||
"RMDIR",
|
||||
"SYMLINK",
|
||||
"SET_DMATTRS",
|
||||
"GROWFS",
|
||||
"STRAT_WRITE",
|
||||
"DIOSTRAT",
|
||||
"WRITE_SYNC",
|
||||
"WRITEID",
|
||||
"ADDAFORK",
|
||||
"ATTRINVAL",
|
||||
"ATRUNCATE",
|
||||
"ATTR_SET",
|
||||
"ATTR_RM",
|
||||
"ATTR_FLAG",
|
||||
"CLEAR_AGI_BUCKET",
|
||||
"QM_SBCHANGE",
|
||||
"DUMMY1",
|
||||
"DUMMY2",
|
||||
"QM_QUOTAOFF",
|
||||
"QM_DQALLOC",
|
||||
"QM_SETQLIM",
|
||||
"QM_DQCLUSTER",
|
||||
"QM_QINOCREATE",
|
||||
"QM_QUOTAOFF_END",
|
||||
"FSYNC_TS",
|
||||
"GROWFSRT_ALLOC",
|
||||
"GROWFSRT_ZERO",
|
||||
"GROWFSRT_FREE",
|
||||
"SWAPEXT",
|
||||
"CHECKPOINT",
|
||||
"ICREATE",
|
||||
"CREATE_TMPFILE"
|
||||
TRANS_TYPE_STR(SETATTR_NOT_SIZE),
|
||||
TRANS_TYPE_STR(SETATTR_SIZE),
|
||||
TRANS_TYPE_STR(INACTIVE),
|
||||
TRANS_TYPE_STR(CREATE),
|
||||
TRANS_TYPE_STR(CREATE_TRUNC),
|
||||
TRANS_TYPE_STR(TRUNCATE_FILE),
|
||||
TRANS_TYPE_STR(REMOVE),
|
||||
TRANS_TYPE_STR(LINK),
|
||||
TRANS_TYPE_STR(RENAME),
|
||||
TRANS_TYPE_STR(MKDIR),
|
||||
TRANS_TYPE_STR(RMDIR),
|
||||
TRANS_TYPE_STR(SYMLINK),
|
||||
TRANS_TYPE_STR(SET_DMATTRS),
|
||||
TRANS_TYPE_STR(GROWFS),
|
||||
TRANS_TYPE_STR(STRAT_WRITE),
|
||||
TRANS_TYPE_STR(DIOSTRAT),
|
||||
TRANS_TYPE_STR(WRITEID),
|
||||
TRANS_TYPE_STR(ADDAFORK),
|
||||
TRANS_TYPE_STR(ATTRINVAL),
|
||||
TRANS_TYPE_STR(ATRUNCATE),
|
||||
TRANS_TYPE_STR(ATTR_SET),
|
||||
TRANS_TYPE_STR(ATTR_RM),
|
||||
TRANS_TYPE_STR(ATTR_FLAG),
|
||||
TRANS_TYPE_STR(CLEAR_AGI_BUCKET),
|
||||
TRANS_TYPE_STR(SB_CHANGE),
|
||||
TRANS_TYPE_STR(DUMMY1),
|
||||
TRANS_TYPE_STR(DUMMY2),
|
||||
TRANS_TYPE_STR(QM_QUOTAOFF),
|
||||
TRANS_TYPE_STR(QM_DQALLOC),
|
||||
TRANS_TYPE_STR(QM_SETQLIM),
|
||||
TRANS_TYPE_STR(QM_DQCLUSTER),
|
||||
TRANS_TYPE_STR(QM_QINOCREATE),
|
||||
TRANS_TYPE_STR(QM_QUOTAOFF_END),
|
||||
TRANS_TYPE_STR(FSYNC_TS),
|
||||
TRANS_TYPE_STR(GROWFSRT_ALLOC),
|
||||
TRANS_TYPE_STR(GROWFSRT_ZERO),
|
||||
TRANS_TYPE_STR(GROWFSRT_FREE),
|
||||
TRANS_TYPE_STR(SWAPEXT),
|
||||
TRANS_TYPE_STR(CHECKPOINT),
|
||||
TRANS_TYPE_STR(ICREATE),
|
||||
TRANS_TYPE_STR(CREATE_TMPFILE)
|
||||
};
|
||||
#undef TRANS_TYPE_STR
|
||||
|
||||
xfs_warn(mp, "xlog_write: reservation summary:");
|
||||
xfs_warn(mp, " trans type = %s (%u)",
|
||||
((ticket->t_trans_type <= 0 ||
|
||||
ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ?
|
||||
"bad-trans-type" : trans_type_str[ticket->t_trans_type-1]),
|
||||
"bad-trans-type" : trans_type_str[ticket->t_trans_type]),
|
||||
ticket->t_trans_type);
|
||||
xfs_warn(mp, " unit res = %d bytes",
|
||||
ticket->t_unit_res);
|
||||
@ -2097,7 +2101,7 @@ xlog_print_tic_res(
|
||||
uint r_type = ticket->t_res_arr[i].r_type;
|
||||
xfs_warn(mp, "region[%u]: %s - %u bytes", i,
|
||||
((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ?
|
||||
"bad-rtype" : res_type_str[r_type-1]),
|
||||
"bad-rtype" : res_type_str[r_type]),
|
||||
ticket->t_res_arr[i].r_len);
|
||||
}
|
||||
|
||||
|
@ -4963,6 +4963,7 @@ xlog_do_recover(
|
||||
xfs_daddr_t head_blk,
|
||||
xfs_daddr_t tail_blk)
|
||||
{
|
||||
struct xfs_mount *mp = log->l_mp;
|
||||
int error;
|
||||
xfs_buf_t *bp;
|
||||
xfs_sb_t *sbp;
|
||||
@ -4977,7 +4978,7 @@ xlog_do_recover(
|
||||
/*
|
||||
* If IO errors happened during recovery, bail out.
|
||||
*/
|
||||
if (XFS_FORCED_SHUTDOWN(log->l_mp)) {
|
||||
if (XFS_FORCED_SHUTDOWN(mp)) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -4990,13 +4991,13 @@ xlog_do_recover(
|
||||
* or iunlinks they will have some entries in the AIL; so we look at
|
||||
* the AIL to determine how to set the tail_lsn.
|
||||
*/
|
||||
xlog_assign_tail_lsn(log->l_mp);
|
||||
xlog_assign_tail_lsn(mp);
|
||||
|
||||
/*
|
||||
* Now that we've finished replaying all buffer and inode
|
||||
* updates, re-read in the superblock and reverify it.
|
||||
*/
|
||||
bp = xfs_getsb(log->l_mp, 0);
|
||||
bp = xfs_getsb(mp, 0);
|
||||
bp->b_flags &= ~(XBF_DONE | XBF_ASYNC);
|
||||
ASSERT(!(bp->b_flags & XBF_WRITE));
|
||||
bp->b_flags |= XBF_READ;
|
||||
@ -5004,7 +5005,7 @@ xlog_do_recover(
|
||||
|
||||
error = xfs_buf_submit_wait(bp);
|
||||
if (error) {
|
||||
if (!XFS_FORCED_SHUTDOWN(log->l_mp)) {
|
||||
if (!XFS_FORCED_SHUTDOWN(mp)) {
|
||||
xfs_buf_ioerror_alert(bp, __func__);
|
||||
ASSERT(0);
|
||||
}
|
||||
@ -5013,14 +5014,17 @@ xlog_do_recover(
|
||||
}
|
||||
|
||||
/* Convert superblock from on-disk format */
|
||||
sbp = &log->l_mp->m_sb;
|
||||
sbp = &mp->m_sb;
|
||||
xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp));
|
||||
ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC);
|
||||
ASSERT(xfs_sb_good_version(sbp));
|
||||
xfs_reinit_percpu_counters(log->l_mp);
|
||||
|
||||
xfs_buf_relse(bp);
|
||||
|
||||
/* re-initialise in-core superblock and geometry structures */
|
||||
xfs_reinit_percpu_counters(mp);
|
||||
error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi);
|
||||
if (error) {
|
||||
xfs_warn(mp, "Failed post-recovery per-ag init: %d", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
xlog_recover_check_summary(log);
|
||||
|
||||
|
117
fs/xfs/xfs_ondisk.h
Normal file
117
fs/xfs/xfs_ondisk.h
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Oracle.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it would be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#ifndef __XFS_ONDISK_H
|
||||
#define __XFS_ONDISK_H
|
||||
|
||||
#define XFS_CHECK_STRUCT_SIZE(structname, size) \
|
||||
BUILD_BUG_ON_MSG(sizeof(structname) != (size), "XFS: sizeof(" \
|
||||
#structname ") is wrong, expected " #size)
|
||||
|
||||
static inline void __init
|
||||
xfs_check_ondisk_structs(void)
|
||||
{
|
||||
/* ag/file structures */
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_acl, 4);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_acl_entry, 12);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_agf, 224);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_agfl, 36);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_agi, 336);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block, 4);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block, 72);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dinode, 176);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot, 104);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk, 136);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dsb, 264);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr, 56);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key, 4);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t, 4);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t, 4);
|
||||
|
||||
/* dir/attr trees */
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr, 80);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leafblock, 88);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_rmt_hdr, 56);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_da3_blkinfo, 56);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_da3_intnode, 64);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_da3_node_hdr, 64);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_blk_hdr, 48);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_data_hdr, 64);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free, 64);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free_hdr, 64);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf, 64);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf_hdr, 64);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_entry_t, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_hdr_t, 32);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t, 4);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t, 4);
|
||||
|
||||
/*
|
||||
* m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to
|
||||
* 4 bytes anyway so it's not obviously a problem. Hence for the moment
|
||||
* we don't check this structure. This can be re-instated when the attr
|
||||
* definitions are updated to use c99 VLA definitions.
|
||||
*
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12);
|
||||
*/
|
||||
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 40);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_attr_shortform_t, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t, 4);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_unused_t, 6);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino4_t, 4);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_ino8_t, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_inou_t, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_entry_t, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_hdr_t, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t, 4);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t, 3);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10);
|
||||
XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t, 2);
|
||||
|
||||
/* log structures */
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat, 24);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32, 28);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64, 32);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32, 28);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64, 32);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32, 12);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64, 16);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_log_dinode, 176);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log, 28);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_ictimestamp, 8);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32, 52);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_64, 56);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat, 20);
|
||||
XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header, 16);
|
||||
}
|
||||
|
||||
#endif /* __XFS_ONDISK_H */
|
@ -45,6 +45,7 @@
|
||||
#include "xfs_filestream.h"
|
||||
#include "xfs_quota.h"
|
||||
#include "xfs_sysfs.h"
|
||||
#include "xfs_ondisk.h"
|
||||
|
||||
#include <linux/namei.h>
|
||||
#include <linux/init.h>
|
||||
@ -1858,6 +1859,8 @@ init_xfs_fs(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
xfs_check_ondisk_structs();
|
||||
|
||||
printk(KERN_INFO XFS_VERSION_STRING " with "
|
||||
XFS_BUILD_OPTIONS " enabled\n");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user