Commit 0e32992f authored by Amir Goldstein's avatar Amir Goldstein Committed by Miklos Szeredi

ovl: remove the 'locked' argument of ovl_nlink_{start,end}

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: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 9df085f3
...@@ -652,7 +652,6 @@ static int ovl_link(struct dentry *old, struct inode *newdir, ...@@ -652,7 +652,6 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
struct dentry *new) struct dentry *new)
{ {
int err; int err;
bool locked = false;
struct inode *inode; struct inode *inode;
err = ovl_want_write(old); err = ovl_want_write(old);
...@@ -673,7 +672,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir, ...@@ -673,7 +672,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
goto out_drop_write; goto out_drop_write;
} }
err = ovl_nlink_start(old, &locked); err = ovl_nlink_start(old);
if (err) if (err)
goto out_drop_write; goto out_drop_write;
...@@ -686,7 +685,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir, ...@@ -686,7 +685,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
if (err) if (err)
iput(inode); iput(inode);
ovl_nlink_end(old, locked); ovl_nlink_end(old);
out_drop_write: out_drop_write:
ovl_drop_write(old); ovl_drop_write(old);
out: out:
...@@ -811,7 +810,6 @@ static bool ovl_pure_upper(struct dentry *dentry) ...@@ -811,7 +810,6 @@ static bool ovl_pure_upper(struct dentry *dentry)
static int ovl_do_remove(struct dentry *dentry, bool is_dir) static int ovl_do_remove(struct dentry *dentry, bool is_dir)
{ {
int err; int err;
bool locked = false;
const struct cred *old_cred; const struct cred *old_cred;
struct dentry *upperdentry; struct dentry *upperdentry;
bool lower_positive = ovl_lower_positive(dentry); bool lower_positive = ovl_lower_positive(dentry);
...@@ -832,7 +830,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) ...@@ -832,7 +830,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir)
if (err) if (err)
goto out_drop_write; goto out_drop_write;
err = ovl_nlink_start(dentry, &locked); err = ovl_nlink_start(dentry);
if (err) if (err)
goto out_drop_write; goto out_drop_write;
...@@ -848,7 +846,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) ...@@ -848,7 +846,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir)
else else
drop_nlink(dentry->d_inode); drop_nlink(dentry->d_inode);
} }
ovl_nlink_end(dentry, locked); ovl_nlink_end(dentry);
/* /*
* Copy ctime * Copy ctime
...@@ -1012,7 +1010,6 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, ...@@ -1012,7 +1010,6 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
unsigned int flags) unsigned int flags)
{ {
int err; int err;
bool locked = false;
struct dentry *old_upperdir; struct dentry *old_upperdir;
struct dentry *new_upperdir; struct dentry *new_upperdir;
struct dentry *olddentry; struct dentry *olddentry;
...@@ -1021,6 +1018,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, ...@@ -1021,6 +1018,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
bool old_opaque; bool old_opaque;
bool new_opaque; bool new_opaque;
bool cleanup_whiteout = false; bool cleanup_whiteout = false;
bool update_nlink = false;
bool overwrite = !(flags & RENAME_EXCHANGE); bool overwrite = !(flags & RENAME_EXCHANGE);
bool is_dir = d_is_dir(old); bool is_dir = d_is_dir(old);
bool new_is_dir = d_is_dir(new); bool new_is_dir = d_is_dir(new);
...@@ -1078,10 +1076,12 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, ...@@ -1078,10 +1076,12 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
err = ovl_copy_up(new); err = ovl_copy_up(new);
if (err) if (err)
goto out_drop_write; goto out_drop_write;
} else { } else if (d_inode(new)) {
err = ovl_nlink_start(new, &locked); err = ovl_nlink_start(new);
if (err) if (err)
goto out_drop_write; goto out_drop_write;
update_nlink = true;
} }
old_cred = ovl_override_creds(old->d_sb); old_cred = ovl_override_creds(old->d_sb);
...@@ -1210,7 +1210,8 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, ...@@ -1210,7 +1210,8 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
unlock_rename(new_upperdir, old_upperdir); unlock_rename(new_upperdir, old_upperdir);
out_revert_creds: out_revert_creds:
revert_creds(old_cred); revert_creds(old_cred);
ovl_nlink_end(new, locked); if (update_nlink)
ovl_nlink_end(new);
out_drop_write: out_drop_write:
ovl_drop_write(old); ovl_drop_write(old);
out: out:
......
...@@ -271,8 +271,8 @@ bool ovl_test_flag(unsigned long flag, struct inode *inode); ...@@ -271,8 +271,8 @@ bool ovl_test_flag(unsigned long flag, struct inode *inode);
bool ovl_inuse_trylock(struct dentry *dentry); bool ovl_inuse_trylock(struct dentry *dentry);
void ovl_inuse_unlock(struct dentry *dentry); void ovl_inuse_unlock(struct dentry *dentry);
bool ovl_need_index(struct dentry *dentry); bool ovl_need_index(struct dentry *dentry);
int ovl_nlink_start(struct dentry *dentry, bool *locked); int ovl_nlink_start(struct dentry *dentry);
void ovl_nlink_end(struct dentry *dentry, bool locked); void ovl_nlink_end(struct dentry *dentry);
int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir); int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir);
int ovl_check_metacopy_xattr(struct dentry *dentry); int ovl_check_metacopy_xattr(struct dentry *dentry);
bool ovl_is_metacopy_dentry(struct dentry *dentry); bool ovl_is_metacopy_dentry(struct dentry *dentry);
......
...@@ -738,14 +738,14 @@ static void ovl_cleanup_index(struct dentry *dentry) ...@@ -738,14 +738,14 @@ static void ovl_cleanup_index(struct dentry *dentry)
* Operations that change overlay inode and upper inode nlink need to be * Operations that change overlay inode and upper inode nlink need to be
* synchronized with copy up for persistent nlink accounting. * 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)); struct ovl_inode *oi = OVL_I(d_inode(dentry));
const struct cred *old_cred; const struct cred *old_cred;
int err; int err;
if (!d_inode(dentry)) if (WARN_ON(!d_inode(dentry)))
return 0; return -ENOENT;
/* /*
* With inodes index is enabled, we store the union overlay nlink * With inodes index is enabled, we store the union overlay nlink
...@@ -787,15 +787,12 @@ int ovl_nlink_start(struct dentry *dentry, bool *locked) ...@@ -787,15 +787,12 @@ int ovl_nlink_start(struct dentry *dentry, bool *locked)
out: out:
if (err) if (err)
mutex_unlock(&oi->lock); mutex_unlock(&oi->lock);
else
*locked = true;
return err; 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)) && if (ovl_test_flag(OVL_INDEX, d_inode(dentry)) &&
d_inode(dentry)->i_nlink == 0) { d_inode(dentry)->i_nlink == 0) {
const struct cred *old_cred; const struct cred *old_cred;
...@@ -806,7 +803,6 @@ void ovl_nlink_end(struct dentry *dentry, bool locked) ...@@ -806,7 +803,6 @@ void ovl_nlink_end(struct dentry *dentry, bool locked)
} }
mutex_unlock(&OVL_I(d_inode(dentry))->lock); mutex_unlock(&OVL_I(d_inode(dentry))->lock);
}
} }
int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir) int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir)
......
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