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