[syslinux:pathbased] core: fs: get rid of the prev_extent member

syslinux-bot for H. Peter Anvin hpa at zytor.com
Sun Feb 28 21:51:15 PST 2010


Commit-ID:  7e5ed28c5bd515ceabac8bc8575f7515ecebb9b6
Gitweb:     http://syslinux.zytor.com/commit/7e5ed28c5bd515ceabac8bc8575f7515ecebb9b6
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Sun, 28 Feb 2010 21:50:04 -0800
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Sun, 28 Feb 2010 21:50:04 -0800

core: fs: get rid of the prev_extent member

The prev_extent member was only ever used transiently; instead pass
the new lstart in as an argument and leave the previous value of
next_extent unmolested and thus can be used in-place.

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


---
 core/fs/ext2/bmap.c    |   11 ++++++-----
 core/fs/ext2/ext2_fs.h |    2 +-
 core/fs/fat/fat.c      |   16 ++++++++--------
 core/fs/getfssec.c     |   29 +++++++++++++----------------
 core/include/fs.h      |    4 ++--
 5 files changed, 30 insertions(+), 32 deletions(-)

diff --git a/core/fs/ext2/bmap.c b/core/fs/ext2/bmap.c
index 6940c1d..ef2bf64 100644
--- a/core/fs/ext2/bmap.c
+++ b/core/fs/ext2/bmap.c
@@ -207,7 +207,7 @@ block_t ext2_bmap(struct inode *inode, block_t block, size_t *nblocks)
 /*
  * Next extent for getfssec
  */
-void ext2_next_extent(struct inode *inode)
+int ext2_next_extent(struct inode *inode, uint32_t lstart)
 {
     struct fs_info *fs = inode->fs;
     int blktosec =  BLOCK_SHIFT(fs) - SECTOR_SHIFT(fs);
@@ -215,13 +215,14 @@ void ext2_next_extent(struct inode *inode)
     block_t block;
     size_t nblocks = 0;
 
-    block = ext2_bmap(inode, inode->next_extent.lstart >> blktosec, &nblocks);
+    block = ext2_bmap(inode, lstart >> blktosec, &nblocks);
 
     if (!block)
 	inode->next_extent.pstart = EXTENT_ZERO;
     else
-	inode->next_extent.pstart = ((sector_t)block << blktosec) |
-	    (inode->next_extent.lstart & blkmask);
+	inode->next_extent.pstart =
+	    ((sector_t)block << blktosec) | (lstart & blkmask);
 
-    inode->next_extent.len = nblocks << blktosec;
+    inode->next_extent.len = (nblocks << blktosec) - (lstart & blkmask);
+    return 0;
 }
diff --git a/core/fs/ext2/ext2_fs.h b/core/fs/ext2/ext2_fs.h
index f266091..8adc9bb 100644
--- a/core/fs/ext2/ext2_fs.h
+++ b/core/fs/ext2/ext2_fs.h
@@ -305,6 +305,6 @@ struct ext2_pvt_inode {
  * functions
  */
 block_t ext2_bmap(struct inode *, block_t, size_t *);
-void ext2_next_extent(struct inode *);
+int ext2_next_extent(struct inode *, uint32_t);
 
 #endif /* ext2_fs.h */
diff --git a/core/fs/fat/fat.c b/core/fs/fat/fat.c
index 685f731..9f221e9 100644
--- a/core/fs/fat/fat.c
+++ b/core/fs/fat/fat.c
@@ -84,11 +84,11 @@ static uint32_t get_next_cluster(struct fs_info *fs, uint32_t clust_num)
     return next_cluster;
 }
 
