Add the parent inode information to the header files.
Make sure that xfs_repair does not think the non-printable
values in parent pointer extended attribute type is an
indication of a corrupted extened attribute entry.
---
include/libxfs.h | 1 +
include/xfs_da_format.h | 12 ++++++++----
libxfs/xfs.h | 1 +
repair/attr_repair.c | 18 +++++++++++-------
4 files changed, 21 insertions(+), 11 deletions(-)
Index: b/include/libxfs.h
===================================================================
--- a/include/libxfs.h
+++ b/include/libxfs.h
@@ -603,6 +603,7 @@ typedef struct xfs_inode {
#define LIBXFS_ATTR_SECURE 0x0008 /* use attrs in security namespace */
#define LIBXFS_ATTR_CREATE 0x0010 /* create, but fail if attr exists */
#define LIBXFS_ATTR_REPLACE 0x0020 /* set, but fail if attr not exists */
+#define LIBXFS_ATTR_PARENT 0x0040 /* parent pointer entry */
/*
* Project quota id helpers (previously projid was 16bit only and using two
Index: b/include/xfs_da_format.h
===================================================================
--- a/include/xfs_da_format.h
+++ b/include/xfs_da_format.h
@@ -1242,24 +1242,28 @@ struct xfs_attr3_icleaf_hdr {
#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 entry */
#define XFS_ATTR_INCOMPLETE_BIT 7 /* attr in middle of
create/delete */
#define XFS_ATTR_LOCAL (1 << XFS_ATTR_LOCAL_BIT)
#define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT)
#define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT)
+#define XFS_ATTR_PARENT (1 << XFS_ATTR_PARENT_BIT)
#define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT)
/*
* Conversion macros for converting namespace bits from argument flags
* to ondisk flags.
*/
-#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE)
-#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE)
+#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE | ATTR_PARENT)
+#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE |
XFS_ATTR_PARENT)
#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK)
#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK)
#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0)
|\
- ((x) & ATTR_SECURE ? XFS_ATTR_SECURE :
0))
+ ((x) & ATTR_SECURE ? XFS_ATTR_SECURE :
0) | \
+ ((x) & ATTR_PARENT ? XFS_ATTR_PARENT :
0))
#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0)
|\
- ((x) & XFS_ATTR_SECURE ? ATTR_SECURE :
0))
+ ((x) & XFS_ATTR_SECURE ? ATTR_SECURE :
0) | \
+ ((x) & XFS_ATTR_PARENT ? ATTR_PARENT :
0))
/*
* Alignment for namelist and valuelist entries (since they are mixed
Index: b/libxfs/xfs.h
===================================================================
--- a/libxfs/xfs.h
+++ b/libxfs/xfs.h
@@ -97,6 +97,7 @@ typedef struct xfs_bmalloca {
#define ATTR_SECURE LIBXFS_ATTR_SECURE
#define ATTR_CREATE LIBXFS_ATTR_CREATE
#define ATTR_REPLACE LIBXFS_ATTR_REPLACE
+#define ATTR_PARENT LIBXFS_ATTR_PARENT
#define ATTR_KERNOTIME 0
#define ATTR_KERNOVAL 0
Index: b/repair/attr_repair.c
===================================================================
--- a/repair/attr_repair.c
+++ b/repair/attr_repair.c
@@ -17,6 +17,7 @@
*/
#include <libxfs.h>
+#include <xfs_attr_leaf.h>
#include "globals.h"
#include "err_protos.h"
#include "attr_repair.h"
@@ -880,7 +881,8 @@ process_shortform_attr(
/* namecheck checks for / and null terminated for file names.
* attributes names currently follow the same rules.
*/
- if (namecheck((char *)¤tentry->nameval[0],
+ if (!(currententry->flags & XFS_ATTR_PARENT) &&
+ namecheck((char *)¤tentry->nameval[0],
currententry->namelen)) {
do_warn(
_("entry contains illegal character in shortform attribute name\n"));
@@ -1026,8 +1028,9 @@ process_leaf_attr_local(
xfs_attr_leaf_name_local_t *local;
local = xfs_attr3_leaf_name_local(leaf, i);
- if (local->namelen == 0 || namecheck((char *)&local->nameval[0],
- local->namelen)) {
+ if (local->namelen == 0 ||
+ (!(entry->flags & XFS_ATTR_PARENT) &&
+ namecheck((char *)&local->nameval[0], local->namelen))) {
do_warn(
_("attribute entry %d in attr block %u, inode %" PRIu64 " has bad name
(namelen = %d)\n"),
i, da_bno, ino, local->namelen);
@@ -1081,10 +1084,11 @@ process_leaf_attr_remote(
remotep = xfs_attr3_leaf_name_remote(leaf, i);
- if (remotep->namelen == 0 || namecheck((char *)&remotep->name[0],
- remotep->namelen) ||
- be32_to_cpu(entry->hashval) !=
- libxfs_da_hashname((uchar_t
*)&remotep->name[0],
+ if (remotep->namelen == 0 ||
+ (!(entry->flags & XFS_ATTR_PARENT) &&
+ namecheck((char *)&remotep->name[0],remotep->namelen)) ||
+ be32_to_cpu(entry->hashval) !=
+ libxfs_da_hashname((uchar_t *)&remotep->name[0],
remotep->namelen) ||
be32_to_cpu(entry->hashval) < last_hashval ||
be32_to_cpu(remotep->valueblk) == 0) {
|