From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@redhat.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH v2 5/7] xfs_db: print attribute remote value blocks
Date: Tue, 1 Aug 2017 14:04:49 -0700 [thread overview]
Message-ID: <20170801210449.GK4477@magnolia> (raw)
In-Reply-To: <150153523972.26081.18217476990683895058.stgit@magnolia>
Teach xfs_db how to print the contents of xattr remote value blocks.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
v2: update manpage, fix some field placement and function naming problems
---
db/attr.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
db/attr.h | 1 +
db/field.c | 3 +++
db/field.h | 1 +
man/man8/xfs_db.8 | 38 ++++++++++++++++++++++++++++++--
5 files changed, 104 insertions(+), 2 deletions(-)
diff --git a/db/attr.c b/db/attr.c
index 23ffcd5..0284fd4 100644
--- a/db/attr.c
+++ b/db/attr.c
@@ -41,6 +41,10 @@ static int attr_leaf_nvlist_offset(void *obj, int startoff, int idx);
static int attr_node_btree_count(void *obj, int startoff);
static int attr_node_hdr_count(void *obj, int startoff);
+static int attr_remote_data_count(void *obj, int startoff);
+static int attr3_remote_hdr_count(void *obj, int startoff);
+static int attr3_remote_data_count(void *obj, int startoff);
+
const field_t attr_hfld[] = {
{ "", FLDT_ATTR, OI(0), C1, 0, TYP_NONE },
{ NULL }
@@ -53,6 +57,8 @@ const field_t attr_flds[] = {
FLD_COUNT, TYP_NONE },
{ "hdr", FLDT_ATTR_NODE_HDR, OI(NOFF(hdr)), attr_node_hdr_count,
FLD_COUNT, TYP_NONE },
+ { "data", FLDT_CHARNS, OI(0), attr_remote_data_count, FLD_COUNT,
+ TYP_NONE },
{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(LOFF(entries)),
attr_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
{ "btree", FLDT_ATTR_NODE_ENTRY, OI(NOFF(__btree)), attr_node_btree_count,
@@ -197,6 +203,35 @@ attr3_leaf_hdr_count(
return be16_to_cpu(leaf->hdr.info.hdr.magic) == XFS_ATTR3_LEAF_MAGIC;
}
+static int
+attr_remote_data_count(
+ void *obj,
+ int startoff)
+{
+ if (attr_leaf_hdr_count(obj, startoff) == 0 &&
+ attr_node_hdr_count(obj, startoff) == 0)
+ return mp->m_sb.sb_blocksize;
+ return 0;
+}
+
+static int
+attr3_remote_data_count(
+ void *obj,
+ int startoff)
+{
+ struct xfs_attr3_rmt_hdr *hdr = obj;
+ size_t buf_space;
+
+ ASSERT(startoff == 0);
+
+ if (hdr->rm_magic != cpu_to_be32(XFS_ATTR3_RMT_MAGIC))
+ return 0;
+ buf_space = XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize);
+ if (be32_to_cpu(hdr->rm_bytes) > buf_space)
+ return buf_space;
+ return be32_to_cpu(hdr->rm_bytes);
+}
+
typedef int (*attr_leaf_entry_walk_f)(struct xfs_attr_leafblock *,
struct xfs_attr_leaf_entry *, int);
static int
@@ -477,6 +512,17 @@ attr3_node_hdr_count(
return be16_to_cpu(node->hdr.info.hdr.magic) == XFS_DA3_NODE_MAGIC;
}
+static int
+attr3_remote_hdr_count(
+ void *obj,
+ int startoff)
+{
+ struct xfs_attr3_rmt_hdr *node = obj;
+
+ ASSERT(startoff == 0);
+ return be32_to_cpu(node->rm_magic) == XFS_ATTR3_RMT_MAGIC;
+}
+
int
attr_size(
void *obj,
@@ -501,6 +547,10 @@ const field_t attr3_flds[] = {
FLD_COUNT, TYP_NONE },
{ "hdr", FLDT_ATTR3_NODE_HDR, OI(N3OFF(hdr)), attr3_node_hdr_count,
FLD_COUNT, TYP_NONE },
+ { "hdr", FLDT_ATTR3_REMOTE_HDR, OI(0), attr3_remote_hdr_count,
+ FLD_COUNT, TYP_NONE },
+ { "data", FLDT_CHARNS, OI(bitize(sizeof(struct xfs_attr3_rmt_hdr))),
+ attr3_remote_data_count, FLD_COUNT, TYP_NONE },
{ "entries", FLDT_ATTR_LEAF_ENTRY, OI(L3OFF(entries)),
attr3_leaf_entries_count, FLD_ARRAY|FLD_COUNT, TYP_NONE },
{ "btree", FLDT_ATTR_NODE_ENTRY, OI(N3OFF(__btree)),
@@ -543,6 +593,19 @@ const field_t attr3_node_hdr_flds[] = {
{ NULL }
};
+#define RM3OFF(f) bitize(offsetof(struct xfs_attr3_rmt_hdr, rm_ ## f))
+const struct field attr3_remote_crc_flds[] = {
+ { "magic", FLDT_UINT32X, OI(RM3OFF(magic)), C1, 0, TYP_NONE },
+ { "offset", FLDT_UINT32D, OI(RM3OFF(offset)), C1, 0, TYP_NONE },
+ { "bytes", FLDT_UINT32D, OI(RM3OFF(bytes)), C1, 0, TYP_NONE },
+ { "crc", FLDT_CRC, OI(RM3OFF(crc)), C1, 0, TYP_NONE },
+ { "uuid", FLDT_UUID, OI(RM3OFF(uuid)), C1, 0, TYP_NONE },
+ { "owner", FLDT_INO, OI(RM3OFF(owner)), C1, 0, TYP_NONE },
+ { "bno", FLDT_DFSBNO, OI(RM3OFF(blkno)), C1, 0, TYP_BMAPBTD },
+ { "lsn", FLDT_UINT64X, OI(RM3OFF(lsn)), C1, 0, TYP_NONE },
+ { NULL }
+};
+
/*
* Special read verifier for attribute buffers. Detect the magic number
* appropriately and set the correct verifier and call it.
diff --git a/db/attr.h b/db/attr.h
index 21848c1..565d6d8 100644
--- a/db/attr.h
+++ b/db/attr.h
@@ -32,6 +32,7 @@ extern const field_t attr3_leaf_hdr_flds[];
extern const field_t attr3_node_hdr_flds[];
extern const field_t attr3_blkinfo_flds[];
extern const field_t attr3_node_hdr_flds[];
+extern const field_t attr3_remote_crc_flds[];
extern int attr_leaf_name_size(void *obj, int startoff, int idx);
extern int attr_size(void *obj, int startoff, int idx);
diff --git a/db/field.c b/db/field.c
index f1e5f35..ae4c805 100644
--- a/db/field.c
+++ b/db/field.c
@@ -99,6 +99,9 @@ const ftattr_t ftattrtab[] = {
{ FLDT_ATTR3_NODE_HDR, "attr3_node_hdr", NULL,
(char *)attr3_node_hdr_flds, SI(bitsz(struct xfs_da3_node_hdr)),
0, NULL, attr3_node_hdr_flds },
+ { FLDT_ATTR3_REMOTE_HDR, "attr3_remote_hdr", NULL,
+ (char *)attr3_remote_crc_flds, attr_size, FTARG_SIZE, NULL,
+ attr3_remote_crc_flds },
{ FLDT_BMAPBTA, "bmapbta", NULL, (char *)bmapbta_flds, btblock_size,
FTARG_SIZE, NULL, bmapbta_flds },
diff --git a/db/field.h b/db/field.h
index d1a7095..a8df29b 100644
--- a/db/field.h
+++ b/db/field.h
@@ -47,6 +47,7 @@ typedef enum fldt {
FLDT_ATTR3_BLKINFO,
FLDT_ATTR3_LEAF_HDR,
FLDT_ATTR3_NODE_HDR,
+ FLDT_ATTR3_REMOTE_HDR,
FLDT_BMAPBTA,
FLDT_BMAPBTA_CRC,
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index b3129f7..043985e 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -940,8 +940,7 @@ version 1 and version 2 directories, see type
.B dir
for a description. Leaf blocks can refer to "local" or "remote" attribute
values. Local values are stored directly in the leaf block.
-Remote values are stored in an independent block in the attribute fork
-(with no structure). Leaf blocks contain the following fields:
+Leaf blocks contain the following fields:
.RS 1.4i
.PD 0
.TP 1.2i
@@ -989,6 +988,41 @@ Fields present for local values:
(fork block number of containing the value).
.PD
.RE
+.IP
+Remote values are stored in an independent block in the attribute fork.
+Prior to v5, value blocks had no structure, but in v5 they acquired a header
+structure with the following fields:
+.RS 1.4i
+.PD 0
+.TP 1.2i
+.B magic
+attr3 remote block magic number, 0x5841524d ('XARM').
+.TP
+.B offset
+Byte offset of this data block within the overall attribute value.
+.TP
+.B bytes
+Number of bytes stored in this block.
+.TP
+.B crc
+Checksum of the attribute block contents.
+.TP
+.B uuid
+Filesystem UUID.
+.TP
+.B owner
+Inode that owns this attribute value.
+.TP
+.B bno
+Block offset of this block within the inode's attribute fork.
+.TP
+.B lsn
+Log serial number of the last time this block was logged.
+.TP
+.B data
+The attribute value data.
+.PD
+.RE
.TP
.B bmapbt
Files with many extents in their data or attribute fork will have the
next prev parent reply other threads:[~2017-08-01 21:04 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-31 21:06 [PATCH 0/7] xfsprogs: 4.13 rollup Darrick J. Wong
2017-07-31 21:06 ` [PATCH 1/7] xfs: remove double-underscore integer types Darrick J. Wong
2017-07-31 21:23 ` Eric Sandeen
2017-07-31 21:25 ` Darrick J. Wong
2017-08-02 9:13 ` Carlos Maiolino
2017-08-02 16:01 ` Darrick J. Wong
2017-07-31 21:07 ` [PATCH 2/7] xfs_repair: fix symlink target length checks by changing MAXPATHLEN to XFS_SYMLINK_MAXLEN Darrick J. Wong
2017-07-31 21:42 ` Eric Sandeen
2017-08-02 9:14 ` Carlos Maiolino
2017-07-31 21:07 ` [PATCH 3/7] xfs_db: fix metadump redirection (again) Darrick J. Wong
2017-07-31 21:57 ` Eric Sandeen
2017-08-01 16:23 ` [PATCH v2 " Darrick J. Wong
2017-08-02 9:17 ` Carlos Maiolino
2017-07-31 21:07 ` [PATCH 4/7] xfs_db: dump dir/attr btrees Darrick J. Wong
2017-07-31 22:05 ` Eric Sandeen
2017-08-01 14:59 ` Darrick J. Wong
2017-08-01 15:40 ` [PATCH v2 " Darrick J. Wong
2017-08-01 16:21 ` Eric Sandeen
2017-08-02 9:22 ` Carlos Maiolino
2017-08-02 9:24 ` Carlos Maiolino
2017-08-02 16:03 ` Darrick J. Wong
2017-07-31 21:07 ` [PATCH 5/7] xfs_db: print attribute remote value blocks Darrick J. Wong
2017-08-01 17:15 ` Eric Sandeen
2017-08-01 20:29 ` Darrick J. Wong
2017-08-01 21:04 ` Darrick J. Wong [this message]
2017-08-02 9:36 ` [PATCH v2 " Carlos Maiolino
2017-07-31 21:07 ` [PATCH 6/7] xfs_db: write values into dir/attr blocks and recalculate CRCs Darrick J. Wong
2017-08-02 9:40 ` Carlos Maiolino
2017-08-03 16:02 ` Eric Sandeen
2017-08-03 16:40 ` Darrick J. Wong
2017-07-31 21:07 ` [PATCH 7/7] xfs_db: introduce fuzz command Darrick J. Wong
2017-08-02 11:06 ` Carlos Maiolino
2017-08-03 16:47 ` [PATCH 8/7] xfs_db: use TYP_F_CRC_FUNC for inodes & dquots Eric Sandeen
2017-08-03 16:58 ` Darrick J. Wong
2017-08-03 17:15 ` [PATCH 8/7 V2] " Eric Sandeen
2017-08-03 18:05 ` Darrick J. Wong
2017-08-03 17:04 ` [PATCH 9/7] xfs_db: btdump should avoid eval for push and pop of cursor Darrick J. Wong
2017-08-03 17:18 ` Eric Sandeen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170801210449.GK4477@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox