From 99a2c80d00e4fbda5efccd28e3115d43cc28cfca Mon Sep 17 00:00:00 2001 From: Sorgelig Date: Fri, 17 Sep 2021 20:12:52 +0800 Subject: [PATCH] exfat: use ATTR_SYSTEM as symlink flag to preserve links while copying on Windows or other OS. --- fs/exfat/exfat_api.h | 8 ++++---- fs/exfat/exfat_super.c | 2 +- fs/exfat/exfat_super.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/exfat/exfat_api.h b/fs/exfat/exfat_api.h index ee6ab0f04..d42e732b0 100644 --- a/fs/exfat/exfat_api.h +++ b/fs/exfat/exfat_api.h @@ -62,17 +62,17 @@ #define ATTR_NORMAL 0x0000 #define ATTR_READONLY 0x0001 #define ATTR_HIDDEN 0x0002 -#define ATTR_SYSTEM 0x0004 +#define ATTR_SYMLINK 0x0004 #define ATTR_VOLUME 0x0008 #define ATTR_SUBDIR 0x0010 #define ATTR_ARCHIVE 0x0020 -#define ATTR_SYMLINK 0x0040 +#define ATTR_SYMLINK_OLD 0x0040 #define ATTR_EXTEND 0x000F #define ATTR_RWMASK 0x007E /* file creation modes */ -#define FM_REGULAR 0x00 -#define FM_SYMLINK 0x40 +#define FM_REGULAR ATTR_NORMAL +#define FM_SYMLINK ATTR_SYMLINK /* return values */ #define FFS_SUCCESS 0 diff --git a/fs/exfat/exfat_super.c b/fs/exfat/exfat_super.c index 99d793f65..3147deeb6 100644 --- a/fs/exfat/exfat_super.c +++ b/fs/exfat/exfat_super.c @@ -1470,7 +1470,7 @@ static int exfat_fill_inode(struct inode *inode, FILE_ID_T *fid) i_size_write(inode, info.Size); EXFAT_I(inode)->mmu_private = i_size_read(inode); set_nlink(inode, info.NumSubdirs); - } else if (info.Attr & ATTR_SYMLINK) { /* symbolic link */ + } else if (info.Attr & (ATTR_SYMLINK | ATTR_SYMLINK_OLD)) { /* symbolic link */ inode->i_generation |= 1; inode->i_mode = exfat_make_mode(sbi, info.Attr, S_IRWXUGO); inode->i_op = &exfat_symlink_inode_operations; diff --git a/fs/exfat/exfat_super.h b/fs/exfat/exfat_super.h index c7780e1d3..3ca6b8d30 100644 --- a/fs/exfat/exfat_super.h +++ b/fs/exfat/exfat_super.h @@ -135,7 +135,7 @@ static inline mode_t exfat_make_mode(struct exfat_sb_info *sbi, if (attr & ATTR_SUBDIR) return (mode & ~sbi->options.fs_dmask) | S_IFDIR; - else if (attr & ATTR_SYMLINK) + else if (attr & (ATTR_SYMLINK | ATTR_SYMLINK_OLD)) return (mode & ~sbi->options.fs_dmask) | S_IFLNK; else return (mode & ~sbi->options.fs_fmask) | S_IFREG;