[syslinux:pathbased] core: fix and simplify generic_getfssec()

syslinux-bot for H. Peter Anvin hpa at zytor.com
Fri Feb 26 20:42:09 PST 2010


Commit-ID:  f822d01851e0404e00cd198bdf3d12b76aba53b5
Gitweb:     http://syslinux.zytor.com/commit/f822d01851e0404e00cd198bdf3d12b76aba53b5
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Fri, 26 Feb 2010 20:40:21 -0800
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Fri, 26 Feb 2010 20:40:21 -0800

core: fix and simplify generic_getfssec()

Both simplify and fix generic_getfssec().  The previous version would
occasionally request the same extent twice from the underlying layer.
This is not a big deal for ext2fs for example, but is *very* expensive
on FAT, where any out-of-order next_extent() call means walking the
FAT from the beginning.

Signed-off-by: H. Peter Anvin <hpa at zytor.com>


---
 core/fs/getfssec.c |   25 +++++++++----------------
 1 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/core/fs/getfssec.c b/core/fs/getfssec.c
index 80923c1..d10bb29 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;



More information about the Syslinux-commits mailing list