diff options
Diffstat (limited to 'fs/aufs/i_op.c')
-rw-r--r-- | fs/aufs/i_op.c | 28 |
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; |