free(orig_name);
}
+static inline bool
+want_obfuscate_dirents(bool is_meta)
+{
+ return metadump.obfuscate && !is_meta;
+}
+
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;
(char *)sfp);
}
- if (metadump.obfuscate)
+ if (want_obfuscate_dirents(is_meta))
generate_obfuscated_name(
libxfs_dir2_sf_get_ino(mp, sfp, sfep),
namelen, &sfep->name[0]);
uint8_t *name,
int namelen,
const void *value,
- int valuelen)
+ int valuelen,
+ bool is_meta)
{
unsigned char old_name[MAXNAMELEN];
struct remap_ent *remap;
xfs_ino_t parent_ino;
int error;
- if (!metadump.obfuscate)
+ if (!metadump.obfuscate || is_meta)
return;
if (!(attr_flags & XFS_ATTR_PARENT))
const void *name,
unsigned int namelen,
const void *value,
- unsigned int valuelen)
+ unsigned int valuelen,
+ bool is_meta)
{
- if (!metadump.obfuscate)
+ if (!metadump.obfuscate || is_meta)
return false;
/*
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
if (asfep->flags & XFS_ATTR_PARENT) {
maybe_obfuscate_pptr(asfep->flags, name, namelen,
- value, asfep->valuelen);
+ value, asfep->valuelen, is_meta);
} else if (want_obfuscate_attr(asfep->flags, name, namelen,
- value, asfep->valuelen)) {
+ value, asfep->valuelen, is_meta)) {
generate_obfuscated_name(0, asfep->namelen, name);
memset(value, 'v', asfep->valuelen);
}
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
dir_offset)
return;
- if (metadump.obfuscate)
+ if (want_obfuscate_dirents(is_meta))
generate_obfuscated_name(be64_to_cpu(dep->inumber),
dep->namelen, &dep->name[0]);
dir_offset += length;
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;
if (xfs_has_crc((mp)))
link += sizeof(struct xfs_dsymlink_hdr);
- if (metadump.obfuscate)
+ if (want_obfuscate_dirents(is_meta))
obfuscate_path_components(link, XFS_SYMLINK_BUF_SPACE(mp,
mp->m_sb.sb_blocksize));
if (metadump.zero_stale_data) {
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;
if (entry->flags & XFS_ATTR_PARENT) {
maybe_obfuscate_pptr(entry->flags, name,
local->namelen, value,
- valuelen);
+ valuelen, is_meta);
} else if (want_obfuscate_attr(entry->flags, name,
local->namelen, value,
- valuelen)) {
+ valuelen, is_meta)) {
generate_obfuscated_name(0, local->namelen,
name);
memset(value, 'v', valuelen);
/* do not obfuscate obviously busted pptr */
add_remote_vals(be32_to_cpu(remote->valueblk),
be32_to_cpu(remote->valuelen));
- } else if (metadump.obfuscate) {
+ } else if (want_obfuscate_dirents(is_meta)) {
generate_obfuscated_name(0, remote->namelen,
&remote->name[0]);
add_remote_vals(be32_to_cpu(remote->valueblk),
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;
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:
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;
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:
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;
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;
/* 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;
}
return rval;
}
+struct scan_bmap {
+ enum typnm typ;
+ bool is_meta;
+};
+
static int
scanfunc_bmap(
struct xfs_btree_block *block,
typnm_t btype,
void *arg) /* ptr to itype */
{
+ struct scan_bmap *sbm = arg;
int i;
xfs_bmbt_ptr_t *pp;
int nrecs;
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]) {
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,
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;
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);
}
for (i = 0; i < nrecs; i++) {
+ struct scan_bmap sbm = {
+ .typ = itype,
+ .is_meta = is_meta,
+ };
xfs_agnumber_t ag;
xfs_agblock_t bno;
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;
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;
return process_bmbt_reclist((xfs_bmbt_rec_t *)XFS_DFORK_PTR(dip,
- whichfork), nex, itype);
+ whichfork), nex, itype, is_meta);
}
static int
struct xfs_dinode *dip,
typnm_t itype)
{
+ bool is_meta = is_metadata_ino(dip);
+
switch (dip->di_format) {
case XFS_DINODE_FMT_LOCAL:
if (!(metadump.obfuscate || metadump.zero_stale_data))
switch (itype) {
case TYP_DIR2:
- process_sf_dir(dip);
+ process_sf_dir(dip, is_meta);
break;
case TYP_SYMLINK:
/* 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 = true;
if (metadump.obfuscate ||
metadump.zero_stale_data)
- process_sf_attr(dip);
+ process_sf_attr(dip, is_meta);
break;
case XFS_DINODE_FMT_EXTENTS: