summaryrefslogtreecommitdiff
path: root/fs/aufs/i_op.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/aufs/i_op.c')
-rw-r--r--fs/aufs/i_op.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/fs/aufs/i_op.c b/fs/aufs/i_op.c
index c274958dd..f5447fd34 100644
--- a/fs/aufs/i_op.c
+++ b/fs/aufs/i_op.c
@@ -268,8 +268,7 @@ static int aufs_atomic_open(struct inode *dir, struct dentry *dentry,
{
int err, h_opened = *opened;
unsigned int lkup_flags;
- struct dentry *parent;
- struct dentry *d;
+ struct dentry *parent, *d;
struct au_sphlhead *aopen;
struct vfsub_aopen_args args = {
.open_flag = open_flag,
@@ -364,10 +363,10 @@ out_unlock:
di_write_unlock(parent);
aufs_read_unlock(dentry, AuLock_DW);
AuDbgDentry(dentry);
- if (unlikely(err))
+ if (unlikely(err < 0))
goto out;
out_no_open:
- if (!err && !(*opened & FILE_CREATED)) {
+ if (err >= 0 && !(*opened & FILE_CREATED)) {
AuLabel(out_no_open);
dget(dentry);
err = finish_no_open(file, dentry);
@@ -567,17 +566,17 @@ out:
return err;
}
-void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task)
+static void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task)
{
-#if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP)
- p->hdir->hi_inode->i_mutex.owner = task;
+#if !defined(CONFIG_RWSEM_GENERIC_SPINLOCK) && defined(CONFIG_RWSEM_SPIN_ON_OWNER)
+ p->hdir->hi_inode->i_rwsem.owner = task;
#endif
}
void au_pin_hdir_acquire_nest(struct au_pin *p)
{
if (p->hdir) {
- mutex_acquire_nest(&p->hdir->hi_inode->i_mutex.dep_map,
+ rwsem_acquire_nest(&p->hdir->hi_inode->i_rwsem.dep_map,
p->lsc_hi, 0, NULL, _RET_IP_);
au_pin_hdir_set_owner(p, current);
}
@@ -587,7 +586,7 @@ void au_pin_hdir_release(struct au_pin *p)
{
if (p->hdir) {
au_pin_hdir_set_owner(p, p->task);
- mutex_release(&p->hdir->hi_inode->i_mutex.dep_map, 1, _RET_IP_);
+ rwsem_release(&p->hdir->hi_inode->i_rwsem.dep_map, 1, _RET_IP_);
}
}
@@ -981,7 +980,7 @@ out_dentry:
out_si:
si_read_unlock(sb);
out_kfree:
- kfree(a);
+ au_delayed_kfree(a);
out:
AuTraceErr(err);
return err;
@@ -1016,15 +1015,15 @@ out:
return err;
}
-ssize_t au_srxattr(struct dentry *dentry, struct au_srxattr *arg)
+ssize_t au_srxattr(struct dentry *dentry, struct inode *inode,
+ struct au_srxattr *arg)
{
int err;
struct path h_path;
struct super_block *sb;
struct au_icpup_args *a;
- struct inode *inode, *h_inode;
+ struct inode *h_inode;
- inode = d_inode(dentry);
IMustLock(inode);
err = -ENOMEM;
@@ -1046,6 +1045,7 @@ ssize_t au_srxattr(struct dentry *dentry, struct au_srxattr *arg)
inode_unlock(a->h_inode);
switch (arg->type) {
case AU_XATTR_SET:
+ AuDebugOn(d_is_negative(h_path.dentry));
err = vfsub_setxattr(h_path.dentry,
arg->u.set.name, arg->u.set.value,
arg->u.set.size, arg->u.set.flags);
@@ -1073,7 +1073,7 @@ out_di:
di_write_unlock(dentry);
si_read_unlock(sb);
out_kfree:
- kfree(a);
+ au_delayed_kfree(a);
out:
AuTraceErr(err);
return err;