[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