Optimization in searching for new zones to allocate contributed
by Jens de Smit.
This commit is contained in:
parent
cd89066f9a
commit
2876d5c4ba
@ -14,6 +14,9 @@
|
||||
* old_icopy: copy to/from in-core inode struct and disk inode (V1.x)
|
||||
* new_icopy: copy to/from in-core inode struct and disk inode (V2.x)
|
||||
* dup_inode: indicate that someone else is using an inode table entry
|
||||
*
|
||||
* Updates:
|
||||
* 2007-06-01: jfdsmit@gmail.com added i_zsearch initialization
|
||||
*/
|
||||
|
||||
#include "fs.h"
|
||||
@ -204,6 +207,7 @@ int numb; /* inode number (ANSI: may not be unshort) */
|
||||
rip->i_count = 1;
|
||||
if (dev != NO_DEV) rw_inode(rip, READING); /* get inode from disk */
|
||||
rip->i_update = 0; /* all the times are initially up-to-date */
|
||||
rip->i_zsearch = NO_ZONE; /* no zones searched for yet */
|
||||
if ((rip->i_mode & I_TYPE) == I_NAMED_PIPE)
|
||||
rip->i_pipe = I_PIPE;
|
||||
else
|
||||
|
@ -6,6 +6,9 @@
|
||||
* disk; the second part holds fields not present on the disk.
|
||||
* The disk inode part is also declared in "type.h" as 'd1_inode' for V1
|
||||
* file systems and 'd2_inode' for V2 file systems.
|
||||
*
|
||||
* Updates:
|
||||
* 2007-01-06: jfdsmit@gmail.com added i_zsearch
|
||||
*/
|
||||
|
||||
#include "queue.h"
|
||||
@ -30,6 +33,7 @@ EXTERN struct inode {
|
||||
struct super_block *i_sp; /* pointer to super block for inode's device */
|
||||
char i_dirt; /* CLEAN or DIRTY */
|
||||
char i_pipe; /* set to I_PIPE if pipe */
|
||||
bit_t i_zsearch; /* where to start search for new zones */
|
||||
|
||||
char i_mountpoint; /* true if mounted on */
|
||||
|
||||
|
@ -6,6 +6,9 @@
|
||||
* do_write: call read_write to perform the WRITE system call
|
||||
* clear_zone: erase a zone in the middle of a file
|
||||
* new_block: acquire a new block
|
||||
*
|
||||
* Updates:
|
||||
* 2007-06-01: jfdsmit@gmail.com added i_zsearch optimalization
|
||||
*/
|
||||
|
||||
#include "fs.h"
|
||||
@ -287,18 +290,20 @@ off_t position; /* file pointer */
|
||||
|
||||
/* Is another block available in the current zone? */
|
||||
if ( (b = read_map(rip, position)) == NO_BLOCK) {
|
||||
/* Choose first zone if possible. */
|
||||
/* Lose if the file is nonempty but the first zone number is NO_ZONE
|
||||
* corresponding to a zone full of zeros. It would be better to
|
||||
* search near the last real zone.
|
||||
*/
|
||||
if (rip->i_zone[0] == NO_ZONE) {
|
||||
sp = rip->i_sp;
|
||||
z = sp->s_firstdatazone;
|
||||
if (rip->i_zsearch == NO_ZONE) {
|
||||
/* First search for this file. Start looking from
|
||||
* the file's first data zone to prevent fragmentation
|
||||
*/
|
||||
if ( (z = rip->i_zone[0]) == NO_ZONE) {
|
||||
/* no first zone for file either */
|
||||
z = rip->i_sp->s_firstdatazone; /* let alloc_zone decide */
|
||||
}
|
||||
} else {
|
||||
z = rip->i_zone[0]; /* hunt near first zone */
|
||||
/* searched before, start from last find */
|
||||
z = rip->i_zsearch;
|
||||
}
|
||||
if ( (z = alloc_zone(rip->i_dev, z)) == NO_ZONE) return(NIL_BUF);
|
||||
rip->i_zsearch = z; /* store for next lookup */
|
||||
if ( (r = write_map(rip, position, z, 0)) != OK) {
|
||||
free_zone(rip->i_dev, z);
|
||||
err_code = r;
|
||||
|
Loading…
x
Reference in New Issue
Block a user