Commit 1e92e307 authored by Amir Goldstein's avatar Amir Goldstein Committed by Miklos Szeredi
Browse files

ovl: abstract ovl_inode lock with a helper



The abstraction improves code readabilty (to some).

Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 0e32992f
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -290,6 +290,16 @@ static inline unsigned int ovl_xino_bits(struct super_block *sb)
	return ofs->xino_bits;
}

static inline int ovl_inode_lock(struct inode *inode)
{
	return mutex_lock_interruptible(&OVL_I(inode)->lock);
}

static inline void ovl_inode_unlock(struct inode *inode)
{
	mutex_unlock(&OVL_I(inode)->lock);
}


/* namei.c */
int ovl_check_fh_len(struct ovl_fh *fh, int fh_len);
+13 −12
Original line number Diff line number Diff line
@@ -521,13 +521,13 @@ bool ovl_already_copied_up(struct dentry *dentry, int flags)

int ovl_copy_up_start(struct dentry *dentry, int flags)
{
	struct ovl_inode *oi = OVL_I(d_inode(dentry));
	struct inode *inode = d_inode(dentry);
	int err;

	err = mutex_lock_interruptible(&oi->lock);
	err = ovl_inode_lock(inode);
	if (!err && ovl_already_copied_up_locked(dentry, flags)) {
		err = 1; /* Already copied up */
		mutex_unlock(&oi->lock);
		ovl_inode_unlock(inode);
	}

	return err;
@@ -535,7 +535,7 @@ int ovl_copy_up_start(struct dentry *dentry, int flags)

void ovl_copy_up_end(struct dentry *dentry)
{
	mutex_unlock(&OVL_I(d_inode(dentry))->lock);
	ovl_inode_unlock(d_inode(dentry));
}

bool ovl_check_origin_xattr(struct dentry *dentry)
@@ -740,11 +740,11 @@ fail:
 */
int ovl_nlink_start(struct dentry *dentry)
{
	struct ovl_inode *oi = OVL_I(d_inode(dentry));
	struct inode *inode = d_inode(dentry);
	const struct cred *old_cred;
	int err;

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

	/*
@@ -767,11 +767,11 @@ int ovl_nlink_start(struct dentry *dentry)
			return err;
	}

	err = mutex_lock_interruptible(&oi->lock);
	err = ovl_inode_lock(inode);
	if (err)
		return err;

	if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, d_inode(dentry)))
	if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, inode))
		goto out;

	old_cred = ovl_override_creds(dentry->d_sb);
@@ -786,15 +786,16 @@ int ovl_nlink_start(struct dentry *dentry)

out:
	if (err)
		mutex_unlock(&oi->lock);
		ovl_inode_unlock(inode);

	return err;
}

void ovl_nlink_end(struct dentry *dentry)
{
	if (ovl_test_flag(OVL_INDEX, d_inode(dentry)) &&
	    d_inode(dentry)->i_nlink == 0) {
	struct inode *inode = d_inode(dentry);

	if (ovl_test_flag(OVL_INDEX, inode) && inode->i_nlink == 0) {
		const struct cred *old_cred;

		old_cred = ovl_override_creds(dentry->d_sb);
@@ -802,7 +803,7 @@ void ovl_nlink_end(struct dentry *dentry)
		revert_creds(old_cred);
	}

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

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