diff mbox

fs/namei.c: Hard link and rename should check same device instead of same mount

Message ID 20160316140514.778db799@localdomain (mailing list archive)
State New, archived
Headers show

Commit Message

Jordi Pujol March 16, 2016, 1:05 p.m. UTC
Hello,

Working on a Linux system that bind mounts some
directories, have found frequent errors when moving files between
directories that belong to different mount points but are on the same
device.

The two attached patches solve these problems on a local filesystem.
Maybe we must test it on different configurations.

Thanks,

Jordi Pujol i Palomer
Enginyer Tècnic Industrial

Comments

Al Viro March 16, 2016, 2:25 p.m. UTC | #1
On Wed, Mar 16, 2016 at 02:05:14PM +0100, Jordi Pujol Palomer wrote:
> Hello,
> 
> Working on a Linux system that bind mounts some
> directories, have found frequent errors when moving files between
> directories that belong to different mount points but are on the same
> device.

> The two attached patches solve these problems on a local filesystem.
> Maybe we must test it on different configurations.
 
NAK.  This is absolutely deliberate; moreover, mount --bind $DIR $DIR
is often used just to set such a boundary.
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jordi Pujol March 20, 2016, 6:06 p.m. UTC | #2
El Wed, 16 Mar 2016 14:25:16 +0000
Al Viro <viro@ZenIV.linux.org.uk> escrigué:

> NAK.  This is absolutely deliberate; moreover, mount --bind $DIR $DIR
> is often used just to set such a boundary.

It means that the way I have proposed may work also ?

Therefore we can develop a new option for binding to let the superuser
choose what is needed for every mount-bind, example:

mount --bind -o boundary $DIR $DIR

mount --bind -o noboundary $DIR1 $DIR2

and allow remount also,

mount -o remount,boundary $DIR

mount -o remount,noboundary $DIR

That seems feasible,

Jordi Pujol i Palomer
Enginyer Tècnic Industrial
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Al Viro March 20, 2016, 6:22 p.m. UTC | #3
On Sun, Mar 20, 2016 at 07:06:25PM +0100, Jordi Pujol Palomer wrote:
> Therefore we can develop a new option for binding to let the superuser
> choose what is needed for every mount-bind, example:
> 
> mount --bind -o boundary $DIR $DIR
> 
> mount --bind -o noboundary $DIR1 $DIR2
> 
> and allow remount also,
> 
> mount -o remount,boundary $DIR
> 
> mount -o remount,noboundary $DIR
> 
> That seems feasible,

... until you consider the fun of moving subtrees between different mounts.
IMO it's a bloody bad idea; semantics would be hard to define, not to mention
that things that used to be on the same fs might eventually get moved to
different ones, and for those there's obviously no way to do link(2) or
rename(2) at all.

What are you actually trying to achieve?  There might be saner ways to do
it...
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jordi Pujol March 21, 2016, 1:35 p.m. UTC | #4
El Sun, 20 Mar 2016 18:22:51 +0000
Al Viro <viro@ZenIV.linux.org.uk> escrigué:

> ... until you consider the fun of moving subtrees between different
> mounts. IMO it's a bloody bad idea; semantics would be hard to
> define, not to mention that things that used to be on the same fs
> might eventually get moved to different ones, and for those there's
> obviously no way to do link(2) or rename(2) at all.
> 
Well I'm not an expert,
think the boundary option should be only for bind mounts, and will
work only when the filesystem supports it, as usual by now. The
mountpoint can be moved, but the underlying device continues being the
same; but sure it is more complicated, I understand,

> What are you actually trying to achieve?  There might be saner ways
> to do it...
Yes, now I see that the all the local bind may be replaced with symbolic
links,

# mount-list > mount-list.txt

Thanks for your attention,

