Merge tag 'v3.10.56' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / buffer.c
index d2a4d1bb2d57aec3999e494d52c4f765a0ae48e8..533723a8b4695730255c4e9b46a922d1398a65ab 100644 (file)
@@ -620,14 +620,16 @@ EXPORT_SYMBOL(mark_buffer_dirty_inode);
 static void __set_page_dirty(struct page *page,
                struct address_space *mapping, int warn)
 {
-       spin_lock_irq(&mapping->tree_lock);
+       unsigned long flags;
+
+       spin_lock_irqsave(&mapping->tree_lock, flags);
        if (page->mapping) {    /* Race with truncate? */
                WARN_ON_ONCE(warn && !PageUptodate(page));
                account_page_dirtied(page, mapping);
                radix_tree_tag_set(&mapping->page_tree,
                                page_index(page), PAGECACHE_TAG_DIRTY);
        }
-       spin_unlock_irq(&mapping->tree_lock);
+       spin_unlock_irqrestore(&mapping->tree_lock, flags);
        __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
 }
 
@@ -983,7 +985,8 @@ grow_dev_page(struct block_device *bdev, sector_t block,
                bh = page_buffers(page);
                if (bh->b_size == size) {
                        end_block = init_page_buffers(page, bdev,
-                                               index << sizebits, size);
+                                               (sector_t)index << sizebits,
+                                               size);
                        goto done;
                }
                if (!try_to_free_buffers(page))
@@ -1004,7 +1007,8 @@ grow_dev_page(struct block_device *bdev, sector_t block,
         */
        spin_lock(&inode->i_mapping->private_lock);
        link_dev_buffers(page, bh);
-       end_block = init_page_buffers(page, bdev, index << sizebits, size);
+       end_block = init_page_buffers(page, bdev, (sector_t)index << sizebits,
+                       size);
        spin_unlock(&inode->i_mapping->private_lock);
 done:
        ret = (block < end_block) ? 1 : -ENXIO;
@@ -1185,10 +1189,18 @@ static struct buffer_head *__bread_slow(struct buffer_head *bh)
        lock_buffer(bh);
        if (buffer_uptodate(bh)) {
                unlock_buffer(bh);
+#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, HIT_READ_CNT);
+#endif
                return bh;
        } else {
                get_bh(bh);
                bh->b_end_io = end_buffer_read_sync;
+#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, WAIT_READ_CNT);
+#endif
                submit_bh(READ, bh);
                wait_on_buffer(bh);
                if (buffer_uptodate(bh))
@@ -3089,6 +3101,10 @@ int __sync_dirty_buffer(struct buffer_head *bh, int rw)
        if (test_clear_buffer_dirty(bh)) {
                get_bh(bh);
                bh->b_end_io = end_buffer_write_sync;
+#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, WAIT_WRITE_CNT);
+#endif
                ret = submit_bh(rw, bh);
                wait_on_buffer(bh);
                if (!ret && !buffer_uptodate(bh))
@@ -3352,6 +3368,10 @@ int bh_submit_read(struct buffer_head *bh)
 
        get_bh(bh);
        bh->b_end_io = end_buffer_read_sync;
+#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, WAIT_READ_CNT);
+#endif
        submit_bh(READ, bh);
        wait_on_buffer(bh);
        if (buffer_uptodate(bh))