Skip to content

Commit

Permalink
ovl: rearrange ovl_follow_link to it doesn't need to call ->put_link
Browse files Browse the repository at this point in the history
ovl_follow_link current calls ->put_link on an error path.
However ->put_link is about to change in a way that it will be
impossible to call it from ovl_follow_link.

So rearrange the code to avoid the need for that error path.
Specifically: move the kmalloc() call before the ->follow_link()
call to the subordinate filesystem.

Signed-off-by: NeilBrown <[email protected]>
Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
neilbrown authored and Al Viro committed May 11, 2015
1 parent 90e4fc8 commit 3188b29
Showing 1 changed file with 12 additions and 13 deletions.
25 changes: 12 additions & 13 deletions fs/overlayfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,32 +145,31 @@ static void *ovl_follow_link(struct dentry *dentry, struct nameidata *nd)
void *ret;
struct dentry *realdentry;
struct inode *realinode;
struct ovl_link_data *data = NULL;

realdentry = ovl_dentry_real(dentry);
realinode = realdentry->d_inode;

if (WARN_ON(!realinode->i_op->follow_link))
return ERR_PTR(-EPERM);

ret = realinode->i_op->follow_link(realdentry, nd);
if (IS_ERR(ret))
return ret;

if (realinode->i_op->put_link) {
struct ovl_link_data *data;

data = kmalloc(sizeof(struct ovl_link_data), GFP_KERNEL);
if (!data) {
realinode->i_op->put_link(realdentry, nd, ret);
if (!data)
return ERR_PTR(-ENOMEM);
}
data->realdentry = realdentry;
data->cookie = ret;
}

return data;
} else {
return NULL;
ret = realinode->i_op->follow_link(realdentry, nd);
if (IS_ERR(ret)) {
kfree(data);
return ret;
}

if (data)
data->cookie = ret;

return data;
}

static void ovl_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
Expand Down

0 comments on commit 3188b29

Please sign in to comment.