Re: btrfs_clone_files and bind mounts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[CCing Amir since he touched precisely the code responsible for this
semantics]

On 26.02.2018 14:01, Hristo Venev wrote:
> On Tue, 2018-02-20 at 18:41 +0200, Nikolay Borisov wrote:
>>
>> On 20.02.2018 17:50, Hristo Venev wrote:
>>> What is the problem with cloning files between different
>>> (vfs)mounts of
>>> the same filesystem?
>>>
>>
>> The "problem" is not really a problem, but rather a well-imposed
>> restriction:
>>
>> From  http://man7.org/linux/man-pages/man2/ioctl_ficlonerange.2.html
>>
>> "Both files must reside within the same filesystem."
>>
>> And as a matter of fact this is enforced in the generic
>> vfs_clone_file_range. Of course if we were to do this across
>> filesystem
>> then we'd have all the problems associated with not being able to
>> ensure
>> atomicity of operations.
> 
> My question was about doing this within the same filesystem. In my case
> (and I think it's relatively common), subvolumes of the same filesystem
> are mounted separately, and I can't think of a good reason why
> FICLONERANGE can't be made to work (it works if the subvolumes are
> accessed within the same mount point).
> 

So Amir,

In 913b86e92e1f ("vfs: allow vfs_clone_file_range() across mount
points") you did relax the requirements of vfs_clone_file_range by
moving the mount point check into ioctl_file_clone. In btrfs we can have
a situation where multiple subvolumes, belonging to the same FS are at
different mountpoint I.e. :

mount /dev/vdc /media/scratch/
echo "test file" >> /media/scratch/foo

btrfs subvolume create /media/scratch/subvol1

btrfs subvolume list /media/scratch/
   ID 257 gen 7 top level 5 path subvol1

mount -osubvolid=257 /dev/vdc /media/subvol-mount/

cp --reflink=always /media/scratch/foo /media/subvol-mount/foo-reflink

cp: failed to clone '/media/subvol-mount/foo-reflink' from
'/media/scratch/foo': Invalid cross-device link


Shouldn't reflinking be allowed in this case? ftrace shows that we are
failing "if (src_file.file->f_path.mnt != dst_file->f_path.mnt)" in
ioctl_file_clone


In your commit you state:

FICLONE/FICLONERANGE ioctls enforce that src and dest files are on
 the same mount.

Whereas the man page says they should be on the same filesystem (not
necessarily on the same mount?)
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux