Hi Eric, Today's linux-next merge of the userns tree got a conflict in fs/namei.c between commits 45b1139e249d ("namei: minor vfs_unlink cleanup"), 0e22d7c4652b ("locks: break delegations on unlink"), 5d375b9f8afb ("locks: helper functions for delegation breaking") and 909b30216356 ("locks: break delegations on rename") from the vfs tree and commit 40216baa0101 ("vfs: Lazily remove mounts on unlinked files and directories. v2") from the userns tree. I fixed it up (see below) and can carry the fix as necessary (no action is required). -- Cheers, Stephen Rothwell sfr@xxxxxxxxxxxxxxxx diff --cc fs/namei.c index a4a30e396136,a12c1d31d4c8..000000000000 --- a/fs/namei.c +++ b/fs/namei.c @@@ -3645,22 -3670,16 +3659,20 @@@ int vfs_unlink(struct inode *dir, struc if (!dir->i_op->unlink) return -EPERM; - mutex_lock(&dentry->d_inode->i_mutex); + mutex_lock(&target->i_mutex); - if (d_mountpoint(dentry)) - error = -EBUSY; - else { - error = security_inode_unlink(dir, dentry); + error = security_inode_unlink(dir, dentry); + if (!error) { ++ error = try_break_deleg(target, delegated_inode); ++ if (error) ++ goto out; + error = dir->i_op->unlink(dir, dentry); if (!error) { - error = try_break_deleg(target, delegated_inode); - if (error) - goto out; - error = dir->i_op->unlink(dir, dentry); - if (!error) - dont_mount(dentry); + dont_mount(dentry); + detach_mounts(dentry); } } - mutex_unlock(&dentry->d_inode->i_mutex); +out: + mutex_unlock(&target->i_mutex); /* We don't d_delete() NFS sillyrenamed files--they still exist. */ if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) { @@@ -3708,8 -3726,11 +3720,11 @@@ retry_deleg if (nd.last.name[nd.last.len]) goto slashes; inode = dentry->d_inode; - if (!inode) + if (d_is_negative(dentry)) goto slashes; + error = -EBUSY; + if (covered(nd.path.mnt, dentry)) + goto exit2; ihold(inode); error = security_path_unlink(&nd.path, dentry); if (error) @@@ -4063,20 -4040,9 +4075,16 @@@ static int vfs_rename_other(struct inod return error; dget(new_dentry); - if (target) - mutex_lock(&target->i_mutex); + lock_two_nondirectories(source, target); - error = -EBUSY; - if (d_mountpoint(old_dentry)||d_mountpoint(new_dentry)) - goto out; - + error = try_break_deleg(source, delegated_inode); + if (error) + goto out; + if (target) { + error = try_break_deleg(target, delegated_inode); + if (error) + goto out; + } error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); if (error) goto out;
Attachment:
pgp034WBSPtYr.pgp
Description: PGP signature