-static void fat_next_extent(struct inode *inode)
+static int fat_next_extent(struct inode *inode, uint32_t lstart)
 {
     struct fs_info *fs = inode->fs;
     struct fat_sb_info *sbi = FAT_SB(fs);
-    uint32_t mcluster = inode->next_extent.lstart >> sbi->clust_shift;
+    uint32_t mcluster = lstart >> sbi->clust_shift;
     uint32_t lcluster;
     uint32_t pcluster;
     uint32_t tcluster;
@@ -99,12 +99,12 @@ static void fat_next_extent(struct inode *inode)
     if (mcluster >= tcluster)
 	goto err;		/* Requested cluster beyond end of file */
 
-    if (inode->prev_extent.len) {
-	if (inode->prev_extent.pstart < data_area)
+    if (inode->next_extent.len) {
+	if (inode->next_extent.pstart < data_area)
 	    goto err;		/* Root directory has only one extent */
-	lcluster = (inode->prev_extent.lstart + inode->prev_extent.len)
+	lcluster = (inode->next_extent.lstart + inode->next_extent.len)
 	    >> sbi->clust_shift;
-	pcluster = ((inode->prev_extent.pstart + inode->prev_extent.len
+	pcluster = ((inode->next_extent.pstart + inode->next_extent.len
 		     - data_area) >> sbi->clust_shift) + 2;
 
 	if (lcluster > mcluster) {
@@ -143,10 +143,10 @@ static void fat_next_extent(struct inode *inode)
 	inode->next_extent.len += cluster_size;
 	lcluster++;
     }
+    return 0;
 
-    /* In the case of error, the caller has already set next_extent.len = 0 */
 err:
-    return;
+    return -1;
 }
 
 static sector_t get_next_sector(struct fs_info* fs, uint32_t sector)
diff --git a/core/fs/getfssec.c b/core/fs/getfssec.c
index d10bb29..3d62d4e 100644
--- a/core/fs/getfssec.c
+++ b/core/fs/getfssec.c
@@ -33,11 +33,15 @@
  *
  * The expected semantics of next_extent are as follows:
  *
- * inode->next_extent.lstart will contain the initial sector number to
- * be mapped.  The routine is expected to populate inode->next_extent.pstart
- * and inode->next_extent.len.  If inode->prev_extent.pstart != EXTENT_VOID
- * then the routine is allowed to assume inode->prev_extent contains valid
- * data.
+ * The second argument will contain the initial sector number to be
+ * mapped.  The routine is expected to populate
+ * inode->next_extent.pstart and inode->next_extent.len (the caller
+ * will store the initial sector number into inode->next_extent.lstart
+ * on return.)
+ *
+ * If inode->next_extent.len != 0 on entry then the routine is allowed
+ * to assume inode->next_extent contains valid data from the previous
+ * usage, which can be used for optimization purposes.
  *
  * If the filesystem can map the entire file as a single extent
  * (e.g. iso9660), then the filesystem can simply insert the extent
@@ -70,18 +74,11 @@ static inline sector_t next_pstart(const struct extent *e)
 static void get_next_extent(struct inode *inode)
 {
     /* The logical start address that we care about... */
+    uint32_t lstart = inode->this_extent.lstart + inode->this_extent.len;
 
-    inode->next_extent.lstart =
-	inode->this_extent.lstart + inode->this_extent.len;
-    dprintf("next_extent.lstart = %u\n", inode->next_extent.lstart);
-
-    /* Whatever we had before... */
-    inode->prev_extent = inode->next_extent;
-
-    /* Dummy information to make failure returns easier */
-    inode->next_extent.len = 0;
-    
-    inode->fs->fs_ops->next_extent(inode);
+    if (inode->fs->fs_ops->next_extent(inode, lstart))
+	inode->next_extent.len = 0; /* ERROR */
+    inode->next_extent.lstart = lstart;
 
     dprintf("Extent: inode %p @ %u start %llu len %u\n",
 	    inode, inode->next_extent.lstart,
diff --git a/core/include/fs.h b/core/include/fs.h
index ef7eb8b..4aca7fc 100644
--- a/core/include/fs.h
+++ b/core/include/fs.h
@@ -69,7 +69,7 @@ struct fs_ops {
     /* the _dir_ stuff */
     struct dirent * (*readdir)(struct file *);
 
-    void     (*next_extent)(struct inode *);
+    int      (*next_extent)(struct inode *, uint32_t);
 };
 
 enum inode_mode {I_FILE, I_DIR, I_SYMLINK};
@@ -106,7 +106,7 @@ struct inode {
     uint32_t     dtime;  /* Delete time */
     uint32_t     flags;
     uint32_t     file_acl;
-    struct extent this_extent, prev_extent, next_extent;
+    struct extent this_extent, next_extent;
     char         pvt[0]; /* Private filesystem data */
 };
 



More information about the Syslinux-commits mailing list