staging: exfat: Remove FAT/VFAT mount support, part 4
The code simplification from the previous patch rendered a few more routines unreferenced, so heave them over the side as well. Signed-off-by: Valdis Kletnieks <Valdis.Kletnieks@vt.edu> Link: https://lore.kernel.org/r/20191112211238.156490-5-Valdis.Kletnieks@vt.edu Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2a17b09fde
commit
35a829c1b7
@ -729,14 +729,7 @@ static inline struct exfat_inode_info *EXFAT_I(struct inode *inode)
|
||||
|
||||
/* NLS management function */
|
||||
u16 nls_upper(struct super_block *sb, u16 a);
|
||||
int nls_dosname_cmp(struct super_block *sb, u8 *a, u8 *b);
|
||||
int nls_uniname_cmp(struct super_block *sb, u16 *a, u16 *b);
|
||||
void nls_uniname_to_dosname(struct super_block *sb,
|
||||
struct dos_name_t *p_dosname,
|
||||
struct uni_name_t *p_uniname, bool *p_lossy);
|
||||
void nls_dosname_to_uniname(struct super_block *sb,
|
||||
struct uni_name_t *p_uniname,
|
||||
struct dos_name_t *p_dosname);
|
||||
void nls_uniname_to_cstring(struct super_block *sb, u8 *p_cstring,
|
||||
struct uni_name_t *p_uniname);
|
||||
void nls_cstring_to_uniname(struct super_block *sb,
|
||||
@ -805,10 +798,6 @@ void exfat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp,
|
||||
u8 mode);
|
||||
s32 exfat_init_dir_entry(struct super_block *sb, struct chain_t *p_dir,
|
||||
s32 entry, u32 type, u32 start_clu, u64 size);
|
||||
s32 exfat_init_ext_dir_entry(struct super_block *sb, struct chain_t *p_dir,
|
||||
s32 entry, s32 num_entries,
|
||||
struct uni_name_t *p_uniname,
|
||||
struct dos_name_t *p_dosname);
|
||||
void init_file_entry(struct file_dentry_t *ep, u32 type);
|
||||
void init_strm_entry(struct strm_dentry_t *ep, u8 flags, u32 start_clu,
|
||||
u64 size);
|
||||
@ -850,25 +839,17 @@ bool is_dir_empty(struct super_block *sb, struct chain_t *p_dir);
|
||||
s32 get_num_entries_and_dos_name(struct super_block *sb, struct chain_t *p_dir,
|
||||
struct uni_name_t *p_uniname, s32 *entries,
|
||||
struct dos_name_t *p_dosname);
|
||||
void get_uni_name_from_dos_entry(struct super_block *sb,
|
||||
struct dos_dentry_t *ep,
|
||||
struct uni_name_t *p_uniname, u8 mode);
|
||||
void exfat_get_uni_name_from_ext_entry(struct super_block *sb,
|
||||
struct chain_t *p_dir, s32 entry,
|
||||
u16 *uniname);
|
||||
s32 extract_uni_name_from_name_entry(struct name_dentry_t *ep,
|
||||
u16 *uniname, s32 order);
|
||||
s32 fat_generate_dos_name(struct super_block *sb, struct chain_t *p_dir,
|
||||
struct dos_name_t *p_dosname);
|
||||
void fat_attach_count_to_dos_name(u8 *dosname, s32 count);
|
||||
s32 fat_calc_num_entries(struct uni_name_t *p_uniname);
|
||||
s32 exfat_calc_num_entries(struct uni_name_t *p_uniname);
|
||||
u16 calc_checksum_2byte(void *data, s32 len, u16 chksum, s32 type);
|
||||
|
||||
/* name resolution functions */
|
||||
s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir,
|
||||
struct uni_name_t *p_uniname);
|
||||
s32 resolve_name(u8 *name, u8 **arg);
|
||||
|
||||
/* file operation functions */
|
||||
s32 exfat_mount(struct super_block *sb, struct pbr_sector_t *p_pbr);
|
||||
|
@ -1976,21 +1976,6 @@ s32 get_num_entries_and_dos_name(struct super_block *sb, struct chain_t *p_dir,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void get_uni_name_from_dos_entry(struct super_block *sb,
|
||||
struct dos_dentry_t *ep,
|
||||
struct uni_name_t *p_uniname, u8 mode)
|
||||
{
|
||||
struct dos_name_t dos_name;
|
||||
|
||||
if (mode == 0x0)
|
||||
dos_name.name_case = 0x0;
|
||||
else
|
||||
dos_name.name_case = ep->lcase;
|
||||
|
||||
memcpy(dos_name.name, ep->name, DOS_NAME_LENGTH);
|
||||
nls_dosname_to_uniname(sb, p_uniname, &dos_name);
|
||||
}
|
||||
|
||||
void exfat_get_uni_name_from_ext_entry(struct super_block *sb,
|
||||
struct chain_t *p_dir, s32 entry,
|
||||
u16 *uniname)
|
||||
@ -2045,128 +2030,6 @@ s32 extract_uni_name_from_name_entry(struct name_dentry_t *ep, u16 *uniname,
|
||||
return len;
|
||||
}
|
||||
|
||||
s32 fat_generate_dos_name(struct super_block *sb, struct chain_t *p_dir,
|
||||
struct dos_name_t *p_dosname)
|
||||
{
|
||||
int i, j, count = 0;
|
||||
bool count_begin = false;
|
||||
s32 dentries_per_clu;
|
||||
u32 type;
|
||||
u8 bmap[128/* 1 ~ 1023 */];
|
||||
struct chain_t clu;
|
||||
struct dos_dentry_t *ep;
|
||||
struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info);
|
||||
|
||||
memset(bmap, 0, sizeof(bmap));
|
||||
exfat_bitmap_set(bmap, 0);
|
||||
|
||||
if (p_dir->dir == CLUSTER_32(0)) /* FAT16 root_dir */
|
||||
dentries_per_clu = p_fs->dentries_in_root;
|
||||
else
|
||||
dentries_per_clu = p_fs->dentries_per_clu;
|
||||
|
||||
clu.dir = p_dir->dir;
|
||||
clu.flags = p_dir->flags;
|
||||
|
||||
while (clu.dir != CLUSTER_32(~0)) {
|
||||
if (p_fs->dev_ejected)
|
||||
break;
|
||||
|
||||
for (i = 0; i < dentries_per_clu; i++) {
|
||||
ep = (struct dos_dentry_t *)get_entry_in_dir(sb, &clu,
|
||||
i, NULL);
|
||||
if (!ep)
|
||||
return -ENOENT;
|
||||
|
||||
type = p_fs->fs_func->get_entry_type((struct dentry_t *)
|
||||
ep);
|
||||
|
||||
if (type == TYPE_UNUSED)
|
||||
break;
|
||||
if ((type != TYPE_FILE) && (type != TYPE_DIR))
|
||||
continue;
|
||||
|
||||
count = 0;
|
||||
count_begin = false;
|
||||
|
||||
for (j = 0; j < 8; j++) {
|
||||
if (ep->name[j] == ' ')
|
||||
break;
|
||||
|
||||
if (ep->name[j] == '~') {
|
||||
count_begin = true;
|
||||
} else if (count_begin) {
|
||||
if ((ep->name[j] >= '0') &&
|
||||
(ep->name[j] <= '9')) {
|
||||
count = count * 10 +
|
||||
(ep->name[j] - '0');
|
||||
} else {
|
||||
count = 0;
|
||||
count_begin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((count > 0) && (count < 1024))
|
||||
exfat_bitmap_set(bmap, count);
|
||||
}
|
||||
|
||||
if (p_dir->dir == CLUSTER_32(0))
|
||||
break; /* FAT16 root_dir */
|
||||
|
||||
if (FAT_read(sb, clu.dir, &clu.dir) != 0)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
count = 0;
|
||||
for (i = 0; i < 128; i++) {
|
||||
if (bmap[i] != 0xFF) {
|
||||
for (j = 0; j < 8; j++) {
|
||||
if (exfat_bitmap_test(&bmap[i], j) == 0) {
|
||||
count = (i << 3) + j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (count != 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((count == 0) || (count >= 1024))
|
||||
return -EEXIST;
|
||||
fat_attach_count_to_dos_name(p_dosname->name, count);
|
||||
|
||||
/* Now dos_name has DOS~????.EXT */
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fat_attach_count_to_dos_name(u8 *dosname, s32 count)
|
||||
{
|
||||
int i, j, length;
|
||||
char str_count[6];
|
||||
|
||||
snprintf(str_count, sizeof(str_count), "~%d", count);
|
||||
length = strlen(str_count);
|
||||
|
||||
i = 0;
|
||||
j = 0;
|
||||
while (j <= (8 - length)) {
|
||||
i = j;
|
||||
if (dosname[j] == ' ')
|
||||
break;
|
||||
if (dosname[j] & 0x80)
|
||||
j += 2;
|
||||
else
|
||||
j++;
|
||||
}
|
||||
|
||||
for (j = 0; j < length; i++, j++)
|
||||
dosname[i] = (u8)str_count[j];
|
||||
|
||||
if (i == 7)
|
||||
dosname[7] = ' ';
|
||||
}
|
||||
|
||||
s32 exfat_calc_num_entries(struct uni_name_t *p_uniname)
|
||||
{
|
||||
s32 len;
|
||||
|
@ -7,13 +7,6 @@
|
||||
#include <linux/nls.h>
|
||||
#include "exfat.h"
|
||||
|
||||
static u16 bad_dos_chars[] = {
|
||||
/* + , ; = [ ] */
|
||||
0x002B, 0x002C, 0x003B, 0x003D, 0x005B, 0x005D,
|
||||
0xFF0B, 0xFF0C, 0xFF1B, 0xFF1D, 0xFF3B, 0xFF3D,
|
||||
0
|
||||
};
|
||||
|
||||
static u16 bad_uni_chars[] = {
|
||||
/* " * / : < > ? \ | */
|
||||
0x0022, 0x002A, 0x002F, 0x003A,
|
||||
@ -96,11 +89,6 @@ static u16 *nls_wstrchr(u16 *str, u16 wchar)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int nls_dosname_cmp(struct super_block *sb, u8 *a, u8 *b)
|
||||
{
|
||||
return strncmp(a, b, DOS_NAME_LENGTH);
|
||||
}
|
||||
|
||||
int nls_uniname_cmp(struct super_block *sb, u16 *a, u16 *b)
|
||||
{
|
||||
int i;
|
||||
@ -114,186 +102,6 @@ int nls_uniname_cmp(struct super_block *sb, u16 *a, u16 *b)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nls_uniname_to_dosname(struct super_block *sb,
|
||||
struct dos_name_t *p_dosname,
|
||||
struct uni_name_t *p_uniname, bool *p_lossy)
|
||||
{
|
||||
int i, j, len;
|
||||
bool lossy = false;
|
||||
u8 buf[MAX_CHARSET_SIZE];
|
||||
u8 lower = 0, upper = 0;
|
||||
u8 *dosname = p_dosname->name;
|
||||
u16 *uniname = p_uniname->name;
|
||||
u16 *p, *last_period;
|
||||
struct nls_table *nls = EXFAT_SB(sb)->nls_disk;
|
||||
|
||||
for (i = 0; i < DOS_NAME_LENGTH; i++)
|
||||
*(dosname + i) = ' ';
|
||||
|
||||
if (!nls_uniname_cmp(sb, uniname, (u16 *)UNI_CUR_DIR_NAME)) {
|
||||
*(dosname) = '.';
|
||||
p_dosname->name_case = 0x0;
|
||||
if (p_lossy)
|
||||
*p_lossy = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!nls_uniname_cmp(sb, uniname, (u16 *)UNI_PAR_DIR_NAME)) {
|
||||
*(dosname) = '.';
|
||||
*(dosname + 1) = '.';
|
||||
p_dosname->name_case = 0x0;
|
||||
if (p_lossy)
|
||||
*p_lossy = false;
|
||||
return;
|
||||
}
|
||||
|
||||
/* search for the last embedded period */
|
||||
last_period = NULL;
|
||||
for (p = uniname; *p; p++) {
|
||||
if (*p == (u16)'.')
|
||||
last_period = p;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while (i < DOS_NAME_LENGTH) {
|
||||
if (i == 8) {
|
||||
if (!last_period)
|
||||
break;
|
||||
|
||||
if (uniname <= last_period) {
|
||||
if (uniname < last_period)
|
||||
lossy = true;
|
||||
uniname = last_period + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (*uniname == (u16)'\0') {
|
||||
break;
|
||||
} else if (*uniname == (u16)' ') {
|
||||
lossy = true;
|
||||
} else if (*uniname == (u16)'.') {
|
||||
if (uniname < last_period)
|
||||
lossy = true;
|
||||
else
|
||||
i = 8;
|
||||
} else if (nls_wstrchr(bad_dos_chars, *uniname)) {
|
||||
lossy = true;
|
||||
*(dosname + i) = '_';
|
||||
i++;
|
||||
} else {
|
||||
len = convert_uni_to_ch(nls, buf, *uniname, &lossy);
|
||||
|
||||
if (len > 1) {
|
||||
if ((i >= 8) && ((i + len) > DOS_NAME_LENGTH))
|
||||
break;
|
||||
|
||||
if ((i < 8) && ((i + len) > 8)) {
|
||||
i = 8;
|
||||
continue;
|
||||
}
|
||||
|
||||
lower = 0xFF;
|
||||
|
||||
for (j = 0; j < len; j++, i++)
|
||||
*(dosname + i) = *(buf + j);
|
||||
} else { /* len == 1 */
|
||||
if ((*buf >= 'a') && (*buf <= 'z')) {
|
||||
*(dosname + i) = *buf - ('a' - 'A');
|
||||
|
||||
if (i < 8)
|
||||
lower |= 0x08;
|
||||
else
|
||||
lower |= 0x10;
|
||||
} else if ((*buf >= 'A') && (*buf <= 'Z')) {
|
||||
*(dosname + i) = *buf;
|
||||
|
||||
if (i < 8)
|
||||
upper |= 0x08;
|
||||
else
|
||||
upper |= 0x10;
|
||||
} else {
|
||||
*(dosname + i) = *buf;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
uniname++;
|
||||
}
|
||||
|
||||
if (*dosname == 0xE5)
|
||||
*dosname = 0x05;
|
||||
|
||||
if (*uniname != 0x0)
|
||||
lossy = true;
|
||||
|
||||
if (upper & lower)
|
||||
p_dosname->name_case = 0xFF;
|
||||
else
|
||||
p_dosname->name_case = lower;
|
||||
|
||||
if (p_lossy)
|
||||
*p_lossy = lossy;
|
||||
}
|
||||
|
||||
void nls_dosname_to_uniname(struct super_block *sb,
|
||||
struct uni_name_t *p_uniname,
|
||||
struct dos_name_t *p_dosname)
|
||||
{
|
||||
int i = 0, j, n = 0;
|
||||
u8 buf[DOS_NAME_LENGTH + 2];
|
||||
u8 *dosname = p_dosname->name;
|
||||
u16 *uniname = p_uniname->name;
|
||||
struct nls_table *nls = EXFAT_SB(sb)->nls_disk;
|
||||
|
||||
if (*dosname == 0x05) {
|
||||
*buf = 0xE5;
|
||||
i++;
|
||||
n++;
|
||||
}
|
||||
|
||||
for (; i < 8; i++, n++) {
|
||||
if (*(dosname + i) == ' ')
|
||||
break;
|
||||
|
||||
if ((*(dosname + i) >= 'A') && (*(dosname + i) <= 'Z') &&
|
||||
(p_dosname->name_case & 0x08))
|
||||
*(buf + n) = *(dosname + i) + ('a' - 'A');
|
||||
else
|
||||
*(buf + n) = *(dosname + i);
|
||||
}
|
||||
if (*(dosname + 8) != ' ') {
|
||||
*(buf + n) = '.';
|
||||
n++;
|
||||
}
|
||||
|
||||
for (i = 8; i < DOS_NAME_LENGTH; i++, n++) {
|
||||
if (*(dosname + i) == ' ')
|
||||
break;
|
||||
|
||||
if ((*(dosname + i) >= 'A') && (*(dosname + i) <= 'Z') &&
|
||||
(p_dosname->name_case & 0x10))
|
||||
*(buf + n) = *(dosname + i) + ('a' - 'A');
|
||||
else
|
||||
*(buf + n) = *(dosname + i);
|
||||
}
|
||||
*(buf + n) = '\0';
|
||||
|
||||
i = 0;
|
||||
j = 0;
|
||||
while (j < (MAX_NAME_LENGTH - 1)) {
|
||||
if (*(buf + i) == '\0')
|
||||
break;
|
||||
|
||||
i += convert_ch_to_uni(nls, uniname, (buf + i), NULL);
|
||||
|
||||
uniname++;
|
||||
j++;
|
||||
}
|
||||
|
||||
*uniname = (u16)'\0';
|
||||
}
|
||||
|
||||
void nls_uniname_to_cstring(struct super_block *sb, u8 *p_cstring,
|
||||
struct uni_name_t *p_uniname)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user