Jordi Pujol i Palomer
Enginyer Tècnic Industrial
sysfs	/sys	sysfs	nodev,noexec,nosuid,relatime,rw	sysfs	0:17
proc	/proc	proc	nodev,noexec,nosuid,relatime,rw	proc	0:5
udev	/dev	devtmpfs	mode=755,nosuid,nr_inodes=978001,relatime,rw,size=3912004k	udev	0:6
devpts	/dev/pts	devpts	gid=5,mode=620,noexec,nosuid,ptmxmode=000,relatime,rw	devpts	0:14
tmpfs	/run	tmpfs	mode=755,noexec,nosuid,relatime,rw,size=786088k	tmpfs	0:18
tmpfs	/lnet	tmpfs	mode=755,relatime,rw,size=7860880k	tmpfs	0:19
/dev/sda1	/lnet/image	ext2	errors=continue,noacl,noatime,nouser_xattr,ro	/dev/sda1	8:1
/lnet/image/LneTLXQT64/00filesystem.squashfs	/lnet/00filesystem.squashfs	squashfs	noatime,ro,loop=/dev/loop0	/dev/loop0	7:0
/lnet/image/LneTLXQT64/10interfaces.squashfs	/lnet/10interfaces.squashfs	squashfs	noatime,ro,loop=/dev/loop1	/dev/loop1	7:1
/dev/sda2	/lnet/cowroot	ext4	data=ordered,relatime,rw	/dev/sda2	8:2
overlay	/	overlay	lowerdir=/lnet/00filesystem.squashfs:/lnet/10interfaces.squashfs,relatime,rw,upperdir=/lnet/cowroot/LneTLXQTCOW/upper,workdir=/lnet/cowroot/LneTLXQTCOW/work	overlay	0:20
tmpfs	/tmp	tmpfs	nodev,nosuid,relatime,rw,size=7860880k,mode=1777	tmpfs	0:21
tmpfs	/var/log	tmpfs	mode=755,nosuid,relatime,rw,size=7860880k	tmpfs	0:22
tmpfs	/var/tmp	tmpfs	nodev,nosuid,relatime,rw,size=7860880k,mode=1777	tmpfs	0:23
securityfs	/sys/kernel/security	securityfs	nodev,noexec,nosuid,relatime,rw	securityfs	0:16
tmpfs	/dev/shm	tmpfs	nodev,nosuid,rw,mode=1777	tmpfs	0:24
tmpfs	/run/lock	tmpfs	nodev,noexec,nosuid,relatime,rw,size=5120k,mode=1777	tmpfs	0:25
tmpfs	/sys/fs/cgroup	tmpfs	mode=755,nodev,noexec,nosuid,ro	tmpfs	0:26
cgroup	/sys/fs/cgroup/systemd	cgroup	name=systemd,nodev,noexec,nosuid,relatime,release_agent=/lib/systemd/systemd-cgroups-agent,rw,xattr	cgroup	0:27
pstore	/sys/fs/pstore	pstore	nodev,noexec,nosuid,relatime,rw	pstore	0:28
cgroup	/sys/fs/cgroup/cpu	cgroup	cpu,nodev,noexec,nosuid,relatime,rw	cgroup	0:29
systemd-1	/proc/sys/fs/binfmt_misc	autofs	direct,fd=27,maxproto=5,minproto=5,pgrp=1,relatime,rw,timeout=0	systemd-1	0:30
hugetlbfs	/dev/hugepages	hugetlbfs	relatime,rw	hugetlbfs	0:31
mqueue	/dev/mqueue	mqueue	relatime,rw	mqueue	0:15
debugfs	/sys/kernel/debug	debugfs	relatime,rw	debugfs	0:7
/lnet/image/LneTLXQT64	/boot	none	ro,bind	/dev/sda1	8:1
/lnet/cowroot/LneTXFCEhome	/home	none	rw,bind	/dev/sda2	8:2
/lnet/cowroot/JPLive	/home/JPLive	none	rw,bind	/dev/sda2	8:2
/lnet/cowroot/JPLive	/lnet/cowroot/LneTXFCEhome/JPLive	none	rw,bind	/dev/sda2	8:2
/lnet/image/grub	/boot/grub	none	ro,bind	/dev/sda1	8:1
/lnet/image/grub	/lnet/image/LneTLXQT64/grub	none	ro,bind	/dev/sda1	8:1
/lnet/cowroot/JPLive/var-spool	/var/spool	none	rw,bind	/dev/sda2	8:2
/lnet/cowroot/LneTXFCEhome/root	/root	none	rw,bind	/dev/sda2	8:2
/lnet/cowroot/JPLive/apt-lib-amd64	/var/lib/apt	none	rw,bind	/dev/sda2	8:2
/lnet/cowroot/JPLive/apt-cache-amd64	/var/cache/apt	none	rw,bind	/dev/sda2	8:2
tmpfs	/run/user/1001	tmpfs	gid=100,mode=700,nodev,nosuid,relatime,rw,size=786088k,uid=1001	tmpfs	0:34
diff mbox

Patch

Signed-off-by: Jordi Pujol Palomer <jordipujolp@gmail.com>
---
Subject: fs: Rename must check same device instead of same mount
Date: Wed, 16 Mar 2016 09:12:21 +0100
--- linux-4.5.0-a/fs/namei.c
+++ linux-4.5.0-b/fs/namei.c	2016-03-15 22:15:03.275460823 +0100
@@ -4424,7 +4424,7 @@  retry:
 	}
 
 	error = -EXDEV;
-	if (old_path.mnt != new_path.mnt)
+	if (old_path.dentry->d_sb->s_dev != new_path.dentry->d_sb->s_dev)
 		goto exit2;
 
 	error = -EBUSY;