diff options
| author | Kevin Dankwardt <k@kcomputing.com> | 2010-02-10 23:43:40 +0900 | 
|---|---|---|
| committer | OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> | 2010-02-10 23:49:08 +0900 | 
| commit | eeb5b4ae81f4a750355fa0c15f4fea22fdf83be1 (patch) | |
| tree | d71cdc178b8643a5ddced54dc540403d11af9fa1 | |
| parent | 8045e2985012bdb95d832dfbcceae1815880a6ed (diff) | |
fat: Fix stat->f_namelen
I found that the length of a file name when created cannot exceed 255
characters, yet, pathconf(), via statfs(), returns the maximum as 260.
Signed-off-by: Kevin Dankwardt <k@kcomputing.com>
Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
| -rw-r--r-- | fs/fat/inode.c | 2 | ||||
| -rw-r--r-- | fs/fat/namei_vfat.c | 6 | ||||
| -rw-r--r-- | include/linux/msdos_fs.h | 3 | 
3 files changed, 6 insertions, 5 deletions
| diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 14da530b05ca..d0a504c8feef 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -558,7 +558,7 @@ static int fat_statfs(struct dentry *dentry, struct kstatfs *buf)  	buf->f_bavail = sbi->free_clusters;  	buf->f_fsid.val[0] = (u32)id;  	buf->f_fsid.val[1] = (u32)(id >> 32); -	buf->f_namelen = sbi->options.isvfat ? 260 : 12; +	buf->f_namelen = sbi->options.isvfat ? FAT_LFN_LEN : 12;  	return 0;  } diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 411c192a05fa..c1ef50154868 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c @@ -502,14 +502,14 @@ xlate_to_uni(const unsigned char *name, int len, unsigned char *outname,  		*outlen = utf8s_to_utf16s(name, len, (wchar_t *)outname);  		if (*outlen < 0)  			return *outlen; -		else if (*outlen > 255) +		else if (*outlen > FAT_LFN_LEN)  			return -ENAMETOOLONG;  		op = &outname[*outlen * sizeof(wchar_t)];  	} else {  		if (nls) {  			for (i = 0, ip = name, op = outname, *outlen = 0; -			     i < len && *outlen <= 255; +			     i < len && *outlen <= FAT_LFN_LEN;  			     *outlen += 1)  			{  				if (escape && (*ip == ':')) { @@ -549,7 +549,7 @@ xlate_to_uni(const unsigned char *name, int len, unsigned char *outname,  				return -ENAMETOOLONG;  		} else {  			for (i = 0, ip = name, op = outname, *outlen = 0; -			     i < len && *outlen <= 255; +			     i < len && *outlen <= FAT_LFN_LEN;  			     i++, *outlen += 1)  			{  				*op++ = *ip++; diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h index ce38f1caa5e1..34066e65fdeb 100644 --- a/include/linux/msdos_fs.h +++ b/include/linux/msdos_fs.h @@ -15,6 +15,7 @@  #define MSDOS_DPB_BITS	4		/* log2(MSDOS_DPB) */  #define MSDOS_DPS	(SECTOR_SIZE / sizeof(struct msdos_dir_entry))  #define MSDOS_DPS_BITS	4		/* log2(MSDOS_DPS) */ +#define MSDOS_LONGNAME	256		/* maximum name length */  #define CF_LE_W(v)	le16_to_cpu(v)  #define CF_LE_L(v)	le32_to_cpu(v)  #define CT_LE_W(v)	cpu_to_le16(v) @@ -47,8 +48,8 @@  #define DELETED_FLAG	0xe5	/* marks file as deleted when in name[0] */  #define IS_FREE(n)	(!*(n) || *(n) == DELETED_FLAG) +#define FAT_LFN_LEN	255	/* maximum long name length */  #define MSDOS_NAME	11	/* maximum name length */ -#define MSDOS_LONGNAME	256	/* maximum name length */  #define MSDOS_SLOTS	21	/* max # of slots for short and long names */  #define MSDOS_DOT	".          "	/* ".", padded to MSDOS_NAME chars */  #define MSDOS_DOTDOT	"..         "	/* "..", padded to MSDOS_NAME chars */ | 
