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

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

 



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.
> 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
>
>



-- 
Thanks -
Manish

--
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