Merge git://git.kernel.org/pub/scm/linux/kernel/git/hirofumi/fatfs-2.6
Linus Torvalds [Wed, 30 Sep 2009 16:31:14 +0000 (09:31 -0700)]
* git://git.kernel.org/pub/scm/linux/kernel/git/hirofumi/fatfs-2.6:
  fat: Check s_dirt in fat_sync_fs()
  vfat: change the default from shortname=lower to shortname=mixed
  fat/nls: Fix handling of utf8 invalid char

1  2 
fs/fat/inode.c
fs/fat/misc.c
fs/nls/nls_base.c

diff --combined fs/fat/inode.c
@@@ -451,12 -451,16 +451,16 @@@ static void fat_write_super(struct supe
  
  static int fat_sync_fs(struct super_block *sb, int wait)
  {
-       lock_super(sb);
-       fat_clusters_flush(sb);
-       sb->s_dirt = 0;
-       unlock_super(sb);
+       int err = 0;
  
-       return 0;
+       if (sb->s_dirt) {
+               lock_super(sb);
+               sb->s_dirt = 0;
+               err = fat_clusters_flush(sb);
+               unlock_super(sb);
+       }
+       return err;
  }
  
  static void fat_put_super(struct super_block *sb)
  
        iput(sbi->fat_inode);
  
 -      if (sbi->nls_disk) {
 -              unload_nls(sbi->nls_disk);
 -              sbi->nls_disk = NULL;
 -              sbi->options.codepage = fat_default_codepage;
 -      }
 -      if (sbi->nls_io) {
 -              unload_nls(sbi->nls_io);
 -              sbi->nls_io = NULL;
 -      }
 -      if (sbi->options.iocharset != fat_default_iocharset) {
 +      unload_nls(sbi->nls_disk);
 +      unload_nls(sbi->nls_io);
 +
 +      if (sbi->options.iocharset != fat_default_iocharset)
                kfree(sbi->options.iocharset);
 -              sbi->options.iocharset = fat_default_iocharset;
 -      }
  
        sb->s_fs_info = NULL;
        kfree(sbi);
@@@ -812,7 -824,7 +816,7 @@@ static int fat_show_options(struct seq_
                        seq_puts(m, ",shortname=mixed");
                        break;
                case VFAT_SFN_DISPLAY_LOWER | VFAT_SFN_CREATE_WIN95:
-                       /* seq_puts(m, ",shortname=lower"); */
+                       seq_puts(m, ",shortname=lower");
                        break;
                default:
                        seq_puts(m, ",shortname=unknown");
@@@ -963,7 -975,7 +967,7 @@@ static int parse_options(char *options
        opts->codepage = fat_default_codepage;
        opts->iocharset = fat_default_iocharset;
        if (is_vfat) {
-               opts->shortname = VFAT_SFN_DISPLAY_LOWER|VFAT_SFN_CREATE_WIN95;
+               opts->shortname = VFAT_SFN_DISPLAY_WINNT|VFAT_SFN_CREATE_WIN95;
                opts->rodir = 0;
        } else {
                opts->shortname = 0;
diff --combined fs/fat/misc.c
@@@ -43,19 -43,19 +43,19 @@@ EXPORT_SYMBOL_GPL(fat_fs_error)
  
  /* Flushes the number of free clusters on FAT32 */
  /* XXX: Need to write one per FSINFO block.  Currently only writes 1 */
- void fat_clusters_flush(struct super_block *sb)
+ int fat_clusters_flush(struct super_block *sb)
  {
        struct msdos_sb_info *sbi = MSDOS_SB(sb);
        struct buffer_head *bh;
        struct fat_boot_fsinfo *fsinfo;
  
        if (sbi->fat_bits != 32)
-               return;
+               return 0;
  
        bh = sb_bread(sb, sbi->fsinfo_sector);
        if (bh == NULL) {
                printk(KERN_ERR "FAT: bread failed in fat_clusters_flush\n");
-               return;
+               return -EIO;
        }
  
        fsinfo = (struct fat_boot_fsinfo *)bh->b_data;
@@@ -74,6 -74,8 +74,8 @@@
                mark_buffer_dirty(bh);
        }
        brelse(bh);
+       return 0;
  }
  
  /*
@@@ -119,8 -121,8 +121,8 @@@ int fat_chain_add(struct inode *inode, 
                MSDOS_I(inode)->i_start = new_dclus;
                MSDOS_I(inode)->i_logstart = new_dclus;
                /*
 -               * Since generic_osync_inode() synchronize later if
 -               * this is not directory, we don't here.
 +               * Since generic_write_sync() synchronizes regular files later,
 +               * we sync here only directories.
                 */
                if (S_ISDIR(inode->i_mode) && IS_DIRSYNC(inode)) {
                        ret = fat_sync_inode(inode);
diff --combined fs/nls/nls_base.c
@@@ -124,10 -124,10 +124,10 @@@ int utf8s_to_utf16s(const u8 *s, int le
        while (*s && len > 0) {
                if (*s & 0x80) {
                        size = utf8_to_utf32(s, len, &u);
-                       if (size < 0) {
-                               /* Ignore character and move on */
-                               size = 1;
-                       } else if (u >= PLANE_SIZE) {
+                       if (size < 0)
+                               return -EINVAL;
+                       if (u >= PLANE_SIZE) {
                                u -= PLANE_SIZE;
                                *op++ = (wchar_t) (SURROGATE_PAIR |
                                                ((u >> 10) & SURROGATE_BITS));
@@@ -270,8 -270,7 +270,8 @@@ struct nls_table *load_nls(char *charse
  
  void unload_nls(struct nls_table *nls)
  {
 -      module_put(nls->owner);
 +      if (nls)
 +              module_put(nls->owner);
  }
  
  static const wchar_t charset2uni[256] = {