Merge tag 'v3.10.107' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / fat / inode.c
index 04708fab99aac43121e03548a5e5557f7a70571b..72abdad44c8904ddb8c4c814f6d76ce6b707917d 100644 (file)
@@ -157,11 +157,40 @@ static int fat_write_begin(struct file *file, struct address_space *mapping,
                        struct page **pagep, void **fsdata)
 {
        int err;
+#if defined(FEATURE_STORAGE_PID_LOGGER)
+       extern unsigned char *page_logger;
+       struct page_pid_logger *tmp_logger;
+       unsigned long page_index;
+       extern spinlock_t g_locker;
+       unsigned long g_flags;
+#endif
 
        *pagep = NULL;
        err = cont_write_begin(file, mapping, pos, len, flags,
                                pagep, fsdata, fat_get_block,
                                &MSDOS_I(mapping->host)->mmu_private);
+#if defined(FEATURE_STORAGE_PID_LOGGER)
+       if( page_logger && (*pagep)) {
+               //printk(KERN_INFO"fat write_begin hank logger count:%d init %x currentpid:%d page:%x mem_map:%x pfn:%d page->index:%d\n", num_physpages, page_logger, current->pid, *pagep, mem_map, (unsigned)((*pagep) - mem_map), (*pagep)->index);
+               //printk(KERN_INFO"page_logger_lock:%x %d", page_logger_lock, ((num_physpages+(1<<PAGE_LOCKER_SHIFT)-1)>>PAGE_LOCKER_SHIFT));
+               //#if defined(CONFIG_FLATMEM)
+               //page_index = (unsigned long)((*pagep) - mem_map) ;
+               //#else
+               page_index = (unsigned long)(__page_to_pfn(*pagep))- PHYS_PFN_OFFSET;
+               //#endif
+               tmp_logger =((struct page_pid_logger *)page_logger) + page_index;
+               spin_lock_irqsave(&g_locker, g_flags);
+               if( page_index < num_physpages) {
+                       if( tmp_logger->pid1 == 0XFFFF)
+                               tmp_logger->pid1 = current->pid;
+                       else if( tmp_logger->pid1 != current->pid)
+                               tmp_logger->pid2 = current->pid;
+               }
+               spin_unlock_irqrestore(&g_locker, g_flags);
+               //printk(KERN_INFO"tmp logger pid1:%u pid2:%u pfn:%d page:%x pos:%x host:%x max_mapnr:%x\n", tmp_logger->pid1, tmp_logger->pid2, (unsigned long)((*pagep) - mem_map),(*pagep), pos, mapping->host, max_mapnr );
+               //printk(KERN_INFO"tmp logger pid1:%u pid2:%u pfn:%lu page:%p\n", tmp_logger->pid1, tmp_logger->pid2, (unsigned long)(__page_to_pfn(*pagep)),(*pagep));
+       }
+#endif
        if (err < 0)
                fat_write_failed(mapping, pos + len);
        return err;
@@ -721,7 +750,15 @@ retry:
        mark_buffer_dirty(bh);
        err = 0;
        if (wait)
+       {
                err = sync_dirty_buffer(bh);
+       }else
+       {
+#ifdef FEATURE_STORAGE_META_LOG
+               if( bh && bh->b_bdev && bh->b_bdev->bd_disk)
+                       set_metadata_rw_status(bh->b_bdev->bd_disk->first_minor, NOWAIT_WRITE_CNT);
+#endif
+       }
        brelse(bh);
        return err;
 }
@@ -1262,6 +1299,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
        struct inode *fsinfo_inode = NULL;
        struct buffer_head *bh;
        struct fat_boot_sector *b;
+       struct fat_boot_bsx *bsx;
        struct msdos_sb_info *sbi;
        u16 logical_sector_size;
        u32 total_sectors, total_clusters, fat_clusters, rootdir_sectors;
@@ -1408,6 +1446,8 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
                        goto out_fail;
                }
 
+               bsx = (struct fat_boot_bsx *)(bh->b_data + FAT32_BSX_OFFSET);
+
                fsinfo = (struct fat_boot_fsinfo *)fsinfo_bh->b_data;
                if (!IS_FSINFO(fsinfo)) {
                        fat_msg(sb, KERN_WARNING, "Invalid FSINFO signature: "
@@ -1423,8 +1463,14 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
                }
 
                brelse(fsinfo_bh);
+       } else {
+               bsx = (struct fat_boot_bsx *)(bh->b_data + FAT16_BSX_OFFSET);
        }
 
+       /* interpret volume ID as a little endian 32 bit integer */
+       sbi->vol_id = (((u32)bsx->vol_id[0]) | ((u32)bsx->vol_id[1] << 8) |
+               ((u32)bsx->vol_id[2] << 16) | ((u32)bsx->vol_id[3] << 24));
+
        sbi->dir_per_block = sb->s_blocksize / sizeof(struct msdos_dir_entry);
        sbi->dir_per_block_bits = ffs(sbi->dir_per_block) - 1;