diff --git a/fs/open.c b/fs/open.c index 3d64372ecc67..e5ff4d052f80 100644 --- a/fs/open.c +++ b/fs/open.c @@ -787,9 +787,21 @@ int chown_common(const struct path *path, uid_t user, gid_t group) path, from_vfsuid(idmap, fs_userns, newattrs.ia_vfsuid), from_vfsgid(idmap, fs_userns, newattrs.ia_vfsgid)); + printk(KERN_INFO "After security_path_chown: owner=%lx\n", + atomic_long_read(&inode->i_rwsem.owner)); if (!error) error = notify_change(idmap, path->dentry, &newattrs, &delegated_inode); + printk(KERN_INFO "After notify_change: owner=%lx, error=%d\n", + atomic_long_read(&inode->i_rwsem.owner), error); + if (atomic_long_read(&inode->i_rwsem.owner) != (long)current) { + printk(KERN_ERR "BUG: About to unlock rwsem we don't own!\n"); + printk(KERN_ERR " inode=%p\n", inode); + printk(KERN_ERR " i_rwsem.owner=%lx\n", atomic_long_read(&inode->i_rwsem.owner)); + printk(KERN_ERR " current=%p\n", current); + printk(KERN_ERR " delegated_inode=%p\n", delegated_inode); + dump_stack(); + } inode_unlock(inode); if (delegated_inode) { error = break_deleg_wait(&delegated_inode); diff --git a/include/linux/fs.h b/include/linux/fs.h index c895146c1444..84f7267aac3d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -987,6 +987,11 @@ static inline __must_check int inode_lock_killable(struct inode *inode) static inline void inode_unlock(struct inode *inode) { + printk(KERN_INFO "[%d] inode_unlock: inode=%p, owner=%lx, current=%p (%s:%d)\n", + count, inode, + atomic_long_read(&inode->i_rwsem.owner), + current, current->comm, current->pid); + dump_stack(); up_write(&inode->i_rwsem); }