linux/fs/fat/inode.c
<<
>>
Prefs
   1/*
   2 *  linux/fs/fat/inode.c
   3 *
   4 *  Written 1992,1993 by Werner Almesberger
   5 *  VFAT extensions by Gordon Chaffee, merged with msdos fs by Henrik Storner
   6 *  Rewritten for the constant inumbers support by Al Viro
   7 *
   8 *  Fixes:
   9 *
  10 *      Max Cohan: Fixed invalid FSINFO offset when info_sector is 0
  11 */
  12
  13#include <linux/module.h>
  14#include <linux/init.h>
  15#include <linux/time.h>
  16#include <linux/slab.h>
  17#include <linux/smp_lock.h>
  18#include <linux/seq_file.h>
  19#include <linux/msdos_fs.h>
  20#include <linux/pagemap.h>
  21#include <linux/mpage.h>
  22#include <linux/buffer_head.h>
  23#include <linux/exportfs.h>
  24#include <linux/mount.h>
  25#include <linux/vfs.h>
  26#include <linux/parser.h>
  27#include <linux/uio.h>
  28#include <linux/writeback.h>
  29#include <linux/log2.h>
  30#include <asm/unaligned.h>
  31
  32#ifndef CONFIG_FAT_DEFAULT_IOCHARSET
  33/* if user don't select VFAT, this is undefined. */
  34#define CONFIG_FAT_DEFAULT_IOCHARSET    ""
  35#endif
  36
  37static int fat_default_codepage = CONFIG_FAT_DEFAULT_CODEPAGE;
  38static char fat_default_iocharset[] = CONFIG_FAT_DEFAULT_IOCHARSET;
  39
  40
  41static int fat_add_cluster(struct inode *inode)
  42{
  43        int err, cluster;
  44
  45        err = fat_alloc_clusters(inode, &cluster, 1);
  46        if (err)
  47                return err;
  48        /* FIXME: this cluster should be added after data of this
  49         * cluster is writed */
  50        err = fat_chain_add(inode, cluster, 1);
  51        if (err)
  52                fat_free_clusters(inode, cluster);
  53        return err;
  54}
  55
  56static inline int __fat_get_block(struct inode *inode, sector_t iblock,
  57                                  unsigned long *max_blocks,
  58                                  struct buffer_head *bh_result, int create)
  59{
  60        struct super_block *sb = inode->i_sb;
  61        struct msdos_sb_info *sbi = MSDOS_SB(sb);
  62        unsigned long mapped_blocks;
  63        sector_t phys;
  64        int err, offset;
  65
  66        err = fat_bmap(inode, iblock, &phys, &mapped_blocks);
  67        if (err)
  68                return err;
  69        if (phys) {
  70                map_bh(bh_result, sb, phys);
  71                *max_blocks = min(mapped_blocks, *max_blocks);
  72                return 0;
  73        }
  74        if (!create)
  75                return 0;
  76
  77        if (iblock != MSDOS_I(inode)->mmu_private >> sb->s_blocksize_bits) {
  78                fat_fs_panic(sb, "corrupted file size (i_pos %lld, %lld)",
  79                        MSDOS_I(inode)->i_pos, MSDOS_I(inode)->mmu_private);
  80                return -EIO;
  81        }
  82
  83        offset = (unsigned long)iblock & (sbi->sec_per_clus - 1);
  84        if (!offset) {
  85                /* TODO: multiple cluster allocation would be desirable. */
  86                err = fat_add_cluster(inode);
  87                if (err)
  88                        return err;
  89        }
  90        /* available blocks on this cluster */
  91        mapped_blocks = sbi->sec_per_clus - offset;
  92
  93        *max_blocks = min(mapped_blocks, *max_blocks);
  94        MSDOS_I(inode)->mmu_private += *max_blocks << sb->s_blocksize_bits;
  95
  96        err = fat_bmap(inode, iblock, &phys, &mapped_blocks);
  97        if (err)
  98                return err;
  99
 100        BUG_ON(!phys);
 101        BUG_ON(*max_blocks != mapped_blocks);
 102        set_buffer_new(bh_result);
 103        map_bh(bh_result, sb, phys);
 104
 105        return 0;
 106}
 107
 108static int fat_get_block(struct inode *inode, sector_t iblock,
 109                         struct buffer_head *bh_result, int create)
 110{
 111        struct super_block *sb = inode->i_sb;
 112        unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits;
 113        int err;
 114
 115        err = __fat_get_block(inode, iblock, &max_blocks, bh_result, create);
 116        if (err)
 117                return err;
 118        bh_result->b_size = max_blocks << sb->s_blocksize_bits;
 119        return 0;
 120}
 121
 122static int fat_writepage(struct page *page, struct writeback_control *wbc)
 123{
 124        return block_write_full_page(page, fat_get_block, wbc);
 125}
 126
 127static int fat_writepages(struct address_space *mapping,
 128                          struct writeback_control *wbc)
 129{
 130        return mpage_writepages(mapping, wbc, fat_get_block);
 131}
 132
 133static int fat_readpage(struct file *file, struct page *page)
 134{
 135        return mpage_readpage(page, fat_get_block);
 136}
 137
 138static int fat_readpages(struct file *file, struct address_space *mapping,
 139                         struct list_head *pages, unsigned nr_pages)
 140{
 141        return mpage_readpages(mapping, pages, nr_pages, fat_get_block);
 142}
 143
 144static int fat_write_begin(struct file *file, struct address_space *mapping,
 145                        loff_t pos, unsigned len, unsigned flags,
 146                        struct page **pagep, void **fsdata)
 147{
 148        *pagep = NULL;
 149        return cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
 150                                fat_get_block,
 151                                &MSDOS_I(mapping->host)->mmu_private);
 152}
 153
 154static int fat_write_end(struct file *file, struct address_space *mapping,
 155                        loff_t pos, unsigned len, unsigned copied,
 156                        struct page *pagep, void *fsdata)
 157{
 158        struct inode *inode = mapping->host;
 159        int err;
 160        err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata);
 161        if (!(err < 0) && !(MSDOS_I(inode)->i_attrs & ATTR_ARCH)) {
 162                inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
 163                MSDOS_I(inode)->i_attrs |= ATTR_ARCH;
 164                mark_inode_dirty(inode);
 165        }
 166        return err;
 167}
 168
 169static ssize_t fat_direct_IO(int rw, struct kiocb *iocb,
 170                             const struct iovec *iov,
 171                             loff_t offset, unsigned long nr_segs)
 172{
 173        struct file *file = iocb->ki_filp;
 174        struct inode *inode = file->f_mapping->host;
 175
 176        if (rw == WRITE) {
 177                /*
 178                 * FIXME: blockdev_direct_IO() doesn't use ->prepare_write(),
 179                 * so we need to update the ->mmu_private to block boundary.
 180                 *
 181                 * But we must fill the remaining area or hole by nul for
 182                 * updating ->mmu_private.
 183                 *
 184                 * Return 0, and fallback to normal buffered write.
 185                 */
 186                loff_t size = offset + iov_length(iov, nr_segs);
 187                if (MSDOS_I(inode)->mmu_private < size)
 188                        return 0;
 189        }
 190
 191        /*
 192         * FAT need to use the DIO_LOCKING for avoiding the race
 193         * condition of fat_get_block() and ->truncate().
 194         */
 195        return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
 196                                  offset, nr_segs, fat_get_block, NULL);
 197}
 198
 199static sector_t _fat_bmap(struct address_space *mapping, sector_t block)
 200{
 201        return generic_block_bmap(mapping, block, fat_get_block);
 202}
 203
 204static const struct address_space_operations fat_aops = {
 205        .readpage       = fat_readpage,
 206        .readpages      = fat_readpages,
 207        .writepage      = fat_writepage,
 208        .writepages     = fat_writepages,
 209        .sync_page      = block_sync_page,
 210        .write_begin    = fat_write_begin,
 211        .write_end      = fat_write_end,
 212        .direct_IO      = fat_direct_IO,
 213        .bmap           = _fat_bmap
 214};
 215
 216/*
 217 * New FAT inode stuff. We do the following:
 218 *      a) i_ino is constant and has nothing with on-disk location.
 219 *      b) FAT manages its own cache of directory entries.
 220 *      c) *This* cache is indexed by on-disk location.
 221 *      d) inode has an associated directory entry, all right, but
 222 *              it may be unhashed.
 223 *      e) currently entries are stored within struct inode. That should
 224 *              change.
 225 *      f) we deal with races in the following way:
 226 *              1. readdir() and lookup() do FAT-dir-cache lookup.
 227 *              2. rename() unhashes the F-d-c entry and rehashes it in
 228 *                      a new place.
 229 *              3. unlink() and rmdir() unhash F-d-c entry.
 230 *              4. fat_write_inode() checks whether the thing is unhashed.
 231 *                      If it is we silently return. If it isn't we do bread(),
 232 *                      check if the location is still valid and retry if it
 233 *                      isn't. Otherwise we do changes.
 234 *              5. Spinlock is used to protect hash/unhash/location check/lookup
 235 *              6. fat_clear_inode() unhashes the F-d-c entry.
 236 *              7. lookup() and readdir() do igrab() if they find a F-d-c entry
 237 *                      and consider negative result as cache miss.
 238 */
 239
 240static void fat_hash_init(struct super_block *sb)
 241{
 242        struct msdos_sb_info *sbi = MSDOS_SB(sb);
 243        int i;
 244
 245        spin_lock_init(&sbi->inode_hash_lock);
 246        for (i = 0; i < FAT_HASH_SIZE; i++)
 247                INIT_HLIST_HEAD(&sbi->inode_hashtable[i]);
 248}
 249
 250static inline unsigned long fat_hash(struct super_block *sb, loff_t i_pos)
 251{
 252        unsigned long tmp = (unsigned long)i_pos | (unsigned long) sb;
 253        tmp = tmp + (tmp >> FAT_HASH_BITS) + (tmp >> FAT_HASH_BITS * 2);
 254        return tmp & FAT_HASH_MASK;
 255}
 256
 257void fat_attach(struct inode *inode, loff_t i_pos)
 258{
 259        struct super_block *sb = inode->i_sb;
 260        struct msdos_sb_info *sbi = MSDOS_SB(sb);
 261
 262        spin_lock(&sbi->inode_hash_lock);
 263        MSDOS_I(inode)->i_pos = i_pos;
 264        hlist_add_head(&MSDOS_I(inode)->i_fat_hash,
 265                        sbi->inode_hashtable + fat_hash(sb, i_pos));
 266        spin_unlock(&sbi->inode_hash_lock);
 267}
 268
 269EXPORT_SYMBOL_GPL(fat_attach);
 270
 271void fat_detach(struct inode *inode)
 272{
 273        struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
 274        spin_lock(&sbi->inode_hash_lock);
 275        MSDOS_I(inode)->i_pos = 0;
 276        hlist_del_init(&MSDOS_I(inode)->i_fat_hash);
 277        spin_unlock(&sbi->inode_hash_lock);
 278}
 279
 280EXPORT_SYMBOL_GPL(fat_detach);
 281
 282struct inode *fat_iget(struct super_block *sb, loff_t i_pos)
 283{
 284        struct msdos_sb_info *sbi = MSDOS_SB(sb);
 285        struct hlist_head *head = sbi->inode_hashtable + fat_hash(sb, i_pos);
 286        struct hlist_node *_p;
 287        struct msdos_inode_info *i;
 288        struct inode *inode = NULL;
 289
 290        spin_lock(&sbi->inode_hash_lock);
 291        hlist_for_each_entry(i, _p, head, i_fat_hash) {
 292                BUG_ON(i->vfs_inode.i_sb != sb);
 293                if (i->i_pos != i_pos)
 294                        continue;
 295                inode = igrab(&i->vfs_inode);
 296                if (inode)
 297                        break;
 298        }
 299        spin_unlock(&sbi->inode_hash_lock);
 300        return inode;
 301}
 302
 303static int is_exec(unsigned char *extension)
 304{
 305        unsigned char *exe_extensions = "EXECOMBAT", *walk;
 306
 307        for (walk = exe_extensions; *walk; walk += 3)
 308                if (!strncmp(extension, walk, 3))
 309                        return 1;
 310        return 0;
 311}
 312
 313static int fat_calc_dir_size(struct inode *inode)
 314{
 315        struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
 316        int ret, fclus, dclus;
 317
 318        inode->i_size = 0;
 319        if (MSDOS_I(inode)->i_start == 0)
 320                return 0;
 321
 322        ret = fat_get_cluster(inode, FAT_ENT_EOF, &fclus, &dclus);
 323        if (ret < 0)
 324                return ret;
 325        inode->i_size = (fclus + 1) << sbi->cluster_bits;
 326
 327        return 0;
 328}
 329
 330/* doesn't deal with root inode */
 331static int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
 332{
 333        struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
 334        int error;
 335
 336        MSDOS_I(inode)->i_pos = 0;
 337        inode->i_uid = sbi->options.fs_uid;
 338        inode->i_gid = sbi->options.fs_gid;
 339        inode->i_version++;
 340        inode->i_generation = get_seconds();
 341
 342        if ((de->attr & ATTR_DIR) && !IS_FREE(de->name)) {
 343                inode->i_generation &= ~1;
 344                inode->i_mode = MSDOS_MKMODE(de->attr,
 345                        S_IRWXUGO & ~sbi->options.fs_dmask) | S_IFDIR;
 346                inode->i_op = sbi->dir_ops;
 347                inode->i_fop = &fat_dir_operations;
 348
 349                MSDOS_I(inode)->i_start = le16_to_cpu(de->start);
 350                if (sbi->fat_bits == 32)
 351                        MSDOS_I(inode)->i_start |= (le16_to_cpu(de->starthi) << 16);
 352
 353                MSDOS_I(inode)->i_logstart = MSDOS_I(inode)->i_start;
 354                error = fat_calc_dir_size(inode);
 355                if (error < 0)
 356                        return error;
 357                MSDOS_I(inode)->mmu_private = inode->i_size;
 358
 359                inode->i_nlink = fat_subdirs(inode);
 360        } else { /* not a directory */
 361                inode->i_generation |= 1;
 362                inode->i_mode = MSDOS_MKMODE(de->attr,
 363                    ((sbi->options.showexec && !is_exec(de->name + 8))
 364                        ? S_IRUGO|S_IWUGO : S_IRWXUGO)
 365                    & ~sbi->options.fs_fmask) | S_IFREG;
 366                MSDOS_I(inode)->i_start = le16_to_cpu(de->start);
 367                if (sbi->fat_bits == 32)
 368                        MSDOS_I(inode)->i_start |= (le16_to_cpu(de->starthi) << 16);
 369
 370                MSDOS_I(inode)->i_logstart = MSDOS_I(inode)->i_start;
 371                inode->i_size = le32_to_cpu(de->size);
 372                inode->i_op = &fat_file_inode_operations;
 373                inode->i_fop = &fat_file_operations;
 374                inode->i_mapping->a_ops = &fat_aops;
 375                MSDOS_I(inode)->mmu_private = inode->i_size;
 376        }
 377        if (de->attr & ATTR_SYS) {
 378                if (sbi->options.sys_immutable)
 379                        inode->i_flags |= S_IMMUTABLE;
 380        }
 381        MSDOS_I(inode)->i_attrs = de->attr & ATTR_UNUSED;
 382        inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1))
 383                           & ~((loff_t)sbi->cluster_size - 1)) >> 9;
 384        inode->i_mtime.tv_sec =
 385                date_dos2unix(le16_to_cpu(de->time), le16_to_cpu(de->date));
 386        inode->i_mtime.tv_nsec = 0;
 387        if (sbi->options.isvfat) {
 388                int secs = de->ctime_cs / 100;
 389                int csecs = de->ctime_cs % 100;
 390                inode->i_ctime.tv_sec  =
 391                        date_dos2unix(le16_to_cpu(de->ctime),
 392                                      le16_to_cpu(de->cdate)) + secs;
 393                inode->i_ctime.tv_nsec = csecs * 10000000;
 394                inode->i_atime.tv_sec =
 395                        date_dos2unix(0, le16_to_cpu(de->adate));
 396                inode->i_atime.tv_nsec = 0;
 397        } else
 398                inode->i_ctime = inode->i_atime = inode->i_mtime;
 399
 400        return 0;
 401}
 402
 403struct inode *fat_build_inode(struct super_block *sb,
 404                        struct msdos_dir_entry *de, loff_t i_pos)
 405{
 406        struct inode *inode;
 407        int err;
 408
 409        inode = fat_iget(sb, i_pos);
 410        if (inode)
 411                goto out;
 412        inode = new_inode(sb);
 413        if (!inode) {
 414                inode = ERR_PTR(-ENOMEM);
 415                goto out;
 416        }
 417        inode->i_ino = iunique(sb, MSDOS_ROOT_INO);
 418        inode->i_version = 1;
 419        err = fat_fill_inode(inode, de);
 420        if (err) {
 421                iput(inode);
 422                inode = ERR_PTR(err);
 423                goto out;
 424        }
 425        fat_attach(inode, i_pos);
 426        insert_inode_hash(inode);
 427out:
 428        return inode;
 429}
 430
 431EXPORT_SYMBOL_GPL(fat_build_inode);
 432
 433static void fat_delete_inode(struct inode *inode)
 434{
 435        truncate_inode_pages(&inode->i_data, 0);
 436
 437        if (!is_bad_inode(inode)) {
 438                inode->i_size = 0;
 439                fat_truncate(inode);
 440        }
 441        clear_inode(inode);
 442}
 443
 444static void fat_clear_inode(struct inode *inode)
 445{
 446        struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
 447
 448        if (is_bad_inode(inode))
 449                return;
 450        lock_kernel();
 451        spin_lock(&sbi->inode_hash_lock);
 452        fat_cache_inval_inode(inode);
 453        hlist_del_init(&MSDOS_I(inode)->i_fat_hash);
 454        spin_unlock(&sbi->inode_hash_lock);
 455        unlock_kernel();
 456}
 457
 458static void fat_write_super(struct super_block *sb)
 459{
 460        sb->s_dirt = 0;
 461
 462        if (!(sb->s_flags & MS_RDONLY))
 463                fat_clusters_flush(sb);
 464}
 465
 466static void fat_put_super(struct super_block *sb)
 467{
 468        struct msdos_sb_info *sbi = MSDOS_SB(sb);
 469
 470        if (sbi->nls_disk) {
 471                unload_nls(sbi->nls_disk);
 472                sbi->nls_disk = NULL;
 473                sbi->options.codepage = fat_default_codepage;
 474        }
 475        if (sbi->nls_io) {
 476                unload_nls(sbi->nls_io);
 477                sbi->nls_io = NULL;
 478        }
 479        if (sbi->options.iocharset != fat_default_iocharset) {
 480                kfree(sbi->options.iocharset);
 481                sbi->options.iocharset = fat_default_iocharset;
 482        }
 483
 484        sb->s_fs_info = NULL;
 485        kfree(sbi);
 486}
 487
 488static struct kmem_cache *fat_inode_cachep;
 489
 490static struct inode *fat_alloc_inode(struct super_block *sb)
 491{
 492        struct msdos_inode_info *ei;
 493        ei = kmem_cache_alloc(fat_inode_cachep, GFP_KERNEL);
 494        if (!ei)
 495                return NULL;
 496        return &ei->vfs_inode;
 497}
 498
 499static void fat_destroy_inode(struct inode *inode)
 500{
 501        kmem_cache_free(fat_inode_cachep, MSDOS_I(inode));
 502}
 503
 504static void init_once(struct kmem_cache *cachep, void *foo)
 505{
 506        struct msdos_inode_info *ei = (struct msdos_inode_info *)foo;
 507
 508        spin_lock_init(&ei->cache_lru_lock);
 509        ei->nr_caches = 0;
 510        ei->cache_valid_id = FAT_CACHE_VALID + 1;
 511        INIT_LIST_HEAD(&ei->cache_lru);
 512        INIT_HLIST_NODE(&ei->i_fat_hash);
 513        inode_init_once(&ei->vfs_inode);
 514}
 515
 516static int __init fat_init_inodecache(void)
 517{
 518        fat_inode_cachep = kmem_cache_create("fat_inode_cache",
 519                                             sizeof(struct msdos_inode_info),
 520                                             0, (SLAB_RECLAIM_ACCOUNT|
 521                                                SLAB_MEM_SPREAD),
 522                                             init_once);
 523        if (fat_inode_cachep == NULL)
 524                return -ENOMEM;
 525        return 0;
 526}
 527
 528static void __exit fat_destroy_inodecache(void)
 529{
 530        kmem_cache_destroy(fat_inode_cachep);
 531}
 532
 533static int fat_remount(struct super_block *sb, int *flags, char *data)
 534{
 535        struct msdos_sb_info *sbi = MSDOS_SB(sb);
 536        *flags |= MS_NODIRATIME | (sbi->options.isvfat ? 0 : MS_NOATIME);
 537        return 0;
 538}
 539
 540static int fat_statfs(struct dentry *dentry, struct kstatfs *buf)
 541{
 542        struct msdos_sb_info *sbi = MSDOS_SB(dentry->d_sb);
 543
 544        /* If the count of free cluster is still unknown, counts it here. */
 545        if (sbi->free_clusters == -1) {
 546                int err = fat_count_free_clusters(dentry->d_sb);
 547                if (err)
 548                        return err;
 549        }
 550
 551        buf->f_type = dentry->d_sb->s_magic;
 552        buf->f_bsize = sbi->cluster_size;
 553        buf->f_blocks = sbi->max_cluster - FAT_START_ENT;
 554        buf->f_bfree = sbi->free_clusters;
 555        buf->f_bavail = sbi->free_clusters;
 556        buf->f_namelen = sbi->options.isvfat ? 260 : 12;
 557
 558        return 0;
 559}
 560
 561static int fat_write_inode(struct inode *inode, int wait)
 562{
 563        struct super_block *sb = inode->i_sb;
 564        struct msdos_sb_info *sbi = MSDOS_SB(sb);
 565        struct buffer_head *bh;
 566        struct msdos_dir_entry *raw_entry;
 567        loff_t i_pos;
 568        int err = 0;
 569
 570retry:
 571        i_pos = MSDOS_I(inode)->i_pos;
 572        if (inode->i_ino == MSDOS_ROOT_INO || !i_pos)
 573                return 0;
 574
 575        lock_kernel();
 576        bh = sb_bread(sb, i_pos >> sbi->dir_per_block_bits);
 577        if (!bh) {
 578                printk(KERN_ERR "FAT: unable to read inode block "
 579                       "for updating (i_pos %lld)\n", i_pos);
 580                err = -EIO;
 581                goto out;
 582        }
 583        spin_lock(&sbi->inode_hash_lock);
 584        if (i_pos != MSDOS_I(inode)->i_pos) {
 585                spin_unlock(&sbi->inode_hash_lock);
 586                brelse(bh);
 587                unlock_kernel();
 588                goto retry;
 589        }
 590
 591        raw_entry = &((struct msdos_dir_entry *) (bh->b_data))
 592            [i_pos & (sbi->dir_per_block - 1)];
 593        if (S_ISDIR(inode->i_mode))
 594                raw_entry->size = 0;
 595        else
 596                raw_entry->size = cpu_to_le32(inode->i_size);
 597        raw_entry->attr = fat_attr(inode);
 598        raw_entry->start = cpu_to_le16(MSDOS_I(inode)->i_logstart);
 599        raw_entry->starthi = cpu_to_le16(MSDOS_I(inode)->i_logstart >> 16);
 600        fat_date_unix2dos(inode->i_mtime.tv_sec, &raw_entry->time, &raw_entry->date);
 601        if (sbi->options.isvfat) {
 602                __le16 atime;
 603                fat_date_unix2dos(inode->i_ctime.tv_sec,&raw_entry->ctime,&raw_entry->cdate);
 604                fat_date_unix2dos(inode->i_atime.tv_sec,&atime,&raw_entry->adate);
 605                raw_entry->ctime_cs = (inode->i_ctime.tv_sec & 1) * 100 +
 606                        inode->i_ctime.tv_nsec / 10000000;
 607        }
 608        spin_unlock(&sbi->inode_hash_lock);
 609        mark_buffer_dirty(bh);
 610        if (wait)
 611                err = sync_dirty_buffer(bh);
 612        brelse(bh);
 613out:
 614        unlock_kernel();
 615        return err;
 616}
 617
 618int fat_sync_inode(struct inode *inode)
 619{
 620        return fat_write_inode(inode, 1);
 621}
 622
 623EXPORT_SYMBOL_GPL(fat_sync_inode);
 624
 625static int fat_show_options(struct seq_file *m, struct vfsmount *mnt);
 626static const struct super_operations fat_sops = {
 627        .alloc_inode    = fat_alloc_inode,
 628        .destroy_inode  = fat_destroy_inode,
 629        .write_inode    = fat_write_inode,
 630        .delete_inode   = fat_delete_inode,
 631        .put_super      = fat_put_super,
 632        .write_super    = fat_write_super,
 633        .statfs         = fat_statfs,
 634        .clear_inode    = fat_clear_inode,
 635        .remount_fs     = fat_remount,
 636
 637        .read_inode     = make_bad_inode,
 638
 639        .show_options   = fat_show_options,
 640};
 641
 642/*
 643 * a FAT file handle with fhtype 3 is
 644 *  0/  i_ino - for fast, reliable lookup if still in the cache
 645 *  1/  i_generation - to see if i_ino is still valid
 646 *          bit 0 == 0 iff directory
 647 *  2/  i_pos(8-39) - if ino has changed, but still in cache
 648 *  3/  i_pos(4-7)|i_logstart - to semi-verify inode found at i_pos
 649 *  4/  i_pos(0-3)|parent->i_logstart - maybe used to hunt for the file on disc
 650 *
 651 * Hack for NFSv2: Maximum FAT entry number is 28bits and maximum
 652 * i_pos is 40bits (blocknr(32) + dir offset(8)), so two 4bits
 653 * of i_logstart is used to store the directory entry offset.
 654 */
 655
 656static struct dentry *fat_fh_to_dentry(struct super_block *sb,
 657                struct fid *fid, int fh_len, int fh_type)
 658{
 659        struct inode *inode = NULL;
 660        struct dentry *result;
 661        u32 *fh = fid->raw;
 662
 663        if (fh_len < 5 || fh_type != 3)
 664                return NULL;
 665
 666        inode = iget(sb, fh[0]);
 667        if (!inode || is_bad_inode(inode) || inode->i_generation != fh[1]) {
 668                if (inode)
 669                        iput(inode);
 670                inode = NULL;
 671        }
 672        if (!inode) {
 673                loff_t i_pos;
 674                int i_logstart = fh[3] & 0x0fffffff;
 675
 676                i_pos = (loff_t)fh[2] << 8;
 677                i_pos |= ((fh[3] >> 24) & 0xf0) | (fh[4] >> 28);
 678
 679                /* try 2 - see if i_pos is in F-d-c
 680                 * require i_logstart to be the same
 681                 * Will fail if you truncate and then re-write
 682                 */
 683
 684                inode = fat_iget(sb, i_pos);
 685                if (inode && MSDOS_I(inode)->i_logstart != i_logstart) {
 686                        iput(inode);
 687                        inode = NULL;
 688                }
 689        }
 690        if (!inode) {
 691                /* For now, do nothing
 692                 * What we could do is:
 693                 * follow the file starting at fh[4], and record
 694                 * the ".." entry, and the name of the fh[2] entry.
 695                 * The follow the ".." file finding the next step up.
 696                 * This way we build a path to the root of
 697                 * the tree. If this works, we lookup the path and so
 698                 * get this inode into the cache.
 699                 * Finally try the fat_iget lookup again
 700                 * If that fails, then weare totally out of luck
 701                 * But all that is for another day
 702                 */
 703        }
 704        if (!inode)
 705                return ERR_PTR(-ESTALE);
 706
 707
 708        /* now to find a dentry.
 709         * If possible, get a well-connected one
 710         */
 711        result = d_alloc_anon(inode);
 712        if (result == NULL) {
 713                iput(inode);
 714                return ERR_PTR(-ENOMEM);
 715        }
 716        result->d_op = sb->s_root->d_op;
 717        return result;
 718}
 719
 720static int
 721fat_encode_fh(struct dentry *de, __u32 *fh, int *lenp, int connectable)
 722{
 723        int len = *lenp;
 724        struct inode *inode =  de->d_inode;
 725        u32 ipos_h, ipos_m, ipos_l;
 726
 727        if (len < 5)
 728                return 255; /* no room */
 729
 730        ipos_h = MSDOS_I(inode)->i_pos >> 8;
 731        ipos_m = (MSDOS_I(inode)->i_pos & 0xf0) << 24;
 732        ipos_l = (MSDOS_I(inode)->i_pos & 0x0f) << 28;
 733        *lenp = 5;
 734        fh[0] = inode->i_ino;
 735        fh[1] = inode->i_generation;
 736        fh[2] = ipos_h;
 737        fh[3] = ipos_m | MSDOS_I(inode)->i_logstart;
 738        spin_lock(&de->d_lock);
 739        fh[4] = ipos_l | MSDOS_I(de->d_parent->d_inode)->i_logstart;
 740        spin_unlock(&de->d_lock);
 741        return 3;
 742}
 743
 744static struct dentry *fat_get_parent(struct dentry *child)
 745{
 746        struct buffer_head *bh;
 747        struct msdos_dir_entry *de;
 748        loff_t i_pos;
 749        struct dentry *parent;
 750        struct inode *inode;
 751        int err;
 752
 753        lock_kernel();
 754
 755        err = fat_get_dotdot_entry(child->d_inode, &bh, &de, &i_pos);
 756        if (err) {
 757                parent = ERR_PTR(err);
 758                goto out;
 759        }
 760        inode = fat_build_inode(child->d_sb, de, i_pos);
 761        brelse(bh);
 762        if (IS_ERR(inode)) {
 763                parent = ERR_PTR(PTR_ERR(inode));
 764                goto out;
 765        }
 766        parent = d_alloc_anon(inode);
 767        if (!parent) {
 768                iput(inode);
 769                parent = ERR_PTR(-ENOMEM);
 770        }
 771out:
 772        unlock_kernel();
 773
 774        return parent;
 775}
 776
 777static const struct export_operations fat_export_ops = {
 778        .encode_fh      = fat_encode_fh,
 779        .fh_to_dentry   = fat_fh_to_dentry,
 780        .get_parent     = fat_get_parent,
 781};
 782
 783static int fat_show_options(struct seq_file *m, struct vfsmount *mnt)
 784{
 785        struct msdos_sb_info *sbi = MSDOS_SB(mnt->mnt_sb);
 786        struct fat_mount_options *opts = &sbi->options;
 787        int isvfat = opts->isvfat;
 788
 789        if (opts->fs_uid != 0)
 790                seq_printf(m, ",uid=%u", opts->fs_uid);
 791        if (opts->fs_gid != 0)
 792                seq_printf(m, ",gid=%u", opts->fs_gid);
 793        seq_printf(m, ",fmask=%04o", opts->fs_fmask);
 794        seq_printf(m, ",dmask=%04o", opts->fs_dmask);
 795        if (sbi->nls_disk)
 796                seq_printf(m, ",codepage=%s", sbi->nls_disk->charset);
 797        if (isvfat) {
 798                if (sbi->nls_io)
 799                        seq_printf(m, ",iocharset=%s", sbi->nls_io->charset);
 800
 801                switch (opts->shortname) {
 802                case VFAT_SFN_DISPLAY_WIN95 | VFAT_SFN_CREATE_WIN95:
 803                        seq_puts(m, ",shortname=win95");
 804                        break;
 805                case VFAT_SFN_DISPLAY_WINNT | VFAT_SFN_CREATE_WINNT:
 806                        seq_puts(m, ",shortname=winnt");
 807                        break;
 808                case VFAT_SFN_DISPLAY_WINNT | VFAT_SFN_CREATE_WIN95:
 809                        seq_puts(m, ",shortname=mixed");
 810                        break;
 811                case VFAT_SFN_DISPLAY_LOWER | VFAT_SFN_CREATE_WIN95:
 812                        /* seq_puts(m, ",shortname=lower"); */
 813                        break;
 814                default:
 815                        seq_puts(m, ",shortname=unknown");
 816                        break;
 817                }
 818        }
 819        if (opts->name_check != 'n')
 820                seq_printf(m, ",check=%c", opts->name_check);
 821        if (opts->usefree)
 822                seq_puts(m, ",usefree");
 823        if (opts->quiet)
 824                seq_puts(m, ",quiet");
 825        if (opts->showexec)
 826                seq_puts(m, ",showexec");
 827        if (opts->sys_immutable)
 828                seq_puts(m, ",sys_immutable");
 829        if (!isvfat) {
 830                if (opts->dotsOK)
 831                        seq_puts(m, ",dotsOK=yes");
 832                if (opts->nocase)
 833                        seq_puts(m, ",nocase");
 834        } else {
 835                if (opts->utf8)
 836                        seq_puts(m, ",utf8");
 837                if (opts->unicode_xlate)
 838                        seq_puts(m, ",uni_xlate");
 839                if (!opts->numtail)
 840                        seq_puts(m, ",nonumtail");
 841        }
 842
 843        return 0;
 844}
 845
 846enum {
 847        Opt_check_n, Opt_check_r, Opt_check_s, Opt_uid, Opt_gid,
 848        Opt_umask, Opt_dmask, Opt_fmask, Opt_codepage, Opt_usefree, Opt_nocase,
 849        Opt_quiet, Opt_showexec, Opt_debug, Opt_immutable,
 850        Opt_dots, Opt_nodots,
 851        Opt_charset, Opt_shortname_lower, Opt_shortname_win95,
 852        Opt_shortname_winnt, Opt_shortname_mixed, Opt_utf8_no, Opt_utf8_yes,
 853        Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes,
 854        Opt_obsolate, Opt_flush, Opt_err,
 855};
 856
 857static match_table_t fat_tokens = {
 858        {Opt_check_r, "check=relaxed"},
 859        {Opt_check_s, "check=strict"},
 860        {Opt_check_n, "check=normal"},
 861        {Opt_check_r, "check=r"},
 862        {Opt_check_s, "check=s"},
 863        {Opt_check_n, "check=n"},
 864        {Opt_uid, "uid=%u"},
 865        {Opt_gid, "gid=%u"},
 866        {Opt_umask, "umask=%o"},
 867        {Opt_dmask, "dmask=%o"},
 868        {Opt_fmask, "fmask=%o"},
 869        {Opt_codepage, "codepage=%u"},
 870        {Opt_usefree, "usefree"},
 871        {Opt_nocase, "nocase"},
 872        {Opt_quiet, "quiet"},
 873        {Opt_showexec, "showexec"},
 874        {Opt_debug, "debug"},
 875        {Opt_immutable, "sys_immutable"},
 876        {Opt_obsolate, "conv=binary"},
 877        {Opt_obsolate, "conv=text"},
 878        {Opt_obsolate, "conv=auto"},
 879        {Opt_obsolate, "conv=b"},
 880        {Opt_obsolate, "conv=t"},
 881        {Opt_obsolate, "conv=a"},
 882        {Opt_obsolate, "fat=%u"},
 883        {Opt_obsolate, "blocksize=%u"},
 884        {Opt_obsolate, "cvf_format=%20s"},
 885        {Opt_obsolate, "cvf_options=%100s"},
 886        {Opt_obsolate, "posix"},
 887        {Opt_flush, "flush"},
 888        {Opt_err, NULL},
 889};
 890static match_table_t msdos_tokens = {
 891        {Opt_nodots, "nodots"},
 892        {Opt_nodots, "dotsOK=no"},
 893        {Opt_dots, "dots"},
 894        {Opt_dots, "dotsOK=yes"},
 895        {Opt_err, NULL}
 896};
 897static match_table_t vfat_tokens = {
 898        {Opt_charset, "iocharset=%s"},
 899        {Opt_shortname_lower, "shortname=lower"},
 900        {Opt_shortname_win95, "shortname=win95"},
 901        {Opt_shortname_winnt, "shortname=winnt"},
 902        {Opt_shortname_mixed, "shortname=mixed"},
 903        {Opt_utf8_no, "utf8=0"},                /* 0 or no or false */
 904        {Opt_utf8_no, "utf8=no"},
 905        {Opt_utf8_no, "utf8=false"},
 906        {Opt_utf8_yes, "utf8=1"},               /* empty or 1 or yes or true */
 907        {Opt_utf8_yes, "utf8=yes"},
 908        {Opt_utf8_yes, "utf8=true"},
 909        {Opt_utf8_yes, "utf8"},
 910        {Opt_uni_xl_no, "uni_xlate=0"},         /* 0 or no or false */
 911        {Opt_uni_xl_no, "uni_xlate=no"},
 912        {Opt_uni_xl_no, "uni_xlate=false"},
 913        {Opt_uni_xl_yes, "uni_xlate=1"},        /* empty or 1 or yes or true */
 914        {Opt_uni_xl_yes, "uni_xlate=yes"},
 915        {Opt_uni_xl_yes, "uni_xlate=true"},
 916        {Opt_uni_xl_yes, "uni_xlate"},
 917        {Opt_nonumtail_no, "nonumtail=0"},      /* 0 or no or false */
 918        {Opt_nonumtail_no, "nonumtail=no"},
 919        {Opt_nonumtail_no, "nonumtail=false"},
 920        {Opt_nonumtail_yes, "nonumtail=1"},     /* empty or 1 or yes or true */
 921        {Opt_nonumtail_yes, "nonumtail=yes"},
 922        {Opt_nonumtail_yes, "nonumtail=true"},
 923        {Opt_nonumtail_yes, "nonumtail"},
 924        {Opt_err, NULL}
 925};
 926
 927static int parse_options(char *options, int is_vfat, int silent, int *debug,
 928                         struct fat_mount_options *opts)
 929{
 930        char *p;
 931        substring_t args[MAX_OPT_ARGS];
 932        int option;
 933        char *iocharset;
 934
 935        opts->isvfat = is_vfat;
 936
 937        opts->fs_uid = current->uid;
 938        opts->fs_gid = current->gid;
 939        opts->fs_fmask = opts->fs_dmask = current->fs->umask;
 940        opts->codepage = fat_default_codepage;
 941        opts->iocharset = fat_default_iocharset;
 942        if (is_vfat)
 943                opts->shortname = VFAT_SFN_DISPLAY_LOWER|VFAT_SFN_CREATE_WIN95;
 944        else
 945                opts->shortname = 0;
 946        opts->name_check = 'n';
 947        opts->quiet = opts->showexec = opts->sys_immutable = opts->dotsOK =  0;
 948        opts->utf8 = opts->unicode_xlate = 0;
 949        opts->numtail = 1;
 950        opts->usefree = opts->nocase = 0;
 951        *debug = 0;
 952
 953        if (!options)
 954                return 0;
 955
 956        while ((p = strsep(&options, ",")) != NULL) {
 957                int token;
 958                if (!*p)
 959                        continue;
 960
 961                token = match_token(p, fat_tokens, args);
 962                if (token == Opt_err) {
 963                        if (is_vfat)
 964                                token = match_token(p, vfat_tokens, args);
 965                        else
 966                                token = match_token(p, msdos_tokens, args);
 967                }
 968                switch (token) {
 969                case Opt_check_s:
 970                        opts->name_check = 's';
 971                        break;
 972                case Opt_check_r:
 973                        opts->name_check = 'r';
 974                        break;
 975                case Opt_check_n:
 976                        opts->name_check = 'n';
 977                        break;
 978                case Opt_usefree:
 979                        opts->usefree = 1;
 980                        break;
 981                case Opt_nocase:
 982                        if (!is_vfat)
 983                                opts->nocase = 1;
 984                        else {
 985                                /* for backward compatibility */
 986                                opts->shortname = VFAT_SFN_DISPLAY_WIN95
 987                                        | VFAT_SFN_CREATE_WIN95;
 988                        }
 989                        break;
 990                case Opt_quiet:
 991                        opts->quiet = 1;
 992                        break;
 993                case Opt_showexec:
 994                        opts->showexec = 1;
 995                        break;
 996                case Opt_debug:
 997                        *debug = 1;
 998                        break;
 999                case Opt_immutable:
1000                        opts->sys_immutable = 1;
1001                        break;
1002                case Opt_uid:
1003                        if (match_int(&args[0], &option))
1004                                return 0;
1005                        opts->fs_uid = option;
1006                        break;
1007                case Opt_gid:
1008                        if (match_int(&args[0], &option))
1009                                return 0;
1010                        opts->fs_gid = option;
1011                        break;
1012                case Opt_umask:
1013                        if (match_octal(&args[0], &option))
1014                                return 0;
1015                        opts->fs_fmask = opts->fs_dmask = option;
1016                        break;
1017                case Opt_dmask:
1018                        if (match_octal(&args[0], &option))
1019                                return 0;
1020                        opts->fs_dmask = option;
1021                        break;
1022                case Opt_fmask:
1023                        if (match_octal(&args[0], &option))
1024                                return 0;
1025                        opts->fs_fmask = option;
1026                        break;
1027                case Opt_codepage:
1028                        if (match_int(&args[0], &option))
1029                                return 0;
1030                        opts->codepage = option;
1031                        break;
1032                case Opt_flush:
1033                        opts->flush = 1;
1034                        break;
1035
1036                /* msdos specific */
1037                case Opt_dots:
1038                        opts->dotsOK = 1;
1039                        break;
1040                case Opt_nodots:
1041                        opts->dotsOK = 0;
1042                        break;
1043
1044                /* vfat specific */
1045                case Opt_charset:
1046                        if (opts->iocharset != fat_default_iocharset)
1047                                kfree(opts->iocharset);
1048                        iocharset = match_strdup(&args[0]);
1049                        if (!iocharset)
1050                                return -ENOMEM;
1051                        opts->iocharset = iocharset;
1052                        break;
1053                case Opt_shortname_lower:
1054                        opts->shortname = VFAT_SFN_DISPLAY_LOWER
1055                                        | VFAT_SFN_CREATE_WIN95;
1056                        break;
1057                case Opt_shortname_win95:
1058                        opts->shortname = VFAT_SFN_DISPLAY_WIN95
1059                                        | VFAT_SFN_CREATE_WIN95;
1060                        break;
1061                case Opt_shortname_winnt:
1062                        opts->shortname = VFAT_SFN_DISPLAY_WINNT
1063                                        | VFAT_SFN_CREATE_WINNT;
1064                        break;
1065                case Opt_shortname_mixed:
1066                        opts->shortname = VFAT_SFN_DISPLAY_WINNT
1067                                        | VFAT_SFN_CREATE_WIN95;
1068                        break;
1069                case Opt_utf8_no:               /* 0 or no or false */
1070                        opts->utf8 = 0;
1071                        break;
1072                case Opt_utf8_yes:              /* empty or 1 or yes or true */
1073                        opts->utf8 = 1;
1074                        break;
1075                case Opt_uni_xl_no:             /* 0 or no or false */
1076                        opts->unicode_xlate = 0;
1077                        break;
1078                case Opt_uni_xl_yes:            /* empty or 1 or yes or true */
1079                        opts->unicode_xlate = 1;
1080                        break;
1081                case Opt_nonumtail_no:          /* 0 or no or false */
1082                        opts->numtail = 1;      /* negated option */
1083                        break;
1084                case Opt_nonumtail_yes:         /* empty or 1 or yes or true */
1085                        opts->numtail = 0;      /* negated option */
1086                        break;
1087
1088                /* obsolete mount options */
1089                case Opt_obsolate:
1090                        printk(KERN_INFO "FAT: \"%s\" option is obsolete, "
1091                               "not supported now\n", p);
1092                        break;
1093                /* unknown option */
1094                default:
1095                        if (!silent) {
1096                                printk(KERN_ERR
1097                                       "FAT: Unrecognized mount option \"%s\" "
1098                                       "or missing value\n", p);
1099                        }
1100                        return -EINVAL;
1101                }
1102        }
1103        /* UTF-8 doesn't provide FAT semantics */
1104        if (!strcmp(opts->iocharset, "utf8")) {
1105                printk(KERN_ERR "FAT: utf8 is not a recommended IO charset"
1106                       " for FAT filesystems, filesystem will be case sensitive!\n");
1107        }
1108
1109        if (opts->unicode_xlate)
1110                opts->utf8 = 0;
1111
1112        return 0;
1113}
1114
1115static int fat_read_root(struct inode *inode)
1116{
1117        struct super_block *sb = inode->i_sb;
1118        struct msdos_sb_info *sbi = MSDOS_SB(sb);
1119        int error;
1120
1121        MSDOS_I(inode)->i_pos = 0;
1122        inode->i_uid = sbi->options.fs_uid;
1123        inode->i_gid = sbi->options.fs_gid;
1124        inode->i_version++;
1125        inode->i_generation = 0;
1126        inode->i_mode = (S_IRWXUGO & ~sbi->options.fs_dmask) | S_IFDIR;
1127        inode->i_op = sbi->dir_ops;
1128        inode->i_fop = &fat_dir_operations;
1129        if (sbi->fat_bits == 32) {
1130                MSDOS_I(inode)->i_start = sbi->root_cluster;
1131                error = fat_calc_dir_size(inode);
1132                if (error < 0)
1133                        return error;
1134        } else {
1135                MSDOS_I(inode)->i_start = 0;
1136                inode->i_size = sbi->dir_entries * sizeof(struct msdos_dir_entry);
1137        }
1138        inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1))
1139                           & ~((loff_t)sbi->cluster_size - 1)) >> 9;
1140        MSDOS_I(inode)->i_logstart = 0;
1141        MSDOS_I(inode)->mmu_private = inode->i_size;
1142
1143        MSDOS_I(inode)->i_attrs = ATTR_NONE;
1144        inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = 0;
1145        inode->i_mtime.tv_nsec = inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec = 0;
1146        inode->i_nlink = fat_subdirs(inode)+2;
1147
1148        return 0;
1149}
1150
1151/*
1152 * Read the super block of an MS-DOS FS.
1153 */
1154int fat_fill_super(struct super_block *sb, void *data, int silent,
1155                   const struct inode_operations *fs_dir_inode_ops, int isvfat)
1156{
1157        struct inode *root_inode = NULL;
1158        struct buffer_head *bh;
1159        struct fat_boot_sector *b;
1160        struct msdos_sb_info *sbi;
1161        u16 logical_sector_size;
1162        u32 total_sectors, total_clusters, fat_clusters, rootdir_sectors;
1163        int debug;
1164        unsigned int media;
1165        long error;
1166        char buf[50];
1167
1168        sbi = kzalloc(sizeof(struct msdos_sb_info), GFP_KERNEL);
1169        if (!sbi)
1170                return -ENOMEM;
1171        sb->s_fs_info = sbi;
1172
1173        sb->s_flags |= MS_NODIRATIME;
1174        sb->s_magic = MSDOS_SUPER_MAGIC;
1175        sb->s_op = &fat_sops;
1176        sb->s_export_op = &fat_export_ops;
1177        sbi->dir_ops = fs_dir_inode_ops;
1178
1179        error = parse_options(data, isvfat, silent, &debug, &sbi->options);
1180        if (error)
1181                goto out_fail;
1182
1183        error = -EIO;
1184        sb_min_blocksize(sb, 512);
1185        bh = sb_bread(sb, 0);
1186        if (bh == NULL) {
1187                printk(KERN_ERR "FAT: unable to read boot sector\n");
1188                goto out_fail;
1189        }
1190
1191        b = (struct fat_boot_sector *) bh->b_data;
1192        if (!b->reserved) {
1193                if (!silent)
1194                        printk(KERN_ERR "FAT: bogus number of reserved sectors\n");
1195                brelse(bh);
1196                goto out_invalid;
1197        }
1198        if (!b->fats) {
1199                if (!silent)
1200                        printk(KERN_ERR "FAT: bogus number of FAT structure\n");
1201                brelse(bh);
1202                goto out_invalid;
1203        }
1204
1205        /*
1206         * Earlier we checked here that b->secs_track and b->head are nonzero,
1207         * but it turns out valid FAT filesystems can have zero there.
1208         */
1209
1210        media = b->media;
1211        if (!FAT_VALID_MEDIA(media)) {
1212                if (!silent)
1213                        printk(KERN_ERR "FAT: invalid media value (0x%02x)\n",
1214                               media);
1215                brelse(bh);
1216                goto out_invalid;
1217        }
1218        logical_sector_size =
1219                le16_to_cpu(get_unaligned((__le16 *)&b->sector_size));
1220        if (!is_power_of_2(logical_sector_size)
1221            || (logical_sector_size < 512)
1222            || (PAGE_CACHE_SIZE < logical_sector_size)) {
1223                if (!silent)
1224                        printk(KERN_ERR "FAT: bogus logical sector size %u\n",
1225                               logical_sector_size);
1226                brelse(bh);
1227                goto out_invalid;
1228        }
1229        sbi->sec_per_clus = b->sec_per_clus;
1230        if (!is_power_of_2(sbi->sec_per_clus)) {
1231                if (!silent)
1232                        printk(KERN_ERR "FAT: bogus sectors per cluster %u\n",
1233                               sbi->sec_per_clus);
1234                brelse(bh);
1235                goto out_invalid;
1236        }
1237
1238        if (logical_sector_size < sb->s_blocksize) {
1239                printk(KERN_ERR "FAT: logical sector size too small for device"
1240                       " (logical sector size = %u)\n", logical_sector_size);
1241                brelse(bh);
1242                goto out_fail;
1243        }
1244        if (logical_sector_size > sb->s_blocksize) {
1245                brelse(bh);
1246
1247                if (!sb_set_blocksize(sb, logical_sector_size)) {
1248                        printk(KERN_ERR "FAT: unable to set blocksize %u\n",
1249                               logical_sector_size);
1250                        goto out_fail;
1251                }
1252                bh = sb_bread(sb, 0);
1253                if (bh == NULL) {
1254                        printk(KERN_ERR "FAT: unable to read boot sector"
1255                               " (logical sector size = %lu)\n",
1256                               sb->s_blocksize);
1257                        goto out_fail;
1258                }
1259                b = (struct fat_boot_sector *) bh->b_data;
1260        }
1261
1262        sbi->cluster_size = sb->s_blocksize * sbi->sec_per_clus;
1263        sbi->cluster_bits = ffs(sbi->cluster_size) - 1;
1264        sbi->fats = b->fats;
1265        sbi->fat_bits = 0;              /* Don't know yet */
1266        sbi->fat_start = le16_to_cpu(b->reserved);
1267        sbi->fat_length = le16_to_cpu(b->fat_length);
1268        sbi->root_cluster = 0;
1269        sbi->free_clusters = -1;        /* Don't know yet */
1270        sbi->prev_free = FAT_START_ENT;
1271
1272        if (!sbi->fat_length && b->fat32_length) {
1273                struct fat_boot_fsinfo *fsinfo;
1274                struct buffer_head *fsinfo_bh;
1275
1276                /* Must be FAT32 */
1277                sbi->fat_bits = 32;
1278                sbi->fat_length = le32_to_cpu(b->fat32_length);
1279                sbi->root_cluster = le32_to_cpu(b->root_cluster);
1280
1281                sb->s_maxbytes = 0xffffffff;
1282
1283                /* MC - if info_sector is 0, don't multiply by 0 */
1284                sbi->fsinfo_sector = le16_to_cpu(b->info_sector);
1285                if (sbi->fsinfo_sector == 0)
1286                        sbi->fsinfo_sector = 1;
1287
1288                fsinfo_bh = sb_bread(sb, sbi->fsinfo_sector);
1289                if (fsinfo_bh == NULL) {
1290                        printk(KERN_ERR "FAT: bread failed, FSINFO block"
1291                               " (sector = %lu)\n", sbi->fsinfo_sector);
1292                        brelse(bh);
1293                        goto out_fail;
1294                }
1295
1296                fsinfo = (struct fat_boot_fsinfo *)fsinfo_bh->b_data;
1297                if (!IS_FSINFO(fsinfo)) {
1298                        printk(KERN_WARNING
1299                               "FAT: Did not find valid FSINFO signature.\n"
1300                               "     Found signature1 0x%08x signature2 0x%08x"
1301                               " (sector = %lu)\n",
1302                               le32_to_cpu(fsinfo->signature1),
1303                               le32_to_cpu(fsinfo->signature2),
1304                               sbi->fsinfo_sector);
1305                } else {
1306                        if (sbi->options.usefree)
1307                                sbi->free_clusters =
1308                                        le32_to_cpu(fsinfo->free_clusters);
1309                        sbi->prev_free = le32_to_cpu(fsinfo->next_cluster);
1310                }
1311
1312                brelse(fsinfo_bh);
1313        }
1314
1315        sbi->dir_per_block = sb->s_blocksize / sizeof(struct msdos_dir_entry);
1316        sbi->dir_per_block_bits = ffs(sbi->dir_per_block) - 1;
1317
1318        sbi->dir_start = sbi->fat_start + sbi->fats * sbi->fat_length;
1319        sbi->dir_entries =
1320                le16_to_cpu(get_unaligned((__le16 *)&b->dir_entries));
1321        if (sbi->dir_entries & (sbi->dir_per_block - 1)) {
1322                if (!silent)
1323                        printk(KERN_ERR "FAT: bogus directroy-entries per block"
1324                               " (%u)\n", sbi->dir_entries);
1325                brelse(bh);
1326                goto out_invalid;
1327        }
1328
1329        rootdir_sectors = sbi->dir_entries
1330                * sizeof(struct msdos_dir_entry) / sb->s_blocksize;
1331        sbi->data_start = sbi->dir_start + rootdir_sectors;
1332        total_sectors = le16_to_cpu(get_unaligned((__le16 *)&b->sectors));
1333        if (total_sectors == 0)
1334                total_sectors = le32_to_cpu(b->total_sect);
1335
1336        total_clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus;
1337
1338        if (sbi->fat_bits != 32)
1339                sbi->fat_bits = (total_clusters > MAX_FAT12) ? 16 : 12;
1340
1341        /* check that FAT table does not overflow */
1342        fat_clusters = sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
1343        total_clusters = min(total_clusters, fat_clusters - FAT_START_ENT);
1344        if (total_clusters > MAX_FAT(sb)) {
1345                if (!silent)
1346                        printk(KERN_ERR "FAT: count of clusters too big (%u)\n",
1347                               total_clusters);
1348                brelse(bh);
1349                goto out_invalid;
1350        }
1351
1352        sbi->max_cluster = total_clusters + FAT_START_ENT;
1353        /* check the free_clusters, it's not necessarily correct */
1354        if (sbi->free_clusters != -1 && sbi->free_clusters > total_clusters)
1355                sbi->free_clusters = -1;
1356        /* check the prev_free, it's not necessarily correct */
1357        sbi->prev_free %= sbi->max_cluster;
1358        if (sbi->prev_free < FAT_START_ENT)
1359                sbi->prev_free = FAT_START_ENT;
1360
1361        brelse(bh);
1362
1363        /* set up enough so that it can read an inode */
1364        fat_hash_init(sb);
1365        fat_ent_access_init(sb);
1366
1367        /*
1368         * The low byte of FAT's first entry must have same value with
1369         * media-field.  But in real world, too many devices is
1370         * writing wrong value.  So, removed that validity check.
1371         *
1372         * if (FAT_FIRST_ENT(sb, media) != first)
1373         */
1374
1375        error = -EINVAL;
1376        sprintf(buf, "cp%d", sbi->options.codepage);
1377        sbi->nls_disk = load_nls(buf);
1378        if (!sbi->nls_disk) {
1379                printk(KERN_ERR "FAT: codepage %s not found\n", buf);
1380                goto out_fail;
1381        }
1382
1383        /* FIXME: utf8 is using iocharset for upper/lower conversion */
1384        if (sbi->options.isvfat) {
1385                sbi->nls_io = load_nls(sbi->options.iocharset);
1386                if (!sbi->nls_io) {
1387                        printk(KERN_ERR "FAT: IO charset %s not found\n",
1388                               sbi->options.iocharset);
1389                        goto out_fail;
1390                }
1391        }
1392
1393        error = -ENOMEM;
1394        root_inode = new_inode(sb);
1395        if (!root_inode)
1396                goto out_fail;
1397        root_inode->i_ino = MSDOS_ROOT_INO;
1398        root_inode->i_version = 1;
1399        error = fat_read_root(root_inode);
1400        if (error < 0)
1401                goto out_fail;
1402        error = -ENOMEM;
1403        insert_inode_hash(root_inode);
1404        sb->s_root = d_alloc_root(root_inode);
1405        if (!sb->s_root) {
1406                printk(KERN_ERR "FAT: get root inode failed\n");
1407                goto out_fail;
1408        }
1409
1410        return 0;
1411
1412out_invalid:
1413        error = -EINVAL;
1414        if (!silent)
1415                printk(KERN_INFO "VFS: Can't find a valid FAT filesystem"
1416                       " on dev %s.\n", sb->s_id);
1417
1418out_fail:
1419        if (root_inode)
1420                iput(root_inode);
1421        if (sbi->nls_io)
1422                unload_nls(sbi->nls_io);
1423        if (sbi->nls_disk)
1424                unload_nls(sbi->nls_disk);
1425        if (sbi->options.iocharset != fat_default_iocharset)
1426                kfree(sbi->options.iocharset);
1427        sb->s_fs_info = NULL;
1428        kfree(sbi);
1429        return error;
1430}
1431
1432EXPORT_SYMBOL_GPL(fat_fill_super);
1433
1434/*
1435 * helper function for fat_flush_inodes.  This writes both the inode
1436 * and the file data blocks, waiting for in flight data blocks before
1437 * the start of the call.  It does not wait for any io started
1438 * during the call
1439 */
1440static int writeback_inode(struct inode *inode)
1441{
1442
1443        int ret;
1444        struct address_space *mapping = inode->i_mapping;
1445        struct writeback_control wbc = {
1446               .sync_mode = WB_SYNC_NONE,
1447              .nr_to_write = 0,
1448        };
1449        /* if we used WB_SYNC_ALL, sync_inode waits for the io for the
1450        * inode to finish.  So WB_SYNC_NONE is sent down to sync_inode
1451        * and filemap_fdatawrite is used for the data blocks
1452        */
1453        ret = sync_inode(inode, &wbc);
1454        if (!ret)
1455               ret = filemap_fdatawrite(mapping);
1456        return ret;
1457}
1458
1459/*
1460 * write data and metadata corresponding to i1 and i2.  The io is
1461 * started but we do not wait for any of it to finish.
1462 *
1463 * filemap_flush is used for the block device, so if there is a dirty
1464 * page for a block already in flight, we will not wait and start the
1465 * io over again
1466 */
1467int fat_flush_inodes(struct super_block *sb, struct inode *i1, struct inode *i2)
1468{
1469        int ret = 0;
1470        if (!MSDOS_SB(sb)->options.flush)
1471                return 0;
1472        if (i1)
1473                ret = writeback_inode(i1);
1474        if (!ret && i2)
1475                ret = writeback_inode(i2);
1476        if (!ret) {
1477                struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping;
1478                ret = filemap_flush(mapping);
1479        }
1480        return ret;
1481}
1482EXPORT_SYMBOL_GPL(fat_flush_inodes);
1483
1484static int __init init_fat_fs(void)
1485{
1486        int err;
1487
1488        err = fat_cache_init();
1489        if (err)
1490                return err;
1491
1492        err = fat_init_inodecache();
1493        if (err)
1494                goto failed;
1495
1496        return 0;
1497
1498failed:
1499        fat_cache_destroy();
1500        return err;
1501}
1502
1503static void __exit exit_fat_fs(void)
1504{
1505        fat_cache_destroy();
1506        fat_destroy_inodecache();
1507}
1508
1509module_init(init_fat_fs)
1510module_exit(exit_fat_fs)
1511
1512MODULE_LICENSE("GPL");
1513