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