Commit 9eef772f authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: add an explicit owner field to xfs_da_args



Add an explicit owner field to xfs_da_args, which will make it easier
for online fsck to set the owner field of the temporary directory and
xattr structures that it builds to repair damaged metadata.

Note: I hopefully found all the xfs_da_args definitions by looking for
automatic stack variable declarations and xfs_da_args.dp assignments:

git grep -E '(args.*dp =|struct xfs_da_args[[:space:]]*[a-z0-9][a-z0-9]*)'

Note that callers of xfs_attr_{get,set,change} can set the owner to zero
(or leave it unset) to have the default set to args->dp.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent abf039e2
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -264,6 +264,8 @@ xfs_attr_get(
	if (xfs_is_shutdown(args->dp->i_mount))
		return -EIO;

	if (!args->owner)
		args->owner = args->dp->i_ino;
	args->geo = args->dp->i_mount->m_attr_geo;
	args->whichfork = XFS_ATTR_FORK;
	args->hashval = xfs_da_hashname(args->name, args->namelen);
@@ -937,6 +939,8 @@ xfs_attr_set(
	if (error)
		return error;

	if (!args->owner)
		args->owner = args->dp->i_ino;
	args->geo = mp->m_attr_geo;
	args->whichfork = XFS_ATTR_FORK;
	args->hashval = xfs_da_hashname(args->name, args->namelen);
+2 −0
Original line number Diff line number Diff line
@@ -904,6 +904,7 @@ xfs_attr_shortform_to_leaf(
	nargs.whichfork = XFS_ATTR_FORK;
	nargs.trans = args->trans;
	nargs.op_flags = XFS_DA_OP_OKNOENT;
	nargs.owner = args->owner;

	sfe = xfs_attr_sf_firstentry(sf);
	for (i = 0; i < sf->count; i++) {
@@ -1106,6 +1107,7 @@ xfs_attr3_leaf_to_shortform(
	nargs.whichfork = XFS_ATTR_FORK;
	nargs.trans = args->trans;
	nargs.op_flags = XFS_DA_OP_OKNOENT;
	nargs.owner = args->owner;

	for (i = 0; i < ichdr.count; entry++, i++) {
		if (entry->flags & XFS_ATTR_INCOMPLETE)
+1 −0
Original line number Diff line number Diff line
@@ -976,6 +976,7 @@ xfs_bmap_add_attrfork_local(
		dargs.total = dargs.geo->fsbcount;
		dargs.whichfork = XFS_DATA_FORK;
		dargs.trans = tp;
		dargs.owner = ip->i_ino;
		return xfs_dir2_sf_to_block(&dargs);
	}

+1 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ typedef struct xfs_da_args {
	int		rmtvaluelen2;	/* remote attr value length in bytes */
	uint32_t	op_flags;	/* operation flags */
	enum xfs_dacmp	cmpresult;	/* name compare result for lookups */
	xfs_ino_t	owner;		/* inode that owns the dir/attr data */
} xfs_da_args_t;

/*
+5 −0
Original line number Diff line number Diff line
@@ -250,6 +250,7 @@ xfs_dir_init(
	args->geo = dp->i_mount->m_dir_geo;
	args->dp = dp;
	args->trans = tp;
	args->owner = dp->i_ino;
	error = xfs_dir2_sf_create(args, pdp->i_ino);
	kfree(args);
	return error;
@@ -295,6 +296,7 @@ xfs_dir_createname(
	args->whichfork = XFS_DATA_FORK;
	args->trans = tp;
	args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT;
	args->owner = dp->i_ino;
	if (!inum)
		args->op_flags |= XFS_DA_OP_JUSTCHECK;

@@ -383,6 +385,7 @@ xfs_dir_lookup(
	args->whichfork = XFS_DATA_FORK;
	args->trans = tp;
	args->op_flags = XFS_DA_OP_OKNOENT;
	args->owner = dp->i_ino;
	if (ci_name)
		args->op_flags |= XFS_DA_OP_CILOOKUP;

@@ -456,6 +459,7 @@ xfs_dir_removename(
	args->total = total;
	args->whichfork = XFS_DATA_FORK;
	args->trans = tp;
	args->owner = dp->i_ino;

	if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL) {
		rval = xfs_dir2_sf_removename(args);
@@ -517,6 +521,7 @@ xfs_dir_replace(
	args->total = total;
	args->whichfork = XFS_DATA_FORK;
	args->trans = tp;
	args->owner = dp->i_ino;

	if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL) {
		rval = xfs_dir2_sf_replace(args);
Loading