Skip to contentSkip to conversation

One question about ext4_fallocate

DISCUSSION Wang Sheng-Hui 2 participants 3 messages Jul 19, 2012 – Jul 20, 2012

lore
Share & tools
lore
#0 lore raw

Dear all,

I have one question about ext4_fallocate:
For its parameters, offset & len, it will preallocate one space with length >= len, right?

Quoted 1 line

From the code:

map.m_lblk = offset >> blkbits;
/*
* We can't just convert len to max_blocks because
* If blocksize = 4096 offset = 3072 and len = 2048 */
max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits)
- map.m_lblk;

We can see that the target space is enlarged to the (floor, ceiling) of (offset, offset+len). Right?

If I'm wrong, please correct me.

Regards,

#1 lore raw
Quoted 13 lines · Wang Sheng-Hui

I have one question about ext4_fallocate:
For its parameters, offset & len, it will preallocate one space with length >= len, right?

From the code:
map.m_lblk = offset >> blkbits;
/*
* We can't just convert len to max_blocks because
* If blocksize = 4096 offset = 3072 and len = 2048 */
max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits)
- map.m_lblk;

Quoted 4 lines

We can see that the target space is enlarged to the (floor, ceiling) of (offset, offset+len). Right?

If I'm wrong, please correct me.

A whole block has to be allocated for fallocate, but if KEEP_SIZE is not used, the i_size should be changed to match the actual requested size.

Cheers, Andreas

#2 lore raw
Quoted 15 lines · Andreas Dilger
Quoted 13 lines · Wang Sheng-Hui

I have one question about ext4_fallocate:
For its parameters, offset & len, it will preallocate one space with length >= len, right?

From the code:
map.m_lblk = offset >> blkbits;
/*
* We can't just convert len to max_blocks because
* If blocksize = 4096 offset = 3072 and len = 2048 */
max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits)
- map.m_lblk;

Quoted 7 lines
Quoted 4 lines

We can see that the target space is enlarged to the (floor, ceiling) of (offset, offset+len). Right?

If I'm wrong, please correct me.

A whole block has to be allocated for fallocate, but if KEEP_SIZE is not used, the i_size should be changed to match the actual requested size.

Got it.

From the code:

	/* Return error if mode is not supported */
	if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
		return -EOPNOTSUPP;

	if (mode & FALLOC_FL_PUNCH_HOLE)
		return ext4_punch_hole(file, offset, len);

ext4 only supports FALLOC_FL_KEEP_SIZE & FALLOC_FL_PUNCH_HOLE currently. For FALLOC_FL_PUNCH_HOLE, it will turn to ext4_punch_hole, so the rest path deals with only FALLOC_FL_KEEP_SIZE and thus it will use whole blocks.

Thanks, Andreas.

Quoted 6 lines

Cheers, Andreas

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html