Skip to content

Commit

Permalink
ovl: remove the 'locked' argument of ovl_nlink_{start,end}
Browse files Browse the repository at this point in the history
It just makes the interface strange without adding any significant value.
The only case where locked is false and return value is 0 is in
ovl_rename() when new is negative, so handle that case explicitly in
ovl_rename().

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
  • Loading branch information
Amir Goldstein authored and Miklos Szeredi committed Oct 26, 2018
1 parent 9df085f commit 0e32992
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 28 deletions.
21 changes: 11 additions & 10 deletions fs/overlayfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,6 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
struct dentry *new)
{
int err;
bool locked = false;
struct inode *inode;

err = ovl_want_write(old);
Expand All @@ -673,7 +672,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
goto out_drop_write;
}

err = ovl_nlink_start(old, &locked);
err = ovl_nlink_start(old);
if (err)
goto out_drop_write;

Expand All @@ -686,7 +685,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
if (err)
iput(inode);

ovl_nlink_end(old, locked);
ovl_nlink_end(old);
out_drop_write:
ovl_drop_write(old);
out:
Expand Down Expand Up @@ -811,7 +810,6 @@ static bool ovl_pure_upper(struct dentry *dentry)
static int ovl_do_remove(struct dentry *dentry, bool is_dir)
{
int err;
bool locked = false;
const struct cred *old_cred;
struct dentry *upperdentry;
bool lower_positive = ovl_lower_positive(dentry);
Expand All @@ -832,7 +830,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir)
if (err)
goto out_drop_write;

err = ovl_nlink_start(dentry, &locked);
err = ovl_nlink_start(dentry);
if (err)
goto out_drop_write;

Expand All @@ -848,7 +846,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir)
else
drop_nlink(dentry->d_inode);
}
ovl_nlink_end(dentry, locked);
ovl_nlink_end(dentry);

/*
* Copy ctime
Expand Down Expand Up @@ -1012,7 +1010,6 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
unsigned int flags)
{
int err;
bool locked = false;
struct dentry *old_upperdir;
struct dentry *new_upperdir;
struct dentry *olddentry;
Expand All @@ -1021,6 +1018,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
bool old_opaque;
bool new_opaque;
bool cleanup_whiteout = false;
bool update_nlink = false;
bool overwrite = !(flags & RENAME_EXCHANGE);
bool is_dir = d_is_dir(old);
bool new_is_dir = d_is_dir(new);
Expand Down Expand Up @@ -1078,10 +1076,12 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
err = ovl_copy_up(new);
if (err)
goto out_drop_write;
} else {
err = ovl_nlink_start(new, &locked);
} else if (d_inode(new)) {
err = ovl_nlink_start(new);
if (err)
goto out_drop_write;

update_nlink = true;
}

old_cred = ovl_override_creds(old->d_sb);
Expand Down Expand Up @@ -1210,7 +1210,8 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
unlock_rename(new_upperdir, old_upperdir);
out_revert_creds:
revert_creds(old_cred);
ovl_nlink_end(new, locked);
if (update_nlink)
ovl_nlink_end(new);
out_drop_write:
ovl_drop_write(old);
out:
Expand Down
4 changes: 2 additions & 2 deletions fs/overlayfs/overlayfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,8 @@ bool ovl_test_flag(unsigned long flag, struct inode *inode);
bool ovl_inuse_trylock(struct dentry *dentry);
void ovl_inuse_unlock(struct dentry *dentry);
bool ovl_need_index(struct dentry *dentry);
int ovl_nlink_start(struct dentry *dentry, bool *locked);
void ovl_nlink_end(struct dentry *dentry, bool locked);
int ovl_nlink_start(struct dentry *dentry);
void ovl_nlink_end(struct dentry *dentry);
int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir);
int ovl_check_metacopy_xattr(struct dentry *dentry);
bool ovl_is_metacopy_dentry(struct dentry *dentry);
Expand Down
28 changes: 12 additions & 16 deletions fs/overlayfs/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -738,14 +738,14 @@ static void ovl_cleanup_index(struct dentry *dentry)
* Operations that change overlay inode and upper inode nlink need to be
* synchronized with copy up for persistent nlink accounting.
*/
int ovl_nlink_start(struct dentry *dentry, bool *locked)
int ovl_nlink_start(struct dentry *dentry)
{
struct ovl_inode *oi = OVL_I(d_inode(dentry));
const struct cred *old_cred;
int err;

if (!d_inode(dentry))
return 0;
if (WARN_ON(!d_inode(dentry)))
return -ENOENT;

/*
* With inodes index is enabled, we store the union overlay nlink
Expand Down Expand Up @@ -787,26 +787,22 @@ int ovl_nlink_start(struct dentry *dentry, bool *locked)
out:
if (err)
mutex_unlock(&oi->lock);
else
*locked = true;

return err;
}

void ovl_nlink_end(struct dentry *dentry, bool locked)
void ovl_nlink_end(struct dentry *dentry)
{
if (locked) {
if (ovl_test_flag(OVL_INDEX, d_inode(dentry)) &&
d_inode(dentry)->i_nlink == 0) {
const struct cred *old_cred;

old_cred = ovl_override_creds(dentry->d_sb);
ovl_cleanup_index(dentry);
revert_creds(old_cred);
}
if (ovl_test_flag(OVL_INDEX, d_inode(dentry)) &&
d_inode(dentry)->i_nlink == 0) {
const struct cred *old_cred;

mutex_unlock(&OVL_I(d_inode(dentry))->lock);
old_cred = ovl_override_creds(dentry->d_sb);
ovl_cleanup_index(dentry);
revert_creds(old_cred);
}

mutex_unlock(&OVL_I(d_inode(dentry))->lock);
}

int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir)
Expand Down

0 comments on commit 0e32992

Please sign in to comment.