2.6.32-longterm review patch.  If anyone has any objections, please let me know.

------------------

From: Kevin Dankwardt <[email protected]>

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 <[email protected]>
Signed-off-by: OGAWA Hirofumi <[email protected]>
Signed-off-by: Willy Tarreau <[email protected]>
---
 fs/fat/inode.c           | 2 +-
 fs/fat/namei_vfat.c      | 6 +++---
 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 76b7961..c187e92 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 72646e2..67b3df1 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 ce38f1c..34066e6 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 */
-- 
1.7.12.2.21.g234cd45.dirty



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to