From: "Darrick J. Wong" <djwong@kernel.org>
To: cem@kernel.org, djwong@kernel.org
Cc: Christoph Hellwig <hch@lst.de>,
Dave Chinner <dchinner@redhat.com>,
Chandan Babu R <chandanbabu@kernel.org>,
Bill O'Donnell <bodonnel@redhat.com>,
linux-xfs@vger.kernel.org
Subject: [PATCH 60/67] xfs: remove struct xfs_attr_shortform
Date: Wed, 17 Apr 2024 14:37:25 -0700 [thread overview]
Message-ID: <171338843241.1853449.9409672417803943825.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <171338842269.1853449.4066376212453408283.stgit@frogsfrogsfrogs>
From: Christoph Hellwig <hch@lst.de>
Source kernel commit: 414147225400a0c4562ebfb0fdd40f065099ede4
sparse complains about struct xfs_attr_shortform because it embeds a
structure with a variable sized array in a variable sized array.
Given that xfs_attr_shortform is not a very useful structure, and the
dir2 equivalent has been removed a long time ago, remove it as well.
Provide a xfs_attr_sf_firstentry helper that returns the first
xfs_attr_sf_entry behind a xfs_attr_sf_hdr to replace the structure
dereference.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
Reviewed-by: Bill O'Donnell <bodonnel@redhat.com>
---
db/attrshort.c | 33 ++++++++++++++++-----------------
db/check.c | 8 ++++----
db/inode.c | 6 +++---
db/metadump.c | 16 +++++++---------
libxfs/libxfs_api_defs.h | 2 ++
libxfs/xfs_attr.c | 4 ++--
libxfs/xfs_attr_leaf.c | 37 ++++++++++++++++++-------------------
libxfs/xfs_attr_leaf.h | 2 +-
libxfs/xfs_attr_sf.h | 13 ++++++++++---
libxfs/xfs_da_format.h | 31 ++++++++++++++++++-------------
libxfs/xfs_inode_fork.c | 5 ++---
libxfs/xfs_ondisk.h | 14 +++++++-------
repair/attr_repair.c | 44 ++++++++++++++++++++------------------------
repair/dinode.c | 21 +++++++++++----------
14 files changed, 121 insertions(+), 115 deletions(-)
diff --git a/db/attrshort.c b/db/attrshort.c
index e234fbd83..c98b90be3 100644
--- a/db/attrshort.c
+++ b/db/attrshort.c
@@ -18,9 +18,8 @@ static int attr_sf_entry_value_offset(void *obj, int startoff, int idx);
static int attr_shortform_list_count(void *obj, int startoff);
static int attr_shortform_list_offset(void *obj, int startoff, int idx);
-#define OFF(f) bitize(offsetof(struct xfs_attr_shortform, f))
const field_t attr_shortform_flds[] = {
- { "hdr", FLDT_ATTR_SF_HDR, OI(OFF(hdr)), C1, 0, TYP_NONE },
+ { "hdr", FLDT_ATTR_SF_HDR, OI(0), C1, 0, TYP_NONE },
{ "list", FLDT_ATTR_SF_ENTRY, attr_shortform_list_offset,
attr_shortform_list_count, FLD_ARRAY|FLD_COUNT|FLD_OFFSET, TYP_NONE },
{ NULL }
@@ -71,11 +70,11 @@ attr_sf_entry_size(
{
struct xfs_attr_sf_entry *e;
int i;
- struct xfs_attr_shortform *sf;
+ struct xfs_attr_sf_hdr *hdr;
ASSERT(bitoffs(startoff) == 0);
- sf = (struct xfs_attr_shortform *)((char *)obj + byteize(startoff));
- e = &sf->list[0];
+ hdr = (struct xfs_attr_sf_hdr *)((char *)obj + byteize(startoff));
+ e = libxfs_attr_sf_firstentry(hdr);
for (i = 0; i < idx; i++)
e = xfs_attr_sf_nextentry(e);
return bitize((int)xfs_attr_sf_entsize(e));
@@ -113,11 +112,11 @@ attr_shortform_list_count(
void *obj,
int startoff)
{
- struct xfs_attr_shortform *sf;
+ struct xfs_attr_sf_hdr *hdr;
ASSERT(bitoffs(startoff) == 0);
- sf = (struct xfs_attr_shortform *)((char *)obj + byteize(startoff));
- return sf->hdr.count;
+ hdr = (struct xfs_attr_sf_hdr *)((char *)obj + byteize(startoff));
+ return hdr->count;
}
static int
@@ -128,14 +127,14 @@ attr_shortform_list_offset(
{
struct xfs_attr_sf_entry *e;
int i;
- struct xfs_attr_shortform *sf;
+ struct xfs_attr_sf_hdr *hdr;
ASSERT(bitoffs(startoff) == 0);
- sf = (struct xfs_attr_shortform *)((char *)obj + byteize(startoff));
- e = &sf->list[0];
+ hdr = (struct xfs_attr_sf_hdr *)((char *)obj + byteize(startoff));
+ e = libxfs_attr_sf_firstentry(hdr);
for (i = 0; i < idx; i++)
e = xfs_attr_sf_nextentry(e);
- return bitize((int)((char *)e - (char *)sf));
+ return bitize((int)((char *)e - (char *)hdr));
}
/*ARGSUSED*/
@@ -147,13 +146,13 @@ attrshort_size(
{
struct xfs_attr_sf_entry *e;
int i;
- struct xfs_attr_shortform *sf;
+ struct xfs_attr_sf_hdr *hdr;
ASSERT(bitoffs(startoff) == 0);
ASSERT(idx == 0);
- sf = (struct xfs_attr_shortform *)((char *)obj + byteize(startoff));
- e = &sf->list[0];
- for (i = 0; i < sf->hdr.count; i++)
+ hdr = (struct xfs_attr_sf_hdr *)((char *)obj + byteize(startoff));
+ e = libxfs_attr_sf_firstentry(hdr);
+ for (i = 0; i < hdr->count; i++)
e = xfs_attr_sf_nextentry(e);
- return bitize((int)((char *)e - (char *)sf));
+ return bitize((int)((char *)e - (char *)hdr));
}
diff --git a/db/check.c b/db/check.c
index 91d0c0940..0a53ab7df 100644
--- a/db/check.c
+++ b/db/check.c
@@ -3069,7 +3069,7 @@ process_lclinode(
blkmap_t **blkmapp,
int whichfork)
{
- struct xfs_attr_shortform *asf;
+ struct xfs_attr_sf_hdr *hdr;
xfs_fsblock_t bno;
bno = XFS_INO_TO_FSB(mp, id->ino);
@@ -3082,12 +3082,12 @@ process_lclinode(
error++;
}
else if (whichfork == XFS_ATTR_FORK) {
- asf = (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip);
- if (be16_to_cpu(asf->hdr.totsize) > XFS_DFORK_ASIZE(dip, mp)) {
+ hdr = XFS_DFORK_APTR(dip);
+ if (be16_to_cpu(hdr->totsize) > XFS_DFORK_ASIZE(dip, mp)) {
if (!sflag || id->ilist || CHECK_BLIST(bno))
dbprintf(_("local inode %lld attr is too large "
"(size %d)\n"),
- id->ino, be16_to_cpu(asf->hdr.totsize));
+ id->ino, be16_to_cpu(hdr->totsize));
error++;
}
}
diff --git a/db/inode.c b/db/inode.c
index c9b506b90..7a5f5a0cb 100644
--- a/db/inode.c
+++ b/db/inode.c
@@ -356,7 +356,7 @@ inode_a_size(
int startoff,
int idx)
{
- struct xfs_attr_shortform *asf;
+ struct xfs_attr_sf_hdr *hdr;
struct xfs_dinode *dip;
ASSERT(startoff == 0);
@@ -364,8 +364,8 @@ inode_a_size(
dip = obj;
switch (dip->di_aformat) {
case XFS_DINODE_FMT_LOCAL:
- asf = (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip);
- return bitize(be16_to_cpu(asf->hdr.totsize));
+ hdr = XFS_DFORK_APTR(dip);
+ return bitize(be16_to_cpu(hdr->totsize));
case XFS_DINODE_FMT_EXTENTS:
return (int)xfs_dfork_attr_extents(dip) * bitsz(xfs_bmbt_rec_t);
case XFS_DINODE_FMT_BTREE:
diff --git a/db/metadump.c b/db/metadump.c
index bac35b9cc..536d089fb 100644
--- a/db/metadump.c
+++ b/db/metadump.c
@@ -1035,16 +1035,15 @@ process_sf_attr(
* values with 'v' (to see a valid string length, as opposed to NULLs)
*/
- struct xfs_attr_shortform *asfp;
- struct xfs_attr_sf_entry *asfep;
+ struct xfs_attr_sf_hdr *hdr = XFS_DFORK_APTR(dip);
+ struct xfs_attr_sf_entry *asfep = libxfs_attr_sf_firstentry(hdr);
int ino_attr_size;
int i;
- asfp = (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip);
- if (asfp->hdr.count == 0)
+ if (hdr->count == 0)
return;
- ino_attr_size = be16_to_cpu(asfp->hdr.totsize);
+ ino_attr_size = be16_to_cpu(hdr->totsize);
if (ino_attr_size > XFS_DFORK_ASIZE(dip, mp)) {
ino_attr_size = XFS_DFORK_ASIZE(dip, mp);
if (metadump.show_warnings)
@@ -1052,9 +1051,8 @@ process_sf_attr(
(long long)metadump.cur_ino);
}
- asfep = &asfp->list[0];
- for (i = 0; (i < asfp->hdr.count) &&
- ((char *)asfep - (char *)asfp < ino_attr_size); i++) {
+ for (i = 0; (i < hdr->count) &&
+ ((char *)asfep - (char *)hdr < ino_attr_size); i++) {
int namelen = asfep->namelen;
@@ -1063,7 +1061,7 @@ process_sf_attr(
print_warning("zero length attr entry in inode "
"%llu", (long long)metadump.cur_ino);
break;
- } else if ((char *)asfep - (char *)asfp +
+ } else if ((char *)asfep - (char *)hdr +
xfs_attr_sf_entsize(asfep) > ino_attr_size) {
if (metadump.show_warnings)
print_warning("attr entry length in inode %llu "
diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
index 7c055e8aa..36afc5d02 100644
--- a/libxfs/libxfs_api_defs.h
+++ b/libxfs/libxfs_api_defs.h
@@ -40,6 +40,8 @@
#define xfs_attr_leaf_newentsize libxfs_attr_leaf_newentsize
#define xfs_attr_namecheck libxfs_attr_namecheck
#define xfs_attr_set libxfs_attr_set
+#define xfs_attr_sf_firstentry libxfs_attr_sf_firstentry
+#define xfs_attr_shortform_verify libxfs_attr_shortform_verify
#define __xfs_bmap_add_free __libxfs_bmap_add_free
#define xfs_bmapi_read libxfs_bmapi_read
diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c
index a383024db..055d20410 100644
--- a/libxfs/xfs_attr.c
+++ b/libxfs/xfs_attr.c
@@ -1050,9 +1050,9 @@ xfs_attr_set(
static inline int xfs_attr_sf_totsize(struct xfs_inode *dp)
{
- struct xfs_attr_shortform *sf = dp->i_af.if_data;
+ struct xfs_attr_sf_hdr *sf = dp->i_af.if_data;
- return be16_to_cpu(sf->hdr.totsize);
+ return be16_to_cpu(sf->totsize);
}
/*
diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c
index 9b6dcff34..cf172b6ea 100644
--- a/libxfs/xfs_attr_leaf.c
+++ b/libxfs/xfs_attr_leaf.c
@@ -701,10 +701,10 @@ struct xfs_attr_sf_entry *
xfs_attr_sf_findname(
struct xfs_da_args *args)
{
- struct xfs_attr_shortform *sf = args->dp->i_af.if_data;
+ struct xfs_attr_sf_hdr *sf = args->dp->i_af.if_data;
struct xfs_attr_sf_entry *sfe;
- for (sfe = &sf->list[0];
+ for (sfe = xfs_attr_sf_firstentry(sf);
sfe < xfs_attr_sf_endptr(sf);
sfe = xfs_attr_sf_nextentry(sfe)) {
if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
@@ -727,7 +727,7 @@ xfs_attr_shortform_add(
struct xfs_inode *dp = args->dp;
struct xfs_mount *mp = dp->i_mount;
struct xfs_ifork *ifp = &dp->i_af;
- struct xfs_attr_shortform *sf = ifp->if_data;
+ struct xfs_attr_sf_hdr *sf = ifp->if_data;
struct xfs_attr_sf_entry *sfe;
int size;
@@ -747,8 +747,8 @@ xfs_attr_shortform_add(
sfe->flags = args->attr_filter;
memcpy(sfe->nameval, args->name, args->namelen);
memcpy(&sfe->nameval[args->namelen], args->value, args->valuelen);
- sf->hdr.count++;
- be16_add_cpu(&sf->hdr.totsize, size);
+ sf->count++;
+ be16_add_cpu(&sf->totsize, size);
xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
xfs_sbversion_add_attr2(mp, args->trans);
@@ -779,9 +779,9 @@ xfs_attr_sf_removename(
{
struct xfs_inode *dp = args->dp;
struct xfs_mount *mp = dp->i_mount;
- struct xfs_attr_shortform *sf = dp->i_af.if_data;
+ struct xfs_attr_sf_hdr *sf = dp->i_af.if_data;
struct xfs_attr_sf_entry *sfe;
- uint16_t totsize = be16_to_cpu(sf->hdr.totsize);
+ uint16_t totsize = be16_to_cpu(sf->totsize);
void *next, *end;
int size = 0;
@@ -806,9 +806,9 @@ xfs_attr_sf_removename(
end = xfs_attr_sf_endptr(sf);
if (next < end)
memmove(sfe, next, end - next);
- sf->hdr.count--;
+ sf->count--;
totsize -= size;
- sf->hdr.totsize = cpu_to_be16(totsize);
+ sf->totsize = cpu_to_be16(totsize);
/*
* Fix up the start offset of the attribute fork
@@ -865,21 +865,21 @@ xfs_attr_shortform_to_leaf(
{
struct xfs_inode *dp = args->dp;
struct xfs_ifork *ifp = &dp->i_af;
- struct xfs_attr_shortform *sf = ifp->if_data;
+ struct xfs_attr_sf_hdr *sf = ifp->if_data;
struct xfs_attr_sf_entry *sfe;
+ int size = be16_to_cpu(sf->totsize);
struct xfs_da_args nargs;
char *tmpbuffer;
- int error, i, size;
+ int error, i;
xfs_dablk_t blkno;
struct xfs_buf *bp;
trace_xfs_attr_sf_to_leaf(args);
- size = be16_to_cpu(sf->hdr.totsize);
tmpbuffer = kmem_alloc(size, 0);
ASSERT(tmpbuffer != NULL);
memcpy(tmpbuffer, ifp->if_data, size);
- sf = (struct xfs_attr_shortform *)tmpbuffer;
+ sf = (struct xfs_attr_sf_hdr *)tmpbuffer;
xfs_idata_realloc(dp, -size, XFS_ATTR_FORK);
xfs_bmap_local_to_extents_empty(args->trans, dp, XFS_ATTR_FORK);
@@ -902,8 +902,8 @@ xfs_attr_shortform_to_leaf(
nargs.trans = args->trans;
nargs.op_flags = XFS_DA_OP_OKNOENT;
- sfe = &sf->list[0];
- for (i = 0; i < sf->hdr.count; i++) {
+ sfe = xfs_attr_sf_firstentry(sf);
+ for (i = 0; i < sf->count; i++) {
nargs.name = sfe->nameval;
nargs.namelen = sfe->namelen;
nargs.value = &sfe->nameval[nargs.namelen];
@@ -970,10 +970,10 @@ xfs_attr_shortform_allfit(
/* Verify the consistency of a raw inline attribute fork. */
xfs_failaddr_t
xfs_attr_shortform_verify(
- struct xfs_attr_shortform *sfp,
+ struct xfs_attr_sf_hdr *sfp,
size_t size)
{
- struct xfs_attr_sf_entry *sfep;
+ struct xfs_attr_sf_entry *sfep = xfs_attr_sf_firstentry(sfp);
struct xfs_attr_sf_entry *next_sfep;
char *endp;
int i;
@@ -987,8 +987,7 @@ xfs_attr_shortform_verify(
endp = (char *)sfp + size;
/* Check all reported entries */
- sfep = &sfp->list[0];
- for (i = 0; i < sfp->hdr.count; i++) {
+ for (i = 0; i < sfp->count; i++) {
/*
* struct xfs_attr_sf_entry has a variable length.
* Check the fixed-offset parts of the structure are
diff --git a/libxfs/xfs_attr_leaf.h b/libxfs/xfs_attr_leaf.h
index 35e668ae7..9b9948639 100644
--- a/libxfs/xfs_attr_leaf.h
+++ b/libxfs/xfs_attr_leaf.h
@@ -53,7 +53,7 @@ int xfs_attr_sf_removename(struct xfs_da_args *args);
struct xfs_attr_sf_entry *xfs_attr_sf_findname(struct xfs_da_args *args);
int xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp);
int xfs_attr_shortform_bytesfit(struct xfs_inode *dp, int bytes);
-xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_attr_shortform *sfp,
+xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_attr_sf_hdr *sfp,
size_t size);
void xfs_attr_fork_remove(struct xfs_inode *ip, struct xfs_trans *tp);
diff --git a/libxfs/xfs_attr_sf.h b/libxfs/xfs_attr_sf.h
index a774d4d87..9abf7de95 100644
--- a/libxfs/xfs_attr_sf.h
+++ b/libxfs/xfs_attr_sf.h
@@ -41,7 +41,14 @@ static inline int xfs_attr_sf_entsize(struct xfs_attr_sf_entry *sfep)
return struct_size(sfep, nameval, sfep->namelen + sfep->valuelen);
}
-/* next entry in struct */
+/* first entry in the SF attr fork */
+static inline struct xfs_attr_sf_entry *
+xfs_attr_sf_firstentry(struct xfs_attr_sf_hdr *hdr)
+{
+ return (struct xfs_attr_sf_entry *)(hdr + 1);
+}
+
+/* next entry after sfep */
static inline struct xfs_attr_sf_entry *
xfs_attr_sf_nextentry(struct xfs_attr_sf_entry *sfep)
{
@@ -50,9 +57,9 @@ xfs_attr_sf_nextentry(struct xfs_attr_sf_entry *sfep)
/* pointer to the space after the last entry, e.g. for adding a new one */
static inline struct xfs_attr_sf_entry *
-xfs_attr_sf_endptr(struct xfs_attr_shortform *sf)
+xfs_attr_sf_endptr(struct xfs_attr_sf_hdr *sf)
{
- return (void *)sf + be16_to_cpu(sf->hdr.totsize);
+ return (void *)sf + be16_to_cpu(sf->totsize);
}
#endif /* __XFS_ATTR_SF_H__ */
diff --git a/libxfs/xfs_da_format.h b/libxfs/xfs_da_format.h
index f9015f88e..24f9d1461 100644
--- a/libxfs/xfs_da_format.h
+++ b/libxfs/xfs_da_format.h
@@ -578,20 +578,25 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp)
#define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */
/*
- * Entries are packed toward the top as tight as possible.
+ * Attribute storage when stored inside the inode.
+ *
+ * Small attribute lists are packed as tightly as possible so as to fit into the
+ * literal area of the inode.
+ *
+ * These "shortform" attribute forks consist of a single xfs_attr_sf_hdr header
+ * followed by zero or more xfs_attr_sf_entry structures.
*/
-struct xfs_attr_shortform {
- struct xfs_attr_sf_hdr { /* constant-structure header block */
- __be16 totsize; /* total bytes in shortform list */
- __u8 count; /* count of active entries */
- __u8 padding;
- } hdr;
- struct xfs_attr_sf_entry {
- uint8_t namelen; /* actual length of name (no NULL) */
- uint8_t valuelen; /* actual length of value (no NULL) */
- uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */
- uint8_t nameval[]; /* name & value bytes concatenated */
- } list[]; /* variable sized array */
+struct xfs_attr_sf_hdr { /* constant-structure header block */
+ __be16 totsize; /* total bytes in shortform list */
+ __u8 count; /* count of active entries */
+ __u8 padding;
+};
+
+struct xfs_attr_sf_entry {
+ __u8 namelen; /* actual length of name (no NULL) */
+ __u8 valuelen; /* actual length of value (no NULL) */
+ __u8 flags; /* flags bits (XFS_ATTR_*) */
+ __u8 nameval[]; /* name & value bytes concatenated */
};
typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */
diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c
index c95abd43a..208b283ba 100644
--- a/libxfs/xfs_inode_fork.c
+++ b/libxfs/xfs_inode_fork.c
@@ -277,10 +277,9 @@ static uint16_t
xfs_dfork_attr_shortform_size(
struct xfs_dinode *dip)
{
- struct xfs_attr_shortform *atp =
- (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip);
+ struct xfs_attr_sf_hdr *sf = XFS_DFORK_APTR(dip);
- return be16_to_cpu(atp->hdr.totsize);
+ return be16_to_cpu(sf->totsize);
}
void
diff --git a/libxfs/xfs_ondisk.h b/libxfs/xfs_ondisk.h
index d9c988c5a..81885a6a0 100644
--- a/libxfs/xfs_ondisk.h
+++ b/libxfs/xfs_ondisk.h
@@ -93,13 +93,13 @@ xfs_check_ondisk_structs(void)
XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, namelen, 8);
XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, name, 9);
XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 32);
- XFS_CHECK_STRUCT_SIZE(struct xfs_attr_shortform, 4);
- XFS_CHECK_OFFSET(struct xfs_attr_shortform, hdr.totsize, 0);
- XFS_CHECK_OFFSET(struct xfs_attr_shortform, hdr.count, 2);
- XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].namelen, 4);
- XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].valuelen, 5);
- XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].flags, 6);
- XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].nameval, 7);
+ XFS_CHECK_STRUCT_SIZE(struct xfs_attr_sf_hdr, 4);
+ XFS_CHECK_OFFSET(struct xfs_attr_sf_hdr, totsize, 0);
+ XFS_CHECK_OFFSET(struct xfs_attr_sf_hdr, count, 2);
+ XFS_CHECK_OFFSET(struct xfs_attr_sf_entry, namelen, 0);
+ XFS_CHECK_OFFSET(struct xfs_attr_sf_entry, valuelen, 1);
+ XFS_CHECK_OFFSET(struct xfs_attr_sf_entry, flags, 2);
+ XFS_CHECK_OFFSET(struct xfs_attr_sf_entry, nameval, 3);
XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12);
XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16);
XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8);
diff --git a/repair/attr_repair.c b/repair/attr_repair.c
index c3a6d5026..31c50c127 100644
--- a/repair/attr_repair.c
+++ b/repair/attr_repair.c
@@ -210,27 +210,25 @@ process_shortform_attr(
struct xfs_dinode *dip,
int *repair)
{
- struct xfs_attr_shortform *asf;
+ struct xfs_attr_sf_hdr *hdr = XFS_DFORK_APTR(dip);
struct xfs_attr_sf_entry *currententry, *nextentry, *tempentry;
int i, junkit;
int currentsize, remainingspace;
*repair = 0;
- asf = (struct xfs_attr_shortform *) XFS_DFORK_APTR(dip);
-
/* Assumption: hdr.totsize is less than a leaf block and was checked
* by lclinode for valid sizes. Check the count though.
*/
- if (asf->hdr.count == 0)
+ if (hdr->count == 0)
/* then the total size should just be the header length */
- if (be16_to_cpu(asf->hdr.totsize) != sizeof(xfs_attr_sf_hdr_t)) {
+ if (be16_to_cpu(hdr->totsize) != sizeof(xfs_attr_sf_hdr_t)) {
/* whoops there's a discrepancy. Clear the hdr */
if (!no_modify) {
do_warn(
_("there are no attributes in the fork for inode %" PRIu64 "\n"),
ino);
- asf->hdr.totsize =
+ hdr->totsize =
cpu_to_be16(sizeof(xfs_attr_sf_hdr_t));
*repair = 1;
return(1);
@@ -243,15 +241,15 @@ process_shortform_attr(
}
currentsize = sizeof(xfs_attr_sf_hdr_t);
- remainingspace = be16_to_cpu(asf->hdr.totsize) - currentsize;
- nextentry = &asf->list[0];
- for (i = 0; i < asf->hdr.count; i++) {
+ remainingspace = be16_to_cpu(hdr->totsize) - currentsize;
+ nextentry = libxfs_attr_sf_firstentry(hdr);
+ for (i = 0; i < hdr->count; i++) {
currententry = nextentry;
junkit = 0;
/* don't go off the end if the hdr.count was off */
if ((currentsize + (sizeof(struct xfs_attr_sf_entry) - 1)) >
- be16_to_cpu(asf->hdr.totsize))
+ be16_to_cpu(hdr->totsize))
break; /* get out and reset count and totSize */
/* if the namelen is 0, can't get to the rest of the entries */
@@ -326,7 +324,7 @@ process_shortform_attr(
((intptr_t) currententry +
xfs_attr_sf_entsize(currententry));
memmove(currententry,tempentry,remainingspace);
- asf->hdr.count -= 1;
+ hdr->count -= 1;
i--; /* no worries, it will wrap back to 0 */
*repair = 1;
continue; /* go back up now */
@@ -344,33 +342,33 @@ process_shortform_attr(
} /* end the loop */
- if (asf->hdr.count != i) {
+ if (hdr->count != i) {
if (no_modify) {
do_warn(
_("would have corrected attribute entry count in inode %" PRIu64 " from %d to %d\n"),
- ino, asf->hdr.count, i);
+ ino, hdr->count, i);
} else {
do_warn(
_("corrected attribute entry count in inode %" PRIu64 ", was %d, now %d\n"),
- ino, asf->hdr.count, i);
- asf->hdr.count = i;
+ ino, hdr->count, i);
+ hdr->count = i;
*repair = 1;
}
}
/* ASSUMPTION: currentsize <= totsize */
- if (be16_to_cpu(asf->hdr.totsize) != currentsize) {
+ if (be16_to_cpu(hdr->totsize) != currentsize) {
if (no_modify) {
do_warn(
_("would have corrected attribute totsize in inode %" PRIu64 " from %d to %d\n"),
- ino, be16_to_cpu(asf->hdr.totsize),
+ ino, be16_to_cpu(hdr->totsize),
currentsize);
} else {
do_warn(
_("corrected attribute entry totsize in inode %" PRIu64 ", was %d, now %d\n"),
- ino, be16_to_cpu(asf->hdr.totsize),
+ ino, be16_to_cpu(hdr->totsize),
currentsize);
- asf->hdr.totsize = cpu_to_be16(currentsize);
+ hdr->totsize = cpu_to_be16(currentsize);
*repair = 1;
}
}
@@ -1232,14 +1230,12 @@ process_attributes(
int err;
__u8 aformat = dip->di_aformat;
#ifdef DEBUG
- struct xfs_attr_shortform *asf;
-
- asf = (struct xfs_attr_shortform *) XFS_DFORK_APTR(dip);
+ struct xfs_attr_sf_hdr *hdr = XFS_DFORK_APTR(dip);
#endif
if (aformat == XFS_DINODE_FMT_LOCAL) {
- ASSERT(be16_to_cpu(asf->hdr.totsize) <=
- XFS_DFORK_ASIZE(dip, mp));
+ ASSERT(be16_to_cpu(hdr->totsize) <= XFS_DFORK_ASIZE(dip, mp));
+
err = process_shortform_attr(mp, ino, dip, repair);
} else if (aformat == XFS_DINODE_FMT_EXTENTS ||
aformat == XFS_DINODE_FMT_BTREE) {
diff --git a/repair/dinode.c b/repair/dinode.c
index c1cfadc88..636e753fc 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -99,10 +99,10 @@ _("would have cleared inode %" PRIu64 " attributes\n"), ino_num);
*/
if (!no_modify) {
- struct xfs_attr_shortform *asf = (struct xfs_attr_shortform *)
- XFS_DFORK_APTR(dino);
- asf->hdr.totsize = cpu_to_be16(sizeof(xfs_attr_sf_hdr_t));
- asf->hdr.count = 0;
+ struct xfs_attr_sf_hdr *hdr = XFS_DFORK_APTR(dino);
+
+ hdr->totsize = cpu_to_be16(sizeof(struct xfs_attr_sf_hdr));
+ hdr->count = 0;
dino->di_forkoff = 0; /* got to do this after asf is set */
}
@@ -993,7 +993,7 @@ process_lclinode(
struct xfs_dinode *dip,
int whichfork)
{
- struct xfs_attr_shortform *asf;
+ struct xfs_attr_sf_hdr *hdr;
xfs_ino_t lino;
lino = XFS_AGINO_TO_INO(mp, agno, ino);
@@ -1005,18 +1005,19 @@ process_lclinode(
XFS_DFORK_DSIZE(dip, mp));
return(1);
} else if (whichfork == XFS_ATTR_FORK) {
- asf = (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip);
- if (be16_to_cpu(asf->hdr.totsize) > XFS_DFORK_ASIZE(dip, mp)) {
+ hdr = XFS_DFORK_APTR(dip);
+
+ if (be16_to_cpu(hdr->totsize) > XFS_DFORK_ASIZE(dip, mp)) {
do_warn(
_("local inode %" PRIu64 " attr fork too large (size %d, max = %zu)\n"),
- lino, be16_to_cpu(asf->hdr.totsize),
+ lino, be16_to_cpu(hdr->totsize),
XFS_DFORK_ASIZE(dip, mp));
return(1);
}
- if (be16_to_cpu(asf->hdr.totsize) < sizeof(xfs_attr_sf_hdr_t)) {
+ if (be16_to_cpu(hdr->totsize) < sizeof(xfs_attr_sf_hdr_t)) {
do_warn(
_("local inode %" PRIu64 " attr too small (size = %d, min size = %zd)\n"),
- lino, be16_to_cpu(asf->hdr.totsize),
+ lino, be16_to_cpu(hdr->totsize),
sizeof(xfs_attr_sf_hdr_t));
return(1);
}
next prev parent reply other threads:[~2024-04-17 21:37 UTC|newest]
Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-17 21:11 [PATCHBOMB] xfsprogs: catch us up to 6.8, at least Darrick J. Wong
2024-04-17 21:15 ` [PATCHSET 01/11] xfsprogs: packaging fixes for 6.7 Darrick J. Wong
2024-04-17 21:18 ` [PATCH 1/2] debian: fix package configuration after removing platform_defs.h.in Darrick J. Wong
2024-05-01 18:00 ` Bill O'Donnell
2024-05-01 18:06 ` Bill O'Donnell
2024-04-17 21:18 ` [PATCH 2/2] libxfs: fix incorrect porting to 6.7 Darrick J. Wong
2024-04-17 21:15 ` [PATCHSET 02/11] xfsprogs: minor fixes for 6.7 Darrick J. Wong
2024-04-17 21:18 ` [PATCH 1/1] mkfs: fix log sunit rounding when external logs are in use Darrick J. Wong
2024-04-17 21:16 ` [PATCHSET 03/11] xfsprogs: convert utilities to use new rt helpers Darrick J. Wong
2024-04-17 21:19 ` [PATCH 01/11] xfs_repair: fix confusing rt space units in the duplicate detection code Darrick J. Wong
2024-04-17 21:19 ` [PATCH 02/11] libxfs: create a helper to compute leftovers of realtime extents Darrick J. Wong
2024-04-17 21:19 ` [PATCH 03/11] libxfs: use helpers to convert rt block numbers to rt extent numbers Darrick J. Wong
2024-04-17 21:19 ` [PATCH 04/11] xfs_repair: convert utility to use new rt extent helpers and types Darrick J. Wong
2024-04-17 21:20 ` [PATCH 05/11] mkfs: " Darrick J. Wong
2024-04-17 21:20 ` [PATCH 06/11] xfs_{db,repair}: convert open-coded xfs_rtword_t pointer accesses to helper Darrick J. Wong
2024-04-17 21:20 ` [PATCH 07/11] xfs_repair: convert helpers for rtbitmap block/wordcount computations Darrick J. Wong
2024-04-17 21:20 ` [PATCH 08/11] xfs_{db,repair}: use accessor functions for bitmap words Darrick J. Wong
2024-04-17 21:21 ` [PATCH 09/11] xfs_{db,repair}: use helpers for rtsummary block/wordcount computations Darrick J. Wong
2024-04-17 21:21 ` [PATCH 10/11] xfs_{db,repair}: use accessor functions for summary info words Darrick J. Wong
2024-04-17 21:21 ` [PATCH 11/11] xfs_{db,repair}: use m_blockwsize instead of sb_blocksize for rt blocks Darrick J. Wong
2024-04-17 21:16 ` [PATCHSET 04/11] libxfs: sync with 6.8 Darrick J. Wong
2024-04-17 21:22 ` [PATCH 01/67] xfs: use xfs_defer_pending objects to recover intent items Darrick J. Wong
2024-04-17 21:22 ` [PATCH 02/67] xfs: recreate work items when recovering " Darrick J. Wong
2024-04-17 21:22 ` [PATCH 03/67] xfs: use xfs_defer_finish_one to finish recovered work items Darrick J. Wong
2024-04-17 21:22 ` [PATCH 04/67] xfs: move ->iop_recover to xfs_defer_op_type Darrick J. Wong
2024-04-17 21:23 ` [PATCH 05/67] xfs: hoist intent done flag setting to ->finish_item callsite Darrick J. Wong
2024-04-17 21:23 ` [PATCH 06/67] xfs: hoist ->create_intent boilerplate to its callsite Darrick J. Wong
2024-04-17 21:23 ` [PATCH 07/67] xfs: use xfs_defer_create_done for the relogging operation Darrick J. Wong
2024-04-17 21:23 ` [PATCH 08/67] xfs: clean out XFS_LI_DIRTY setting boilerplate from ->iop_relog Darrick J. Wong
2024-04-17 21:24 ` [PATCH 09/67] xfs: hoist xfs_trans_add_item calls to defer ops functions Darrick J. Wong
2024-04-17 21:24 ` [PATCH 10/67] xfs: move ->iop_relog to struct xfs_defer_op_type Darrick J. Wong
2024-04-17 21:24 ` [PATCH 11/67] xfs: make rextslog computation consistent with mkfs Darrick J. Wong
2024-04-17 21:24 ` [PATCH 12/67] xfs: fix 32-bit truncation in xfs_compute_rextslog Darrick J. Wong
2024-04-17 21:25 ` [PATCH 13/67] xfs: don't allow overly small or large realtime volumes Darrick J. Wong
2024-04-17 21:25 ` [PATCH 14/67] xfs: elide ->create_done calls for unlogged deferred work Darrick J. Wong
2024-04-17 21:25 ` [PATCH 15/67] xfs: don't append work items to logged xfs_defer_pending objects Darrick J. Wong
2024-04-17 21:25 ` [PATCH 16/67] xfs: allow pausing of pending deferred work items Darrick J. Wong
2024-04-17 21:26 ` [PATCH 17/67] xfs: remove __xfs_free_extent_later Darrick J. Wong
2024-04-17 21:26 ` [PATCH 18/67] xfs: automatic freeing of freshly allocated unwritten space Darrick J. Wong
2024-04-17 21:26 ` [PATCH 19/67] xfs: remove unused fields from struct xbtree_ifakeroot Darrick J. Wong
2024-04-17 21:26 ` [PATCH 20/67] xfs: force small EFIs for reaping btree extents Darrick J. Wong
2024-04-17 21:27 ` [PATCH 21/67] xfs: ensure logflagsp is initialized in xfs_bmap_del_extent_real Darrick J. Wong
2024-04-17 21:27 ` [PATCH 22/67] xfs: update dir3 leaf block metadata after swap Darrick J. Wong
2024-04-17 21:27 ` [PATCH 23/67] xfs: extract xfs_da_buf_copy() helper function Darrick J. Wong
2024-04-17 21:28 ` [PATCH 24/67] xfs: move xfs_ondisk.h to libxfs/ Darrick J. Wong
2024-04-17 21:28 ` [PATCH 25/67] xfs: consolidate the xfs_attr_defer_* helpers Darrick J. Wong
2024-04-17 21:28 ` [PATCH 26/67] xfs: store an ops pointer in struct xfs_defer_pending Darrick J. Wong
2024-04-17 21:28 ` [PATCH 27/67] xfs: pass the defer ops instead of type to xfs_defer_start_recovery Darrick J. Wong
2024-04-17 21:29 ` [PATCH 28/67] xfs: pass the defer ops directly to xfs_defer_add Darrick J. Wong
2024-04-17 21:29 ` [PATCH 29/67] xfs: force all buffers to be written during btree bulk load Darrick J. Wong
2024-04-17 21:29 ` [PATCH 30/67] xfs: set XBF_DONE on newly formatted btree block that are ready for writing Darrick J. Wong
2024-04-17 21:29 ` [PATCH 31/67] xfs: read leaf blocks when computing keys for bulkloading into node blocks Darrick J. Wong
2024-04-17 21:30 ` [PATCH 32/67] xfs: move btree bulkload record initialization to ->get_record implementations Darrick J. Wong
2024-04-17 21:30 ` [PATCH 33/67] xfs: constrain dirty buffers while formatting a staged btree Darrick J. Wong
2024-04-17 21:30 ` [PATCH 34/67] xfs: repair free space btrees Darrick J. Wong
2024-04-17 21:30 ` [PATCH 35/67] xfs: repair inode btrees Darrick J. Wong
2024-04-17 21:31 ` [PATCH 36/67] xfs: repair refcount btrees Darrick J. Wong
2024-04-17 21:31 ` [PATCH 37/67] xfs: dont cast to char * for XFS_DFORK_*PTR macros Darrick J. Wong
2024-04-17 21:31 ` [PATCH 38/67] xfs: set inode sick state flags when we zap either ondisk fork Darrick J. Wong
2024-04-17 21:31 ` [PATCH 39/67] xfs: zap broken inode forks Darrick J. Wong
2024-04-17 21:32 ` [PATCH 40/67] xfs: repair inode fork block mapping data structures Darrick J. Wong
2024-04-17 21:32 ` [PATCH 41/67] xfs: create a ranged query function for refcount btrees Darrick J. Wong
2024-04-17 21:32 ` [PATCH 42/67] xfs: create a new inode fork block unmap helper Darrick J. Wong
2024-04-17 21:32 ` [PATCH 43/67] xfs: improve dquot iteration for scrub Darrick J. Wong
2024-04-17 21:33 ` [PATCH 44/67] xfs: add lock protection when remove perag from radix tree Darrick J. Wong
2024-04-17 21:33 ` [PATCH 45/67] xfs: fix perag leak when growfs fails Darrick J. Wong
2024-04-17 21:33 ` [PATCH 46/67] xfs: remove the xfs_alloc_arg argument to xfs_bmap_btalloc_accounting Darrick J. Wong
2024-04-17 21:34 ` [PATCH 47/67] xfs: also use xfs_bmap_btalloc_accounting for RT allocations Darrick J. Wong
2024-04-17 21:34 ` [PATCH 48/67] xfs: return -ENOSPC from xfs_rtallocate_* Darrick J. Wong
2024-04-17 21:34 ` [PATCH 49/67] xfs: indicate if xfs_bmap_adjacent changed ap->blkno Darrick J. Wong
2024-04-17 21:34 ` [PATCH 50/67] xfs: move xfs_rtget_summary to xfs_rtbitmap.c Darrick J. Wong
2024-04-17 21:35 ` [PATCH 51/67] xfs: split xfs_rtmodify_summary_int Darrick J. Wong
2024-04-17 21:35 ` [PATCH 52/67] xfs: remove rt-wrappers from xfs_format.h Darrick J. Wong
2024-04-17 21:35 ` [PATCH 53/67] xfs: remove XFS_RTMIN/XFS_RTMAX Darrick J. Wong
2024-04-17 21:35 ` [PATCH 54/67] xfs: make if_data a void pointer Darrick J. Wong
2024-04-17 21:36 ` [PATCH 55/67] xfs: return if_data from xfs_idata_realloc Darrick J. Wong
2024-04-17 21:36 ` [PATCH 56/67] xfs: move the xfs_attr_sf_lookup tracepoint Darrick J. Wong
2024-04-17 21:36 ` [PATCH 57/67] xfs: simplify xfs_attr_sf_findname Darrick J. Wong
2024-04-17 21:36 ` [PATCH 58/67] xfs: remove xfs_attr_shortform_lookup Darrick J. Wong
2024-04-17 21:37 ` [PATCH 59/67] xfs: use xfs_attr_sf_findname in xfs_attr_shortform_getvalue Darrick J. Wong
2024-04-17 21:37 ` Darrick J. Wong [this message]
2024-04-17 21:37 ` [PATCH 61/67] xfs: remove xfs_attr_sf_hdr_t Darrick J. Wong
2024-04-17 21:37 ` [PATCH 62/67] xfs: turn the XFS_DA_OP_REPLACE checks in xfs_attr_shortform_addname into asserts Darrick J. Wong
2024-04-17 21:38 ` [PATCH 63/67] xfs: fix a use after free in xfs_defer_finish_recovery Darrick J. Wong
2024-04-17 21:38 ` [PATCH 64/67] xfs: use the op name in trace_xlog_intent_recovery_failed Darrick J. Wong
2024-04-17 21:38 ` [PATCH 65/67] xfs: fix backwards logic in xfs_bmap_alloc_account Darrick J. Wong
2024-04-17 21:38 ` [PATCH 66/67] xfs: reset XFS_ATTR_INCOMPLETE filter on node removal Darrick J. Wong
2024-04-17 21:39 ` [PATCH 67/67] xfs: remove conditional building of rt geometry validator functions Darrick J. Wong
2024-04-17 21:16 ` [PATCHSET 05/11] xfs_repair: faster btree bulkloading Darrick J. Wong
2024-04-17 21:39 ` [PATCH 1/2] xfs_repair: adjust btree bulkloading slack computations to match online repair Darrick J. Wong
2024-04-17 21:39 ` [PATCH 2/2] xfs_repair: bulk load records into new btree blocks Darrick J. Wong
2024-04-17 21:16 ` [PATCHSET 06/11] xfsprogs: bug fixes for 6.8 Darrick J. Wong
2024-04-17 21:40 ` [PATCH 1/5] xfs_repair: double-check with shortform attr verifiers Darrick J. Wong
2024-04-17 21:40 ` [PATCH 2/5] xfs_db: improve number extraction in getbitval Darrick J. Wong
2024-04-17 21:40 ` [PATCH 3/5] xfs_scrub: fix threadcount estimates for phase 6 Darrick J. Wong
2024-04-17 21:40 ` [PATCH 4/5] xfs_scrub: don't fail while reporting media scan errors Darrick J. Wong
2024-04-17 21:41 ` [PATCH 5/5] xfs_io: add linux madvise advice codes Darrick J. Wong
2024-04-17 21:17 ` [PATCHSET V3 07/11] xfsprogs: fix log sector size detection Darrick J. Wong
2024-04-17 21:41 ` [PATCH 1/5] libxfs: remove the unused fs_topology_t typedef Darrick J. Wong
2024-04-17 21:41 ` [PATCH 2/5] libxfs: refactor the fs_topology structure Darrick J. Wong
2024-04-17 21:41 ` [PATCH 3/5] libxfs: remove the S_ISREG check from blkid_get_topology Darrick J. Wong
2024-04-17 21:42 ` [PATCH 4/5] libxfs: also query log device topology in get_topology Darrick J. Wong
2024-04-17 21:42 ` [PATCH 5/5] mkfs: use a sensible log sector size default Darrick J. Wong
2024-04-17 21:17 ` [PATCHSET 08/11] mkfs: scale shards on ssds Darrick J. Wong
2024-04-17 21:42 ` [PATCH 1/2] mkfs: allow sizing allocation groups for concurrency Darrick J. Wong
2024-04-17 21:42 ` [PATCH 2/2] mkfs: allow sizing internal logs " Darrick J. Wong
2024-04-17 21:17 ` [PATCHSET v30.3 09/11] xfs_scrub: scan metadata files in parallel Darrick J. Wong
2024-04-17 21:43 ` [PATCH 1/3] libfrog: rename XFROG_SCRUB_TYPE_* to XFROG_SCRUB_GROUP_* Darrick J. Wong
2024-04-17 21:43 ` [PATCH 2/3] libfrog: promote XFROG_SCRUB_DESCR_SUMMARY to a scrub type Darrick J. Wong
2024-04-17 21:43 ` [PATCH 3/3] xfs_scrub: scan whole-fs metadata files in parallel Darrick J. Wong
2024-04-17 21:17 ` [PATCHSET v30.3 10/11] xfs_repair: rebuild inode fork mappings Darrick J. Wong
2024-04-17 21:43 ` [PATCH 1/3] xfs_repair: push inode buf and dinode pointers all the way to inode fork processing Darrick J. Wong
2024-04-17 21:44 ` [PATCH 2/3] xfs_repair: sync bulkload data structures with kernel newbt code Darrick J. Wong
2024-04-17 21:44 ` [PATCH 3/3] xfs_repair: rebuild block mappings from rmapbt data Darrick J. Wong
2024-04-17 21:18 ` [PATCHSET 11/11] xfs_repair: support more than 4 billion records Darrick J. Wong
2024-04-17 21:44 ` [PATCH 1/8] xfs_db: add a bmbt inflation command Darrick J. Wong
2024-04-17 21:45 ` [PATCH 2/8] xfs_repair: slab and bag structs need to track more than 2^32 items Darrick J. Wong
2024-04-17 21:45 ` [PATCH 3/8] xfs_repair: support more than 2^32 rmapbt records per AG Darrick J. Wong
2024-04-17 21:45 ` [PATCH 4/8] xfs_repair: support more than 2^32 owners per physical block Darrick J. Wong
2024-04-17 21:45 ` [PATCH 5/8] xfs_repair: clean up lock resources Darrick J. Wong
2024-04-17 21:46 ` [PATCH 6/8] xfs_repair: constrain attr fork extent count Darrick J. Wong
2024-04-17 21:46 ` [PATCH 7/8] xfs_repair: don't create block maps for data files Darrick J. Wong
2024-04-17 21:46 ` [PATCH 8/8] xfs_repair: support more than INT_MAX block maps Darrick J. Wong
-- strict thread matches above, loose matches on Subject: below --
2024-04-22 16:25 [PATCH 00/67] libxfs: Sync to Linux 6.8 cem
2024-04-22 16:26 ` [PATCH 60/67] xfs: remove struct xfs_attr_shortform cem
2024-03-26 2:55 [PATCHSET 02/18] libxfs: sync with 6.8 Darrick J. Wong
2024-03-26 3:18 ` [PATCH 60/67] xfs: remove struct xfs_attr_shortform Darrick J. Wong
2024-03-13 1:47 [PATCHSET 02/10] libxfs: sync with 6.8 Darrick J. Wong
2024-03-13 2:08 ` [PATCH 60/67] xfs: remove struct xfs_attr_shortform Darrick J. Wong
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=171338843241.1853449.9409672417803943825.stgit@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=bodonnel@redhat.com \
--cc=cem@kernel.org \
--cc=chandanbabu@kernel.org \
--cc=dchinner@redhat.com \
--cc=hch@lst.de \
--cc=linux-xfs@vger.kernel.org \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).