diff options
Diffstat (limited to 'fs/xfs/scrub/common.c')
| -rw-r--r-- | fs/xfs/scrub/common.c | 35 | 
1 files changed, 33 insertions, 2 deletions
diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c index de24532fe083..81f2b96bb5a7 100644 --- a/fs/xfs/scrub/common.c +++ b/fs/xfs/scrub/common.c @@ -25,6 +25,7 @@  #include "xfs_trans_priv.h"  #include "xfs_da_format.h"  #include "xfs_da_btree.h" +#include "xfs_dir2_priv.h"  #include "xfs_attr.h"  #include "xfs_reflink.h"  #include "xfs_ag.h" @@ -604,6 +605,7 @@ xchk_ag_free(  	struct xchk_ag		*sa)  {  	xchk_ag_btcur_free(sa); +	xrep_reset_perag_resv(sc);  	if (sa->agf_bp) {  		xfs_trans_brelse(sc->tp, sa->agf_bp);  		sa->agf_bp = NULL; @@ -733,6 +735,8 @@ xchk_iget(  	xfs_ino_t		inum,  	struct xfs_inode	**ipp)  { +	ASSERT(sc->tp != NULL); +  	return xfs_iget(sc->mp, sc->tp, inum, XFS_IGET_UNTRUSTED, 0, ipp);  } @@ -816,6 +820,26 @@ again:  	return 0;  } +#ifdef CONFIG_XFS_QUOTA +/* + * Try to attach dquots to this inode if we think we might want to repair it. + * Callers must not hold any ILOCKs.  If the dquots are broken and cannot be + * attached, a quotacheck will be scheduled. + */ +int +xchk_ino_dqattach( +	struct xfs_scrub	*sc) +{ +	ASSERT(sc->tp != NULL); +	ASSERT(sc->ip != NULL); + +	if (!xchk_could_repair(sc)) +		return 0; + +	return xrep_ino_dqattach(sc); +} +#endif +  /* Install an inode that we opened by handle for scrubbing. */  int  xchk_install_handle_inode( @@ -882,8 +906,8 @@ xchk_iget_for_scrubbing(  	if (!xfs_verify_ino(sc->mp, sc->sm->sm_ino))  		return -ENOENT; -	/* Try a regular untrusted iget. */ -	error = xchk_iget(sc, sc->sm->sm_ino, &ip); +	/* Try a safe untrusted iget. */ +	error = xchk_iget_safe(sc, sc->sm->sm_ino, &ip);  	if (!error)  		return xchk_install_handle_inode(sc, ip);  	if (error == -ENOENT) @@ -1027,6 +1051,11 @@ xchk_setup_inode_contents(  	error = xchk_trans_alloc(sc, resblks);  	if (error)  		goto out; + +	error = xchk_ino_dqattach(sc); +	if (error) +		goto out; +  	xchk_ilock(sc, XFS_ILOCK_EXCL);  out:  	/* scrub teardown will unlock and release the inode for us */ @@ -1132,6 +1161,7 @@ xchk_metadata_inode_subtype(  	unsigned int		scrub_type)  {  	__u32			smtype = sc->sm->sm_type; +	unsigned int		sick_mask = sc->sick_mask;  	int			error;  	sc->sm->sm_type = scrub_type; @@ -1149,6 +1179,7 @@ xchk_metadata_inode_subtype(  		break;  	} +	sc->sick_mask = sick_mask;  	sc->sm->sm_type = smtype;  	return error;  }  |