]> git.hungrycats.org Git - linux/commitdiff
fat: Fix stat->f_namelen
authorKevin Dankwardt <k@kcomputing.com>
Wed, 10 Feb 2010 14:43:40 +0000 (23:43 +0900)
committerWilly Tarreau <w@1wt.eu>
Mon, 10 Jun 2013 09:43:21 +0000 (11:43 +0200)
commit eeb5b4ae81f4a750355fa0c15f4fea22fdf83be1 upstream.

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>
Signed-off-by: Willy Tarreau <w@1wt.eu>
fs/fat/inode.c
fs/fat/namei_vfat.c
include/linux/msdos_fs.h

index 76b7961ab6632e5d955a9139eaa4b0652e11ff8c..c187e92e129547b92fe04319d260f8a545b5db0e 100644 (file)
@@ -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;
 }
index 72646e2c0f48c585b96550f084e2ddf6eed06f07..67b3df1feae6c037b29919be70172947f4e6d7b5 100644 (file)
@@ -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++;
index ce38f1caa5e1346e748ee0fca6d5d7b66c2aae0d..34066e65fdeb327b4da8e0fd58e4dc143d985fc4 100644 (file)
@@ -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 */