[libvirt] [PATCH 2/2] storage: Rename btrfsCloneFile to support other filesystems.
Michal Privoznik
mprivozn at redhat.com
Mon Jul 9 10:05:31 UTC 2018
On 07/09/2018 08:57 AM, Peter Krempa wrote:
> On Fri, Jul 06, 2018 at 16:57:17 +0200, Michal Privoznik wrote:
>> On 07/06/2018 03:43 PM, Julio Faracco wrote:
>>> This commit renames and adds other macros to support aother filesystems
>>> when a reflink is performed. After that, XFS filesystems (and others)
>>> with reflink support will be able to clone.
>>>
>>> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1565004
>>>
>>> Signed-off-by: Julio Faracco <jcfaracco at gmail.com>
>>> ---
>>> src/storage/storage_util.c | 20 ++++++++++++++------
>>> 1 file changed, 14 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
>>> index a701a75702..fd1239c6cb 100644
>>> --- a/src/storage/storage_util.c
>>> +++ b/src/storage/storage_util.c
>>> @@ -36,6 +36,9 @@
>>> # ifndef FS_NOCOW_FL
>>> # define FS_NOCOW_FL 0x00800000 /* Do not cow file */
>>> # endif
>>> +# ifdef FICLONE
>>> +# define REFLINK_IOC_CLONE FICLONE
>>> +# endif
>>> #endif
>>>
>>> #if WITH_BLKID
>>> @@ -48,6 +51,10 @@
>>>
>>> #if HAVE_LINUX_BTRFS_H
>>> # include <linux/btrfs.h>
>>> +# define REFLINK_IOC_CLONE BTRFS_IOC_CLONE
>>> +#elif HAVE_XFS_XFS_H
>>> +# include <xfs/xfs.h>
>>> +# define REFLINK_IOC_CLONE XFS_IOC_CLONE
>>> #endif
>>>
>>
>> Problem is, REFLING_IOC_CLONE is defined already at this point (by hunk
>> above) so this redefines the macro.
>>
>> Fixed by squashing this in:
>>
>> diff --git i/src/storage/storage_util.c w/src/storage/storage_util.c
>> index fd1239c6cb..da99043e0a 100644
>> --- i/src/storage/storage_util.c
>> +++ w/src/storage/storage_util.c
>> @@ -36,9 +36,6 @@
>> # ifndef FS_NOCOW_FL
>> # define FS_NOCOW_FL 0x00800000 /* Do not cow file */
>> # endif
>> -# ifdef FICLONE
>> -# define REFLINK_IOC_CLONE FICLONE
>> -# endif
>> #endif
>>
>> #if WITH_BLKID
>> @@ -55,6 +52,8 @@
>> #elif HAVE_XFS_XFS_H
>> # include <xfs/xfs.h>
>> # define REFLINK_IOC_CLONE XFS_IOC_CLONE
>> +#elif defined(FICLONE)
>> +# define REFLINK_IOC_CLONE FICLONE
>
> While it fortunately does not matter functionally as:
>
> /usr/include/linux/fs.h:#define FICLONE _IOW(0x94, 9, int)
>
> /usr/include/xfs/xfs_fs.h:#define XFS_IOC_CLONE _IOW (0x94, 9, int)
>
> /usr/include/linux/btrfs.h:#define BTRFS_IOCTL_MAGIC 0x94
> /usr/include/linux/btrfs.h:#define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int)
Huh. So why are filesystems providing their own symbol? Just to confuse
users?
>
> I think the logic should be the other way around and use the
> most-generic definition first. This is just plain confusing for readers
> e.g. if you have both headers for XFS and BTRFS. For linux users it does
> not matter if any of the others are defined as the FICLONE should always
> be defined.
Okay. I'll post a patch for that.
Michal
More information about the libvir-list
mailing list