* [PATCH 0/4] xfs: scrub tweaks
@ 2017-12-01 22:11 Eric Sandeen
2017-12-01 22:12 ` [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS Eric Sandeen
` (4 more replies)
0 siblings, 5 replies; 16+ messages in thread
From: Eric Sandeen @ 2017-12-01 22:11 UTC (permalink / raw)
To: linux-xfs
A handful of random stuff.
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS
2017-12-01 22:11 [PATCH 0/4] xfs: scrub tweaks Eric Sandeen
@ 2017-12-01 22:12 ` Eric Sandeen
2017-12-01 22:29 ` Darrick J. Wong
2017-12-01 22:13 ` [PATCH 2/4] xfs: explicitly initialize meta_scrub_ops array by type Eric Sandeen
` (3 subsequent siblings)
4 siblings, 1 reply; 16+ messages in thread
From: Eric Sandeen @ 2017-12-01 22:12 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
Advertise this config option along with the others.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h
index fcc5dfc..8cee8e8 100644
--- a/fs/xfs/xfs_super.h
+++ b/fs/xfs/xfs_super.h
@@ -44,6 +44,12 @@
# define XFS_REALTIME_STRING
#endif
+#ifdef CONFIG_XFS_ONLINE_SCRUB
+# define XFS_SCRUB_STRING "scrub, "
+#else
+# define XFS_SCRUB_STRING
+#endif
+
#ifdef DEBUG
# define XFS_DBG_STRING "debug"
#else
@@ -54,6 +60,7 @@
#define XFS_BUILD_OPTIONS XFS_ACL_STRING \
XFS_SECURITY_STRING \
XFS_REALTIME_STRING \
+ XFS_SCRUB_STRING \
XFS_DBG_STRING /* DBG must be last */
struct xfs_inode;
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/4] xfs: explicitly initialize meta_scrub_ops array by type
2017-12-01 22:11 [PATCH 0/4] xfs: scrub tweaks Eric Sandeen
2017-12-01 22:12 ` [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS Eric Sandeen
@ 2017-12-01 22:13 ` Eric Sandeen
2017-12-01 22:26 ` Darrick J. Wong
2017-12-01 22:14 ` [PATCH 3/4] xfs: factor out scrub input checking Eric Sandeen
` (2 subsequent siblings)
4 siblings, 1 reply; 16+ messages in thread
From: Eric Sandeen @ 2017-12-01 22:13 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
An implicit mapping to type by order of initialization seems
error-prone, and doesn't lend itself to cscope-ing.
Also add sanity checks about size of array vs. max types,
and a defensive check that ->scrub exists before using it.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
index 9c42c4e..dc1f33a 100644
--- a/fs/xfs/scrub/scrub.c
+++ b/fs/xfs/scrub/scrub.c
@@ -168,104 +168,104 @@
/* Scrubbing dispatch. */
static const struct xfs_scrub_meta_ops meta_scrub_ops[] = {
- { /* ioctl presence test */
+ [XFS_SCRUB_TYPE_PROBE] = { /* ioctl presence test */
.setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_probe,
},
- { /* superblock */
+ [XFS_SCRUB_TYPE_SB] = { /* superblock */
.setup = xfs_scrub_setup_ag_header,
.scrub = xfs_scrub_superblock,
},
- { /* agf */
+ [XFS_SCRUB_TYPE_AGF] = { /* agf */
.setup = xfs_scrub_setup_ag_header,
.scrub = xfs_scrub_agf,
},
- { /* agfl */
+ [XFS_SCRUB_TYPE_AGFL]= { /* agfl */
.setup = xfs_scrub_setup_ag_header,
.scrub = xfs_scrub_agfl,
},
- { /* agi */
+ [XFS_SCRUB_TYPE_AGI] = { /* agi */
.setup = xfs_scrub_setup_ag_header,
.scrub = xfs_scrub_agi,
},
- { /* bnobt */
+ [XFS_SCRUB_TYPE_BNOBT] = { /* bnobt */
.setup = xfs_scrub_setup_ag_allocbt,
.scrub = xfs_scrub_bnobt,
},
- { /* cntbt */
+ [XFS_SCRUB_TYPE_CNTBT] = { /* cntbt */
.setup = xfs_scrub_setup_ag_allocbt,
.scrub = xfs_scrub_cntbt,
},
- { /* inobt */
+ [XFS_SCRUB_TYPE_INOBT] = { /* inobt */
.setup = xfs_scrub_setup_ag_iallocbt,
.scrub = xfs_scrub_inobt,
},
- { /* finobt */
+ [XFS_SCRUB_TYPE_FINOBT] = { /* finobt */
.setup = xfs_scrub_setup_ag_iallocbt,
.scrub = xfs_scrub_finobt,
.has = xfs_sb_version_hasfinobt,
},
- { /* rmapbt */
+ [XFS_SCRUB_TYPE_RMAPBT] = { /* rmapbt */
.setup = xfs_scrub_setup_ag_rmapbt,
.scrub = xfs_scrub_rmapbt,
.has = xfs_sb_version_hasrmapbt,
},
- { /* refcountbt */
+ [XFS_SCRUB_TYPE_REFCNTBT] = { /* refcountbt */
.setup = xfs_scrub_setup_ag_refcountbt,
.scrub = xfs_scrub_refcountbt,
.has = xfs_sb_version_hasreflink,
},
- { /* inode record */
+ [XFS_SCRUB_TYPE_INODE] = { /* inode record */
.setup = xfs_scrub_setup_inode,
.scrub = xfs_scrub_inode,
},
- { /* inode data fork */
+ [XFS_SCRUB_TYPE_BMBTD] = { /* inode data fork */
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_data,
},
- { /* inode attr fork */
+ [XFS_SCRUB_TYPE_BMBTA] = { /* inode attr fork */
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_attr,
},
- { /* inode CoW fork */
+ [XFS_SCRUB_TYPE_BMBTC] = { /* inode CoW fork */
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_cow,
},
- { /* directory */
+ [XFS_SCRUB_TYPE_DIR] = { /* directory */
.setup = xfs_scrub_setup_directory,
.scrub = xfs_scrub_directory,
},
- { /* extended attributes */
+ [XFS_SCRUB_TYPE_XATTR] = { /* extended attributes */
.setup = xfs_scrub_setup_xattr,
.scrub = xfs_scrub_xattr,
},
- { /* symbolic link */
+ [XFS_SCRUB_TYPE_SYMLINK] = { /* symbolic link */
.setup = xfs_scrub_setup_symlink,
.scrub = xfs_scrub_symlink,
},
- { /* parent pointers */
+ [XFS_SCRUB_TYPE_PARENT] = { /* parent pointers */
.setup = xfs_scrub_setup_parent,
.scrub = xfs_scrub_parent,
},
- { /* realtime bitmap */
+ [XFS_SCRUB_TYPE_RTBITMAP] = { /* realtime bitmap */
.setup = xfs_scrub_setup_rt,
.scrub = xfs_scrub_rtbitmap,
.has = xfs_sb_version_hasrealtime,
},
- { /* realtime summary */
+ [XFS_SCRUB_TYPE_RTSUM] = { /* realtime summary */
.setup = xfs_scrub_setup_rt,
.scrub = xfs_scrub_rtsummary,
.has = xfs_sb_version_hasrealtime,
},
- { /* user quota */
+ [XFS_SCRUB_TYPE_UQUOTA] = { /* user quota */
.setup = xfs_scrub_setup_quota,
.scrub = xfs_scrub_quota,
},
- { /* group quota */
+ [XFS_SCRUB_TYPE_GQUOTA] = { /* group quota */
.setup = xfs_scrub_setup_quota,
.scrub = xfs_scrub_quota,
},
- { /* project quota */
+ [XFS_SCRUB_TYPE_PQUOTA] = { /* project quota */
.setup = xfs_scrub_setup_quota,
.scrub = xfs_scrub_quota,
},
@@ -297,6 +297,9 @@
bool try_harder = false;
int error = 0;
+ BUILD_BUG_ON(sizeof(meta_scrub_ops) !=
+ (sizeof(struct xfs_scrub_meta_ops) * XFS_SCRUB_TYPE_NR));
+
trace_xfs_scrub_start(ip, sm, error);
/* Forbidden if we are shut down or mounted norecovery. */
@@ -320,7 +323,7 @@
if (sm->sm_type >= XFS_SCRUB_TYPE_NR)
goto out;
ops = &meta_scrub_ops[sm->sm_type];
- if (ops->scrub == NULL)
+ if (ops->setup == NULL || ops->scrub == NULL)
goto out;
/*
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/4] xfs: factor out scrub input checking
2017-12-01 22:11 [PATCH 0/4] xfs: scrub tweaks Eric Sandeen
2017-12-01 22:12 ` [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS Eric Sandeen
2017-12-01 22:13 ` [PATCH 2/4] xfs: explicitly initialize meta_scrub_ops array by type Eric Sandeen
@ 2017-12-01 22:14 ` Eric Sandeen
2017-12-01 22:25 ` Darrick J. Wong
2017-12-01 23:23 ` [PATCH v2 " Darrick J. Wong
2017-12-01 22:15 ` [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate Eric Sandeen
2017-12-01 22:39 ` [PATCH 0/4] xfs: scrub tweaks Darrick J. Wong
4 siblings, 2 replies; 16+ messages in thread
From: Eric Sandeen @ 2017-12-01 22:14 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
Do this before adding more core checks.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
index dc1f33a..16932f9 100644
--- a/fs/xfs/scrub/scrub.c
+++ b/fs/xfs/scrub/scrub.c
@@ -285,47 +285,34 @@
"EXPERIMENTAL online scrub feature in use. Use at your own risk!");
}
-/* Dispatch metadata scrubbing. */
-int
-xfs_scrub_metadata(
- struct xfs_inode *ip,
+static int
+xfs_scrub_validate(
+ struct xfs_mount *mp,
struct xfs_scrub_metadata *sm)
{
- struct xfs_scrub_context sc;
- struct xfs_mount *mp = ip->i_mount;
+ int error;
const struct xfs_scrub_meta_ops *ops;
- bool try_harder = false;
- int error = 0;
-
- BUILD_BUG_ON(sizeof(meta_scrub_ops) !=
- (sizeof(struct xfs_scrub_meta_ops) * XFS_SCRUB_TYPE_NR));
-
- trace_xfs_scrub_start(ip, sm, error);
-
- /* Forbidden if we are shut down or mounted norecovery. */
- error = -ESHUTDOWN;
- if (XFS_FORCED_SHUTDOWN(mp))
- goto out;
- error = -ENOTRECOVERABLE;
- if (mp->m_flags & XFS_MOUNT_NORECOVERY)
- goto out;
- /* Check our inputs. */
error = -EINVAL;
+ /* Check our inputs. */
sm->sm_flags &= ~XFS_SCRUB_FLAGS_OUT;
if (sm->sm_flags & ~XFS_SCRUB_FLAGS_IN)
goto out;
if (memchr_inv(sm->sm_reserved, 0, sizeof(sm->sm_reserved)))
goto out;
- /* Do we know about this type of metadata? */
error = -ENOENT;
+ /* Do we know about this type of metadata? */
if (sm->sm_type >= XFS_SCRUB_TYPE_NR)
goto out;
ops = &meta_scrub_ops[sm->sm_type];
if (ops->setup == NULL || ops->scrub == NULL)
goto out;
+ /* Does this fs even support this type of metadata? */
+ if (ops->has && !ops->has(&mp->m_sb))
+ goto out;
+ error = -EOPNOTSUPP;
/*
* We won't scrub any filesystem that doesn't have the ability
* to record unwritten extents. The option was made default in
@@ -335,20 +322,46 @@
* We also don't support v1-v3 filesystems, which aren't
* mountable.
*/
- error = -EOPNOTSUPP;
if (!xfs_sb_version_hasextflgbit(&mp->m_sb))
goto out;
- /* Does this fs even support this type of metadata? */
- error = -ENOENT;
- if (ops->has && !ops->has(&mp->m_sb))
- goto out;
-
/* We don't know how to repair anything yet. */
- error = -EOPNOTSUPP;
if (sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR)
goto out;
+ error = 0;
+out:
+ return error;
+}
+
+/* Dispatch metadata scrubbing. */
+int
+xfs_scrub_metadata(
+ struct xfs_inode *ip,
+ struct xfs_scrub_metadata *sm)
+{
+ struct xfs_scrub_context sc;
+ struct xfs_mount *mp = ip->i_mount;
+ bool try_harder = false;
+ int error = 0;
+
+ BUILD_BUG_ON(sizeof(meta_scrub_ops) !=
+ (sizeof(struct xfs_scrub_meta_ops) * XFS_SCRUB_TYPE_NR));
+
+ trace_xfs_scrub_start(ip, sm, error);
+
+ /* Forbidden if we are shut down or mounted norecovery. */
+ error = -ESHUTDOWN;
+ if (XFS_FORCED_SHUTDOWN(mp))
+ goto out;
+ error = -ENOTRECOVERABLE;
+ if (mp->m_flags & XFS_MOUNT_NORECOVERY)
+ goto out;
+
+ error = xfs_scrub_validate(mp, sm);
+ if (error)
+ goto out;
+
xfs_scrub_experimental_warning(mp);
retry_op:
@@ -356,7 +369,7 @@
memset(&sc, 0, sizeof(sc));
sc.mp = ip->i_mount;
sc.sm = sm;
- sc.ops = ops;
+ sc.ops = &meta_scrub_ops[sm->sm_type];
sc.try_harder = try_harder;
sc.sa.agno = NULLAGNUMBER;
error = sc.ops->setup(&sc, ip);
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate
2017-12-01 22:11 [PATCH 0/4] xfs: scrub tweaks Eric Sandeen
` (2 preceding siblings ...)
2017-12-01 22:14 ` [PATCH 3/4] xfs: factor out scrub input checking Eric Sandeen
@ 2017-12-01 22:15 ` Eric Sandeen
2017-12-01 22:24 ` Darrick J. Wong
` (2 more replies)
2017-12-01 22:39 ` [PATCH 0/4] xfs: scrub tweaks Darrick J. Wong
4 siblings, 3 replies; 16+ messages in thread
From: Eric Sandeen @ 2017-12-01 22:15 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
There were ad-hoc checks for some scrub types but not others;
mark each scrub type with ... it's type, and use that to validate
the allowed and/or required input fields.
Moving these checks out of xfs_scrub_setup_ag_header makes it
a thin wrapper, so unwrap it in the process.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
enum scrub_type should probably go somewhere shared ...?
diff --git a/fs/xfs/scrub/agheader.c b/fs/xfs/scrub/agheader.c
index 2a9b4f9..b599358 100644
--- a/fs/xfs/scrub/agheader.c
+++ b/fs/xfs/scrub/agheader.c
@@ -37,23 +37,6 @@
#include "scrub/common.h"
#include "scrub/trace.h"
-/*
- * Set up scrub to check all the static metadata in each AG.
- * This means the SB, AGF, AGI, and AGFL headers.
- */
-int
-xfs_scrub_setup_ag_header(
- struct xfs_scrub_context *sc,
- struct xfs_inode *ip)
-{
- struct xfs_mount *mp = sc->mp;
-
- if (sc->sm->sm_agno >= mp->m_sb.sb_agcount ||
- sc->sm->sm_ino || sc->sm->sm_gen)
- return -EINVAL;
- return xfs_scrub_setup_fs(sc, ip);
-}
-
/* Walk all the blocks in the AGFL. */
int
xfs_scrub_walk_agfl(
diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c
index ac95fe9..98452ad 100644
--- a/fs/xfs/scrub/common.c
+++ b/fs/xfs/scrub/common.c
@@ -472,7 +472,7 @@
return error;
}
- error = xfs_scrub_setup_ag_header(sc, ip);
+ error = xfs_scrub_setup_fs(sc, ip);
if (error)
return error;
@@ -507,14 +507,6 @@
struct xfs_inode *ip = NULL;
int error;
- /*
- * If userspace passed us an AG number or a generation number
- * without an inode number, they haven't got a clue so bail out
- * immediately.
- */
- if (sc->sm->sm_agno || (sc->sm->sm_gen && !sc->sm->sm_ino))
- return -EINVAL;
-
/* We want to scan the inode we already had opened. */
if (sc->sm->sm_ino == 0 || sc->sm->sm_ino == ip_in->i_ino) {
sc->ip = ip_in;
diff --git a/fs/xfs/scrub/common.h b/fs/xfs/scrub/common.h
index 5c04385..fe12053 100644
--- a/fs/xfs/scrub/common.h
+++ b/fs/xfs/scrub/common.h
@@ -78,8 +78,6 @@ void xfs_scrub_fblock_set_warning(struct xfs_scrub_context *sc, int whichfork,
/* Setup functions */
int xfs_scrub_setup_fs(struct xfs_scrub_context *sc, struct xfs_inode *ip);
-int xfs_scrub_setup_ag_header(struct xfs_scrub_context *sc,
- struct xfs_inode *ip);
int xfs_scrub_setup_ag_allocbt(struct xfs_scrub_context *sc,
struct xfs_inode *ip);
int xfs_scrub_setup_ag_iallocbt(struct xfs_scrub_context *sc,
diff --git a/fs/xfs/scrub/quota.c b/fs/xfs/scrub/quota.c
index 2eac160..4587853 100644
--- a/fs/xfs/scrub/quota.c
+++ b/fs/xfs/scrub/quota.c
@@ -67,13 +67,6 @@
{
uint dqtype;
- /*
- * If userspace gave us an AG number or inode data, they don't
- * know what they're doing. Get out.
- */
- if (sc->sm->sm_agno || sc->sm->sm_ino || sc->sm->sm_gen)
- return -EINVAL;
-
dqtype = xfs_scrub_quota_to_dqtype(sc);
if (dqtype == 0)
return -EINVAL;
diff --git a/fs/xfs/scrub/rtbitmap.c b/fs/xfs/scrub/rtbitmap.c
index c6fedb6..6860d5d 100644
--- a/fs/xfs/scrub/rtbitmap.c
+++ b/fs/xfs/scrub/rtbitmap.c
@@ -43,22 +43,14 @@
struct xfs_scrub_context *sc,
struct xfs_inode *ip)
{
- struct xfs_mount *mp = sc->mp;
- int error = 0;
-
- /*
- * If userspace gave us an AG number or inode data, they don't
- * know what they're doing. Get out.
- */
- if (sc->sm->sm_agno || sc->sm->sm_ino || sc->sm->sm_gen)
- return -EINVAL;
+ int error;
error = xfs_scrub_setup_fs(sc, ip);
if (error)
return error;
sc->ilock_flags = XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP;
- sc->ip = mp->m_rbmip;
+ sc->ip = sc->mp->m_rbmip;
xfs_ilock(sc->ip, sc->ilock_flags);
return 0;
diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
index 16932f9..6899126 100644
--- a/fs/xfs/scrub/scrub.c
+++ b/fs/xfs/scrub/scrub.c
@@ -129,8 +129,6 @@
{
int error = 0;
- if (sc->sm->sm_ino || sc->sm->sm_agno)
- return -EINVAL;
if (xfs_scrub_should_terminate(sc, &error))
return error;
@@ -169,105 +167,129 @@
static const struct xfs_scrub_meta_ops meta_scrub_ops[] = {
[XFS_SCRUB_TYPE_PROBE] = { /* ioctl presence test */
+ .type = ST_NONE,
.setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_probe,
},
[XFS_SCRUB_TYPE_SB] = { /* superblock */
- .setup = xfs_scrub_setup_ag_header,
+ .type = ST_PERAG,
+ .setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_superblock,
},
[XFS_SCRUB_TYPE_AGF] = { /* agf */
- .setup = xfs_scrub_setup_ag_header,
+ .type = ST_PERAG,
+ .setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_agf,
},
[XFS_SCRUB_TYPE_AGFL]= { /* agfl */
- .setup = xfs_scrub_setup_ag_header,
+ .type = ST_PERAG,
+ .setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_agfl,
},
[XFS_SCRUB_TYPE_AGI] = { /* agi */
- .setup = xfs_scrub_setup_ag_header,
+ .type = ST_PERAG,
+ .setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_agi,
},
[XFS_SCRUB_TYPE_BNOBT] = { /* bnobt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_allocbt,
.scrub = xfs_scrub_bnobt,
},
[XFS_SCRUB_TYPE_CNTBT] = { /* cntbt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_allocbt,
.scrub = xfs_scrub_cntbt,
},
[XFS_SCRUB_TYPE_INOBT] = { /* inobt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_iallocbt,
.scrub = xfs_scrub_inobt,
},
[XFS_SCRUB_TYPE_FINOBT] = { /* finobt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_iallocbt,
.scrub = xfs_scrub_finobt,
.has = xfs_sb_version_hasfinobt,
},
[XFS_SCRUB_TYPE_RMAPBT] = { /* rmapbt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_rmapbt,
.scrub = xfs_scrub_rmapbt,
.has = xfs_sb_version_hasrmapbt,
},
[XFS_SCRUB_TYPE_REFCNTBT] = { /* refcountbt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_refcountbt,
.scrub = xfs_scrub_refcountbt,
.has = xfs_sb_version_hasreflink,
},
[XFS_SCRUB_TYPE_INODE] = { /* inode record */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_inode,
.scrub = xfs_scrub_inode,
},
[XFS_SCRUB_TYPE_BMBTD] = { /* inode data fork */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_data,
},
[XFS_SCRUB_TYPE_BMBTA] = { /* inode attr fork */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_attr,
},
[XFS_SCRUB_TYPE_BMBTC] = { /* inode CoW fork */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_cow,
},
[XFS_SCRUB_TYPE_DIR] = { /* directory */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_directory,
.scrub = xfs_scrub_directory,
},
[XFS_SCRUB_TYPE_XATTR] = { /* extended attributes */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_xattr,
.scrub = xfs_scrub_xattr,
},
[XFS_SCRUB_TYPE_SYMLINK] = { /* symbolic link */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_symlink,
.scrub = xfs_scrub_symlink,
},
[XFS_SCRUB_TYPE_PARENT] = { /* parent pointers */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_parent,
.scrub = xfs_scrub_parent,
},
[XFS_SCRUB_TYPE_RTBITMAP] = { /* realtime bitmap */
+ .type = ST_FS,
.setup = xfs_scrub_setup_rt,
.scrub = xfs_scrub_rtbitmap,
.has = xfs_sb_version_hasrealtime,
},
[XFS_SCRUB_TYPE_RTSUM] = { /* realtime summary */
+ .type = ST_FS,
.setup = xfs_scrub_setup_rt,
.scrub = xfs_scrub_rtsummary,
.has = xfs_sb_version_hasrealtime,
},
[XFS_SCRUB_TYPE_UQUOTA] = { /* user quota */
- .setup = xfs_scrub_setup_quota,
- .scrub = xfs_scrub_quota,
+ .type = ST_FS,
+ .setup = xfs_scrub_setup_quota,
+ .scrub = xfs_scrub_quota,
},
[XFS_SCRUB_TYPE_GQUOTA] = { /* group quota */
- .setup = xfs_scrub_setup_quota,
- .scrub = xfs_scrub_quota,
+ .type = ST_FS,
+ .setup = xfs_scrub_setup_quota,
+ .scrub = xfs_scrub_quota,
},
[XFS_SCRUB_TYPE_PQUOTA] = { /* project quota */
- .setup = xfs_scrub_setup_quota,
- .scrub = xfs_scrub_quota,
+ .type = ST_FS,
+ .setup = xfs_scrub_setup_quota,
+ .scrub = xfs_scrub_quota,
},
};
@@ -298,14 +320,35 @@
sm->sm_flags &= ~XFS_SCRUB_FLAGS_OUT;
if (sm->sm_flags & ~XFS_SCRUB_FLAGS_IN)
goto out;
+ /* sm_reserved[] must be zero */
if (memchr_inv(sm->sm_reserved, 0, sizeof(sm->sm_reserved)))
goto out;
+ ops = &meta_scrub_ops[sm->sm_type];
+ /* restricting fields must be appropriate for type */
+ switch (ops->type) {
+ case ST_NONE:
+ case ST_FS:
+ if (sm->sm_ino || sm->sm_gen || sm->sm_agno)
+ goto out;
+ break;
+ case ST_PERAG:
+ if (sm->sm_ino || sm->sm_gen ||
+ sm->sm_agno >= mp->m_sb.sb_agcount)
+ goto out;
+ break;
+ case ST_INODE:
+ if (sm->sm_agno || (sm->sm_gen && !sm->sm_ino))
+ goto out;
+ break;
+ default:
+ goto out;
+ }
+
error = -ENOENT;
/* Do we know about this type of metadata? */
if (sm->sm_type >= XFS_SCRUB_TYPE_NR)
goto out;
- ops = &meta_scrub_ops[sm->sm_type];
if (ops->setup == NULL || ops->scrub == NULL)
goto out;
/* Does this fs even support this type of metadata? */
diff --git a/fs/xfs/scrub/scrub.h b/fs/xfs/scrub/scrub.h
index e9ec041..47f098c 100644
--- a/fs/xfs/scrub/scrub.h
+++ b/fs/xfs/scrub/scrub.h
@@ -22,7 +22,17 @@
struct xfs_scrub_context;
+/* Type info and names for the scrub types. */
+enum scrub_type {
+ ST_NONE = 1, /* disabled */
+ ST_PERAG, /* per-AG metadata */
+ ST_FS, /* per-FS metadata */
+ ST_INODE, /* per-inode metadata */
+};
+
struct xfs_scrub_meta_ops {
+ /* type describing required/allowed inputs */
+ int type;
/* Acquire whatever resources are needed for the operation. */
int (*setup)(struct xfs_scrub_context *,
struct xfs_inode *);
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate
2017-12-01 22:15 ` [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate Eric Sandeen
@ 2017-12-01 22:24 ` Darrick J. Wong
2017-12-01 22:25 ` Eric Sandeen
2017-12-01 23:02 ` Darrick J. Wong
2017-12-01 23:24 ` [PATCH v2 " Darrick J. Wong
2 siblings, 1 reply; 16+ messages in thread
From: Darrick J. Wong @ 2017-12-01 22:24 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs
On Fri, Dec 01, 2017 at 04:15:04PM -0600, Eric Sandeen wrote:
> There were ad-hoc checks for some scrub types but not others;
> mark each scrub type with ... it's type, and use that to validate
> the allowed and/or required input fields.
>
> Moving these checks out of xfs_scrub_setup_ag_header makes it
> a thin wrapper, so unwrap it in the process.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
>
> enum scrub_type should probably go somewhere shared ...?
>
> diff --git a/fs/xfs/scrub/agheader.c b/fs/xfs/scrub/agheader.c
> index 2a9b4f9..b599358 100644
> --- a/fs/xfs/scrub/agheader.c
> +++ b/fs/xfs/scrub/agheader.c
> @@ -37,23 +37,6 @@
> #include "scrub/common.h"
> #include "scrub/trace.h"
>
> -/*
> - * Set up scrub to check all the static metadata in each AG.
> - * This means the SB, AGF, AGI, and AGFL headers.
> - */
> -int
> -xfs_scrub_setup_ag_header(
> - struct xfs_scrub_context *sc,
> - struct xfs_inode *ip)
> -{
> - struct xfs_mount *mp = sc->mp;
> -
> - if (sc->sm->sm_agno >= mp->m_sb.sb_agcount ||
> - sc->sm->sm_ino || sc->sm->sm_gen)
> - return -EINVAL;
> - return xfs_scrub_setup_fs(sc, ip);
> -}
> -
> /* Walk all the blocks in the AGFL. */
> int
> xfs_scrub_walk_agfl(
> diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c
> index ac95fe9..98452ad 100644
> --- a/fs/xfs/scrub/common.c
> +++ b/fs/xfs/scrub/common.c
> @@ -472,7 +472,7 @@
> return error;
> }
>
> - error = xfs_scrub_setup_ag_header(sc, ip);
> + error = xfs_scrub_setup_fs(sc, ip);
> if (error)
> return error;
>
> @@ -507,14 +507,6 @@
> struct xfs_inode *ip = NULL;
> int error;
>
> - /*
> - * If userspace passed us an AG number or a generation number
> - * without an inode number, they haven't got a clue so bail out
> - * immediately.
> - */
> - if (sc->sm->sm_agno || (sc->sm->sm_gen && !sc->sm->sm_ino))
> - return -EINVAL;
> -
> /* We want to scan the inode we already had opened. */
> if (sc->sm->sm_ino == 0 || sc->sm->sm_ino == ip_in->i_ino) {
> sc->ip = ip_in;
> diff --git a/fs/xfs/scrub/common.h b/fs/xfs/scrub/common.h
> index 5c04385..fe12053 100644
> --- a/fs/xfs/scrub/common.h
> +++ b/fs/xfs/scrub/common.h
> @@ -78,8 +78,6 @@ void xfs_scrub_fblock_set_warning(struct xfs_scrub_context *sc, int whichfork,
>
> /* Setup functions */
> int xfs_scrub_setup_fs(struct xfs_scrub_context *sc, struct xfs_inode *ip);
> -int xfs_scrub_setup_ag_header(struct xfs_scrub_context *sc,
> - struct xfs_inode *ip);
> int xfs_scrub_setup_ag_allocbt(struct xfs_scrub_context *sc,
> struct xfs_inode *ip);
> int xfs_scrub_setup_ag_iallocbt(struct xfs_scrub_context *sc,
> diff --git a/fs/xfs/scrub/quota.c b/fs/xfs/scrub/quota.c
> index 2eac160..4587853 100644
> --- a/fs/xfs/scrub/quota.c
> +++ b/fs/xfs/scrub/quota.c
> @@ -67,13 +67,6 @@
> {
> uint dqtype;
>
> - /*
> - * If userspace gave us an AG number or inode data, they don't
> - * know what they're doing. Get out.
> - */
> - if (sc->sm->sm_agno || sc->sm->sm_ino || sc->sm->sm_gen)
> - return -EINVAL;
> -
> dqtype = xfs_scrub_quota_to_dqtype(sc);
> if (dqtype == 0)
> return -EINVAL;
> diff --git a/fs/xfs/scrub/rtbitmap.c b/fs/xfs/scrub/rtbitmap.c
> index c6fedb6..6860d5d 100644
> --- a/fs/xfs/scrub/rtbitmap.c
> +++ b/fs/xfs/scrub/rtbitmap.c
> @@ -43,22 +43,14 @@
> struct xfs_scrub_context *sc,
> struct xfs_inode *ip)
> {
> - struct xfs_mount *mp = sc->mp;
> - int error = 0;
> -
> - /*
> - * If userspace gave us an AG number or inode data, they don't
> - * know what they're doing. Get out.
> - */
> - if (sc->sm->sm_agno || sc->sm->sm_ino || sc->sm->sm_gen)
> - return -EINVAL;
> + int error;
>
> error = xfs_scrub_setup_fs(sc, ip);
> if (error)
> return error;
>
> sc->ilock_flags = XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP;
> - sc->ip = mp->m_rbmip;
> + sc->ip = sc->mp->m_rbmip;
> xfs_ilock(sc->ip, sc->ilock_flags);
>
> return 0;
> diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
> index 16932f9..6899126 100644
> --- a/fs/xfs/scrub/scrub.c
> +++ b/fs/xfs/scrub/scrub.c
> @@ -129,8 +129,6 @@
> {
> int error = 0;
>
> - if (sc->sm->sm_ino || sc->sm->sm_agno)
> - return -EINVAL;
> if (xfs_scrub_should_terminate(sc, &error))
> return error;
>
> @@ -169,105 +167,129 @@
>
> static const struct xfs_scrub_meta_ops meta_scrub_ops[] = {
> [XFS_SCRUB_TYPE_PROBE] = { /* ioctl presence test */
> + .type = ST_NONE,
> .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_probe,
> },
> [XFS_SCRUB_TYPE_SB] = { /* superblock */
> - .setup = xfs_scrub_setup_ag_header,
> + .type = ST_PERAG,
> + .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_superblock,
> },
> [XFS_SCRUB_TYPE_AGF] = { /* agf */
> - .setup = xfs_scrub_setup_ag_header,
> + .type = ST_PERAG,
> + .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_agf,
> },
> [XFS_SCRUB_TYPE_AGFL]= { /* agfl */
> - .setup = xfs_scrub_setup_ag_header,
> + .type = ST_PERAG,
> + .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_agfl,
> },
> [XFS_SCRUB_TYPE_AGI] = { /* agi */
> - .setup = xfs_scrub_setup_ag_header,
> + .type = ST_PERAG,
> + .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_agi,
> },
> [XFS_SCRUB_TYPE_BNOBT] = { /* bnobt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_allocbt,
> .scrub = xfs_scrub_bnobt,
> },
> [XFS_SCRUB_TYPE_CNTBT] = { /* cntbt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_allocbt,
> .scrub = xfs_scrub_cntbt,
> },
> [XFS_SCRUB_TYPE_INOBT] = { /* inobt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_iallocbt,
> .scrub = xfs_scrub_inobt,
> },
> [XFS_SCRUB_TYPE_FINOBT] = { /* finobt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_iallocbt,
> .scrub = xfs_scrub_finobt,
> .has = xfs_sb_version_hasfinobt,
> },
> [XFS_SCRUB_TYPE_RMAPBT] = { /* rmapbt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_rmapbt,
> .scrub = xfs_scrub_rmapbt,
> .has = xfs_sb_version_hasrmapbt,
> },
> [XFS_SCRUB_TYPE_REFCNTBT] = { /* refcountbt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_refcountbt,
> .scrub = xfs_scrub_refcountbt,
> .has = xfs_sb_version_hasreflink,
> },
> [XFS_SCRUB_TYPE_INODE] = { /* inode record */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_inode,
> .scrub = xfs_scrub_inode,
> },
> [XFS_SCRUB_TYPE_BMBTD] = { /* inode data fork */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_data,
> },
> [XFS_SCRUB_TYPE_BMBTA] = { /* inode attr fork */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_attr,
> },
> [XFS_SCRUB_TYPE_BMBTC] = { /* inode CoW fork */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_cow,
> },
> [XFS_SCRUB_TYPE_DIR] = { /* directory */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_directory,
> .scrub = xfs_scrub_directory,
> },
> [XFS_SCRUB_TYPE_XATTR] = { /* extended attributes */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_xattr,
> .scrub = xfs_scrub_xattr,
> },
> [XFS_SCRUB_TYPE_SYMLINK] = { /* symbolic link */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_symlink,
> .scrub = xfs_scrub_symlink,
> },
> [XFS_SCRUB_TYPE_PARENT] = { /* parent pointers */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_parent,
> .scrub = xfs_scrub_parent,
> },
> [XFS_SCRUB_TYPE_RTBITMAP] = { /* realtime bitmap */
> + .type = ST_FS,
> .setup = xfs_scrub_setup_rt,
> .scrub = xfs_scrub_rtbitmap,
> .has = xfs_sb_version_hasrealtime,
> },
> [XFS_SCRUB_TYPE_RTSUM] = { /* realtime summary */
> + .type = ST_FS,
> .setup = xfs_scrub_setup_rt,
> .scrub = xfs_scrub_rtsummary,
> .has = xfs_sb_version_hasrealtime,
> },
> [XFS_SCRUB_TYPE_UQUOTA] = { /* user quota */
> - .setup = xfs_scrub_setup_quota,
> - .scrub = xfs_scrub_quota,
> + .type = ST_FS,
> + .setup = xfs_scrub_setup_quota,
> + .scrub = xfs_scrub_quota,
> },
> [XFS_SCRUB_TYPE_GQUOTA] = { /* group quota */
> - .setup = xfs_scrub_setup_quota,
> - .scrub = xfs_scrub_quota,
> + .type = ST_FS,
> + .setup = xfs_scrub_setup_quota,
> + .scrub = xfs_scrub_quota,
> },
> [XFS_SCRUB_TYPE_PQUOTA] = { /* project quota */
> - .setup = xfs_scrub_setup_quota,
> - .scrub = xfs_scrub_quota,
> + .type = ST_FS,
> + .setup = xfs_scrub_setup_quota,
> + .scrub = xfs_scrub_quota,
> },
> };
>
> @@ -298,14 +320,35 @@
> sm->sm_flags &= ~XFS_SCRUB_FLAGS_OUT;
> if (sm->sm_flags & ~XFS_SCRUB_FLAGS_IN)
> goto out;
> + /* sm_reserved[] must be zero */
> if (memchr_inv(sm->sm_reserved, 0, sizeof(sm->sm_reserved)))
> goto out;
>
> + ops = &meta_scrub_ops[sm->sm_type];
> + /* restricting fields must be appropriate for type */
> + switch (ops->type) {
> + case ST_NONE:
> + case ST_FS:
> + if (sm->sm_ino || sm->sm_gen || sm->sm_agno)
> + goto out;
> + break;
> + case ST_PERAG:
> + if (sm->sm_ino || sm->sm_gen ||
> + sm->sm_agno >= mp->m_sb.sb_agcount)
> + goto out;
> + break;
> + case ST_INODE:
> + if (sm->sm_agno || (sm->sm_gen && !sm->sm_ino))
> + goto out;
> + break;
> + default:
> + goto out;
> + }
> +
> error = -ENOENT;
> /* Do we know about this type of metadata? */
> if (sm->sm_type >= XFS_SCRUB_TYPE_NR)
> goto out;
> - ops = &meta_scrub_ops[sm->sm_type];
> if (ops->setup == NULL || ops->scrub == NULL)
> goto out;
> /* Does this fs even support this type of metadata? */
> diff --git a/fs/xfs/scrub/scrub.h b/fs/xfs/scrub/scrub.h
> index e9ec041..47f098c 100644
> --- a/fs/xfs/scrub/scrub.h
> +++ b/fs/xfs/scrub/scrub.h
> @@ -22,7 +22,17 @@
>
> struct xfs_scrub_context;
>
> +/* Type info and names for the scrub types. */
> +enum scrub_type {
enum xfs_scrub_type ?
> + ST_NONE = 1, /* disabled */
> + ST_PERAG, /* per-AG metadata */
> + ST_FS, /* per-FS metadata */
> + ST_INODE, /* per-inode metadata */
> +};
> +
> struct xfs_scrub_meta_ops {
> + /* type describing required/allowed inputs */
> + int type;
enum xfs_scrub_type type; ?
--D
> /* Acquire whatever resources are needed for the operation. */
> int (*setup)(struct xfs_scrub_context *,
> struct xfs_inode *);
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 3/4] xfs: factor out scrub input checking
2017-12-01 22:14 ` [PATCH 3/4] xfs: factor out scrub input checking Eric Sandeen
@ 2017-12-01 22:25 ` Darrick J. Wong
2017-12-01 23:23 ` [PATCH v2 " Darrick J. Wong
1 sibling, 0 replies; 16+ messages in thread
From: Darrick J. Wong @ 2017-12-01 22:25 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs
On Fri, Dec 01, 2017 at 04:14:15PM -0600, Eric Sandeen wrote:
> Do this before adding more core checks.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
>
> diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
> index dc1f33a..16932f9 100644
> --- a/fs/xfs/scrub/scrub.c
> +++ b/fs/xfs/scrub/scrub.c
> @@ -285,47 +285,34 @@
> "EXPERIMENTAL online scrub feature in use. Use at your own risk!");
> }
>
> -/* Dispatch metadata scrubbing. */
> -int
> -xfs_scrub_metadata(
> - struct xfs_inode *ip,
> +static int
> +xfs_scrub_validate(
> + struct xfs_mount *mp,
> struct xfs_scrub_metadata *sm)
> {
> - struct xfs_scrub_context sc;
> - struct xfs_mount *mp = ip->i_mount;
> + int error;
> const struct xfs_scrub_meta_ops *ops;
> - bool try_harder = false;
> - int error = 0;
> -
> - BUILD_BUG_ON(sizeof(meta_scrub_ops) !=
> - (sizeof(struct xfs_scrub_meta_ops) * XFS_SCRUB_TYPE_NR));
> -
> - trace_xfs_scrub_start(ip, sm, error);
> -
> - /* Forbidden if we are shut down or mounted norecovery. */
> - error = -ESHUTDOWN;
> - if (XFS_FORCED_SHUTDOWN(mp))
> - goto out;
> - error = -ENOTRECOVERABLE;
> - if (mp->m_flags & XFS_MOUNT_NORECOVERY)
> - goto out;
>
> - /* Check our inputs. */
> error = -EINVAL;
> + /* Check our inputs. */
> sm->sm_flags &= ~XFS_SCRUB_FLAGS_OUT;
> if (sm->sm_flags & ~XFS_SCRUB_FLAGS_IN)
> goto out;
> if (memchr_inv(sm->sm_reserved, 0, sizeof(sm->sm_reserved)))
> goto out;
>
> - /* Do we know about this type of metadata? */
> error = -ENOENT;
> + /* Do we know about this type of metadata? */
> if (sm->sm_type >= XFS_SCRUB_TYPE_NR)
> goto out;
> ops = &meta_scrub_ops[sm->sm_type];
> if (ops->setup == NULL || ops->scrub == NULL)
> goto out;
> + /* Does this fs even support this type of metadata? */
> + if (ops->has && !ops->has(&mp->m_sb))
> + goto out;
>
> + error = -EOPNOTSUPP;
> /*
> * We won't scrub any filesystem that doesn't have the ability
> * to record unwritten extents. The option was made default in
> @@ -335,20 +322,46 @@
> * We also don't support v1-v3 filesystems, which aren't
> * mountable.
> */
> - error = -EOPNOTSUPP;
> if (!xfs_sb_version_hasextflgbit(&mp->m_sb))
> goto out;
>
> - /* Does this fs even support this type of metadata? */
> - error = -ENOENT;
> - if (ops->has && !ops->has(&mp->m_sb))
> - goto out;
> -
> /* We don't know how to repair anything yet. */
> - error = -EOPNOTSUPP;
> if (sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR)
> goto out;
>
> + error = 0;
> +out:
> + return error;
> +}
> +
> +/* Dispatch metadata scrubbing. */
> +int
> +xfs_scrub_metadata(
> + struct xfs_inode *ip,
> + struct xfs_scrub_metadata *sm)
> +{
> + struct xfs_scrub_context sc;
> + struct xfs_mount *mp = ip->i_mount;
> + bool try_harder = false;
> + int error = 0;
> +
> + BUILD_BUG_ON(sizeof(meta_scrub_ops) !=
> + (sizeof(struct xfs_scrub_meta_ops) * XFS_SCRUB_TYPE_NR));
> +
> + trace_xfs_scrub_start(ip, sm, error);
> +
> + /* Forbidden if we are shut down or mounted norecovery. */
> + error = -ESHUTDOWN;
> + if (XFS_FORCED_SHUTDOWN(mp))
> + goto out;
> + error = -ENOTRECOVERABLE;
> + if (mp->m_flags & XFS_MOUNT_NORECOVERY)
> + goto out;
> +
> + error = xfs_scrub_validate(mp, sm);
I might've named this xfs_scrub_validate_inputs, but eh.
> + if (error)
> + goto out;
> +
> xfs_scrub_experimental_warning(mp);
>
> retry_op:
> @@ -356,7 +369,7 @@
> memset(&sc, 0, sizeof(sc));
> sc.mp = ip->i_mount;
> sc.sm = sm;
> - sc.ops = ops;
> + sc.ops = &meta_scrub_ops[sm->sm_type];
Trailing whitespace.
--D
> sc.try_harder = try_harder;
> sc.sa.agno = NULLAGNUMBER;
> error = sc.ops->setup(&sc, ip);
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate
2017-12-01 22:24 ` Darrick J. Wong
@ 2017-12-01 22:25 ` Eric Sandeen
0 siblings, 0 replies; 16+ messages in thread
From: Eric Sandeen @ 2017-12-01 22:25 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: Eric Sandeen, linux-xfs
On 12/1/17 4:24 PM, Darrick J. Wong wrote:
>> diff --git a/fs/xfs/scrub/scrub.h b/fs/xfs/scrub/scrub.h
>> index e9ec041..47f098c 100644
>> --- a/fs/xfs/scrub/scrub.h
>> +++ b/fs/xfs/scrub/scrub.h
>> @@ -22,7 +22,17 @@
>>
>> struct xfs_scrub_context;
>>
>> +/* Type info and names for the scrub types. */
>> +enum scrub_type {
> enum xfs_scrub_type ?
>
Oh, sure. I can resend or feel free to fix it on the way in if that's
all there is.
-Eric
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 2/4] xfs: explicitly initialize meta_scrub_ops array by type
2017-12-01 22:13 ` [PATCH 2/4] xfs: explicitly initialize meta_scrub_ops array by type Eric Sandeen
@ 2017-12-01 22:26 ` Darrick J. Wong
0 siblings, 0 replies; 16+ messages in thread
From: Darrick J. Wong @ 2017-12-01 22:26 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs
On Fri, Dec 01, 2017 at 04:13:27PM -0600, Eric Sandeen wrote:
> An implicit mapping to type by order of initialization seems
> error-prone, and doesn't lend itself to cscope-ing.
>
> Also add sanity checks about size of array vs. max types,
> and a defensive check that ->scrub exists before using it.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>
> diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
> index 9c42c4e..dc1f33a 100644
> --- a/fs/xfs/scrub/scrub.c
> +++ b/fs/xfs/scrub/scrub.c
> @@ -168,104 +168,104 @@
> /* Scrubbing dispatch. */
>
> static const struct xfs_scrub_meta_ops meta_scrub_ops[] = {
> - { /* ioctl presence test */
> + [XFS_SCRUB_TYPE_PROBE] = { /* ioctl presence test */
> .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_probe,
> },
> - { /* superblock */
> + [XFS_SCRUB_TYPE_SB] = { /* superblock */
> .setup = xfs_scrub_setup_ag_header,
> .scrub = xfs_scrub_superblock,
> },
> - { /* agf */
> + [XFS_SCRUB_TYPE_AGF] = { /* agf */
> .setup = xfs_scrub_setup_ag_header,
> .scrub = xfs_scrub_agf,
> },
> - { /* agfl */
> + [XFS_SCRUB_TYPE_AGFL]= { /* agfl */
> .setup = xfs_scrub_setup_ag_header,
> .scrub = xfs_scrub_agfl,
> },
> - { /* agi */
> + [XFS_SCRUB_TYPE_AGI] = { /* agi */
> .setup = xfs_scrub_setup_ag_header,
> .scrub = xfs_scrub_agi,
> },
> - { /* bnobt */
> + [XFS_SCRUB_TYPE_BNOBT] = { /* bnobt */
> .setup = xfs_scrub_setup_ag_allocbt,
> .scrub = xfs_scrub_bnobt,
> },
> - { /* cntbt */
> + [XFS_SCRUB_TYPE_CNTBT] = { /* cntbt */
> .setup = xfs_scrub_setup_ag_allocbt,
> .scrub = xfs_scrub_cntbt,
> },
> - { /* inobt */
> + [XFS_SCRUB_TYPE_INOBT] = { /* inobt */
> .setup = xfs_scrub_setup_ag_iallocbt,
> .scrub = xfs_scrub_inobt,
> },
> - { /* finobt */
> + [XFS_SCRUB_TYPE_FINOBT] = { /* finobt */
> .setup = xfs_scrub_setup_ag_iallocbt,
> .scrub = xfs_scrub_finobt,
> .has = xfs_sb_version_hasfinobt,
> },
> - { /* rmapbt */
> + [XFS_SCRUB_TYPE_RMAPBT] = { /* rmapbt */
> .setup = xfs_scrub_setup_ag_rmapbt,
> .scrub = xfs_scrub_rmapbt,
> .has = xfs_sb_version_hasrmapbt,
> },
> - { /* refcountbt */
> + [XFS_SCRUB_TYPE_REFCNTBT] = { /* refcountbt */
> .setup = xfs_scrub_setup_ag_refcountbt,
> .scrub = xfs_scrub_refcountbt,
> .has = xfs_sb_version_hasreflink,
> },
> - { /* inode record */
> + [XFS_SCRUB_TYPE_INODE] = { /* inode record */
> .setup = xfs_scrub_setup_inode,
> .scrub = xfs_scrub_inode,
> },
> - { /* inode data fork */
> + [XFS_SCRUB_TYPE_BMBTD] = { /* inode data fork */
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_data,
> },
> - { /* inode attr fork */
> + [XFS_SCRUB_TYPE_BMBTA] = { /* inode attr fork */
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_attr,
> },
> - { /* inode CoW fork */
> + [XFS_SCRUB_TYPE_BMBTC] = { /* inode CoW fork */
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_cow,
> },
> - { /* directory */
> + [XFS_SCRUB_TYPE_DIR] = { /* directory */
> .setup = xfs_scrub_setup_directory,
> .scrub = xfs_scrub_directory,
> },
> - { /* extended attributes */
> + [XFS_SCRUB_TYPE_XATTR] = { /* extended attributes */
> .setup = xfs_scrub_setup_xattr,
> .scrub = xfs_scrub_xattr,
> },
> - { /* symbolic link */
> + [XFS_SCRUB_TYPE_SYMLINK] = { /* symbolic link */
> .setup = xfs_scrub_setup_symlink,
> .scrub = xfs_scrub_symlink,
> },
> - { /* parent pointers */
> + [XFS_SCRUB_TYPE_PARENT] = { /* parent pointers */
> .setup = xfs_scrub_setup_parent,
> .scrub = xfs_scrub_parent,
> },
> - { /* realtime bitmap */
> + [XFS_SCRUB_TYPE_RTBITMAP] = { /* realtime bitmap */
> .setup = xfs_scrub_setup_rt,
> .scrub = xfs_scrub_rtbitmap,
> .has = xfs_sb_version_hasrealtime,
> },
> - { /* realtime summary */
> + [XFS_SCRUB_TYPE_RTSUM] = { /* realtime summary */
> .setup = xfs_scrub_setup_rt,
> .scrub = xfs_scrub_rtsummary,
> .has = xfs_sb_version_hasrealtime,
> },
> - { /* user quota */
> + [XFS_SCRUB_TYPE_UQUOTA] = { /* user quota */
> .setup = xfs_scrub_setup_quota,
> .scrub = xfs_scrub_quota,
> },
> - { /* group quota */
> + [XFS_SCRUB_TYPE_GQUOTA] = { /* group quota */
> .setup = xfs_scrub_setup_quota,
> .scrub = xfs_scrub_quota,
> },
> - { /* project quota */
> + [XFS_SCRUB_TYPE_PQUOTA] = { /* project quota */
> .setup = xfs_scrub_setup_quota,
> .scrub = xfs_scrub_quota,
> },
> @@ -297,6 +297,9 @@
> bool try_harder = false;
> int error = 0;
>
> + BUILD_BUG_ON(sizeof(meta_scrub_ops) !=
> + (sizeof(struct xfs_scrub_meta_ops) * XFS_SCRUB_TYPE_NR));
> +
> trace_xfs_scrub_start(ip, sm, error);
>
> /* Forbidden if we are shut down or mounted norecovery. */
> @@ -320,7 +323,7 @@
> if (sm->sm_type >= XFS_SCRUB_TYPE_NR)
> goto out;
> ops = &meta_scrub_ops[sm->sm_type];
> - if (ops->scrub == NULL)
> + if (ops->setup == NULL || ops->scrub == NULL)
> goto out;
>
> /*
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS
2017-12-01 22:12 ` [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS Eric Sandeen
@ 2017-12-01 22:29 ` Darrick J. Wong
2017-12-01 22:31 ` Eric Sandeen
0 siblings, 1 reply; 16+ messages in thread
From: Darrick J. Wong @ 2017-12-01 22:29 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs
On Fri, Dec 01, 2017 at 04:12:34PM -0600, Eric Sandeen wrote:
> Advertise this config option along with the others.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
>
> diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h
> index fcc5dfc..8cee8e8 100644
> --- a/fs/xfs/xfs_super.h
> +++ b/fs/xfs/xfs_super.h
> @@ -44,6 +44,12 @@
> # define XFS_REALTIME_STRING
> #endif
>
> +#ifdef CONFIG_XFS_ONLINE_SCRUB
> +# define XFS_SCRUB_STRING "scrub, "
> +#else
> +# define XFS_SCRUB_STRING
> +#endif
I don't mind this addition to the build options, though I had pictured
scrub becoming an integral part of xfs some day and not remaining a
configurable option.
That said I haven't evaluated how much scrub bloats up xfs nor do I know
if the kernel tinyfication people would actually want to turn it off??
(For my part I prefer it some day not be Kconfig option so that it won't
bitrot ala CONFIG_XFS_RT=y.)
--D
> +
> #ifdef DEBUG
> # define XFS_DBG_STRING "debug"
> #else
> @@ -54,6 +60,7 @@
> #define XFS_BUILD_OPTIONS XFS_ACL_STRING \
> XFS_SECURITY_STRING \
> XFS_REALTIME_STRING \
> + XFS_SCRUB_STRING \
> XFS_DBG_STRING /* DBG must be last */
>
> struct xfs_inode;
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS
2017-12-01 22:29 ` Darrick J. Wong
@ 2017-12-01 22:31 ` Eric Sandeen
2018-02-01 0:03 ` Darrick J. Wong
0 siblings, 1 reply; 16+ messages in thread
From: Eric Sandeen @ 2017-12-01 22:31 UTC (permalink / raw)
To: Darrick J. Wong, Eric Sandeen; +Cc: linux-xfs
On 12/1/17 4:29 PM, Darrick J. Wong wrote:
> On Fri, Dec 01, 2017 at 04:12:34PM -0600, Eric Sandeen wrote:
>> Advertise this config option along with the others.
>>
>> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
>> ---
>>
>> diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h
>> index fcc5dfc..8cee8e8 100644
>> --- a/fs/xfs/xfs_super.h
>> +++ b/fs/xfs/xfs_super.h
>> @@ -44,6 +44,12 @@
>> # define XFS_REALTIME_STRING
>> #endif
>>
>> +#ifdef CONFIG_XFS_ONLINE_SCRUB
>> +# define XFS_SCRUB_STRING "scrub, "
>> +#else
>> +# define XFS_SCRUB_STRING
>> +#endif
>
> I don't mind this addition to the build options, though I had pictured
> scrub becoming an integral part of xfs some day and not remaining a
> configurable option.
It could be removed at that time, unless it's considered an API?
I'm not hung up on this, if there's no reason for it that's OK.
> That said I haven't evaluated how much scrub bloats up xfs nor do I know
> if the kernel tinyfication people would actually want to turn it off??
>
> (For my part I prefer it some day not be Kconfig option so that it won't
> bitrot ala CONFIG_XFS_RT=y.)
I'd imagine that it'd be turned on more often than RT but that's just a guess.
-Eric
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 0/4] xfs: scrub tweaks
2017-12-01 22:11 [PATCH 0/4] xfs: scrub tweaks Eric Sandeen
` (3 preceding siblings ...)
2017-12-01 22:15 ` [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate Eric Sandeen
@ 2017-12-01 22:39 ` Darrick J. Wong
4 siblings, 0 replies; 16+ messages in thread
From: Darrick J. Wong @ 2017-12-01 22:39 UTC (permalink / raw)
To: Eric Sandeen; +Cc: linux-xfs
On Fri, Dec 01, 2017 at 04:11:59PM -0600, Eric Sandeen wrote:
> A handful of random stuff.
For the whole set:
Looks ok, will test...
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate
2017-12-01 22:15 ` [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate Eric Sandeen
2017-12-01 22:24 ` Darrick J. Wong
@ 2017-12-01 23:02 ` Darrick J. Wong
2017-12-01 23:24 ` [PATCH v2 " Darrick J. Wong
2 siblings, 0 replies; 16+ messages in thread
From: Darrick J. Wong @ 2017-12-01 23:02 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs
On Fri, Dec 01, 2017 at 04:15:04PM -0600, Eric Sandeen wrote:
> There were ad-hoc checks for some scrub types but not others;
> mark each scrub type with ... it's type, and use that to validate
> the allowed and/or required input fields.
>
> Moving these checks out of xfs_scrub_setup_ag_header makes it
> a thin wrapper, so unwrap it in the process.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
>
> enum scrub_type should probably go somewhere shared ...?
>
> diff --git a/fs/xfs/scrub/agheader.c b/fs/xfs/scrub/agheader.c
> index 2a9b4f9..b599358 100644
> --- a/fs/xfs/scrub/agheader.c
> +++ b/fs/xfs/scrub/agheader.c
> @@ -37,23 +37,6 @@
> #include "scrub/common.h"
> #include "scrub/trace.h"
>
> -/*
> - * Set up scrub to check all the static metadata in each AG.
> - * This means the SB, AGF, AGI, and AGFL headers.
> - */
> -int
> -xfs_scrub_setup_ag_header(
> - struct xfs_scrub_context *sc,
> - struct xfs_inode *ip)
> -{
> - struct xfs_mount *mp = sc->mp;
> -
> - if (sc->sm->sm_agno >= mp->m_sb.sb_agcount ||
> - sc->sm->sm_ino || sc->sm->sm_gen)
> - return -EINVAL;
> - return xfs_scrub_setup_fs(sc, ip);
> -}
> -
> /* Walk all the blocks in the AGFL. */
> int
> xfs_scrub_walk_agfl(
> diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c
> index ac95fe9..98452ad 100644
> --- a/fs/xfs/scrub/common.c
> +++ b/fs/xfs/scrub/common.c
> @@ -472,7 +472,7 @@
> return error;
> }
>
> - error = xfs_scrub_setup_ag_header(sc, ip);
> + error = xfs_scrub_setup_fs(sc, ip);
> if (error)
> return error;
>
> @@ -507,14 +507,6 @@
> struct xfs_inode *ip = NULL;
> int error;
>
> - /*
> - * If userspace passed us an AG number or a generation number
> - * without an inode number, they haven't got a clue so bail out
> - * immediately.
> - */
> - if (sc->sm->sm_agno || (sc->sm->sm_gen && !sc->sm->sm_ino))
> - return -EINVAL;
> -
> /* We want to scan the inode we already had opened. */
> if (sc->sm->sm_ino == 0 || sc->sm->sm_ino == ip_in->i_ino) {
> sc->ip = ip_in;
> diff --git a/fs/xfs/scrub/common.h b/fs/xfs/scrub/common.h
> index 5c04385..fe12053 100644
> --- a/fs/xfs/scrub/common.h
> +++ b/fs/xfs/scrub/common.h
> @@ -78,8 +78,6 @@ void xfs_scrub_fblock_set_warning(struct xfs_scrub_context *sc, int whichfork,
>
> /* Setup functions */
> int xfs_scrub_setup_fs(struct xfs_scrub_context *sc, struct xfs_inode *ip);
> -int xfs_scrub_setup_ag_header(struct xfs_scrub_context *sc,
> - struct xfs_inode *ip);
> int xfs_scrub_setup_ag_allocbt(struct xfs_scrub_context *sc,
> struct xfs_inode *ip);
> int xfs_scrub_setup_ag_iallocbt(struct xfs_scrub_context *sc,
> diff --git a/fs/xfs/scrub/quota.c b/fs/xfs/scrub/quota.c
> index 2eac160..4587853 100644
> --- a/fs/xfs/scrub/quota.c
> +++ b/fs/xfs/scrub/quota.c
> @@ -67,13 +67,6 @@
> {
> uint dqtype;
>
> - /*
> - * If userspace gave us an AG number or inode data, they don't
> - * know what they're doing. Get out.
> - */
> - if (sc->sm->sm_agno || sc->sm->sm_ino || sc->sm->sm_gen)
> - return -EINVAL;
> -
> dqtype = xfs_scrub_quota_to_dqtype(sc);
> if (dqtype == 0)
> return -EINVAL;
> diff --git a/fs/xfs/scrub/rtbitmap.c b/fs/xfs/scrub/rtbitmap.c
> index c6fedb6..6860d5d 100644
> --- a/fs/xfs/scrub/rtbitmap.c
> +++ b/fs/xfs/scrub/rtbitmap.c
> @@ -43,22 +43,14 @@
> struct xfs_scrub_context *sc,
> struct xfs_inode *ip)
> {
> - struct xfs_mount *mp = sc->mp;
> - int error = 0;
> -
> - /*
> - * If userspace gave us an AG number or inode data, they don't
> - * know what they're doing. Get out.
> - */
> - if (sc->sm->sm_agno || sc->sm->sm_ino || sc->sm->sm_gen)
> - return -EINVAL;
> + int error;
>
> error = xfs_scrub_setup_fs(sc, ip);
> if (error)
> return error;
>
> sc->ilock_flags = XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP;
> - sc->ip = mp->m_rbmip;
> + sc->ip = sc->mp->m_rbmip;
> xfs_ilock(sc->ip, sc->ilock_flags);
>
> return 0;
> diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
> index 16932f9..6899126 100644
> --- a/fs/xfs/scrub/scrub.c
> +++ b/fs/xfs/scrub/scrub.c
> @@ -129,8 +129,6 @@
> {
> int error = 0;
>
> - if (sc->sm->sm_ino || sc->sm->sm_agno)
> - return -EINVAL;
> if (xfs_scrub_should_terminate(sc, &error))
> return error;
>
> @@ -169,105 +167,129 @@
>
> static const struct xfs_scrub_meta_ops meta_scrub_ops[] = {
> [XFS_SCRUB_TYPE_PROBE] = { /* ioctl presence test */
> + .type = ST_NONE,
> .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_probe,
> },
> [XFS_SCRUB_TYPE_SB] = { /* superblock */
> - .setup = xfs_scrub_setup_ag_header,
> + .type = ST_PERAG,
> + .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_superblock,
> },
> [XFS_SCRUB_TYPE_AGF] = { /* agf */
> - .setup = xfs_scrub_setup_ag_header,
> + .type = ST_PERAG,
> + .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_agf,
> },
> [XFS_SCRUB_TYPE_AGFL]= { /* agfl */
> - .setup = xfs_scrub_setup_ag_header,
> + .type = ST_PERAG,
> + .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_agfl,
> },
> [XFS_SCRUB_TYPE_AGI] = { /* agi */
> - .setup = xfs_scrub_setup_ag_header,
> + .type = ST_PERAG,
> + .setup = xfs_scrub_setup_fs,
> .scrub = xfs_scrub_agi,
> },
> [XFS_SCRUB_TYPE_BNOBT] = { /* bnobt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_allocbt,
> .scrub = xfs_scrub_bnobt,
> },
> [XFS_SCRUB_TYPE_CNTBT] = { /* cntbt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_allocbt,
> .scrub = xfs_scrub_cntbt,
> },
> [XFS_SCRUB_TYPE_INOBT] = { /* inobt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_iallocbt,
> .scrub = xfs_scrub_inobt,
> },
> [XFS_SCRUB_TYPE_FINOBT] = { /* finobt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_iallocbt,
> .scrub = xfs_scrub_finobt,
> .has = xfs_sb_version_hasfinobt,
> },
> [XFS_SCRUB_TYPE_RMAPBT] = { /* rmapbt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_rmapbt,
> .scrub = xfs_scrub_rmapbt,
> .has = xfs_sb_version_hasrmapbt,
> },
> [XFS_SCRUB_TYPE_REFCNTBT] = { /* refcountbt */
> + .type = ST_PERAG,
> .setup = xfs_scrub_setup_ag_refcountbt,
> .scrub = xfs_scrub_refcountbt,
> .has = xfs_sb_version_hasreflink,
> },
> [XFS_SCRUB_TYPE_INODE] = { /* inode record */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_inode,
> .scrub = xfs_scrub_inode,
> },
> [XFS_SCRUB_TYPE_BMBTD] = { /* inode data fork */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_data,
> },
> [XFS_SCRUB_TYPE_BMBTA] = { /* inode attr fork */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_attr,
> },
> [XFS_SCRUB_TYPE_BMBTC] = { /* inode CoW fork */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_inode_bmap,
> .scrub = xfs_scrub_bmap_cow,
> },
> [XFS_SCRUB_TYPE_DIR] = { /* directory */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_directory,
> .scrub = xfs_scrub_directory,
> },
> [XFS_SCRUB_TYPE_XATTR] = { /* extended attributes */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_xattr,
> .scrub = xfs_scrub_xattr,
> },
> [XFS_SCRUB_TYPE_SYMLINK] = { /* symbolic link */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_symlink,
> .scrub = xfs_scrub_symlink,
> },
> [XFS_SCRUB_TYPE_PARENT] = { /* parent pointers */
> + .type = ST_INODE,
> .setup = xfs_scrub_setup_parent,
> .scrub = xfs_scrub_parent,
> },
> [XFS_SCRUB_TYPE_RTBITMAP] = { /* realtime bitmap */
> + .type = ST_FS,
> .setup = xfs_scrub_setup_rt,
> .scrub = xfs_scrub_rtbitmap,
> .has = xfs_sb_version_hasrealtime,
> },
> [XFS_SCRUB_TYPE_RTSUM] = { /* realtime summary */
> + .type = ST_FS,
> .setup = xfs_scrub_setup_rt,
> .scrub = xfs_scrub_rtsummary,
> .has = xfs_sb_version_hasrealtime,
> },
> [XFS_SCRUB_TYPE_UQUOTA] = { /* user quota */
> - .setup = xfs_scrub_setup_quota,
> - .scrub = xfs_scrub_quota,
> + .type = ST_FS,
> + .setup = xfs_scrub_setup_quota,
> + .scrub = xfs_scrub_quota,
> },
> [XFS_SCRUB_TYPE_GQUOTA] = { /* group quota */
> - .setup = xfs_scrub_setup_quota,
> - .scrub = xfs_scrub_quota,
> + .type = ST_FS,
> + .setup = xfs_scrub_setup_quota,
> + .scrub = xfs_scrub_quota,
> },
> [XFS_SCRUB_TYPE_PQUOTA] = { /* project quota */
> - .setup = xfs_scrub_setup_quota,
> - .scrub = xfs_scrub_quota,
> + .type = ST_FS,
> + .setup = xfs_scrub_setup_quota,
> + .scrub = xfs_scrub_quota,
> },
> };
>
> @@ -298,14 +320,35 @@
> sm->sm_flags &= ~XFS_SCRUB_FLAGS_OUT;
> if (sm->sm_flags & ~XFS_SCRUB_FLAGS_IN)
> goto out;
> + /* sm_reserved[] must be zero */
> if (memchr_inv(sm->sm_reserved, 0, sizeof(sm->sm_reserved)))
> goto out;
>
> + ops = &meta_scrub_ops[sm->sm_type];
This has to come after we range-check sm_type.
--D
> + /* restricting fields must be appropriate for type */
> + switch (ops->type) {
> + case ST_NONE:
> + case ST_FS:
> + if (sm->sm_ino || sm->sm_gen || sm->sm_agno)
> + goto out;
> + break;
> + case ST_PERAG:
> + if (sm->sm_ino || sm->sm_gen ||
> + sm->sm_agno >= mp->m_sb.sb_agcount)
> + goto out;
> + break;
> + case ST_INODE:
> + if (sm->sm_agno || (sm->sm_gen && !sm->sm_ino))
> + goto out;
> + break;
> + default:
> + goto out;
> + }
> +
> error = -ENOENT;
> /* Do we know about this type of metadata? */
> if (sm->sm_type >= XFS_SCRUB_TYPE_NR)
> goto out;
> - ops = &meta_scrub_ops[sm->sm_type];
> if (ops->setup == NULL || ops->scrub == NULL)
> goto out;
> /* Does this fs even support this type of metadata? */
> diff --git a/fs/xfs/scrub/scrub.h b/fs/xfs/scrub/scrub.h
> index e9ec041..47f098c 100644
> --- a/fs/xfs/scrub/scrub.h
> +++ b/fs/xfs/scrub/scrub.h
> @@ -22,7 +22,17 @@
>
> struct xfs_scrub_context;
>
> +/* Type info and names for the scrub types. */
> +enum scrub_type {
> + ST_NONE = 1, /* disabled */
> + ST_PERAG, /* per-AG metadata */
> + ST_FS, /* per-FS metadata */
> + ST_INODE, /* per-inode metadata */
> +};
> +
> struct xfs_scrub_meta_ops {
> + /* type describing required/allowed inputs */
> + int type;
> /* Acquire whatever resources are needed for the operation. */
> int (*setup)(struct xfs_scrub_context *,
> struct xfs_inode *);
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v2 3/4] xfs: factor out scrub input checking
2017-12-01 22:14 ` [PATCH 3/4] xfs: factor out scrub input checking Eric Sandeen
2017-12-01 22:25 ` Darrick J. Wong
@ 2017-12-01 23:23 ` Darrick J. Wong
1 sibling, 0 replies; 16+ messages in thread
From: Darrick J. Wong @ 2017-12-01 23:23 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs
From: Eric Sandeen <sandeen@sandeen.net>
Do this before adding more core checks.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
[darrick: rename input validation function]
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
fs/xfs/scrub/scrub.c | 75 +++++++++++++++++++++++++++++---------------------
1 file changed, 44 insertions(+), 31 deletions(-)
diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
index dc1f33a..182d2fe 100644
--- a/fs/xfs/scrub/scrub.c
+++ b/fs/xfs/scrub/scrub.c
@@ -285,47 +285,34 @@ xfs_scrub_experimental_warning(
"EXPERIMENTAL online scrub feature in use. Use at your own risk!");
}
-/* Dispatch metadata scrubbing. */
-int
-xfs_scrub_metadata(
- struct xfs_inode *ip,
+static int
+xfs_scrub_validate_inputs(
+ struct xfs_mount *mp,
struct xfs_scrub_metadata *sm)
{
- struct xfs_scrub_context sc;
- struct xfs_mount *mp = ip->i_mount;
+ int error;
const struct xfs_scrub_meta_ops *ops;
- bool try_harder = false;
- int error = 0;
-
- BUILD_BUG_ON(sizeof(meta_scrub_ops) !=
- (sizeof(struct xfs_scrub_meta_ops) * XFS_SCRUB_TYPE_NR));
-
- trace_xfs_scrub_start(ip, sm, error);
-
- /* Forbidden if we are shut down or mounted norecovery. */
- error = -ESHUTDOWN;
- if (XFS_FORCED_SHUTDOWN(mp))
- goto out;
- error = -ENOTRECOVERABLE;
- if (mp->m_flags & XFS_MOUNT_NORECOVERY)
- goto out;
- /* Check our inputs. */
error = -EINVAL;
+ /* Check our inputs. */
sm->sm_flags &= ~XFS_SCRUB_FLAGS_OUT;
if (sm->sm_flags & ~XFS_SCRUB_FLAGS_IN)
goto out;
if (memchr_inv(sm->sm_reserved, 0, sizeof(sm->sm_reserved)))
goto out;
- /* Do we know about this type of metadata? */
error = -ENOENT;
+ /* Do we know about this type of metadata? */
if (sm->sm_type >= XFS_SCRUB_TYPE_NR)
goto out;
ops = &meta_scrub_ops[sm->sm_type];
if (ops->setup == NULL || ops->scrub == NULL)
goto out;
+ /* Does this fs even support this type of metadata? */
+ if (ops->has && !ops->has(&mp->m_sb))
+ goto out;
+ error = -EOPNOTSUPP;
/*
* We won't scrub any filesystem that doesn't have the ability
* to record unwritten extents. The option was made default in
@@ -335,20 +322,46 @@ xfs_scrub_metadata(
* We also don't support v1-v3 filesystems, which aren't
* mountable.
*/
- error = -EOPNOTSUPP;
if (!xfs_sb_version_hasextflgbit(&mp->m_sb))
goto out;
- /* Does this fs even support this type of metadata? */
- error = -ENOENT;
- if (ops->has && !ops->has(&mp->m_sb))
- goto out;
-
/* We don't know how to repair anything yet. */
- error = -EOPNOTSUPP;
if (sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR)
goto out;
+ error = 0;
+out:
+ return error;
+}
+
+/* Dispatch metadata scrubbing. */
+int
+xfs_scrub_metadata(
+ struct xfs_inode *ip,
+ struct xfs_scrub_metadata *sm)
+{
+ struct xfs_scrub_context sc;
+ struct xfs_mount *mp = ip->i_mount;
+ bool try_harder = false;
+ int error = 0;
+
+ BUILD_BUG_ON(sizeof(meta_scrub_ops) !=
+ (sizeof(struct xfs_scrub_meta_ops) * XFS_SCRUB_TYPE_NR));
+
+ trace_xfs_scrub_start(ip, sm, error);
+
+ /* Forbidden if we are shut down or mounted norecovery. */
+ error = -ESHUTDOWN;
+ if (XFS_FORCED_SHUTDOWN(mp))
+ goto out;
+ error = -ENOTRECOVERABLE;
+ if (mp->m_flags & XFS_MOUNT_NORECOVERY)
+ goto out;
+
+ error = xfs_scrub_validate_inputs(mp, sm);
+ if (error)
+ goto out;
+
xfs_scrub_experimental_warning(mp);
retry_op:
@@ -356,7 +369,7 @@ xfs_scrub_metadata(
memset(&sc, 0, sizeof(sc));
sc.mp = ip->i_mount;
sc.sm = sm;
- sc.ops = ops;
+ sc.ops = &meta_scrub_ops[sm->sm_type];
sc.try_harder = try_harder;
sc.sa.agno = NULLAGNUMBER;
error = sc.ops->setup(&sc, ip);
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 4/4] xfs: move all scrub input checking to xfs_scrub_validate
2017-12-01 22:15 ` [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate Eric Sandeen
2017-12-01 22:24 ` Darrick J. Wong
2017-12-01 23:02 ` Darrick J. Wong
@ 2017-12-01 23:24 ` Darrick J. Wong
2 siblings, 0 replies; 16+ messages in thread
From: Darrick J. Wong @ 2017-12-01 23:24 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs
From: Eric Sandeen <sandeen@sandeen.net>
There were ad-hoc checks for some scrub types but not others;
mark each scrub type with ... it's type, and use that to validate
the allowed and/or required input fields.
Moving these checks out of xfs_scrub_setup_ag_header makes it
a thin wrapper, so unwrap it in the process.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
[darrick: add xfs_ prefix to enum, check scrub args after checking type]
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
| 17 ------------
fs/xfs/scrub/common.c | 10 +------
fs/xfs/scrub/common.h | 2 -
fs/xfs/scrub/quota.c | 7 -----
fs/xfs/scrub/rtbitmap.c | 12 +-------
fs/xfs/scrub/scrub.c | 68 +++++++++++++++++++++++++++++++++++++++--------
fs/xfs/scrub/scrub.h | 11 ++++++++
7 files changed, 70 insertions(+), 57 deletions(-)
--git a/fs/xfs/scrub/agheader.c b/fs/xfs/scrub/agheader.c
index 2a9b4f9..b599358 100644
--- a/fs/xfs/scrub/agheader.c
+++ b/fs/xfs/scrub/agheader.c
@@ -37,23 +37,6 @@
#include "scrub/common.h"
#include "scrub/trace.h"
-/*
- * Set up scrub to check all the static metadata in each AG.
- * This means the SB, AGF, AGI, and AGFL headers.
- */
-int
-xfs_scrub_setup_ag_header(
- struct xfs_scrub_context *sc,
- struct xfs_inode *ip)
-{
- struct xfs_mount *mp = sc->mp;
-
- if (sc->sm->sm_agno >= mp->m_sb.sb_agcount ||
- sc->sm->sm_ino || sc->sm->sm_gen)
- return -EINVAL;
- return xfs_scrub_setup_fs(sc, ip);
-}
-
/* Walk all the blocks in the AGFL. */
int
xfs_scrub_walk_agfl(
diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c
index ac95fe9..98452ad 100644
--- a/fs/xfs/scrub/common.c
+++ b/fs/xfs/scrub/common.c
@@ -472,7 +472,7 @@ xfs_scrub_setup_ag_btree(
return error;
}
- error = xfs_scrub_setup_ag_header(sc, ip);
+ error = xfs_scrub_setup_fs(sc, ip);
if (error)
return error;
@@ -507,14 +507,6 @@ xfs_scrub_get_inode(
struct xfs_inode *ip = NULL;
int error;
- /*
- * If userspace passed us an AG number or a generation number
- * without an inode number, they haven't got a clue so bail out
- * immediately.
- */
- if (sc->sm->sm_agno || (sc->sm->sm_gen && !sc->sm->sm_ino))
- return -EINVAL;
-
/* We want to scan the inode we already had opened. */
if (sc->sm->sm_ino == 0 || sc->sm->sm_ino == ip_in->i_ino) {
sc->ip = ip_in;
diff --git a/fs/xfs/scrub/common.h b/fs/xfs/scrub/common.h
index 5c04385..fe12053 100644
--- a/fs/xfs/scrub/common.h
+++ b/fs/xfs/scrub/common.h
@@ -78,8 +78,6 @@ int xfs_scrub_checkpoint_log(struct xfs_mount *mp);
/* Setup functions */
int xfs_scrub_setup_fs(struct xfs_scrub_context *sc, struct xfs_inode *ip);
-int xfs_scrub_setup_ag_header(struct xfs_scrub_context *sc,
- struct xfs_inode *ip);
int xfs_scrub_setup_ag_allocbt(struct xfs_scrub_context *sc,
struct xfs_inode *ip);
int xfs_scrub_setup_ag_iallocbt(struct xfs_scrub_context *sc,
diff --git a/fs/xfs/scrub/quota.c b/fs/xfs/scrub/quota.c
index 8e58ba8..d43b654 100644
--- a/fs/xfs/scrub/quota.c
+++ b/fs/xfs/scrub/quota.c
@@ -67,13 +67,6 @@ xfs_scrub_setup_quota(
{
uint dqtype;
- /*
- * If userspace gave us an AG number or inode data, they don't
- * know what they're doing. Get out.
- */
- if (sc->sm->sm_agno || sc->sm->sm_ino || sc->sm->sm_gen)
- return -EINVAL;
-
dqtype = xfs_scrub_quota_to_dqtype(sc);
if (dqtype == 0)
return -EINVAL;
diff --git a/fs/xfs/scrub/rtbitmap.c b/fs/xfs/scrub/rtbitmap.c
index c6fedb6..6860d5d 100644
--- a/fs/xfs/scrub/rtbitmap.c
+++ b/fs/xfs/scrub/rtbitmap.c
@@ -43,22 +43,14 @@ xfs_scrub_setup_rt(
struct xfs_scrub_context *sc,
struct xfs_inode *ip)
{
- struct xfs_mount *mp = sc->mp;
- int error = 0;
-
- /*
- * If userspace gave us an AG number or inode data, they don't
- * know what they're doing. Get out.
- */
- if (sc->sm->sm_agno || sc->sm->sm_ino || sc->sm->sm_gen)
- return -EINVAL;
+ int error;
error = xfs_scrub_setup_fs(sc, ip);
if (error)
return error;
sc->ilock_flags = XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP;
- sc->ip = mp->m_rbmip;
+ sc->ip = sc->mp->m_rbmip;
xfs_ilock(sc->ip, sc->ilock_flags);
return 0;
diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
index 182d2fe..b98084d 100644
--- a/fs/xfs/scrub/scrub.c
+++ b/fs/xfs/scrub/scrub.c
@@ -129,8 +129,6 @@ xfs_scrub_probe(
{
int error = 0;
- if (sc->sm->sm_ino || sc->sm->sm_agno)
- return -EINVAL;
if (xfs_scrub_should_terminate(sc, &error))
return error;
@@ -169,105 +167,129 @@ xfs_scrub_teardown(
static const struct xfs_scrub_meta_ops meta_scrub_ops[] = {
[XFS_SCRUB_TYPE_PROBE] = { /* ioctl presence test */
+ .type = ST_NONE,
.setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_probe,
},
[XFS_SCRUB_TYPE_SB] = { /* superblock */
- .setup = xfs_scrub_setup_ag_header,
+ .type = ST_PERAG,
+ .setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_superblock,
},
[XFS_SCRUB_TYPE_AGF] = { /* agf */
- .setup = xfs_scrub_setup_ag_header,
+ .type = ST_PERAG,
+ .setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_agf,
},
[XFS_SCRUB_TYPE_AGFL]= { /* agfl */
- .setup = xfs_scrub_setup_ag_header,
+ .type = ST_PERAG,
+ .setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_agfl,
},
[XFS_SCRUB_TYPE_AGI] = { /* agi */
- .setup = xfs_scrub_setup_ag_header,
+ .type = ST_PERAG,
+ .setup = xfs_scrub_setup_fs,
.scrub = xfs_scrub_agi,
},
[XFS_SCRUB_TYPE_BNOBT] = { /* bnobt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_allocbt,
.scrub = xfs_scrub_bnobt,
},
[XFS_SCRUB_TYPE_CNTBT] = { /* cntbt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_allocbt,
.scrub = xfs_scrub_cntbt,
},
[XFS_SCRUB_TYPE_INOBT] = { /* inobt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_iallocbt,
.scrub = xfs_scrub_inobt,
},
[XFS_SCRUB_TYPE_FINOBT] = { /* finobt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_iallocbt,
.scrub = xfs_scrub_finobt,
.has = xfs_sb_version_hasfinobt,
},
[XFS_SCRUB_TYPE_RMAPBT] = { /* rmapbt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_rmapbt,
.scrub = xfs_scrub_rmapbt,
.has = xfs_sb_version_hasrmapbt,
},
[XFS_SCRUB_TYPE_REFCNTBT] = { /* refcountbt */
+ .type = ST_PERAG,
.setup = xfs_scrub_setup_ag_refcountbt,
.scrub = xfs_scrub_refcountbt,
.has = xfs_sb_version_hasreflink,
},
[XFS_SCRUB_TYPE_INODE] = { /* inode record */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_inode,
.scrub = xfs_scrub_inode,
},
[XFS_SCRUB_TYPE_BMBTD] = { /* inode data fork */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_data,
},
[XFS_SCRUB_TYPE_BMBTA] = { /* inode attr fork */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_attr,
},
[XFS_SCRUB_TYPE_BMBTC] = { /* inode CoW fork */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_inode_bmap,
.scrub = xfs_scrub_bmap_cow,
},
[XFS_SCRUB_TYPE_DIR] = { /* directory */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_directory,
.scrub = xfs_scrub_directory,
},
[XFS_SCRUB_TYPE_XATTR] = { /* extended attributes */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_xattr,
.scrub = xfs_scrub_xattr,
},
[XFS_SCRUB_TYPE_SYMLINK] = { /* symbolic link */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_symlink,
.scrub = xfs_scrub_symlink,
},
[XFS_SCRUB_TYPE_PARENT] = { /* parent pointers */
+ .type = ST_INODE,
.setup = xfs_scrub_setup_parent,
.scrub = xfs_scrub_parent,
},
[XFS_SCRUB_TYPE_RTBITMAP] = { /* realtime bitmap */
+ .type = ST_FS,
.setup = xfs_scrub_setup_rt,
.scrub = xfs_scrub_rtbitmap,
.has = xfs_sb_version_hasrealtime,
},
[XFS_SCRUB_TYPE_RTSUM] = { /* realtime summary */
+ .type = ST_FS,
.setup = xfs_scrub_setup_rt,
.scrub = xfs_scrub_rtsummary,
.has = xfs_sb_version_hasrealtime,
},
[XFS_SCRUB_TYPE_UQUOTA] = { /* user quota */
- .setup = xfs_scrub_setup_quota,
- .scrub = xfs_scrub_quota,
+ .type = ST_FS,
+ .setup = xfs_scrub_setup_quota,
+ .scrub = xfs_scrub_quota,
},
[XFS_SCRUB_TYPE_GQUOTA] = { /* group quota */
- .setup = xfs_scrub_setup_quota,
- .scrub = xfs_scrub_quota,
+ .type = ST_FS,
+ .setup = xfs_scrub_setup_quota,
+ .scrub = xfs_scrub_quota,
},
[XFS_SCRUB_TYPE_PQUOTA] = { /* project quota */
- .setup = xfs_scrub_setup_quota,
- .scrub = xfs_scrub_quota,
+ .type = ST_FS,
+ .setup = xfs_scrub_setup_quota,
+ .scrub = xfs_scrub_quota,
},
};
@@ -298,6 +320,7 @@ xfs_scrub_validate_inputs(
sm->sm_flags &= ~XFS_SCRUB_FLAGS_OUT;
if (sm->sm_flags & ~XFS_SCRUB_FLAGS_IN)
goto out;
+ /* sm_reserved[] must be zero */
if (memchr_inv(sm->sm_reserved, 0, sizeof(sm->sm_reserved)))
goto out;
@@ -312,6 +335,27 @@ xfs_scrub_validate_inputs(
if (ops->has && !ops->has(&mp->m_sb))
goto out;
+ error = -EINVAL;
+ /* restricting fields must be appropriate for type */
+ switch (ops->type) {
+ case ST_NONE:
+ case ST_FS:
+ if (sm->sm_ino || sm->sm_gen || sm->sm_agno)
+ goto out;
+ break;
+ case ST_PERAG:
+ if (sm->sm_ino || sm->sm_gen ||
+ sm->sm_agno >= mp->m_sb.sb_agcount)
+ goto out;
+ break;
+ case ST_INODE:
+ if (sm->sm_agno || (sm->sm_gen && !sm->sm_ino))
+ goto out;
+ break;
+ default:
+ goto out;
+ }
+
error = -EOPNOTSUPP;
/*
* We won't scrub any filesystem that doesn't have the ability
diff --git a/fs/xfs/scrub/scrub.h b/fs/xfs/scrub/scrub.h
index e9ec041..2a79614 100644
--- a/fs/xfs/scrub/scrub.h
+++ b/fs/xfs/scrub/scrub.h
@@ -22,6 +22,14 @@
struct xfs_scrub_context;
+/* Type info and names for the scrub types. */
+enum xfs_scrub_type {
+ ST_NONE = 1, /* disabled */
+ ST_PERAG, /* per-AG metadata */
+ ST_FS, /* per-FS metadata */
+ ST_INODE, /* per-inode metadata */
+};
+
struct xfs_scrub_meta_ops {
/* Acquire whatever resources are needed for the operation. */
int (*setup)(struct xfs_scrub_context *,
@@ -32,6 +40,9 @@ struct xfs_scrub_meta_ops {
/* Decide if we even have this piece of metadata. */
bool (*has)(struct xfs_sb *);
+
+ /* type describing required/allowed inputs */
+ enum xfs_scrub_type type;
};
/* Buffer pointers and btree cursors for an entire AG. */
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS
2017-12-01 22:31 ` Eric Sandeen
@ 2018-02-01 0:03 ` Darrick J. Wong
0 siblings, 0 replies; 16+ messages in thread
From: Darrick J. Wong @ 2018-02-01 0:03 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Eric Sandeen, linux-xfs
On Fri, Dec 01, 2017 at 04:31:04PM -0600, Eric Sandeen wrote:
> On 12/1/17 4:29 PM, Darrick J. Wong wrote:
> > On Fri, Dec 01, 2017 at 04:12:34PM -0600, Eric Sandeen wrote:
> >> Advertise this config option along with the others.
> >>
> >> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> >> ---
> >>
> >> diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h
> >> index fcc5dfc..8cee8e8 100644
> >> --- a/fs/xfs/xfs_super.h
> >> +++ b/fs/xfs/xfs_super.h
> >> @@ -44,6 +44,12 @@
> >> # define XFS_REALTIME_STRING
> >> #endif
> >>
> >> +#ifdef CONFIG_XFS_ONLINE_SCRUB
> >> +# define XFS_SCRUB_STRING "scrub, "
> >> +#else
> >> +# define XFS_SCRUB_STRING
> >> +#endif
> >
> > I don't mind this addition to the build options, though I had pictured
> > scrub becoming an integral part of xfs some day and not remaining a
> > configurable option.
>
> It could be removed at that time, unless it's considered an API?
>
> I'm not hung up on this, if there's no reason for it that's OK.
>
> > That said I haven't evaluated how much scrub bloats up xfs nor do I know
> > if the kernel tinyfication people would actually want to turn it off??
> >
> > (For my part I prefer it some day not be Kconfig option so that it won't
> > bitrot ala CONFIG_XFS_RT=y.)
>
> I'd imagine that it'd be turned on more often than RT but that's just a guess.
Ok, now that we've merged all this stuff, it looks like disabling the
scrub code alone can reduce the module size by ~8%. I can imagine the
occasional system builder who wants xfs but doesn't care about online
fsck, so I think I'll keep the kconfig option. Therefore, it ought to
go in the build string.
Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
>
> -Eric
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2018-02-01 0:03 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-01 22:11 [PATCH 0/4] xfs: scrub tweaks Eric Sandeen
2017-12-01 22:12 ` [PATCH 1/4] xfs: add scrub to XFS_BUILD_OPTIONS Eric Sandeen
2017-12-01 22:29 ` Darrick J. Wong
2017-12-01 22:31 ` Eric Sandeen
2018-02-01 0:03 ` Darrick J. Wong
2017-12-01 22:13 ` [PATCH 2/4] xfs: explicitly initialize meta_scrub_ops array by type Eric Sandeen
2017-12-01 22:26 ` Darrick J. Wong
2017-12-01 22:14 ` [PATCH 3/4] xfs: factor out scrub input checking Eric Sandeen
2017-12-01 22:25 ` Darrick J. Wong
2017-12-01 23:23 ` [PATCH v2 " Darrick J. Wong
2017-12-01 22:15 ` [PATCH 4/4] xfs: move all scrub input checking to xfs_scrub_validate Eric Sandeen
2017-12-01 22:24 ` Darrick J. Wong
2017-12-01 22:25 ` Eric Sandeen
2017-12-01 23:02 ` Darrick J. Wong
2017-12-01 23:24 ` [PATCH v2 " Darrick J. Wong
2017-12-01 22:39 ` [PATCH 0/4] xfs: scrub tweaks Darrick J. Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).