diff --git a/fs/attr.c b/fs/attr.c index 795f231d00e8..a45d29032283 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -418,6 +418,8 @@ int notify_change(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr, struct inode **delegated_inode) { struct inode *inode = dentry->d_inode; + printk(KERN_INFO "notify_change START: inode=%p, owner=%lx\n", + inode, atomic_long_read(&inode->i_rwsem.owner)); umode_t mode = inode->i_mode; int error; struct timespec64 now; @@ -551,7 +553,8 @@ int notify_change(struct mnt_idmap *idmap, struct dentry *dentry, fsnotify_change(dentry, ia_valid); security_inode_post_setattr(idmap, dentry, ia_valid); } - + printk(KERN_INFO "notify_change END: inode=%p, owner=%lx, error=%d\n", + inode, atomic_long_read(&inode->i_rwsem.owner), error); return error; } EXPORT_SYMBOL(notify_change); 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);