mirror of
https://github.com/reactos/reactos.git
synced 2025-06-24 23:19:45 +00:00
- Add proper write support.
- Change fs_flush logic, so it reuses the same fs_write routine instead of duplicating code. - RosBE supports %I64d, so use it instead of %lld. svn path=/trunk/; revision=35065
This commit is contained in:
parent
6fbda662d9
commit
059407e16e
3 changed files with 62 additions and 33 deletions
|
@ -24,7 +24,7 @@
|
||||||
#include "check.h"
|
#include "check.h"
|
||||||
|
|
||||||
|
|
||||||
int interactive = 0,list = 0,test = 0,verbose = 0,write_immed = 0;
|
int interactive = 0,list = 0,test = 0,verbose = 0,write_immed = 0,no_change_list=0;
|
||||||
int atari_format = 0;
|
int atari_format = 0;
|
||||||
unsigned n_files = 0;
|
unsigned n_files = 0;
|
||||||
void *mem_queue = NULL;
|
void *mem_queue = NULL;
|
||||||
|
|
|
@ -162,7 +162,7 @@ typedef struct {
|
||||||
#define offsetof(t,e) ((int)&(((t *)0)->e))
|
#define offsetof(t,e) ((int)&(((t *)0)->e))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int interactive,list,verbose,test,write_immed;
|
extern int interactive,list,verbose,test,write_immed,no_change_list;
|
||||||
extern int atari_format;
|
extern int atari_format;
|
||||||
extern unsigned n_files;
|
extern unsigned n_files;
|
||||||
extern void *mem_queue;
|
extern void *mem_queue;
|
||||||
|
|
|
@ -107,13 +107,8 @@ void fs_read(loff_t pos,int size,void *data)
|
||||||
const size_t seek_delta = (size_t)(pos - seekpos_aligned); // TMN:
|
const size_t seek_delta = (size_t)(pos - seekpos_aligned); // TMN:
|
||||||
const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned; // TMN:
|
const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned; // TMN:
|
||||||
char* tmpBuf = malloc(readsize_aligned); // TMN:
|
char* tmpBuf = malloc(readsize_aligned); // TMN:
|
||||||
#ifdef _MSC_VER
|
|
||||||
if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %I64d",pos);
|
if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %I64d",pos);
|
||||||
if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %I64dd",size,pos);
|
if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %I64d",size,pos);
|
||||||
#else
|
|
||||||
if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos);
|
|
||||||
if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %lld",size,pos);
|
|
||||||
#endif
|
|
||||||
assert(got >= size);
|
assert(got >= size);
|
||||||
got = size;
|
got = size;
|
||||||
assert(seek_delta + size <= readsize);
|
assert(seek_delta + size <= readsize);
|
||||||
|
@ -123,7 +118,7 @@ void fs_read(loff_t pos,int size,void *data)
|
||||||
if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos);
|
if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos);
|
||||||
if ((got = read(fd,data,size)) < 0) pdie("Read %d bytes at %lld",size,pos);
|
if ((got = read(fd,data,size)) < 0) pdie("Read %d bytes at %lld",size,pos);
|
||||||
#endif // TMN:
|
#endif // TMN:
|
||||||
if (got != size) die("Got %d bytes instead of %d at %lld",got,size,pos);
|
if (got != size) die("Got %d bytes instead of %d at %I64d",got,size,pos);
|
||||||
for (walk = changes; walk; walk = walk->next) {
|
for (walk = changes; walk; walk = walk->next) {
|
||||||
if (walk->pos < pos+size && walk->pos+walk->size > pos) {
|
if (walk->pos < pos+size && walk->pos+walk->size > pos) {
|
||||||
if (walk->pos < pos)
|
if (walk->pos < pos)
|
||||||
|
@ -166,32 +161,52 @@ void fs_write(loff_t pos,int size,void *data)
|
||||||
int did;
|
int did;
|
||||||
|
|
||||||
#if 1 //SAE
|
#if 1 //SAE
|
||||||
|
if (write_immed) {
|
||||||
void *scratch;
|
void *scratch;
|
||||||
const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size;
|
const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size;
|
||||||
const loff_t seekpos_aligned = pos - (pos % 512);
|
const loff_t seekpos_aligned = pos - (pos % 512);
|
||||||
const size_t seek_delta = (size_t)(pos - seekpos_aligned);
|
const size_t seek_delta = (size_t)(pos - seekpos_aligned);
|
||||||
const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned;
|
const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned;
|
||||||
scratch = alloc(readsize_aligned);
|
boolean use_read = (seek_delta != 0) || ((readsize_aligned-size) != 0);
|
||||||
|
|
||||||
|
/* Aloc temp buffer if write is not aligned */
|
||||||
|
if (use_read)
|
||||||
|
scratch = alloc(readsize_aligned);
|
||||||
|
else
|
||||||
|
scratch = data;
|
||||||
|
|
||||||
if (write_immed) {
|
|
||||||
did_change = 1;
|
did_change = 1;
|
||||||
if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos);
|
if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %I64d",seekpos_aligned);
|
||||||
if ((did = write(fd,data,readsize_aligned)) == (int)readsize_aligned)
|
|
||||||
|
if (use_read)
|
||||||
{
|
{
|
||||||
free(scratch);
|
/* Read aligned data */
|
||||||
|
if (read(fd,scratch,readsize_aligned) < 0) pdie("Read %d bytes at %I64d",size,pos);
|
||||||
|
|
||||||
|
/* Patch data in memory */
|
||||||
|
memcpy(data, scratch+seek_delta, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write it back */
|
||||||
|
if ((did = write(fd,scratch,readsize_aligned)) == (int)readsize_aligned)
|
||||||
|
{
|
||||||
|
if (use_read) free(scratch);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (did < 0) pdie("Write %d bytes at %lld",size,pos);
|
if (did < 0) pdie("Write %d bytes at %I64d",size,pos);
|
||||||
die("Wrote %d bytes instead of %d at %lld",did,size,pos);
|
die("Wrote %d bytes instead of %d at %I64d",did,size,pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!no_change_list)
|
||||||
|
{
|
||||||
new = alloc(sizeof(CHANGE));
|
new = alloc(sizeof(CHANGE));
|
||||||
new->pos = pos;
|
new->pos = pos;
|
||||||
memcpy(new->data = alloc(new->size = readsize_aligned),data,readsize_aligned);
|
memcpy(new->data = alloc(new->size = size),data,size);
|
||||||
new->next = NULL;
|
new->next = NULL;
|
||||||
if (last) last->next = new;
|
if (last) last->next = new;
|
||||||
else changes = new;
|
else changes = new;
|
||||||
last = new;
|
last = new;
|
||||||
|
}
|
||||||
#else //SAE
|
#else //SAE
|
||||||
if (write_immed) {
|
if (write_immed) {
|
||||||
did_change = 1;
|
did_change = 1;
|
||||||
|
@ -215,10 +230,16 @@ static void fs_flush(void)
|
||||||
{
|
{
|
||||||
CHANGE *this;
|
CHANGE *this;
|
||||||
int size;
|
int size;
|
||||||
|
int old_write_immed = write_immed;
|
||||||
|
|
||||||
|
/* Disable writes to the list now */
|
||||||
|
no_change_list = 1;
|
||||||
|
write_immed = 1;
|
||||||
|
|
||||||
while (changes) {
|
while (changes) {
|
||||||
this = changes;
|
this = changes;
|
||||||
changes = changes->next;
|
changes = changes->next;
|
||||||
|
#if 0
|
||||||
if (llseek(fd,this->pos,0) != this->pos)
|
if (llseek(fd,this->pos,0) != this->pos)
|
||||||
fprintf(stderr,"Seek to %lld failed: %s\n Did not write %d bytes.\n",
|
fprintf(stderr,"Seek to %lld failed: %s\n Did not write %d bytes.\n",
|
||||||
(__int64)this->pos,strerror(errno),this->size);
|
(__int64)this->pos,strerror(errno),this->size);
|
||||||
|
@ -228,9 +249,17 @@ static void fs_flush(void)
|
||||||
else if (size != this->size)
|
else if (size != this->size)
|
||||||
fprintf(stderr,"Wrote %d bytes instead of %d bytes at %lld."
|
fprintf(stderr,"Wrote %d bytes instead of %d bytes at %lld."
|
||||||
"\n",size,this->size,(__int64)this->pos);
|
"\n",size,this->size,(__int64)this->pos);
|
||||||
|
#else
|
||||||
|
fs_write(this->pos, this->size, this->data);
|
||||||
|
#endif
|
||||||
|
|
||||||
free(this->data);
|
free(this->data);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restore values */
|
||||||
|
no_change_list = 0;
|
||||||
|
write_immed = old_write_immed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue