@@ -404,7 +404,7 @@ struct udf_map_rq {
404404
405405static int udf_map_block (struct inode * inode , struct udf_map_rq * map )
406406{
407- int err ;
407+ int ret ;
408408 struct udf_inode_info * iinfo = UDF_I (inode );
409409
410410 if (WARN_ON_ONCE (iinfo -> i_alloc_type == ICBTAG_FLAG_AD_IN_ICB ))
@@ -416,18 +416,24 @@ static int udf_map_block(struct inode *inode, struct udf_map_rq *map)
416416 uint32_t elen ;
417417 sector_t offset ;
418418 struct extent_position epos = {};
419+ int8_t etype ;
419420
420421 down_read (& iinfo -> i_data_sem );
421- if (inode_bmap (inode , map -> lblk , & epos , & eloc , & elen , & offset )
422- == (EXT_RECORDED_ALLOCATED >> 30 )) {
422+ ret = inode_bmap (inode , map -> lblk , & epos , & eloc , & elen , & offset ,
423+ & etype );
424+ if (ret < 0 )
425+ goto out_read ;
426+ if (ret > 0 && etype == (EXT_RECORDED_ALLOCATED >> 30 )) {
423427 map -> pblk = udf_get_lb_pblock (inode -> i_sb , & eloc ,
424428 offset );
425429 map -> oflags |= UDF_BLK_MAPPED ;
430+ ret = 0 ;
426431 }
432+ out_read :
427433 up_read (& iinfo -> i_data_sem );
428434 brelse (epos .bh );
429435
430- return 0 ;
436+ return ret ;
431437 }
432438
433439 down_write (& iinfo -> i_data_sem );
@@ -438,9 +444,9 @@ static int udf_map_block(struct inode *inode, struct udf_map_rq *map)
438444 if (((loff_t )map -> lblk ) << inode -> i_blkbits >= iinfo -> i_lenExtents )
439445 udf_discard_prealloc (inode );
440446 udf_clear_extent_cache (inode );
441- err = inode_getblk (inode , map );
447+ ret = inode_getblk (inode , map );
442448 up_write (& iinfo -> i_data_sem );
443- return err ;
449+ return ret ;
444450}
445451
446452static int __udf_get_block (struct inode * inode , sector_t block ,
@@ -662,8 +668,10 @@ static int udf_extend_file(struct inode *inode, loff_t newsize)
662668 */
663669 udf_discard_prealloc (inode );
664670
665- etype = inode_bmap (inode , first_block , & epos , & eloc , & elen , & offset );
666- within_last_ext = (etype != -1 );
671+ err = inode_bmap (inode , first_block , & epos , & eloc , & elen , & offset , & etype );
672+ if (err < 0 )
673+ goto out ;
674+ within_last_ext = (err == 1 );
667675 /* We don't expect extents past EOF... */
668676 WARN_ON_ONCE (within_last_ext &&
669677 elen > ((loff_t )offset + 1 ) << inode -> i_blkbits );
@@ -2401,13 +2409,15 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos)
24012409 return (elen >> 30 );
24022410}
24032411
2404- int8_t inode_bmap (struct inode * inode , sector_t block ,
2405- struct extent_position * pos , struct kernel_lb_addr * eloc ,
2406- uint32_t * elen , sector_t * offset )
2412+ /*
2413+ * Returns 1 on success, -errno on error, 0 on hit EOF.
2414+ */
2415+ int inode_bmap (struct inode * inode , sector_t block , struct extent_position * pos ,
2416+ struct kernel_lb_addr * eloc , uint32_t * elen , sector_t * offset ,
2417+ int8_t * etype )
24072418{
24082419 unsigned char blocksize_bits = inode -> i_sb -> s_blocksize_bits ;
24092420 loff_t lbcount = 0 , bcount = (loff_t ) block << blocksize_bits ;
2410- int8_t etype ;
24112421 struct udf_inode_info * iinfo ;
24122422 int err = 0 ;
24132423
@@ -2419,19 +2429,19 @@ int8_t inode_bmap(struct inode *inode, sector_t block,
24192429 }
24202430 * elen = 0 ;
24212431 do {
2422- err = udf_next_aext (inode , pos , eloc , elen , & etype , 1 );
2432+ err = udf_next_aext (inode , pos , eloc , elen , etype , 1 );
24232433 if (err <= 0 ) {
24242434 if (err == 0 ) {
24252435 * offset = (bcount - lbcount ) >> blocksize_bits ;
24262436 iinfo -> i_lenExtents = lbcount ;
24272437 }
2428- return -1 ;
2438+ return err ;
24292439 }
24302440 lbcount += * elen ;
24312441 } while (lbcount <= bcount );
24322442 /* update extent cache */
24332443 udf_update_extent_cache (inode , lbcount - * elen , pos );
24342444 * offset = (bcount + * elen - lbcount ) >> blocksize_bits ;
24352445
2436- return etype ;
2446+ return 1 ;
24372447}
0 commit comments