.. | .. |
---|
1165 | 1165 | struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, |
---|
1166 | 1166 | uint32_t start, uint32_t end) |
---|
1167 | 1167 | { |
---|
| 1168 | + struct inode *inode = OFNI_EDONI_2SFFJ(f); |
---|
1168 | 1169 | struct jffs2_full_dnode *new_fn; |
---|
1169 | 1170 | struct jffs2_raw_inode ri; |
---|
1170 | 1171 | uint32_t alloclen, offset, orig_end, orig_start; |
---|
1171 | 1172 | int ret = 0; |
---|
1172 | 1173 | unsigned char *comprbuf = NULL, *writebuf; |
---|
1173 | | - unsigned long pg; |
---|
| 1174 | + struct page *page; |
---|
1174 | 1175 | unsigned char *pg_ptr; |
---|
1175 | 1176 | |
---|
1176 | 1177 | memset(&ri, 0, sizeof(ri)); |
---|
.. | .. |
---|
1325 | 1326 | * end up here trying to GC the *same* page that jffs2_write_begin() is |
---|
1326 | 1327 | * trying to write out, read_cache_page() will not deadlock. */ |
---|
1327 | 1328 | mutex_unlock(&f->sem); |
---|
1328 | | - pg_ptr = jffs2_gc_fetch_page(c, f, start, &pg); |
---|
1329 | | - mutex_lock(&f->sem); |
---|
1330 | | - |
---|
1331 | | - if (IS_ERR(pg_ptr)) { |
---|
| 1329 | + page = read_cache_page(inode->i_mapping, start >> PAGE_SHIFT, |
---|
| 1330 | + jffs2_do_readpage_unlock, inode); |
---|
| 1331 | + if (IS_ERR(page)) { |
---|
1332 | 1332 | pr_warn("read_cache_page() returned error: %ld\n", |
---|
1333 | | - PTR_ERR(pg_ptr)); |
---|
1334 | | - return PTR_ERR(pg_ptr); |
---|
| 1333 | + PTR_ERR(page)); |
---|
| 1334 | + mutex_lock(&f->sem); |
---|
| 1335 | + return PTR_ERR(page); |
---|
1335 | 1336 | } |
---|
| 1337 | + |
---|
| 1338 | + pg_ptr = kmap(page); |
---|
| 1339 | + mutex_lock(&f->sem); |
---|
1336 | 1340 | |
---|
1337 | 1341 | offset = start; |
---|
1338 | 1342 | while(offset < orig_end) { |
---|
.. | .. |
---|
1396 | 1400 | } |
---|
1397 | 1401 | } |
---|
1398 | 1402 | |
---|
1399 | | - jffs2_gc_release_page(c, pg_ptr, &pg); |
---|
| 1403 | + kunmap(page); |
---|
| 1404 | + put_page(page); |
---|
1400 | 1405 | return ret; |
---|
1401 | 1406 | } |
---|