xfs: use dontcache for grabbing inodes during scrub
[linux-2.6-block.git] / fs / xfs / scrub / common.c
index abff79a77c72b632649f40efdba51e3fcd3498de..1ad8ec63a7f443e313a3a8a06390fa356285a916 100644 (file)
@@ -31,6 +31,8 @@
 #include "xfs_ag.h"
 #include "xfs_error.h"
 #include "xfs_quota.h"
+#include "xfs_exchmaps.h"
+#include "xfs_rtbitmap.h"
 #include "scrub/scrub.h"
 #include "scrub/common.h"
 #include "scrub/trace.h"
@@ -445,7 +447,7 @@ xchk_perag_read_headers(
 {
        int                     error;
 
-       error = xfs_ialloc_read_agi(sa->pag, sc->tp, &sa->agi_bp);
+       error = xfs_ialloc_read_agi(sa->pag, sc->tp, 0, &sa->agi_bp);
        if (error && want_ag_read_header_failure(sc, XFS_SCRUB_TYPE_AGI))
                return error;
 
@@ -781,7 +783,7 @@ xchk_iget(
 {
        ASSERT(sc->tp != NULL);
 
-       return xfs_iget(sc->mp, sc->tp, inum, XFS_IGET_UNTRUSTED, 0, ipp);
+       return xfs_iget(sc->mp, sc->tp, inum, XCHK_IGET_FLAGS, 0, ipp);
 }
 
 /*
@@ -827,13 +829,13 @@ again:
         * in the iget cache miss path.
         */
        pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum));
-       error = xfs_ialloc_read_agi(pag, tp, agi_bpp);
+       error = xfs_ialloc_read_agi(pag, tp, 0, agi_bpp);
        xfs_perag_put(pag);
        if (error)
                return error;
 
-       error = xfs_iget(mp, tp, inum,
-                       XFS_IGET_NORETRY | XFS_IGET_UNTRUSTED, 0, ipp);
+       error = xfs_iget(mp, tp, inum, XFS_IGET_NORETRY | XCHK_IGET_FLAGS, 0,
+                       ipp);
        if (error == -EAGAIN) {
                /*
                 * The inode may be in core but temporarily unavailable and may
@@ -1044,9 +1046,7 @@ xchk_irele(
        struct xfs_scrub        *sc,
        struct xfs_inode        *ip)
 {
-       if (current->journal_info != NULL) {
-               ASSERT(current->journal_info == sc->tp);
-
+       if (sc->tp) {
                /*
                 * If we are in a transaction, we /cannot/ drop the inode
                 * ourselves, because the VFS will trigger writeback, which
@@ -1062,12 +1062,6 @@ xchk_irele(
                spin_lock(&VFS_I(ip)->i_lock);
                VFS_I(ip)->i_state &= ~I_DONTCACHE;
                spin_unlock(&VFS_I(ip)->i_lock);
-       } else if (atomic_read(&VFS_I(ip)->i_count) == 1) {
-               /*
-                * If this is the last reference to the inode and the caller
-                * permits it, set DONTCACHE to avoid thrashing.
-                */
-               d_mark_dontcache(VFS_I(ip));
        }
 
        xfs_irele(ip);
@@ -1204,27 +1198,12 @@ xchk_metadata_inode_subtype(
        struct xfs_scrub        *sc,
        unsigned int            scrub_type)
 {
-       __u32                   smtype = sc->sm->sm_type;
-       unsigned int            sick_mask = sc->sick_mask;
+       struct xfs_scrub_subord *sub;
        int                     error;
 
-       sc->sm->sm_type = scrub_type;
-
-       switch (scrub_type) {
-       case XFS_SCRUB_TYPE_INODE:
-               error = xchk_inode(sc);
-               break;
-       case XFS_SCRUB_TYPE_BMBTD:
-               error = xchk_bmap_data(sc);
-               break;
-       default:
-               ASSERT(0);
-               error = -EFSCORRUPTED;
-               break;
-       }
-
-       sc->sick_mask = sick_mask;
-       sc->sm->sm_type = smtype;
+       sub = xchk_scrub_create_subord(sc, scrub_type);
+       error = sub->sc.ops->scrub(&sub->sc);
+       xchk_scrub_free_subord(sub);
        return error;
 }