|
@@ -39,11 +39,11 @@ static struct {
|
|
|
#endif
|
|
|
|
|
|
#define metapage_locked(mp) test_bit(META_locked, &(mp)->flag)
|
|
|
-#define trylock_metapage(mp) test_and_set_bit(META_locked, &(mp)->flag)
|
|
|
+#define trylock_metapage(mp) test_and_set_bit_lock(META_locked, &(mp)->flag)
|
|
|
|
|
|
static inline void unlock_metapage(struct metapage *mp)
|
|
|
{
|
|
|
- clear_bit(META_locked, &mp->flag);
|
|
|
+ clear_bit_unlock(META_locked, &mp->flag);
|
|
|
wake_up(&mp->wait);
|
|
|
}
|
|
|
|
|
@@ -88,7 +88,7 @@ struct meta_anchor {
|
|
|
};
|
|
|
#define mp_anchor(page) ((struct meta_anchor *)page_private(page))
|
|
|
|
|
|
-static inline struct metapage *page_to_mp(struct page *page, uint offset)
|
|
|
+static inline struct metapage *page_to_mp(struct page *page, int offset)
|
|
|
{
|
|
|
if (!PagePrivate(page))
|
|
|
return NULL;
|
|
@@ -153,7 +153,7 @@ static inline void dec_io(struct page *page, void (*handler) (struct page *))
|
|
|
}
|
|
|
|
|
|
#else
|
|
|
-static inline struct metapage *page_to_mp(struct page *page, uint offset)
|
|
|
+static inline struct metapage *page_to_mp(struct page *page, int offset)
|
|
|
{
|
|
|
return PagePrivate(page) ? (struct metapage *)page_private(page) : NULL;
|
|
|
}
|
|
@@ -249,7 +249,7 @@ static inline void drop_metapage(struct page *page, struct metapage *mp)
|
|
|
*/
|
|
|
|
|
|
static sector_t metapage_get_blocks(struct inode *inode, sector_t lblock,
|
|
|
- unsigned int *len)
|
|
|
+ int *len)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
int xflag;
|
|
@@ -352,25 +352,27 @@ static void metapage_write_end_io(struct bio *bio, int err)
|
|
|
static int metapage_writepage(struct page *page, struct writeback_control *wbc)
|
|
|
{
|
|
|
struct bio *bio = NULL;
|
|
|
- unsigned int block_offset; /* block offset of mp within page */
|
|
|
+ int block_offset; /* block offset of mp within page */
|
|
|
struct inode *inode = page->mapping->host;
|
|
|
- unsigned int blocks_per_mp = JFS_SBI(inode->i_sb)->nbperpage;
|
|
|
- unsigned int len;
|
|
|
- unsigned int xlen;
|
|
|
+ int blocks_per_mp = JFS_SBI(inode->i_sb)->nbperpage;
|
|
|
+ int len;
|
|
|
+ int xlen;
|
|
|
struct metapage *mp;
|
|
|
int redirty = 0;
|
|
|
sector_t lblock;
|
|
|
+ int nr_underway = 0;
|
|
|
sector_t pblock;
|
|
|
sector_t next_block = 0;
|
|
|
sector_t page_start;
|
|
|
unsigned long bio_bytes = 0;
|
|
|
unsigned long bio_offset = 0;
|
|
|
- unsigned int offset;
|
|
|
+ int offset;
|
|
|
|
|
|
page_start = (sector_t)page->index <<
|
|
|
(PAGE_CACHE_SHIFT - inode->i_blkbits);
|
|
|
BUG_ON(!PageLocked(page));
|
|
|
BUG_ON(PageWriteback(page));
|
|
|
+ set_page_writeback(page);
|
|
|
|
|
|
for (offset = 0; offset < PAGE_CACHE_SIZE; offset += PSIZE) {
|
|
|
mp = page_to_mp(page, offset);
|
|
@@ -413,11 +415,10 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
|
|
|
if (!bio->bi_size)
|
|
|
goto dump_bio;
|
|
|
submit_bio(WRITE, bio);
|
|
|
+ nr_underway++;
|
|
|
bio = NULL;
|
|
|
- } else {
|
|
|
- set_page_writeback(page);
|
|
|
+ } else
|
|
|
inc_io(page);
|
|
|
- }
|
|
|
xlen = (PAGE_CACHE_SIZE - offset) >> inode->i_blkbits;
|
|
|
pblock = metapage_get_blocks(inode, lblock, &xlen);
|
|
|
if (!pblock) {
|
|
@@ -427,7 +428,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
|
|
|
continue;
|
|
|
}
|
|
|
set_bit(META_io, &mp->flag);
|
|
|
- len = min(xlen, (uint) JFS_SBI(inode->i_sb)->nbperpage);
|
|
|
+ len = min(xlen, (int)JFS_SBI(inode->i_sb)->nbperpage);
|
|
|
|
|
|
bio = bio_alloc(GFP_NOFS, 1);
|
|
|
bio->bi_bdev = inode->i_sb->s_bdev;
|
|
@@ -449,12 +450,16 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
|
|
|
goto dump_bio;
|
|
|
|
|
|
submit_bio(WRITE, bio);
|
|
|
+ nr_underway++;
|
|
|
}
|
|
|
if (redirty)
|
|
|
redirty_page_for_writepage(wbc, page);
|
|
|
|
|
|
unlock_page(page);
|
|
|
|
|
|
+ if (nr_underway == 0)
|
|
|
+ end_page_writeback(page);
|
|
|
+
|
|
|
return 0;
|
|
|
add_failed:
|
|
|
/* We should never reach here, since we're only adding one vec */
|
|
@@ -475,13 +480,13 @@ static int metapage_readpage(struct file *fp, struct page *page)
|
|
|
{
|
|
|
struct inode *inode = page->mapping->host;
|
|
|
struct bio *bio = NULL;
|
|
|
- unsigned int block_offset;
|
|
|
- unsigned int blocks_per_page = PAGE_CACHE_SIZE >> inode->i_blkbits;
|
|
|
+ int block_offset;
|
|
|
+ int blocks_per_page = PAGE_CACHE_SIZE >> inode->i_blkbits;
|
|
|
sector_t page_start; /* address of page in fs blocks */
|
|
|
sector_t pblock;
|
|
|
- unsigned int xlen;
|
|
|
+ int xlen;
|
|
|
unsigned int len;
|
|
|
- unsigned int offset;
|
|
|
+ int offset;
|
|
|
|
|
|
BUG_ON(!PageLocked(page));
|
|
|
page_start = (sector_t)page->index <<
|
|
@@ -530,7 +535,7 @@ static int metapage_releasepage(struct page *page, gfp_t gfp_mask)
|
|
|
{
|
|
|
struct metapage *mp;
|
|
|
int ret = 1;
|
|
|
- unsigned int offset;
|
|
|
+ int offset;
|
|
|
|
|
|
for (offset = 0; offset < PAGE_CACHE_SIZE; offset += PSIZE) {
|
|
|
mp = page_to_mp(page, offset);
|