summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fs/getfssec.c25
1 files changed, 9 insertions, 16 deletions
diff --git a/core/fs/getfssec.c b/core/fs/getfssec.c
index 80923c1c..d10bb29c 100644
--- a/core/fs/getfssec.c
+++ b/core/fs/getfssec.c
@@ -134,27 +134,20 @@ uint32_t generic_getfssec(struct file *file, char *buf,
inode->this_extent.pstart,
inode->this_extent.len);
- if (inode->this_extent.len < sectors &&
- (!inode->next_extent.len ||
- inode->next_extent.lstart !=
- inode->this_extent.lstart + inode->this_extent.len)) {
- get_next_extent(inode);
- }
-
while (sectors) {
uint32_t chunk;
size_t len;
- if (!inode->this_extent.len) {
- inode->this_extent = inode->next_extent;
- if (!inode->next_extent.len)
- break; /* Can't read anything more */
- }
-
while (sectors > inode->this_extent.len) {
- get_next_extent(inode);
-
- if (inode->next_extent.len &&
+ if (!inode->next_extent.len ||
+ inode->next_extent.lstart !=
+ inode->this_extent.lstart + inode->this_extent.len)
+ get_next_extent(inode);
+
+ if (!inode->this_extent.len) {
+ /* Doesn't matter if it's contiguous... */
+ inode->this_extent = inode->next_extent;
+ } else if (inode->next_extent.len &&
inode->next_extent.pstart == next_pstart(&inode->this_extent)) {
/* Coalesce extents and loop */
inode->this_extent.len += inode->next_extent.len;