Inodes created from protofile parsing will also need to
add the appropriate parent pointers
Signed-off-by: Allison Henderson <allison.henderson@xxxxxxxxxx>
---
mkfs/proto.c | 55 ++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 36 insertions(+), 19 deletions(-)
diff --git a/mkfs/proto.c b/mkfs/proto.c
index 67c228a..222479f 100644
--- a/mkfs/proto.c
+++ b/mkfs/proto.c
@@ -19,6 +19,7 @@
#include "libxfs.h"
#include <sys/stat.h>
#include "xfs_multidisk.h"
+#include "xfs_parent.h"
/*
* Prototypes for internal functions.
@@ -318,23 +319,25 @@ newregfile(
static void
newdirent(
- xfs_mount_t *mp,
- xfs_trans_t *tp,
- xfs_inode_t *pip,
- struct xfs_name *name,
- xfs_ino_t inum,
- xfs_fsblock_t *first,
- struct xfs_defer_ops *dfops)
+ struct xfs_mount *mp,
+ struct xfs_trans *tp,
+ struct xfs_inode *pip,
+ struct xfs_name *name,
+ struct xfs_inode *ip,
+ xfs_fsblock_t *first,
+ struct xfs_defer_ops *dfops,
+ xfs_dir2_dataptr_t *offset)
{
- int error;
- int rsv;
+ int error;
+ int rsv;
rsv = XFS_DIRENTER_SPACE_RES(mp, name->len);
- error = -libxfs_dir_createname(tp, pip, name, inum, first, dfops, rsv,
- NULL);
+ error = -libxfs_dir_createname(tp, pip, name, ip->i_ino, first, dfops, rsv,
+ offset);
if (error)
fail(_("directory createname error"), error);
+
}
static void
@@ -387,6 +390,7 @@ parseproto(
cred_t creds;
char *value;
struct xfs_name xname;
+ xfs_dir2_dataptr_t offset;
memset(&creds, 0, sizeof(creds));
mstr = getstr(pp);
@@ -470,7 +474,7 @@ parseproto(
free(buf);
libxfs_trans_ijoin(tp, pip, 0);
xname.type = XFS_DIR3_FT_REG_FILE;
- newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &dfops);
+ newdirent(mp, tp, pip, &xname, ip, &first, &dfops, &offset);
break;
case IF_RESERVED: /* pre-allocated space only */
@@ -493,7 +497,7 @@ parseproto(
libxfs_trans_ijoin(tp, pip, 0);
xname.type = XFS_DIR3_FT_REG_FILE;
- newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &dfops);
+ newdirent(mp, tp, pip, &xname, ip, &first, &dfops, &offset);
libxfs_trans_log_inode(tp, ip, flags);
libxfs_defer_ijoin(&dfops, ip);
@@ -516,7 +520,7 @@ parseproto(
}
libxfs_trans_ijoin(tp, pip, 0);
xname.type = XFS_DIR3_FT_BLKDEV;
- newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &dfops);
+ newdirent(mp, tp, pip, &xname, ip, &first, &dfops, &offset);
flags |= XFS_ILOG_DEV;
break;
@@ -530,7 +534,7 @@ parseproto(
fail(_("Inode allocation failed"), error);
libxfs_trans_ijoin(tp, pip, 0);
xname.type = XFS_DIR3_FT_CHRDEV;
- newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &dfops);
+ newdirent(mp, tp, pip, &xname, ip, &first, &dfops, &offset);
flags |= XFS_ILOG_DEV;
break;
@@ -542,7 +546,7 @@ parseproto(
fail(_("Inode allocation failed"), error);
libxfs_trans_ijoin(tp, pip, 0);
xname.type = XFS_DIR3_FT_FIFO;
- newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &dfops);
+ newdirent(mp, tp, pip, &xname, ip, &first, &dfops, &offset);
break;
case IF_SYMLINK:
buf = getstr(pp);
@@ -555,7 +559,7 @@ parseproto(
flags |= newfile(tp, ip, &dfops, &first, 1, 1, buf, len);
libxfs_trans_ijoin(tp, pip, 0);
xname.type = XFS_DIR3_FT_SYMLINK;
- newdirent(mp, tp, pip, &xname, ip->i_ino, &first, &dfops);
+ newdirent(mp, tp, pip, &xname, ip, &first, &dfops, &offset);
break;
case IF_DIRECTORY:
tp = getres(mp, 0);
@@ -572,8 +576,8 @@ parseproto(
} else {
libxfs_trans_ijoin(tp, pip, 0);
xname.type = XFS_DIR3_FT_DIR;
- newdirent(mp, tp, pip, &xname, ip->i_ino,
- &first, &dfops);
+ newdirent(mp, tp, pip, &xname, ip,
+ &first, &dfops, &offset);
inc_nlink(VFS_I(pip));
libxfs_trans_log_inode(tp, pip, XFS_ILOG_CORE);
}
@@ -612,6 +616,19 @@ parseproto(
fail(_("Error encountered creating file from prototype file"),
error);
}
+
+ if (xfs_sb_version_hasparent(&mp->m_sb)) {
+ error = xfs_parent_add(pip, ip, &xname, offset, &first, &dfops);