@@ -1234,7 +1234,8 @@ generate_obfuscated_name(
static void
process_sf_dir(
- struct xfs_dinode *dip)
+ struct xfs_dinode *dip,
+ bool is_meta)
{
struct xfs_dir2_sf_hdr *sfp;
xfs_dir2_sf_entry_t *sfep;
@@ -1280,7 +1281,7 @@ process_sf_dir(
(char *)sfp);
}
- if (obfuscate)
+ if (obfuscate && !is_meta)
generate_obfuscated_name(
libxfs_dir2_sf_get_ino(mp, sfp, sfep),
namelen, &sfep->name[0]);
@@ -1363,7 +1364,8 @@ process_sf_symlink(
static void
process_sf_attr(
- struct xfs_dinode *dip)
+ struct xfs_dinode *dip,
+ bool is_meta)
{
/*
* with extended attributes, obfuscate the names and fill the actual
@@ -1406,7 +1408,7 @@ process_sf_attr(
break;
}
- if (obfuscate) {
+ if (obfuscate && !is_meta) {
generate_obfuscated_name(0, asfep->namelen,
&asfep->nameval[0]);
memset(&asfep->nameval[asfep->namelen], 'v',
@@ -1509,7 +1511,8 @@ static void
process_dir_data_block(
char *block,
xfs_fileoff_t offset,
- int is_block_format)
+ int is_block_format,
+ bool is_meta)
{
/*
* we have to rely on the fileoffset and signature of the block to
@@ -1616,7 +1619,7 @@ process_dir_data_block(
dir_offset)
return;
- if (obfuscate)
+ if (obfuscate && !is_meta)
generate_obfuscated_name(be64_to_cpu(dep->inumber),
dep->namelen, &dep->name[0]);
dir_offset += length;
@@ -1641,7 +1644,8 @@ process_symlink_block(
xfs_fsblock_t s,
xfs_filblks_t c,
typnm_t btype,
- xfs_fileoff_t last)
+ xfs_fileoff_t last,
+ bool is_meta)
{
struct bbmap map;
char *link;
@@ -1666,7 +1670,7 @@ process_symlink_block(
if (xfs_has_crc((mp)))
link += sizeof(struct xfs_dsymlink_hdr);
- if (obfuscate)
+ if (obfuscate && !is_meta)
obfuscate_path_components(link, XFS_SYMLINK_BUF_SPACE(mp,
mp->m_sb.sb_blocksize));
if (zero_stale_data) {
@@ -1717,7 +1721,8 @@ add_remote_vals(
static void
process_attr_block(
char *block,
- xfs_fileoff_t offset)
+ xfs_fileoff_t offset,
+ bool is_meta)
{
struct xfs_attr_leafblock *leaf;
struct xfs_attr3_icleaf_hdr hdr;
@@ -1785,7 +1790,7 @@ process_attr_block(
(long long)cur_ino);
break;
}
- if (obfuscate) {
+ if (obfuscate && !is_meta) {
generate_obfuscated_name(0, local->namelen,
&local->nameval[0]);
memset(&local->nameval[local->namelen], 'v',
@@ -1808,7 +1813,7 @@ process_attr_block(
(long long)cur_ino);
break;
}
- if (obfuscate) {
+ if (obfuscate && !is_meta) {
generate_obfuscated_name(0, remote->namelen,
&remote->name[0]);
add_remote_vals(be32_to_cpu(remote->valueblk),
@@ -1841,7 +1846,8 @@ process_single_fsb_objects(
xfs_fsblock_t s,
xfs_filblks_t c,
typnm_t btype,
- xfs_fileoff_t last)
+ xfs_fileoff_t last,
+ bool is_meta)
{
int rval = 1;
char *dp;
@@ -1911,12 +1917,13 @@ process_single_fsb_objects(
process_dir_leaf_block(dp);
} else {
process_dir_data_block(dp, o,
- last == mp->m_dir_geo->fsbcount);
+ last == mp->m_dir_geo->fsbcount,
+ is_meta);
}
iocur_top->need_crc = 1;
break;
case TYP_ATTR:
- process_attr_block(dp, o);
+ process_attr_block(dp, o, is_meta);
iocur_top->need_crc = 1;
break;
default:
@@ -1949,7 +1956,8 @@ process_multi_fsb_dir(
xfs_fsblock_t s,
xfs_filblks_t c,
typnm_t btype,
- xfs_fileoff_t last)
+ xfs_fileoff_t last,
+ bool is_meta)
{
char *dp;
int rval = 1;
@@ -1993,7 +2001,8 @@ process_multi_fsb_dir(
process_dir_leaf_block(dp);
} else {
process_dir_data_block(dp, o,
- last == mp->m_dir_geo->fsbcount);
+ last == mp->m_dir_geo->fsbcount,
+ is_meta);
}
iocur_top->need_crc = 1;
write:
@@ -2030,13 +2039,14 @@ process_multi_fsb_objects(
xfs_fsblock_t s,
xfs_filblks_t c,
typnm_t btype,
- xfs_fileoff_t last)
+ xfs_fileoff_t last,
+ bool is_meta)
{
switch (btype) {
case TYP_DIR2:
- return process_multi_fsb_dir(o, s, c, btype, last);
+ return process_multi_fsb_dir(o, s, c, btype, last, is_meta);
case TYP_SYMLINK:
- return process_symlink_block(o, s, c, btype, last);
+ return process_symlink_block(o, s, c, btype, last, is_meta);
default:
print_warning("bad type for multi-fsb object %d", btype);
return 1;
@@ -2048,7 +2058,8 @@ static int
process_bmbt_reclist(
xfs_bmbt_rec_t *rp,
int numrecs,
- typnm_t btype)
+ typnm_t btype,
+ bool is_meta)
{
int i;
xfs_fileoff_t o, op = NULLFILEOFF;
@@ -2124,10 +2135,10 @@ process_bmbt_reclist(
/* multi-extent blocks require special handling */
if (is_multi_fsb)
rval = process_multi_fsb_objects(o, s, c, btype,
- last);
+ last, is_meta);
else
rval = process_single_fsb_objects(o, s, c, btype,
- last);
+ last, is_meta);
if (!rval)
break;
}
@@ -2135,6 +2146,11 @@ process_bmbt_reclist(
return rval;
}
+struct scan_bmap {
+ enum typnm typ;
+ bool is_meta;
+};
+
static int
scanfunc_bmap(
struct xfs_btree_block *block,
@@ -2144,6 +2160,7 @@ scanfunc_bmap(
typnm_t btype,
void *arg) /* ptr to itype */
{
+ struct scan_bmap *sbm = arg;
int i;
xfs_bmbt_ptr_t *pp;
int nrecs;
@@ -2159,7 +2176,7 @@ scanfunc_bmap(
return 1;
}
return process_bmbt_reclist(XFS_BMBT_REC_ADDR(mp, block, 1),
- nrecs, *(typnm_t*)arg);
+ nrecs, sbm->typ, sbm->is_meta);
}
if (nrecs > mp->m_bmap_dmxr[1]) {
@@ -2191,6 +2208,15 @@ scanfunc_bmap(
return 1;
}
+static inline bool
+is_metadata_ino(
+ struct xfs_dinode *dip)
+{
+ return xfs_has_metadir(mp) &&
+ dip->di_version >= 3 &&
+ (dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA));
+}
+
static int
process_btinode(
struct xfs_dinode *dip,
@@ -2204,6 +2230,7 @@ process_btinode(
int maxrecs;
int whichfork;
typnm_t btype;
+ bool is_meta = is_metadata_ino(dip);
whichfork = (itype == TYP_ATTR) ? XFS_ATTR_FORK : XFS_DATA_FORK;
btype = (itype == TYP_ATTR) ? TYP_BMAPBTA : TYP_BMAPBTD;
@@ -2222,7 +2249,7 @@ process_btinode(
if (level == 0) {
return process_bmbt_reclist(XFS_BMDR_REC_ADDR(dib, 1),
- nrecs, itype);
+ nrecs, itype, is_meta);
}
maxrecs = libxfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), 0);
@@ -2249,6 +2276,10 @@ process_btinode(
}
for (i = 0; i < nrecs; i++) {
+ struct scan_bmap sbm = {
+ .typ = itype,
+ .is_meta = is_meta,
+ };
xfs_agnumber_t ag;
xfs_agblock_t bno;
@@ -2265,7 +2296,7 @@ process_btinode(
continue;
}
- if (!scan_btree(ag, bno, level, btype, &itype, scanfunc_bmap))
+ if (!scan_btree(ag, bno, level, btype, &sbm, scanfunc_bmap))
return 0;
}
return 1;
@@ -2279,6 +2310,7 @@ process_exinode(
int whichfork;
int used;
xfs_extnum_t nex, max_nex;
+ bool is_meta = is_metadata_ino(dip);
whichfork = (itype == TYP_ATTR) ? XFS_ATTR_FORK : XFS_DATA_FORK;
@@ -2301,7 +2333,7 @@ process_exinode(
return process_bmbt_reclist((xfs_bmbt_rec_t *)XFS_DFORK_PTR(dip,
- whichfork), nex, itype);
+ whichfork), nex, itype, is_meta);
}
static int
@@ -2309,6 +2341,8 @@ process_inode_data(
struct xfs_dinode *dip,
typnm_t itype)
{
+ bool is_meta = is_metadata_ino(dip);
+
switch (dip->di_format) {
case XFS_DINODE_FMT_LOCAL:
if (!(obfuscate || zero_stale_data))
@@ -2329,7 +2363,7 @@ process_inode_data(
switch (itype) {
case TYP_DIR2:
- process_sf_dir(dip);
+ process_sf_dir(dip, is_meta);
break;
case TYP_SYMLINK:
@@ -2447,12 +2481,14 @@ process_inode(
/* copy extended attributes if they exist and forkoff is valid */
if (XFS_DFORK_DSIZE(dip, mp) < XFS_LITINO(mp)) {
+ bool is_meta = is_metadata_ino(dip);
+
attr_data.remote_val_count = 0;
switch (dip->di_aformat) {
case XFS_DINODE_FMT_LOCAL:
need_new_crc = 1;
if (obfuscate || zero_stale_data)
- process_sf_attr(dip);
+ process_sf_attr(dip, is_meta);
break;
case XFS_DINODE_FMT_EXTENTS: