|
|
| 374 |
offset <<= PAGE_CACHE_SHIFT; |
374 |
offset <<= PAGE_CACHE_SHIFT; |
| 375 |
offset += p_offset; |
375 |
offset += p_offset; |
| 376 |
|
376 |
|
| 377 |
pb = pagebuf_lookup(iomapp->iomap_target, |
377 |
/* get an "empty" pagebuf to manage IO completion |
| 378 |
iomapp->iomap_offset, iomapp->iomap_bsize, 0); |
378 |
* Proper values will be set before returning */ |
|
|
379 |
pb = pagebuf_lookup(iomapp->iomap_target, 0, 0, 0); |
| 379 |
if (!pb) |
380 |
if (!pb) |
| 380 |
return -EAGAIN; |
381 |
return -EAGAIN; |
| 381 |
|
382 |
|
|
|
| 438 |
nblocks += bs; |
439 |
nblocks += bs; |
| 439 |
atomic_add(bs, &pb->pb_io_remaining); |
440 |
atomic_add(bs, &pb->pb_io_remaining); |
| 440 |
convert_page(inode, page, iomapp, pb, startio, all_bh); |
441 |
convert_page(inode, page, iomapp, pb, startio, all_bh); |
|
|
442 |
/* stop if converting the next page might add |
| 443 |
* enough blocks that the corresponding byte |
| 444 |
* count won't fit in our ulong page buf length */ |
| 445 |
if (nblocks >= ((ULONG_MAX - PAGE_SIZE) >> block_bits)) |
| 446 |
goto enough; |
| 441 |
} |
447 |
} |
| 442 |
|
448 |
|
| 443 |
if (tindex == tlast && |
449 |
if (tindex == tlast && |
|
|
| 448 |
nblocks += bs; |
454 |
nblocks += bs; |
| 449 |
atomic_add(bs, &pb->pb_io_remaining); |
455 |
atomic_add(bs, &pb->pb_io_remaining); |
| 450 |
convert_page(inode, page, iomapp, pb, startio, all_bh); |
456 |
convert_page(inode, page, iomapp, pb, startio, all_bh); |
|
|
457 |
if (nblocks >= ((ULONG_MAX - PAGE_SIZE) >> block_bits)) |
| 458 |
goto enough; |
| 451 |
} |
459 |
} |
| 452 |
} |
460 |
} |
| 453 |
} |
461 |
} |
| 454 |
|
462 |
|
|
|
463 |
enough: |
| 455 |
size = nblocks; /* NB: using 64bit number here */ |
464 |
size = nblocks; /* NB: using 64bit number here */ |
| 456 |
size <<= block_bits; /* convert fsb's to byte range */ |
465 |
size <<= block_bits; /* convert fsb's to byte range */ |
| 457 |
|
466 |
|
| 458 |
XFS_BUF_DATAIO(pb); |
467 |
XFS_BUF_DATAIO(pb); |
| 459 |
XFS_BUF_ASYNC(pb); |
468 |
XFS_BUF_ASYNC(pb); |
| 460 |
XFS_BUF_SET_SIZE(pb, size); |
469 |
XFS_BUF_SET_SIZE(pb, size); |
|
|
470 |
XFS_BUF_SET_COUNT(pb, size); |
| 461 |
XFS_BUF_SET_OFFSET(pb, offset); |
471 |
XFS_BUF_SET_OFFSET(pb, offset); |
| 462 |
XFS_BUF_SET_FSPRIVATE(pb, LINVFS_GET_VP(inode)); |
472 |
XFS_BUF_SET_FSPRIVATE(pb, LINVFS_GET_VP(inode)); |
| 463 |
XFS_BUF_SET_IODONE_FUNC(pb, linvfs_unwritten_convert); |
473 |
XFS_BUF_SET_IODONE_FUNC(pb, linvfs_unwritten_convert); |
|
|
| 1133 |
int error = 0; |
1143 |
int error = 0; |
| 1134 |
int pb_flags, map_flags, pg_index = 0; |
1144 |
int pb_flags, map_flags, pg_index = 0; |
| 1135 |
size_t length, total; |
1145 |
size_t length, total; |
| 1136 |
loff_t offset; |
1146 |
loff_t offset, map_size; |
| 1137 |
size_t map_size, size; |
1147 |
size_t size; |
| 1138 |
vnode_t *vp = LINVFS_GET_VP(inode); |
1148 |
vnode_t *vp = LINVFS_GET_VP(inode); |
| 1139 |
|
1149 |
|
|
|
1150 |
/* Note - although the iomap could have a 64-bit size, |
| 1151 |
* kiobuf->length is only an int, so the min(map_size, length) |
| 1152 |
* test will keep us from overflowing the pagebuf size_t size. |
| 1153 |
*/ |
| 1140 |
total = length = iobuf->length; |
1154 |
total = length = iobuf->length; |
| 1141 |
offset = blocknr; |
1155 |
offset = blocknr; |
| 1142 |
offset <<= inode->i_blkbits; |
1156 |
offset <<= inode->i_blkbits; |
|
|
| 1153 |
BUG_ON(iomap.iomap_flags & IOMAP_DELAY); |
1167 |
BUG_ON(iomap.iomap_flags & IOMAP_DELAY); |
| 1154 |
|
1168 |
|
| 1155 |
map_size = iomap.iomap_bsize - iomap.iomap_delta; |
1169 |
map_size = iomap.iomap_bsize - iomap.iomap_delta; |
| 1156 |
size = min(map_size, length); |
1170 |
size = (size_t)min(map_size, (loff_t)length); |
| 1157 |
|
1171 |
|
| 1158 |
if ((iomap.iomap_flags & IOMAP_HOLE) || |
1172 |
if ((iomap.iomap_flags & IOMAP_HOLE) || |
| 1159 |
((iomap.iomap_flags & IOMAP_UNWRITTEN) && rw == READ)) { |
1173 |
((iomap.iomap_flags & IOMAP_UNWRITTEN) && rw == READ)) { |