exfat: use ATTR_SYSTEM as symlink flag to preserve links while copying on Windows or other OS.

This commit is contained in:
Sorgelig
2021-09-17 20:12:52 +08:00
parent 7f7148c1f0
commit 99a2c80d00
3 changed files with 6 additions and 6 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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;