Re: e4defrag: file extent map : redundant loop???

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,
Manish Katiyar wrote:
> On Sun, Sep 13, 2009 at 5:26 PM, SandeepKsinha
<sandeepksinha@xxxxxxxxx> wrote:
>> Hi all,
>>
>> Here is a code snippet from e4defrag.c, can be located @
>>
http://git.kernel.org/?p=fs/ext2/e2fsprogs.git;a=blob_plain;f=misc/e4defrag.c;hb=next
>>
>>
>> /*
>> * get_file_extents() - Get file's extent list.
>> *
>> * @fd: defrag target file's descriptor.
>> * @ext_list_head: the head of the extent list.
>> */
>> static int get_file_extents(int fd, struct fiemap_extent_list
**ext_list_head)
>> {
>> __u32 i;
>> int ret;
>> int ext_buf_size, fie_buf_size;
>> __u64 pos = 0;
>> struct fiemap *fiemap_buf = NULL;
>> struct fiemap_extent *ext_buf = NULL;
>> struct fiemap_extent_list *ext_list = NULL;
>>
>> /* Convert units, in bytes.
>> * Be careful : now, physical block number in extent is 48bit,
>> * and the maximum blocksize for ext4 is 4K(12bit),
>> * so there is no overflow, but in future it may be changed.
>> */
>>
>> /* Alloc space for fiemap */
>> ext_buf_size = EXTENT_MAX_COUNT * sizeof(struct fiemap_extent);
>> fie_buf_size = sizeof(struct fiemap) + ext_buf_size;
>>
>> fiemap_buf = malloc(fie_buf_size);
>> if (fiemap_buf == NULL)
>> return -1;
>>
>> ext_buf = fiemap_buf->fm_extents;
>> memset(fiemap_buf, 0, fie_buf_size);
>> fiemap_buf->fm_length = FIEMAP_MAX_OFFSET;
>> fiemap_buf->fm_flags |= FIEMAP_FLAG_SYNC;
>> fiemap_buf->fm_extent_count = EXTENT_MAX_COUNT;
>>
>> do {
>> fiemap_buf->fm_start = pos;
>> memset(ext_buf, 0, ext_buf_size);
>> ret = ioctl(fd, FS_IOC_FIEMAP, fiemap_buf);
>> if (ret < 0)
>> goto out;
>> for (i = 0; i < fiemap_buf->fm_mapped_extents; i++) {
>> ext_list = NULL;
>> ext_list = malloc(sizeof(struct fiemap_extent_list));
>> if (ext_list == NULL)
>> goto out;
>>
>> ext_list->data.physical = ext_buf[i].fe_physical
>> / block_size;
>> ext_list->data.logical = ext_buf[i].fe_logical
>> / block_size;
>> ext_list->data.len = ext_buf[i].fe_length
>> / block_size;
>>
>> ret = insert_extent_by_physical(
>> ext_list_head, ext_list);
>> if (ret < 0) {
>> FREE(ext_list);
>> goto out;
>> }
>> }
>> /* Record file's logical offset this time */
>> pos = ext_buf[EXTENT_MAX_COUNT-1].fe_logical +
>> ext_buf[EXTENT_MAX_COUNT-1].fe_length;
>> /*
>> * If fm_extents array has been filled and
>> * there are extents left, continue to cycle.
>> */
>> } while (fiemap_buf->fm_mapped_extents
>> == EXTENT_MAX_COUNT &&
>> !(ext_buf[EXTENT_MAX_COUNT-1].fe_flags
>> & FIEMAP_EXTENT_LAST));
>>
>> FREE(fiemap_buf);
>> return 0;
>> out:
>> FREE(fiemap_buf);
>> return -1;
>> }
>>
>> Why do we have a while loop here, we have already made sure that we
>> are initially itself allocating memory for EXTENT_MAX_COUNT?
>> This is the maximum number of extents supported by the file system.
> Sandeep,
>
> EXTENT_MAX_COUNT doesn't look to be the max extents supported by the
> filesystem. It is the max chunk supported by e4defrag. Max supported
> is FIEMAP_MAX_EXTENTS which is much larger.

Exactly.
Thanks for your explanation, Manish. :-)

Regards,
Akira Fujita


>> Is
>> this loop not redundant ?
>
> No, the loop just tries to get more extents as long as you haven't hit
> the last one.
>
>>
>>
>>
>> --
>> Regards,
>> Sandeep.
>>
>>
>>
>>
>>
>>
>> “To learn is to change. Education is a process that changes the learner.”
>>
>> --
>> To unsubscribe from this list: send an email with
>> "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
>> Please read the FAQ at http://kernelnewbies.org/FAQ
>>
>>
>
>
>



--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux