X-Git-Url: https://git.stricted.de/?a=blobdiff_plain;f=fs%2Fbuffer.c;h=cac19c317578edf2c2f59ede36a798722192206d;hb=HEAD;hp=d2a4d1bb2d57aec3999e494d52c4f765a0ae48e8;hpb=2a66a854f5d716bb67e24dba78e53bdd5f0253ad;p=GitHub%2Fmt8127%2Fandroid_kernel_alcatel_ttab.git diff --git a/fs/buffer.c b/fs/buffer.c index d2a4d1bb2d57..cac19c317578 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -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)) @@ -2014,6 +2026,7 @@ int generic_write_end(struct file *file, struct address_space *mapping, struct page *page, void *fsdata) { struct inode *inode = mapping->host; + loff_t old_size = inode->i_size; int i_size_changed = 0; copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); @@ -2033,6 +2046,8 @@ int generic_write_end(struct file *file, struct address_space *mapping, unlock_page(page); page_cache_release(page); + if (old_size < pos) + pagecache_isize_extended(inode, old_size, pos); /* * Don't mark the inode dirty under page lock. First, it unnecessarily * makes the holding time of page lock longer. Second, it forces lock @@ -2250,6 +2265,11 @@ static int cont_expand_zero(struct file *file, struct address_space *mapping, err = 0; balance_dirty_pages_ratelimited(mapping); + + if (unlikely(fatal_signal_pending(current))) { + err = -EINTR; + goto out; + } } /* page covers the boundary, find the boundary offset */ @@ -3089,6 +3109,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 +3376,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))