[PATCH 03/21] fat: split include/msdos_fs.h - Kernel

This is a discussion on [PATCH 03/21] fat: split include/msdos_fs.h - Kernel ; This splits __KERNEL__ stuff in include/msdos_fs.h into fs/fat/fat.h. Signed-off-by: OGAWA Hirofumi --- fs/fat/cache.c | 2 fs/fat/dir.c | 2 fs/fat/fat.h | 274 +++++++++++++++++++++++++++++++++++++++++++++ fs/fat/fatent.c | 1 fs/fat/file.c | 2 fs/fat/inode.c | 2 fs/fat/misc.c | 2 fs/fat/namei_msdos.c | 2 fs/fat/namei_vfat.c | 3 ...

+ Reply to Thread
Results 1 to 5 of 5

Thread: [PATCH 03/21] fat: split include/msdos_fs.h

  1. [PATCH 03/21] fat: split include/msdos_fs.h


    This splits __KERNEL__ stuff in include/msdos_fs.h into fs/fat/fat.h.

    Signed-off-by: OGAWA Hirofumi
    ---

    fs/fat/cache.c | 2
    fs/fat/dir.c | 2
    fs/fat/fat.h | 274 +++++++++++++++++++++++++++++++++++++++++++++
    fs/fat/fatent.c | 1
    fs/fat/file.c | 2
    fs/fat/inode.c | 2
    fs/fat/misc.c | 2
    fs/fat/namei_msdos.c | 2
    fs/fat/namei_vfat.c | 3
    include/linux/msdos_fs.h | 276 ----------------------------------------------
    10 files changed, 284 insertions(+), 282 deletions(-)

    diff -puN fs/fat/cache.c~fat_split-msdos_fs-h fs/fat/cache.c
    --- linux-2.6/fs/fat/cache.c~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/cache.c 2008-10-11 23:45:34.000000000 +0900
    @@ -9,8 +9,8 @@
    */

    #include
    -#include
    #include
    +#include "fat.h"

    /* this must be > 0. */
    #define FAT_MAX_CACHE 8
    diff -puN fs/fat/dir.c~fat_split-msdos_fs-h fs/fat/dir.c
    --- linux-2.6/fs/fat/dir.c~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/dir.c 2008-10-11 23:45:34.000000000 +0900
    @@ -16,11 +16,11 @@
    #include
    #include
    #include
    -#include
    #include
    #include
    #include
    #include
    +#include "fat.h"

    static inline loff_t fat_make_i_pos(struct super_block *sb,
    struct buffer_head *bh,
    diff -puN /dev/null fs/fat/fat.h
    --- /dev/null 2008-10-10 23:58:12.880001316 +0900
    +++ linux-2.6-hirofumi/fs/fat/fat.h 2008-10-11 23:45:34.000000000 +0900
    @@ -0,0 +1,274 @@
    +#ifndef _FAT_H
    +#define _FAT_H
    +
    +#include
    +#include
    +#include
    +#include
    +#include
    +#include
    +
    +/*
    + * vfat shortname flags
    + */
    +#define VFAT_SFN_DISPLAY_LOWER 0x0001 /* convert to lowercase for display */
    +#define VFAT_SFN_DISPLAY_WIN95 0x0002 /* emulate win95 rule for display */
    +#define VFAT_SFN_DISPLAY_WINNT 0x0004 /* emulate winnt rule for display */
    +#define VFAT_SFN_CREATE_WIN95 0x0100 /* emulate win95 rule for create */
    +#define VFAT_SFN_CREATE_WINNT 0x0200 /* emulate winnt rule for create */
    +
    +struct fat_mount_options {
    + uid_t fs_uid;
    + gid_t fs_gid;
    + unsigned short fs_fmask;
    + unsigned short fs_dmask;
    + unsigned short codepage; /* Codepage for shortname conversions */
    + char *iocharset; /* Charset used for filename input/display */
    + unsigned short shortname; /* flags for shortname display/create rule */
    + unsigned char name_check; /* r = relaxed, n = normal, s = strict */
    + unsigned short allow_utime;/* permission for setting the [am]time */
    + unsigned quiet:1, /* set = fake successful chmods and chowns */
    + showexec:1, /* set = only set x bit for com/exe/bat */
    + sys_immutable:1, /* set = system files are immutable */
    + dotsOK:1, /* set = hidden and system files are named '.filename' */
    + isvfat:1, /* 0=no vfat long filename support, 1=vfat support */
    + utf8:1, /* Use of UTF-8 character set (Default) */
    + unicode_xlate:1, /* create escape sequences for unhandled Unicode */
    + numtail:1, /* Does first alias have a numeric '~1' type tail? */
    + flush:1, /* write things quickly */
    + nocase:1, /* Does this need case conversion? 0=need case conversion*/
    + usefree:1, /* Use free_clusters for FAT32 */
    + tz_utc:1; /* Filesystem timestamps are in UTC */
    +};
    +
    +#define FAT_HASH_BITS 8
    +#define FAT_HASH_SIZE (1UL << FAT_HASH_BITS)
    +#define FAT_HASH_MASK (FAT_HASH_SIZE-1)
    +
    +/*
    + * MS-DOS file system in-core superblock data
    + */
    +struct msdos_sb_info {
    + unsigned short sec_per_clus; /* sectors/cluster */
    + unsigned short cluster_bits; /* log2(cluster_size) */
    + unsigned int cluster_size; /* cluster size */
    + unsigned char fats,fat_bits; /* number of FATs, FAT bits (12 or 16) */
    + unsigned short fat_start;
    + unsigned long fat_length; /* FAT start & length (sec.) */
    + unsigned long dir_start;
    + unsigned short dir_entries; /* root dir start & entries */
    + unsigned long data_start; /* first data sector */
    + unsigned long max_cluster; /* maximum cluster number */
    + unsigned long root_cluster; /* first cluster of the root directory */
    + unsigned long fsinfo_sector; /* sector number of FAT32 fsinfo */
    + struct mutex fat_lock;
    + unsigned int prev_free; /* previously allocated cluster number */
    + unsigned int free_clusters; /* -1 if undefined */
    + unsigned int free_clus_valid; /* is free_clusters valid? */
    + struct fat_mount_options options;
    + struct nls_table *nls_disk; /* Codepage used on disk */
    + struct nls_table *nls_io; /* Charset used for input and display */
    + const void *dir_ops; /* Opaque; default directory operations */
    + int dir_per_block; /* dir entries per block */
    + int dir_per_block_bits; /* log2(dir_per_block) */
    +
    + int fatent_shift;
    + struct fatent_operations *fatent_ops;
    +
    + spinlock_t inode_hash_lock;
    + struct hlist_head inode_hashtable[FAT_HASH_SIZE];
    +};
    +
    +#define FAT_CACHE_VALID 0 /* special case for valid cache */
    +
    +/*
    + * MS-DOS file system inode data in memory
    + */
    +struct msdos_inode_info {
    + spinlock_t cache_lru_lock;
    + struct list_head cache_lru;
    + int nr_caches;
    + /* for avoiding the race between fat_free() and fat_get_cluster() */
    + unsigned int cache_valid_id;
    +
    + loff_t mmu_private;
    + int i_start; /* first cluster or 0 */
    + int i_logstart; /* logical first cluster */
    + int i_attrs; /* unused attribute bits */
    + loff_t i_pos; /* on-disk position of directory entry or 0 */
    + struct hlist_node i_fat_hash; /* hash by i_location */
    + struct inode vfs_inode;
    +};
    +
    +struct fat_slot_info {
    + loff_t i_pos; /* on-disk position of directory entry */
    + loff_t slot_off; /* offset for slot or de start */
    + int nr_slots; /* number of slots + 1(de) in filename */
    + struct msdos_dir_entry *de;
    + struct buffer_head *bh;
    +};
    +
    +static inline struct msdos_sb_info *MSDOS_SB(struct super_block *sb)
    +{
    + return sb->s_fs_info;
    +}
    +
    +static inline struct msdos_inode_info *MSDOS_I(struct inode *inode)
    +{
    + return container_of(inode, struct msdos_inode_info, vfs_inode);
    +}
    +
    +/* Return the FAT attribute byte for this inode */
    +static inline u8 fat_attr(struct inode *inode)
    +{
    + return ((inode->i_mode & S_IWUGO) ? ATTR_NONE : ATTR_RO) |
    + (S_ISDIR(inode->i_mode) ? ATTR_DIR : ATTR_NONE) |
    + MSDOS_I(inode)->i_attrs;
    +}
    +
    +static inline unsigned char fat_checksum(const __u8 *name)
    +{
    + unsigned char s = name[0];
    + s = (s<<7) + (s>>1) + name[1]; s = (s<<7) + (s>>1) + name[2];
    + s = (s<<7) + (s>>1) + name[3]; s = (s<<7) + (s>>1) + name[4];
    + s = (s<<7) + (s>>1) + name[5]; s = (s<<7) + (s>>1) + name[6];
    + s = (s<<7) + (s>>1) + name[7]; s = (s<<7) + (s>>1) + name[8];
    + s = (s<<7) + (s>>1) + name[9]; s = (s<<7) + (s>>1) + name[10];
    + return s;
    +}
    +
    +static inline sector_t fat_clus_to_blknr(struct msdos_sb_info *sbi, int clus)
    +{
    + return ((sector_t)clus - FAT_START_ENT) * sbi->sec_per_clus
    + + sbi->data_start;
    +}
    +
    +static inline void fat16_towchar(wchar_t *dst, const __u8 *src, size_t len)
    +{
    +#ifdef __BIG_ENDIAN
    + while (len--) {
    + *dst++ = src[0] | (src[1] << 8);
    + src += 2;
    + }
    +#else
    + memcpy(dst, src, len * 2);
    +#endif
    +}
    +
    +static inline void fatwchar_to16(__u8 *dst, const wchar_t *src, size_t len)
    +{
    +#ifdef __BIG_ENDIAN
    + while (len--) {
    + dst[0] = *src & 0x00FF;
    + dst[1] = (*src & 0xFF00) >> 8;
    + dst += 2;
    + src++;
    + }
    +#else
    + memcpy(dst, src, len * 2);
    +#endif
    +}
    +
    +/* fat/cache.c */
    +extern void fat_cache_inval_inode(struct inode *inode);
    +extern int fat_get_cluster(struct inode *inode, int cluster,
    + int *fclus, int *dclus);
    +extern int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys,
    + unsigned long *mapped_blocks);
    +
    +/* fat/dir.c */
    +extern const struct file_operations fat_dir_operations;
    +extern int fat_search_long(struct inode *inode, const unsigned char *name,
    + int name_len, struct fat_slot_info *sinfo);
    +extern int fat_dir_empty(struct inode *dir);
    +extern int fat_subdirs(struct inode *dir);
    +extern int fat_scan(struct inode *dir, const unsigned char *name,
    + struct fat_slot_info *sinfo);
    +extern int fat_get_dotdot_entry(struct inode *dir, struct buffer_head **bh,
    + struct msdos_dir_entry **de, loff_t *i_pos);
    +extern int fat_alloc_new_dir(struct inode *dir, struct timespec *ts);
    +extern int fat_add_entries(struct inode *dir, void *slots, int nr_slots,
    + struct fat_slot_info *sinfo);
    +extern int fat_remove_entries(struct inode *dir, struct fat_slot_info *sinfo);
    +
    +/* fat/fatent.c */
    +struct fat_entry {
    + int entry;
    + union {
    + u8 *ent12_p[2];
    + __le16 *ent16_p;
    + __le32 *ent32_p;
    + } u;
    + int nr_bhs;
    + struct buffer_head *bhs[2];
    +};
    +
    +static inline void fatent_init(struct fat_entry *fatent)
    +{
    + fatent->nr_bhs = 0;
    + fatent->entry = 0;
    + fatent->u.ent32_p = NULL;
    + fatent->bhs[0] = fatent->bhs[1] = NULL;
    +}
    +
    +static inline void fatent_set_entry(struct fat_entry *fatent, int entry)
    +{
    + fatent->entry = entry;
    + fatent->u.ent32_p = NULL;
    +}
    +
    +static inline void fatent_brelse(struct fat_entry *fatent)
    +{
    + int i;
    + fatent->u.ent32_p = NULL;
    + for (i = 0; i < fatent->nr_bhs; i++)
    + brelse(fatent->bhs[i]);
    + fatent->nr_bhs = 0;
    + fatent->bhs[0] = fatent->bhs[1] = NULL;
    +}
    +
    +extern void fat_ent_access_init(struct super_block *sb);
    +extern int fat_ent_read(struct inode *inode, struct fat_entry *fatent,
    + int entry);
    +extern int fat_ent_write(struct inode *inode, struct fat_entry *fatent,
    + int new, int wait);
    +extern int fat_alloc_clusters(struct inode *inode, int *cluster,
    + int nr_cluster);
    +extern int fat_free_clusters(struct inode *inode, int cluster);
    +extern int fat_count_free_clusters(struct super_block *sb);
    +
    +/* fat/file.c */
    +extern int fat_generic_ioctl(struct inode *inode, struct file *filp,
    + unsigned int cmd, unsigned long arg);
    +extern const struct file_operations fat_file_operations;
    +extern const struct inode_operations fat_file_inode_operations;
    +extern int fat_setattr(struct dentry * dentry, struct iattr * attr);
    +extern void fat_truncate(struct inode *inode);
    +extern int fat_getattr(struct vfsmount *mnt, struct dentry *dentry,
    + struct kstat *stat);
    +
    +/* fat/inode.c */
    +extern void fat_attach(struct inode *inode, loff_t i_pos);
    +extern void fat_detach(struct inode *inode);
    +extern struct inode *fat_iget(struct super_block *sb, loff_t i_pos);
    +extern struct inode *fat_build_inode(struct super_block *sb,
    + struct msdos_dir_entry *de, loff_t i_pos);
    +extern int fat_sync_inode(struct inode *inode);
    +extern int fat_fill_super(struct super_block *sb, void *data, int silent,
    + const struct inode_operations *fs_dir_inode_ops, int isvfat);
    +
    +extern int fat_flush_inodes(struct super_block *sb, struct inode *i1,
    + struct inode *i2);
    +/* fat/misc.c */
    +extern void fat_fs_panic(struct super_block *s, const char *fmt, ...);
    +extern void fat_clusters_flush(struct super_block *sb);
    +extern int fat_chain_add(struct inode *inode, int new_dclus, int nr_cluster);
    +extern int date_dos2unix(unsigned short time, unsigned short date, int tz_utc);
    +extern void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date,
    + int tz_utc);
    +extern int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs);
    +
    +int fat_cache_init(void);
    +void fat_cache_destroy(void);
    +
    +#endif /* !_FAT_H */
    diff -puN fs/fat/fatent.c~fat_split-msdos_fs-h fs/fat/fatent.c
    --- linux-2.6/fs/fat/fatent.c~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/fatent.c 2008-10-11 23:45:46.000000000 +0900
    @@ -7,6 +7,7 @@
    #include
    #include
    #include
    +#include "fat.h"

    struct fatent_operations {
    void (*ent_blocknr)(struct super_block *, int, int *, sector_t *);
    diff -puN fs/fat/file.c~fat_split-msdos_fs-h fs/fat/file.c
    --- linux-2.6/fs/fat/file.c~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/file.c 2008-10-11 23:45:34.000000000 +0900
    @@ -10,13 +10,13 @@
    #include
    #include
    #include
    -#include
    #include
    #include
    #include
    #include
    #include
    #include
    +#include "fat.h"

    int fat_generic_ioctl(struct inode *inode, struct file *filp,
    unsigned int cmd, unsigned long arg)
    diff -puN fs/fat/inode.c~fat_split-msdos_fs-h fs/fat/inode.c
    --- linux-2.6/fs/fat/inode.c~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/inode.c 2008-10-11 23:45:34.000000000 +0900
    @@ -16,7 +16,6 @@
    #include
    #include
    #include
    -#include
    #include
    #include
    #include
    @@ -28,6 +27,7 @@
    #include
    #include
    #include
    +#include "fat.h"

    #ifndef CONFIG_FAT_DEFAULT_IOCHARSET
    /* if user don't select VFAT, this is undefined. */
    diff -puN fs/fat/misc.c~fat_split-msdos_fs-h fs/fat/misc.c
    --- linux-2.6/fs/fat/misc.c~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/misc.c 2008-10-11 23:45:34.000000000 +0900
    @@ -8,8 +8,8 @@

    #include
    #include
    -#include
    #include
    +#include "fat.h"

    /*
    * fat_fs_panic reports a severe file system problem and sets the file system
    diff -puN fs/fat/namei_msdos.c~fat_split-msdos_fs-h fs/fat/namei_msdos.c
    --- linux-2.6/fs/fat/namei_msdos.c~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/namei_msdos.c 2008-10-11 23:45:34.000000000 +0900
    @@ -9,8 +9,8 @@
    #include
    #include
    #include
    -#include
    #include
    +#include "fat.h"

    /* Characters that are undesirable in an MS-DOS file name */
    static unsigned char bad_chars[] = "*?<>|\"";
    diff -puN fs/fat/namei_vfat.c~fat_split-msdos_fs-h fs/fat/namei_vfat.c
    --- linux-2.6/fs/fat/namei_vfat.c~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/namei_vfat.c 2008-10-11 23:45:34.000000000 +0900
    @@ -16,14 +16,13 @@
    */

    #include
    -
    #include
    -#include
    #include
    #include
    #include
    #include
    #include
    +#include "fat.h"

    static int vfat_revalidate(struct dentry *dentry, struct nameidata *nd)
    {
    diff -puN include/linux/msdos_fs.h~fat_split-msdos_fs-h include/linux/msdos_fs.h
    --- linux-2.6/include/linux/msdos_fs.h~fat_split-msdos_fs-h 2008-10-11 23:45:34.000000000 +0900
    +++ linux-2.6-hirofumi/include/linux/msdos_fs.h 2008-10-11 23:45:34.000000000 +0900
    @@ -167,282 +167,10 @@ struct msdos_dir_slot {
    };

    #ifdef __KERNEL__
    -
    -#include
    -#include
    -#include
    -#include
    -#include
    -
    -/*
    - * vfat shortname flags
    - */
    -#define VFAT_SFN_DISPLAY_LOWER 0x0001 /* convert to lowercase for display */
    -#define VFAT_SFN_DISPLAY_WIN95 0x0002 /* emulate win95 rule for display */
    -#define VFAT_SFN_DISPLAY_WINNT 0x0004 /* emulate winnt rule for display */
    -#define VFAT_SFN_CREATE_WIN95 0x0100 /* emulate win95 rule for create */
    -#define VFAT_SFN_CREATE_WINNT 0x0200 /* emulate winnt rule for create */
    -
    -struct fat_mount_options {
    - uid_t fs_uid;
    - gid_t fs_gid;
    - unsigned short fs_fmask;
    - unsigned short fs_dmask;
    - unsigned short codepage; /* Codepage for shortname conversions */
    - char *iocharset; /* Charset used for filename input/display */
    - unsigned short shortname; /* flags for shortname display/create rule */
    - unsigned char name_check; /* r = relaxed, n = normal, s = strict */
    - unsigned short allow_utime;/* permission for setting the [am]time */
    - unsigned quiet:1, /* set = fake successful chmods and chowns */
    - showexec:1, /* set = only set x bit for com/exe/bat */
    - sys_immutable:1, /* set = system files are immutable */
    - dotsOK:1, /* set = hidden and system files are named '.filename' */
    - isvfat:1, /* 0=no vfat long filename support, 1=vfat support */
    - utf8:1, /* Use of UTF-8 character set (Default) */
    - unicode_xlate:1, /* create escape sequences for unhandled Unicode */
    - numtail:1, /* Does first alias have a numeric '~1' type tail? */
    - flush:1, /* write things quickly */
    - nocase:1, /* Does this need case conversion? 0=need case conversion*/
    - usefree:1, /* Use free_clusters for FAT32 */
    - tz_utc:1; /* Filesystem timestamps are in UTC */
    -};
    -
    -#define FAT_HASH_BITS 8
    -#define FAT_HASH_SIZE (1UL << FAT_HASH_BITS)
    -#define FAT_HASH_MASK (FAT_HASH_SIZE-1)
    -
    -/*
    - * MS-DOS file system in-core superblock data
    - */
    -struct msdos_sb_info {
    - unsigned short sec_per_clus; /* sectors/cluster */
    - unsigned short cluster_bits; /* log2(cluster_size) */
    - unsigned int cluster_size; /* cluster size */
    - unsigned char fats,fat_bits; /* number of FATs, FAT bits (12 or 16) */
    - unsigned short fat_start;
    - unsigned long fat_length; /* FAT start & length (sec.) */
    - unsigned long dir_start;
    - unsigned short dir_entries; /* root dir start & entries */
    - unsigned long data_start; /* first data sector */
    - unsigned long max_cluster; /* maximum cluster number */
    - unsigned long root_cluster; /* first cluster of the root directory */
    - unsigned long fsinfo_sector; /* sector number of FAT32 fsinfo */
    - struct mutex fat_lock;
    - unsigned int prev_free; /* previously allocated cluster number */
    - unsigned int free_clusters; /* -1 if undefined */
    - unsigned int free_clus_valid; /* is free_clusters valid? */
    - struct fat_mount_options options;
    - struct nls_table *nls_disk; /* Codepage used on disk */
    - struct nls_table *nls_io; /* Charset used for input and display */
    - const void *dir_ops; /* Opaque; default directory operations */
    - int dir_per_block; /* dir entries per block */
    - int dir_per_block_bits; /* log2(dir_per_block) */
    -
    - int fatent_shift;
    - struct fatent_operations *fatent_ops;
    -
    - spinlock_t inode_hash_lock;
    - struct hlist_head inode_hashtable[FAT_HASH_SIZE];
    -};
    -
    -#define FAT_CACHE_VALID 0 /* special case for valid cache */
    -
    -/*
    - * MS-DOS file system inode data in memory
    - */
    -struct msdos_inode_info {
    - spinlock_t cache_lru_lock;
    - struct list_head cache_lru;
    - int nr_caches;
    - /* for avoiding the race between fat_free() and fat_get_cluster() */
    - unsigned int cache_valid_id;
    -
    - loff_t mmu_private;
    - int i_start; /* first cluster or 0 */
    - int i_logstart; /* logical first cluster */
    - int i_attrs; /* unused attribute bits */
    - loff_t i_pos; /* on-disk position of directory entry or 0 */
    - struct hlist_node i_fat_hash; /* hash by i_location */
    - struct inode vfs_inode;
    -};
    -
    -struct fat_slot_info {
    - loff_t i_pos; /* on-disk position of directory entry */
    - loff_t slot_off; /* offset for slot or de start */
    - int nr_slots; /* number of slots + 1(de) in filename */
    - struct msdos_dir_entry *de;
    - struct buffer_head *bh;
    -};
    -
    -static inline struct msdos_sb_info *MSDOS_SB(struct super_block *sb)
    -{
    - return sb->s_fs_info;
    -}
    -
    -static inline struct msdos_inode_info *MSDOS_I(struct inode *inode)
    -{
    - return container_of(inode, struct msdos_inode_info, vfs_inode);
    -}
    -
    -/* Return the FAT attribute byte for this inode */
    -static inline u8 fat_attr(struct inode *inode)
    -{
    - return ((inode->i_mode & S_IWUGO) ? ATTR_NONE : ATTR_RO) |
    - (S_ISDIR(inode->i_mode) ? ATTR_DIR : ATTR_NONE) |
    - MSDOS_I(inode)->i_attrs;
    -}
    -
    -static inline unsigned char fat_checksum(const __u8 *name)
    -{
    - unsigned char s = name[0];
    - s = (s<<7) + (s>>1) + name[1]; s = (s<<7) + (s>>1) + name[2];
    - s = (s<<7) + (s>>1) + name[3]; s = (s<<7) + (s>>1) + name[4];
    - s = (s<<7) + (s>>1) + name[5]; s = (s<<7) + (s>>1) + name[6];
    - s = (s<<7) + (s>>1) + name[7]; s = (s<<7) + (s>>1) + name[8];
    - s = (s<<7) + (s>>1) + name[9]; s = (s<<7) + (s>>1) + name[10];
    - return s;
    -}
    -
    -static inline sector_t fat_clus_to_blknr(struct msdos_sb_info *sbi, int clus)
    -{
    - return ((sector_t)clus - FAT_START_ENT) * sbi->sec_per_clus
    - + sbi->data_start;
    -}
    -
    -static inline void fat16_towchar(wchar_t *dst, const __u8 *src, size_t len)
    -{
    -#ifdef __BIG_ENDIAN
    - while (len--) {
    - *dst++ = src[0] | (src[1] << 8);
    - src += 2;
    - }
    -#else
    - memcpy(dst, src, len * 2);
    -#endif
    -}
    -
    -static inline void fatwchar_to16(__u8 *dst, const wchar_t *src, size_t len)
    -{
    -#ifdef __BIG_ENDIAN
    - while (len--) {
    - dst[0] = *src & 0x00FF;
    - dst[1] = (*src & 0xFF00) >> 8;
    - dst += 2;
    - src++;
    - }
    -#else
    - memcpy(dst, src, len * 2);
    -#endif
    -}
    -
    /* media of boot sector */
    static inline int fat_valid_media(u8 media)
    {
    return 0xf8 <= media || media == 0xf0;
    }
    -
    -/* fat/cache.c */
    -extern void fat_cache_inval_inode(struct inode *inode);
    -extern int fat_get_cluster(struct inode *inode, int cluster,
    - int *fclus, int *dclus);
    -extern int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys,
    - unsigned long *mapped_blocks);
    -
    -/* fat/dir.c */
    -extern const struct file_operations fat_dir_operations;
    -extern int fat_search_long(struct inode *inode, const unsigned char *name,
    - int name_len, struct fat_slot_info *sinfo);
    -extern int fat_dir_empty(struct inode *dir);
    -extern int fat_subdirs(struct inode *dir);
    -extern int fat_scan(struct inode *dir, const unsigned char *name,
    - struct fat_slot_info *sinfo);
    -extern int fat_get_dotdot_entry(struct inode *dir, struct buffer_head **bh,
    - struct msdos_dir_entry **de, loff_t *i_pos);
    -extern int fat_alloc_new_dir(struct inode *dir, struct timespec *ts);
    -extern int fat_add_entries(struct inode *dir, void *slots, int nr_slots,
    - struct fat_slot_info *sinfo);
    -extern int fat_remove_entries(struct inode *dir, struct fat_slot_info *sinfo);
    -
    -/* fat/fatent.c */
    -struct fat_entry {
    - int entry;
    - union {
    - u8 *ent12_p[2];
    - __le16 *ent16_p;
    - __le32 *ent32_p;
    - } u;
    - int nr_bhs;
    - struct buffer_head *bhs[2];
    -};
    -
    -static inline void fatent_init(struct fat_entry *fatent)
    -{
    - fatent->nr_bhs = 0;
    - fatent->entry = 0;
    - fatent->u.ent32_p = NULL;
    - fatent->bhs[0] = fatent->bhs[1] = NULL;
    -}
    -
    -static inline void fatent_set_entry(struct fat_entry *fatent, int entry)
    -{
    - fatent->entry = entry;
    - fatent->u.ent32_p = NULL;
    -}
    -
    -static inline void fatent_brelse(struct fat_entry *fatent)
    -{
    - int i;
    - fatent->u.ent32_p = NULL;
    - for (i = 0; i < fatent->nr_bhs; i++)
    - brelse(fatent->bhs[i]);
    - fatent->nr_bhs = 0;
    - fatent->bhs[0] = fatent->bhs[1] = NULL;
    -}
    -
    -extern void fat_ent_access_init(struct super_block *sb);
    -extern int fat_ent_read(struct inode *inode, struct fat_entry *fatent,
    - int entry);
    -extern int fat_ent_write(struct inode *inode, struct fat_entry *fatent,
    - int new, int wait);
    -extern int fat_alloc_clusters(struct inode *inode, int *cluster,
    - int nr_cluster);
    -extern int fat_free_clusters(struct inode *inode, int cluster);
    -extern int fat_count_free_clusters(struct super_block *sb);
    -
    -/* fat/file.c */
    -extern int fat_generic_ioctl(struct inode *inode, struct file *filp,
    - unsigned int cmd, unsigned long arg);
    -extern const struct file_operations fat_file_operations;
    -extern const struct inode_operations fat_file_inode_operations;
    -extern int fat_setattr(struct dentry * dentry, struct iattr * attr);
    -extern void fat_truncate(struct inode *inode);
    -extern int fat_getattr(struct vfsmount *mnt, struct dentry *dentry,
    - struct kstat *stat);
    -
    -/* fat/inode.c */
    -extern void fat_attach(struct inode *inode, loff_t i_pos);
    -extern void fat_detach(struct inode *inode);
    -extern struct inode *fat_iget(struct super_block *sb, loff_t i_pos);
    -extern struct inode *fat_build_inode(struct super_block *sb,
    - struct msdos_dir_entry *de, loff_t i_pos);
    -extern int fat_sync_inode(struct inode *inode);
    -extern int fat_fill_super(struct super_block *sb, void *data, int silent,
    - const struct inode_operations *fs_dir_inode_ops, int isvfat);
    -
    -extern int fat_flush_inodes(struct super_block *sb, struct inode *i1,
    - struct inode *i2);
    -/* fat/misc.c */
    -extern void fat_fs_panic(struct super_block *s, const char *fmt, ...);
    -extern void fat_clusters_flush(struct super_block *sb);
    -extern int fat_chain_add(struct inode *inode, int new_dclus, int nr_cluster);
    -extern int date_dos2unix(unsigned short time, unsigned short date, int tz_utc);
    -extern void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date,
    - int tz_utc);
    -extern int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs);
    -
    -int fat_cache_init(void);
    -void fat_cache_destroy(void);
    -
    -#endif /* __KERNEL__ */
    -
    -#endif
    +#endif /* !__KERNEL__ */
    +#endif /* !_LINUX_MSDOS_FS_H */
    _
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. [PATCH 05/21] fat: use generic_file_llseek() for directory


    Since fat_dir_ioctl() was already fixed (i.e. called under ->i_mutex),
    and __fat_readdir() doesn't take BKL anymore. So, BKL for ->llseek()
    is pointless, and we have to use generic_file_llseek().

    Signed-off-by: OGAWA Hirofumi
    ---

    fs/fat/dir.c | 1 +
    1 file changed, 1 insertion(+)

    diff -puN fs/fat/dir.c~fat_use-generic_file_llseek fs/fat/dir.c
    --- linux-2.6/fs/fat/dir.c~fat_use-generic_file_llseek 2008-08-29 11:59:44.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/dir.c 2008-09-01 20:07:19.000000000 +0900
    @@ -832,6 +832,7 @@ static long fat_compat_dir_ioctl(struct
    #endif /* CONFIG_COMPAT */

    const struct file_operations fat_dir_operations = {
    + .llseek = generic_file_llseek,
    .read = generic_read_dir,
    .readdir = fat_readdir,
    .ioctl = fat_dir_ioctl,
    _
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  3. [PATCH 08/21] fat: Fix fat_ent_update_ptr() for FAT12


    This fixes the missing update for bhs/nr_bhs in case the caller
    accessed from block boundary to first block of boundary.

    Signed-off-by: OGAWA Hirofumi
    ---

    fs/fat/fatent.c | 18 ++++++++++++++----
    1 file changed, 14 insertions(+), 4 deletions(-)

    diff -puN fs/fat/fatent.c~fat-fix-fat12-update_ptr fs/fat/fatent.c
    --- linux-2.6/fs/fat/fatent.c~fat-fix-fat12-update_ptr 2008-10-11 23:46:04.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/fatent.c 2008-10-11 23:46:04.000000000 +0900
    @@ -317,10 +317,20 @@ static inline int fat_ent_update_ptr(str
    /* Is this fatent's blocks including this entry? */
    if (!fatent->nr_bhs || bhs[0]->b_blocknr != blocknr)
    return 0;
    - /* Does this entry need the next block? */
    - if (sbi->fat_bits == 12 && (offset + 1) >= sb->s_blocksize) {
    - if (fatent->nr_bhs != 2 || bhs[1]->b_blocknr != (blocknr + 1))
    - return 0;
    + if (sbi->fat_bits == 12) {
    + if ((offset + 1) < sb->s_blocksize) {
    + /* This entry is on bhs[0]. */
    + if (fatent->nr_bhs == 2) {
    + brelse(bhs[1]);
    + fatent->nr_bhs = 1;
    + }
    + } else {
    + /* This entry needs the next block. */
    + if (fatent->nr_bhs != 2)
    + return 0;
    + if (bhs[1]->b_blocknr != (blocknr + 1))
    + return 0;
    + }
    }
    ops->ent_set_ptr(fatent, offset);
    return 1;
    _
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  4. [PATCH 21/21] fat: i_blocks warning fix


    blkcnt_t type depends on CONFIG_LSF. Use unsigned long long always for
    printk(). But lazy to type it, so add "llu" and use it.

    Signed-off-by: OGAWA Hirofumi
    ---

    fs/fat/dir.c | 2 +-
    fs/fat/fat.h | 3 +++
    fs/fat/fatent.c | 5 ++---
    fs/fat/misc.c | 5 +++--
    4 files changed, 9 insertions(+), 6 deletions(-)

    diff -puN fs/fat/misc.c~fat-i_blocks-warn-fix fs/fat/misc.c
    --- linux-2.6/fs/fat/misc.c~fat-i_blocks-warn-fix 2008-10-13 02:02:50.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/misc.c 2008-10-13 02:13:16.000000000 +0900
    @@ -124,8 +124,9 @@ int fat_chain_add(struct inode *inode, i
    mark_inode_dirty(inode);
    }
    if (new_fclus != (inode->i_blocks >> (sbi->cluster_bits - 9))) {
    - fat_fs_panic(sb, "clusters badly computed (%d != %lu)",
    - new_fclus, inode->i_blocks >> (sbi->cluster_bits - 9));
    + fat_fs_panic(sb, "clusters badly computed (%d != %llu)",
    + new_fclus,
    + (llu)(inode->i_blocks >> (sbi->cluster_bits - 9)));
    fat_cache_inval_inode(inode);
    }
    inode->i_blocks += nr_cluster << (sbi->cluster_bits - 9);
    diff -puN fs/fat/fat.h~fat-i_blocks-warn-fix fs/fat/fat.h
    --- linux-2.6/fs/fat/fat.h~fat-i_blocks-warn-fix 2008-10-13 02:14:12.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/fat.h 2008-10-13 02:17:52.000000000 +0900
    @@ -323,4 +323,7 @@ extern int fat_sync_bhs(struct buffer_he
    int fat_cache_init(void);
    void fat_cache_destroy(void);

    +/* helper for printk */
    +typedef unsigned long long llu;
    +
    #endif /* !_FAT_H */
    diff -puN fs/fat/dir.c~fat-i_blocks-warn-fix fs/fat/dir.c
    --- linux-2.6/fs/fat/dir.c~fat-i_blocks-warn-fix 2008-10-13 02:15:43.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/dir.c 2008-10-13 02:15:50.000000000 +0900
    @@ -86,7 +86,7 @@ next:
    *bh = sb_bread(sb, phys);
    if (*bh == NULL) {
    printk(KERN_ERR "FAT: Directory bread(block %llu) failed\n",
    - (unsigned long long)phys);
    + (llu)phys);
    /* skip this block */
    *pos = (iblock + 1) << sb->s_blocksize_bits;
    goto next;
    diff -puN fs/fat/fatent.c~fat-i_blocks-warn-fix fs/fat/fatent.c
    --- linux-2.6/fs/fat/fatent.c~fat-i_blocks-warn-fix 2008-10-13 02:16:13.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/fatent.c 2008-10-13 02:16:26.000000000 +0900
    @@ -93,8 +93,7 @@ static int fat12_ent_bread(struct super_
    err_brelse:
    brelse(bhs[0]);
    err:
    - printk(KERN_ERR "FAT: FAT read failed (blocknr %llu)\n",
    - (unsigned long long)blocknr);
    + printk(KERN_ERR "FAT: FAT read failed (blocknr %llu)\n", (llu)blocknr);
    return -EIO;
    }

    @@ -107,7 +106,7 @@ static int fat_ent_bread(struct super_bl
    fatent->bhs[0] = sb_bread(sb, blocknr);
    if (!fatent->bhs[0]) {
    printk(KERN_ERR "FAT: FAT read failed (blocknr %llu)\n",
    - (unsigned long long)blocknr);
    + (llu)blocknr);
    return -EIO;
    }
    fatent->nr_bhs = 1;
    _
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  5. [PATCH 14/21] fat: Cleanup FAT attribute stuff


    This adds three helpers:

    fat_make_attrs() - makes FAT attributes from inode.
    fat_make_mode() - makes mode_t from FAT attributes.
    fat_save_attrs() - saves FAT attributes to inode.

    Then this replaces: MSDOS_MKMODE() by fat_make_mode(), fat_attr() by
    fat_make_attrs(), ->i_attrs = attr & ATTR_UNUSED by fat_save_attrs().
    And for root inode, those is used with ATTR_DIR instead of bogus
    ATTR_NONE.

    Signed-off-by: OGAWA Hirofumi
    ---

    fs/fat/fat.h | 20 +++++++++++++++++++-
    fs/fat/file.c | 32 ++++++++++++--------------------
    fs/fat/inode.c | 19 +++++++++----------
    include/linux/msdos_fs.h | 5 -----
    4 files changed, 40 insertions(+), 36 deletions(-)

    diff -puN fs/fat/file.c~fat-attrs-cleanup fs/fat/file.c
    --- linux-2.6/fs/fat/file.c~fat-attrs-cleanup 2008-08-27 19:33:26.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/file.c 2008-08-27 22:24:41.000000000 +0900
    @@ -27,13 +27,7 @@ int fat_generic_ioctl(struct inode *inod
    switch (cmd) {
    case FAT_IOCTL_GET_ATTRIBUTES:
    {
    - u32 attr;
    -
    - if (inode->i_ino == MSDOS_ROOT_INO)
    - attr = ATTR_DIR;
    - else
    - attr = fat_attr(inode);
    -
    + u32 attr = fat_make_attrs(inode);
    return put_user(attr, user_attr);
    }
    case FAT_IOCTL_SET_ATTRIBUTES:
    @@ -62,20 +56,16 @@ int fat_generic_ioctl(struct inode *inod
    /* Merge in ATTR_VOLUME and ATTR_DIR */
    attr |= (MSDOS_I(inode)->i_attrs & ATTR_VOLUME) |
    (is_dir ? ATTR_DIR : 0);
    - oldattr = fat_attr(inode);
    + oldattr = fat_make_attrs(inode);

    /* Equivalent to a chmod() */
    ia.ia_valid = ATTR_MODE | ATTR_CTIME;
    ia.ia_ctime = current_fs_time(inode->i_sb);
    - if (is_dir) {
    - ia.ia_mode = MSDOS_MKMODE(attr,
    - S_IRWXUGO & ~sbi->options.fs_dmask)
    - | S_IFDIR;
    - } else {
    - ia.ia_mode = MSDOS_MKMODE(attr,
    - (S_IRUGO | S_IWUGO | (inode->i_mode & S_IXUGO))
    - & ~sbi->options.fs_fmask)
    - | S_IFREG;
    + if (is_dir)
    + ia.ia_mode = fat_make_mode(sbi, attr, S_IRWXUGO);
    + else {
    + ia.ia_mode = fat_make_mode(sbi, attr,
    + S_IRUGO | S_IWUGO | (inode->i_mode & S_IXUGO));
    }

    /* The root directory has no attributes */
    @@ -115,7 +105,7 @@ int fat_generic_ioctl(struct inode *inod
    inode->i_flags &= S_IMMUTABLE;
    }

    - MSDOS_I(inode)->i_attrs = attr & ATTR_UNUSED;
    + fat_save_attrs(inode, attr);
    mark_inode_dirty(inode);
    up:
    mnt_drop_write(filp->f_path.mnt);
    @@ -274,7 +264,7 @@ static int fat_sanitize_mode(const struc

    /*
    * Note, the basic check is already done by a caller of
    - * (attr->ia_mode & ~MSDOS_VALID_MODE)
    + * (attr->ia_mode & ~FAT_VALID_MODE)
    */

    if (S_ISREG(inode->i_mode))
    @@ -314,6 +304,8 @@ static int fat_allow_set_time(struct msd
    }

    #define TIMES_SET_FLAGS (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)
    +/* valid file mode bits */
    +#define FAT_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXUGO)

    int fat_setattr(struct dentry *dentry, struct iattr *attr)
    {
    @@ -356,7 +348,7 @@ int fat_setattr(struct dentry *dentry, s
    ((attr->ia_valid & ATTR_GID) &&
    (attr->ia_gid != sbi->options.fs_gid)) ||
    ((attr->ia_valid & ATTR_MODE) &&
    - (attr->ia_mode & ~MSDOS_VALID_MODE)))
    + (attr->ia_mode & ~FAT_VALID_MODE)))
    error = -EPERM;

    if (error) {
    diff -puN fs/fat/fat.h~fat-attrs-cleanup fs/fat/fat.h
    --- linux-2.6/fs/fat/fat.h~fat-attrs-cleanup 2008-08-27 19:33:26.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/fat.h 2008-08-27 22:24:41.000000000 +0900
    @@ -117,14 +117,32 @@ static inline struct msdos_inode_info *M
    return container_of(inode, struct msdos_inode_info, vfs_inode);
    }

    +/* Convert attribute bits and a mask to the UNIX mode. */
    +static inline mode_t fat_make_mode(struct msdos_sb_info *sbi,
    + u8 attrs, mode_t mode)
    +{
    + if (attrs & ATTR_RO)
    + mode &= ~S_IWUGO;
    +
    + if (attrs & ATTR_DIR)
    + return (mode & ~sbi->options.fs_dmask) | S_IFDIR;
    + else
    + return (mode & ~sbi->options.fs_fmask) | S_IFREG;
    +}
    +
    /* Return the FAT attribute byte for this inode */
    -static inline u8 fat_attr(struct inode *inode)
    +static inline u8 fat_make_attrs(struct inode *inode)
    {
    return ((inode->i_mode & S_IWUGO) ? ATTR_NONE : ATTR_RO) |
    (S_ISDIR(inode->i_mode) ? ATTR_DIR : ATTR_NONE) |
    MSDOS_I(inode)->i_attrs;
    }

    +static inline void fat_save_attrs(struct inode *inode, u8 attrs)
    +{
    + MSDOS_I(inode)->i_attrs = attrs & ATTR_UNUSED;
    +}
    +
    static inline unsigned char fat_checksum(const __u8 *name)
    {
    unsigned char s = name[0];
    diff -puN fs/fat/inode.c~fat-attrs-cleanup fs/fat/inode.c
    --- linux-2.6/fs/fat/inode.c~fat-attrs-cleanup 2008-08-27 19:33:26.000000000 +0900
    +++ linux-2.6-hirofumi/fs/fat/inode.c 2008-08-27 22:24:41.000000000 +0900
    @@ -337,8 +337,7 @@ static int fat_fill_inode(struct inode *

    if ((de->attr & ATTR_DIR) && !IS_FREE(de->name)) {
    inode->i_generation &= ~1;
    - inode->i_mode = MSDOS_MKMODE(de->attr,
    - S_IRWXUGO & ~sbi->options.fs_dmask) | S_IFDIR;
    + inode->i_mode = fat_make_mode(sbi, de->attr, S_IRWXUGO);
    inode->i_op = sbi->dir_ops;
    inode->i_fop = &fat_dir_operations;

    @@ -355,10 +354,9 @@ static int fat_fill_inode(struct inode *
    inode->i_nlink = fat_subdirs(inode);
    } else { /* not a directory */
    inode->i_generation |= 1;
    - inode->i_mode = MSDOS_MKMODE(de->attr,
    - ((sbi->options.showexec && !is_exec(de->name + 8))
    - ? S_IRUGO|S_IWUGO : S_IRWXUGO)
    - & ~sbi->options.fs_fmask) | S_IFREG;
    + inode->i_mode = fat_make_mode(sbi, de->attr,
    + ((sbi->options.showexec && !is_exec(de->name + 8))
    + ? S_IRUGO|S_IWUGO : S_IRWXUGO));
    MSDOS_I(inode)->i_start = le16_to_cpu(de->start);
    if (sbi->fat_bits == 32)
    MSDOS_I(inode)->i_start |= (le16_to_cpu(de->starthi) << 16);
    @@ -374,7 +372,8 @@ static int fat_fill_inode(struct inode *
    if (sbi->options.sys_immutable)
    inode->i_flags |= S_IMMUTABLE;
    }
    - MSDOS_I(inode)->i_attrs = de->attr & ATTR_UNUSED;
    + fat_save_attrs(inode, de->attr);
    +
    inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1))
    & ~((loff_t)sbi->cluster_size - 1)) >> 9;

    @@ -569,7 +568,7 @@ retry:
    raw_entry->size = 0;
    else
    raw_entry->size = cpu_to_le32(inode->i_size);
    - raw_entry->attr = fat_attr(inode);
    + raw_entry->attr = fat_make_attrs(inode);
    raw_entry->start = cpu_to_le16(MSDOS_I(inode)->i_logstart);
    raw_entry->starthi = cpu_to_le16(MSDOS_I(inode)->i_logstart >> 16);
    fat_time_unix2fat(sbi, &inode->i_mtime, &raw_entry->time,
    @@ -1121,7 +1120,7 @@ static int fat_read_root(struct inode *i
    inode->i_gid = sbi->options.fs_gid;
    inode->i_version++;
    inode->i_generation = 0;
    - inode->i_mode = (S_IRWXUGO & ~sbi->options.fs_dmask) | S_IFDIR;
    + inode->i_mode = fat_make_mode(sbi, ATTR_DIR, S_IRWXUGO);
    inode->i_op = sbi->dir_ops;
    inode->i_fop = &fat_dir_operations;
    if (sbi->fat_bits == 32) {
    @@ -1138,7 +1137,7 @@ static int fat_read_root(struct inode *i
    MSDOS_I(inode)->i_logstart = 0;
    MSDOS_I(inode)->mmu_private = inode->i_size;

    - MSDOS_I(inode)->i_attrs = ATTR_NONE;
    + fat_save_attrs(inode, ATTR_DIR);
    inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = 0;
    inode->i_mtime.tv_nsec = inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec = 0;
    inode->i_nlink = fat_subdirs(inode)+2;
    diff -puN include/linux/msdos_fs.h~fat-attrs-cleanup include/linux/msdos_fs.h
    --- linux-2.6/include/linux/msdos_fs.h~fat-attrs-cleanup 2008-08-27 19:33:26.000000000 +0900
    +++ linux-2.6-hirofumi/include/linux/msdos_fs.h 2008-08-27 22:24:40.000000000 +0900
    @@ -46,11 +46,6 @@
    #define DELETED_FLAG 0xe5 /* marks file as deleted when in name[0] */
    #define IS_FREE(n) (!*(n) || *(n) == DELETED_FLAG)

    -/* valid file mode bits */
    -#define MSDOS_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)
    -/* Convert attribute bits and a mask to the UNIX mode. */
    -#define MSDOS_MKMODE(a, m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
    -
    #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 */
    _
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread