From: Allison Henderson <allison.hender...@oracle.com>

Add the new parent attribute type. XFS_ATTR_PARENT is used only for parent 
pointer
entries; it uses reserved blocks like XFS_ATTR_ROOT.

Signed-off-by: Mark Tinguely <tingu...@sgi.com>
Signed-off-by: Dave Chinner <dchin...@redhat.com>
Signed-off-by: Allison Henderson <allison.hender...@oracle.com>
Reviewed-by: Darrick J. Wong <djw...@kernel.org>
---
 fs/xfs/libxfs/xfs_attr.c       | 4 +++-
 fs/xfs/libxfs/xfs_da_format.h  | 5 ++++-
 fs/xfs/libxfs/xfs_log_format.h | 1 +
 fs/xfs/scrub/attr.c            | 2 +-
 4 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
index b1dbed7655e8..101823772bf9 100644
--- a/fs/xfs/libxfs/xfs_attr.c
+++ b/fs/xfs/libxfs/xfs_attr.c
@@ -976,11 +976,13 @@ xfs_attr_set(
        struct xfs_inode        *dp = args->dp;
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_trans_res    tres;
-       bool                    rsvd = (args->attr_filter & XFS_ATTR_ROOT);
+       bool                    rsvd;
        int                     error, local;
        int                     rmt_blks = 0;
        unsigned int            total;
 
+       rsvd = (args->attr_filter & (XFS_ATTR_ROOT | XFS_ATTR_PARENT)) != 0;
+
        if (xfs_is_shutdown(dp->i_mount))
                return -EIO;
 
diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h
index 25e2841084e1..3dc03968bba6 100644
--- a/fs/xfs/libxfs/xfs_da_format.h
+++ b/fs/xfs/libxfs/xfs_da_format.h
@@ -688,12 +688,15 @@ struct xfs_attr3_leafblock {
 #define        XFS_ATTR_LOCAL_BIT      0       /* attr is stored locally */
 #define        XFS_ATTR_ROOT_BIT       1       /* limit access to trusted 
attrs */
 #define        XFS_ATTR_SECURE_BIT     2       /* limit access to secure attrs 
*/
+#define        XFS_ATTR_PARENT_BIT     3       /* parent pointer attrs */
 #define        XFS_ATTR_INCOMPLETE_BIT 7       /* attr in middle of 
create/delete */
 #define XFS_ATTR_LOCAL         (1u << XFS_ATTR_LOCAL_BIT)
 #define XFS_ATTR_ROOT          (1u << XFS_ATTR_ROOT_BIT)
 #define XFS_ATTR_SECURE                (1u << XFS_ATTR_SECURE_BIT)
+#define XFS_ATTR_PARENT                (1u << XFS_ATTR_PARENT_BIT)
 #define XFS_ATTR_INCOMPLETE    (1u << XFS_ATTR_INCOMPLETE_BIT)
-#define XFS_ATTR_NSP_ONDISK_MASK       (XFS_ATTR_ROOT | XFS_ATTR_SECURE)
+#define XFS_ATTR_NSP_ONDISK_MASK \
+                       (XFS_ATTR_ROOT | XFS_ATTR_SECURE | XFS_ATTR_PARENT)
 
 /*
  * Alignment for namelist and valuelist entries (since they are mixed
diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h
index ae9c99762a24..727b5a858028 100644
--- a/fs/xfs/libxfs/xfs_log_format.h
+++ b/fs/xfs/libxfs/xfs_log_format.h
@@ -967,6 +967,7 @@ struct xfs_icreate_log {
  */
 #define XFS_ATTRI_FILTER_MASK          (XFS_ATTR_ROOT | \
                                         XFS_ATTR_SECURE | \
+                                        XFS_ATTR_PARENT | \
                                         XFS_ATTR_INCOMPLETE)
 
 /*
diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c
index 31529b9bf389..9d2e33743ecd 100644
--- a/fs/xfs/scrub/attr.c
+++ b/fs/xfs/scrub/attr.c
@@ -441,7 +441,7 @@ xchk_xattr_rec(
        /* Retrieve the entry and check it. */
        hash = be32_to_cpu(ent->hashval);
        badflags = ~(XFS_ATTR_LOCAL | XFS_ATTR_ROOT | XFS_ATTR_SECURE |
-                       XFS_ATTR_INCOMPLETE);
+                       XFS_ATTR_INCOMPLETE | XFS_ATTR_PARENT);
        if ((ent->flags & badflags) != 0)
                xchk_da_set_corrupt(ds, level);
        if (ent->flags & XFS_ATTR_LOCAL) {
-- 
2.38.4

Reply via email to