mirror of
https://github.com/torvalds/linux.git
synced 2025-11-01 00:58:39 +02:00
udf: Unify types in anchor block detection
When detecting last recorded block and from it derived anchor block position, we were mixing unsigned long, u32, and sector_t types. Since udf supports only 32-bit block numbers this is harmless but sometimes makes things awkward. Convert everything to udf_pblk_t and also handle the situation when block device size would not fit into udf_pblk_t. Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
1ea1cd11c7
commit
bd904f3c74
3 changed files with 8 additions and 5 deletions
|
|
@ -45,7 +45,7 @@ unsigned int udf_get_last_session(struct super_block *sb)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long udf_get_last_block(struct super_block *sb)
|
udf_pblk_t udf_get_last_block(struct super_block *sb)
|
||||||
{
|
{
|
||||||
struct cdrom_device_info *cdi = disk_to_cdi(sb->s_bdev->bd_disk);
|
struct cdrom_device_info *cdi = disk_to_cdi(sb->s_bdev->bd_disk);
|
||||||
unsigned long lblock = 0;
|
unsigned long lblock = 0;
|
||||||
|
|
@ -54,8 +54,11 @@ unsigned long udf_get_last_block(struct super_block *sb)
|
||||||
* The cdrom layer call failed or returned obviously bogus value?
|
* The cdrom layer call failed or returned obviously bogus value?
|
||||||
* Try using the device size...
|
* Try using the device size...
|
||||||
*/
|
*/
|
||||||
if (!cdi || cdrom_get_last_written(cdi, &lblock) || lblock == 0)
|
if (!cdi || cdrom_get_last_written(cdi, &lblock) || lblock == 0) {
|
||||||
|
if (sb_bdev_nr_blocks(sb) > ~(udf_pblk_t)0)
|
||||||
|
return 0;
|
||||||
lblock = sb_bdev_nr_blocks(sb);
|
lblock = sb_bdev_nr_blocks(sb);
|
||||||
|
}
|
||||||
|
|
||||||
if (lblock)
|
if (lblock)
|
||||||
return lblock - 1;
|
return lblock - 1;
|
||||||
|
|
|
||||||
|
|
@ -1861,10 +1861,10 @@ static int udf_check_anchor_block(struct super_block *sb, sector_t block,
|
||||||
* Returns < 0 on error, 0 on success. -EAGAIN is special - try next set
|
* Returns < 0 on error, 0 on success. -EAGAIN is special - try next set
|
||||||
* of anchors.
|
* of anchors.
|
||||||
*/
|
*/
|
||||||
static int udf_scan_anchors(struct super_block *sb, sector_t *lastblock,
|
static int udf_scan_anchors(struct super_block *sb, udf_pblk_t *lastblock,
|
||||||
struct kernel_lb_addr *fileset)
|
struct kernel_lb_addr *fileset)
|
||||||
{
|
{
|
||||||
sector_t last[6];
|
udf_pblk_t last[6];
|
||||||
int i;
|
int i;
|
||||||
struct udf_sb_info *sbi = UDF_SB(sb);
|
struct udf_sb_info *sbi = UDF_SB(sb);
|
||||||
int last_count = 0;
|
int last_count = 0;
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@ extern void udf_new_tag(char *, uint16_t, uint16_t, uint16_t, uint32_t, int);
|
||||||
|
|
||||||
/* lowlevel.c */
|
/* lowlevel.c */
|
||||||
extern unsigned int udf_get_last_session(struct super_block *);
|
extern unsigned int udf_get_last_session(struct super_block *);
|
||||||
extern unsigned long udf_get_last_block(struct super_block *);
|
udf_pblk_t udf_get_last_block(struct super_block *);
|
||||||
|
|
||||||
/* partition.c */
|
/* partition.c */
|
||||||
extern uint32_t udf_get_pblock(struct super_block *, uint32_t, uint16_t,
|
extern uint32_t udf_get_pblock(struct super_block *, uint32_t, uint16_t,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue