Commit a618acab authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Dave Chinner

xfs: don't leak the retained da state when doing a leaf to node conversion

If a setxattr operation finds an xattr structure in leaf format, adding
the attr can fail due to lack of space and hence requires an upgrade to
node format.  After this happens, we'll roll the transaction and
re-enter the state machine, at which time we need to perform a second
lookup of the attribute name to find its new location.  This lookup
attaches a new da state structure to the xfs_attr_item but doesn't free
the old one (from the leaf lookup) and leaks it.  Fix that.
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarAllison Henderson <allison.henderson@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 309001c2
......@@ -1401,8 +1401,10 @@ xfs_attr_node_hasname(
int retval, error;
state = xfs_da_state_alloc(args);
if (statep != NULL)
if (statep != NULL) {
ASSERT(*statep == NULL);
*statep = state;
}
/*
* Search to see if name exists, and get back a pointer to it.
......@@ -1428,6 +1430,10 @@ xfs_attr_node_addname_find_attr(
struct xfs_da_args *args = attr->xattri_da_args;
int error;
if (attr->xattri_da_state)
xfs_da_state_free(attr->xattri_da_state);
attr->xattri_da_state = NULL;
/*
* Search to see if name already exists, and get back a pointer
* to where it should go.
......@@ -1593,7 +1599,7 @@ STATIC int
xfs_attr_node_get(
struct xfs_da_args *args)
{
struct xfs_da_state *state;
struct xfs_da_state *state = NULL;
struct xfs_da_state_blk *blk;
int i;
int error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment