@@ -149,5 +149,6 @@
#define xfs_dir_get_ops libxfs_dir_get_ops
#define xfs_default_ifork_ops libxfs_default_ifork_ops
#define xfs_fs_geometry libxfs_fs_geometry
+#define xfs_parent_add libxfs_parent_add
#endif /* __LIBXFS_API_DEFS_H__ */
@@ -17,6 +17,7 @@
#include "dinode.h"
#include "progress.h"
#include "versions.h"
+#include "xfs_parent.h"
static struct cred zerocr;
static struct fsxattr zerofsx;
@@ -919,17 +920,18 @@ mk_root_dir(xfs_mount_t *mp)
static xfs_ino_t
mk_orphanage(xfs_mount_t *mp)
{
- xfs_ino_t ino;
- xfs_trans_t *tp;
- xfs_inode_t *ip;
- xfs_inode_t *pip;
- ino_tree_node_t *irec;
- int ino_offset = 0;
- int i;
- int error;
- const int mode = 0755;
- int nres;
- struct xfs_name xname;
+ xfs_ino_t ino;
+ struct xfs_trans *tp;
+ struct xfs_inode *ip;
+ struct xfs_inode *pip;
+ struct ino_tree_node *irec;
+ int ino_offset = 0;
+ int i;
+ int error;
+ const int mode = 0755;
+ int nres;
+ struct xfs_name xname;
+ xfs_dir2_dataptr_t offset;
/*
* check for an existing lost+found first, if it exists, return
@@ -1014,7 +1016,7 @@ mk_orphanage(xfs_mount_t *mp)
/*
* create the actual entry
*/
- error = -libxfs_dir_createname(tp, pip, &xname, ip->i_ino, nres, NULL);
+ error = -libxfs_dir_createname(tp, pip, &xname, ip->i_ino, nres, &offset);
if (error)
do_error(
_("can't make %s, createname error %d\n"),
@@ -1034,6 +1036,16 @@ mk_orphanage(xfs_mount_t *mp)
libxfs_trans_log_inode(tp, pip, XFS_ILOG_CORE);
libxfs_dir_init(tp, ip, pip);
libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
+
+ if (xfs_sb_version_hasparent(&mp->m_sb)) {
+ error = -libxfs_parent_add(pip, ip, &xname, offset);
+ if (error)
+ do_error(_("Error creating parent pointer: %d\n"),
+ error);
+ libxfs_trans_log_inode(tp, pip, XFS_ILOG_CORE);
+ libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
+ }
+
libxfs_trans_commit(tp);
IRELE(ip);
IRELE(pip);
Inodes that are not recovered from the orphanage will be recreated, so we will need to re-add the parent pointers here too. Signed-off-by: Allison Henderson <allison.henderson@oracle.com> --- libxfs/libxfs_api_defs.h | 1 + repair/phase6.c | 36 ++++++++++++++++++++++++------------ 2 files changed, 25 insertions(+), 12 deletions(-)