Commit 35a829c1 authored by Valdis Kletnieks's avatar Valdis Kletnieks Committed by Greg Kroah-Hartman
Browse files

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: default avatarValdis Kletnieks <Valdis.Kletnieks@vt.edu>
Link: https://lore.kernel.org/r/20191112211238.156490-5-Valdis.Kletnieks@vt.edu


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2a17b09f
Loading
Loading
Loading
Loading
+0 −19
Original line number Diff line number Diff line
@@ -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);
+0 −137
Original line number Diff line number Diff line
@@ -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;
+0 −192
Original line number Diff line number Diff line
@@ -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)
{