@@ -1223,10 +1223,9 @@ xfs_vm_releasepage(
1223
1223
}
1224
1224
1225
1225
STATIC int
1226
- __xfs_get_block (
1226
+ __xfs_get_blocks (
1227
1227
struct inode * inode ,
1228
1228
sector_t iblock ,
1229
- unsigned long blocks ,
1230
1229
struct buffer_head * bh_result ,
1231
1230
int create ,
1232
1231
int direct ,
@@ -1236,22 +1235,17 @@ __xfs_get_block(
1236
1235
xfs_iomap_t iomap ;
1237
1236
xfs_off_t offset ;
1238
1237
ssize_t size ;
1239
- int retpbbm = 1 ;
1238
+ int niomap = 1 ;
1240
1239
int error ;
1241
1240
1242
1241
offset = (xfs_off_t )iblock << inode -> i_blkbits ;
1243
- if (blocks )
1244
- size = (ssize_t ) min_t (xfs_off_t , LONG_MAX ,
1245
- (xfs_off_t )blocks << inode -> i_blkbits );
1246
- else
1247
- size = 1 << inode -> i_blkbits ;
1248
-
1242
+ ASSERT (bh_result -> b_size >= (1 << inode -> i_blkbits ));
1243
+ size = bh_result -> b_size ;
1249
1244
VOP_BMAP (vp , offset , size ,
1250
- create ? flags : BMAPI_READ , & iomap , & retpbbm , error );
1245
+ create ? flags : BMAPI_READ , & iomap , & niomap , error );
1251
1246
if (error )
1252
1247
return - error ;
1253
-
1254
- if (retpbbm == 0 )
1248
+ if (niomap == 0 )
1255
1249
return 0 ;
1256
1250
1257
1251
if (iomap .iomap_bn != IOMAP_DADDR_NULL ) {
@@ -1271,12 +1265,16 @@ __xfs_get_block(
1271
1265
}
1272
1266
}
1273
1267
1274
- /* If this is a realtime file, data might be on a new device */
1268
+ /*
1269
+ * If this is a realtime file, data may be on a different device.
1270
+ * to that pointed to from the buffer_head b_bdev currently.
1271
+ */
1275
1272
bh_result -> b_bdev = iomap .iomap_target -> bt_bdev ;
1276
1273
1277
- /* If we previously allocated a block out beyond eof and
1278
- * we are now coming back to use it then we will need to
1279
- * flag it as new even if it has a disk address.
1274
+ /*
1275
+ * If we previously allocated a block out beyond eof and we are
1276
+ * now coming back to use it then we will need to flag it as new
1277
+ * even if it has a disk address.
1280
1278
*/
1281
1279
if (create &&
1282
1280
((!buffer_mapped (bh_result ) && !buffer_uptodate (bh_result )) ||
@@ -1292,26 +1290,24 @@ __xfs_get_block(
1292
1290
}
1293
1291
}
1294
1292
1295
- if (blocks ) {
1293
+ if (direct || size > ( 1 << inode -> i_blkbits ) ) {
1296
1294
ASSERT (iomap .iomap_bsize - iomap .iomap_delta > 0 );
1297
1295
offset = min_t (xfs_off_t ,
1298
- iomap .iomap_bsize - iomap .iomap_delta ,
1299
- (xfs_off_t )blocks << inode -> i_blkbits );
1300
- bh_result -> b_size = (u32 ) min_t (xfs_off_t , UINT_MAX , offset );
1296
+ iomap .iomap_bsize - iomap .iomap_delta , size );
1297
+ bh_result -> b_size = (ssize_t )min_t (xfs_off_t , LONG_MAX , offset );
1301
1298
}
1302
1299
1303
1300
return 0 ;
1304
1301
}
1305
1302
1306
1303
int
1307
- xfs_get_block (
1304
+ xfs_get_blocks (
1308
1305
struct inode * inode ,
1309
1306
sector_t iblock ,
1310
1307
struct buffer_head * bh_result ,
1311
1308
int create )
1312
1309
{
1313
- return __xfs_get_block (inode , iblock ,
1314
- bh_result -> b_size >> inode -> i_blkbits ,
1310
+ return __xfs_get_blocks (inode , iblock ,
1315
1311
bh_result , create , 0 , BMAPI_WRITE );
1316
1312
}
1317
1313
@@ -1322,8 +1318,7 @@ xfs_get_blocks_direct(
1322
1318
struct buffer_head * bh_result ,
1323
1319
int create )
1324
1320
{
1325
- return __xfs_get_block (inode , iblock ,
1326
- bh_result -> b_size >> inode -> i_blkbits ,
1321
+ return __xfs_get_blocks (inode , iblock ,
1327
1322
bh_result , create , 1 , BMAPI_WRITE |BMAPI_DIRECT );
1328
1323
}
1329
1324
@@ -1405,7 +1400,7 @@ xfs_vm_prepare_write(
1405
1400
unsigned int from ,
1406
1401
unsigned int to )
1407
1402
{
1408
- return block_prepare_write (page , from , to , xfs_get_block );
1403
+ return block_prepare_write (page , from , to , xfs_get_blocks );
1409
1404
}
1410
1405
1411
1406
STATIC sector_t
@@ -1422,15 +1417,15 @@ xfs_vm_bmap(
1422
1417
VOP_RWLOCK (vp , VRWLOCK_READ );
1423
1418
VOP_FLUSH_PAGES (vp , (xfs_off_t )0 , -1 , 0 , FI_REMAPF , error );
1424
1419
VOP_RWUNLOCK (vp , VRWLOCK_READ );
1425
- return generic_block_bmap (mapping , block , xfs_get_block );
1420
+ return generic_block_bmap (mapping , block , xfs_get_blocks );
1426
1421
}
1427
1422
1428
1423
STATIC int
1429
1424
xfs_vm_readpage (
1430
1425
struct file * unused ,
1431
1426
struct page * page )
1432
1427
{
1433
- return mpage_readpage (page , xfs_get_block );
1428
+ return mpage_readpage (page , xfs_get_blocks );
1434
1429
}
1435
1430
1436
1431
STATIC int
@@ -1440,7 +1435,7 @@ xfs_vm_readpages(
1440
1435
struct list_head * pages ,
1441
1436
unsigned nr_pages )
1442
1437
{
1443
- return mpage_readpages (mapping , pages , nr_pages , xfs_get_block );
1438
+ return mpage_readpages (mapping , pages , nr_pages , xfs_get_blocks );
1444
1439
}
1445
1440
1446
1441
STATIC void
0 commit comments