One question about ext4_fallocate
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,
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 tomax_blocksbecause
* 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
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 tomax_blocksbecause
* 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_SIZEis not used, thei_sizeshould 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