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