On 4/9/12 11:34 PM, Eric Sandeen wrote: > xfs_metadump currently obfuscates entire symlinks without regard > to path components; this can lead to a corrupt image when restoring > a metadump containing extremely long symlinks: > > Phase 3 - for each AG... > - scan and clear agi unlinked lists... > - process known inodes and perform inode discovery... > - agno = 0 > component of symlink in inode 145 too long > problem with symbolic link in inode 145 > cleared inode 145 > ... <more trail of woe> > > Fix this by consolidating symlink obfuscation into a new > function which obfuscates one path component at a time. > > Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> ping? :) > --- > > Yes, I need to do an xfstest for this. metadumping a filesystem > after fsstressing it works well. > > diff --git a/db/metadump.c b/db/metadump.c > index c5ffddb..9f15d9e 100644 > --- a/db/metadump.c > +++ b/db/metadump.c > @@ -956,6 +956,40 @@ obfuscate_sf_dir( > } > > static void > +obfuscate_path_components( > + char *buf, > + __uint64_t len) > +{ > + uchar_t *comp; > + xfs_dahash_t hash; > + > + comp = (uchar_t *)buf; > + while (comp < (uchar_t *)buf + len) { > + char *slash; > + int namelen; > + > + /* find slash at end of this component */ > + slash = strchr((char *)comp, '/'); > + if (!slash) { > + /* last (or single) component */ > + namelen = strlen((char *)comp); > + hash = libxfs_da_hashname(comp, namelen); > + obfuscate_name(hash, namelen, comp); > + break; > + } > + namelen = slash - (char *)comp; > + /* handle leading or consecutive slashes */ > + if (!namelen) { > + comp++; > + continue; > + } > + hash = libxfs_da_hashname(comp, namelen); > + obfuscate_name(hash, namelen, comp); > + comp += namelen + 1; > + } > +} > + > +static void > obfuscate_sf_symlink( > xfs_dinode_t *dip) > { > @@ -971,8 +1005,7 @@ obfuscate_sf_symlink( > } > > buf = (char *)XFS_DFORK_DPTR(dip); > - while (len > 0) > - buf[--len] = random() % 127 + 1; > + obfuscate_path_components(buf, len); > } > > static void > @@ -1176,11 +1209,8 @@ obfuscate_symlink_blocks( > char *block, > xfs_dfilblks_t count) > { > - int i; > - > count <<= mp->m_sb.sb_blocklog; > - for (i = 0; i < count; i++) > - block[i] = random() % 127 + 1; > + obfuscate_path_components(block, count); > } > > #define MAX_REMOTE_VALS 4095 > > _______________________________________________ > xfs mailing list > xfs@xxxxxxxxxxx > http://oss.sgi.com/mailman/listinfo/xfs > _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs