mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-12-22 10:30:13 +00:00
Minor clarifications in the code and comments. Integrated atches from Frederic Sureau: 1. copy_buf is now an ordinary char pointer. 2. Read directly from a file that is not modified. This reduces the code size when COFFEE_MICRO_LOGS is set to 0. 3. Update the file end value each time it is changed in case a log merge operation occurs later. 4. Avoid possible alignment problem in reading from the dummy_space area when calling cfs_readdir.
This commit is contained in:
parent
24614875ef
commit
1168703506
@ -937,7 +937,7 @@ write_log_page(struct file *file, struct log_param *lp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
unsigned char copy_buf[log_record_size];
|
char copy_buf[log_record_size];
|
||||||
|
|
||||||
lp_out.offset = offset = region * log_record_size;
|
lp_out.offset = offset = region * log_record_size;
|
||||||
lp_out.buf = copy_buf;
|
lp_out.buf = copy_buf;
|
||||||
@ -949,8 +949,12 @@ write_log_page(struct file *file, struct log_param *lp)
|
|||||||
absolute_offset(file->page, offset));
|
absolute_offset(file->page, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy((char *)©_buf + lp->offset, lp->buf, lp->size);
|
memcpy(©_buf[lp->offset], lp->buf, lp->size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write the region number in the region index table.
|
||||||
|
* The region number is incremented to avoid values of zero.
|
||||||
|
*/
|
||||||
offset = absolute_offset(log_page, 0);
|
offset = absolute_offset(log_page, 0);
|
||||||
++region;
|
++region;
|
||||||
COFFEE_WRITE(®ion, sizeof(region),
|
COFFEE_WRITE(®ion, sizeof(region),
|
||||||
@ -1098,35 +1102,39 @@ cfs_read(int fd, void *buf, unsigned size)
|
|||||||
size = file->end - fdp->offset;
|
size = file->end - fdp->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes_left = size;
|
/* If the file is allocated, read directly in the file. */
|
||||||
if(FILE_MODIFIED(file)) {
|
if(!FILE_MODIFIED(file)) {
|
||||||
read_header(&hdr, file->page);
|
COFFEE_READ(buf, size, absolute_offset(file->page, fdp->offset));
|
||||||
|
fdp->offset += size;
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if COFFEE_MICRO_LOGS
|
||||||
|
read_header(&hdr, file->page);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill the buffer by copying from the log in first hand, or the
|
* Fill the buffer by copying from the log in first hand, or the
|
||||||
* ordinary file if the page has no log record.
|
* ordinary file if the page has no log record.
|
||||||
*/
|
*/
|
||||||
while(bytes_left) {
|
for(bytes_left = size; bytes_left > 0; bytes_left -= r) {
|
||||||
watchdog_periodic();
|
watchdog_periodic();
|
||||||
r = -1;
|
r = -1;
|
||||||
#if COFFEE_MICRO_LOGS
|
|
||||||
if(FILE_MODIFIED(file)) {
|
lp.offset = fdp->offset;
|
||||||
lp.offset = fdp->offset;
|
lp.buf = buf;
|
||||||
lp.buf = buf;
|
lp.size = bytes_left;
|
||||||
lp.size = bytes_left;
|
r = read_log_page(&hdr, file->record_count, &lp);
|
||||||
r = read_log_page(&hdr, file->record_count, &lp);
|
|
||||||
}
|
|
||||||
#endif /* COFFEE_MICRO_LOGS */
|
|
||||||
/* Read from the original file if we cannot find the data in the log. */
|
/* Read from the original file if we cannot find the data in the log. */
|
||||||
if(r < 0) {
|
if(r < 0) {
|
||||||
|
COFFEE_READ(buf, bytes_left, absolute_offset(file->page, fdp->offset));
|
||||||
r = bytes_left;
|
r = bytes_left;
|
||||||
COFFEE_READ(buf, r, absolute_offset(file->page, fdp->offset));
|
|
||||||
}
|
}
|
||||||
bytes_left -= r;
|
|
||||||
fdp->offset += r;
|
fdp->offset += r;
|
||||||
buf += r;
|
buf += r;
|
||||||
}
|
}
|
||||||
|
#endif /* COFFEE_MICRO_LOGS */
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -1160,8 +1168,7 @@ cfs_write(int fd, const void *buf, unsigned size)
|
|||||||
|
|
||||||
#if COFFEE_MICRO_LOGS
|
#if COFFEE_MICRO_LOGS
|
||||||
if(FILE_MODIFIED(file) || fdp->offset < file->end) {
|
if(FILE_MODIFIED(file) || fdp->offset < file->end) {
|
||||||
bytes_left = size;
|
for(bytes_left = size; bytes_left > 0;) {
|
||||||
while(bytes_left) {
|
|
||||||
lp.offset = fdp->offset;
|
lp.offset = fdp->offset;
|
||||||
lp.buf = buf;
|
lp.buf = buf;
|
||||||
lp.size = bytes_left;
|
lp.size = bytes_left;
|
||||||
@ -1180,6 +1187,12 @@ cfs_write(int fd, const void *buf, unsigned size)
|
|||||||
bytes_left -= i;
|
bytes_left -= i;
|
||||||
fdp->offset += i;
|
fdp->offset += i;
|
||||||
buf += i;
|
buf += i;
|
||||||
|
|
||||||
|
/* Update the file end for a potential log merge that might
|
||||||
|
occur while writing log records. */
|
||||||
|
if(fdp->offset > file->end) {
|
||||||
|
file->end = fdp->offset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1190,10 +1203,11 @@ cfs_write(int fd, const void *buf, unsigned size)
|
|||||||
} else {
|
} else {
|
||||||
#endif /* COFFEE_MICRO_LOGS */
|
#endif /* COFFEE_MICRO_LOGS */
|
||||||
#if COFFEE_APPEND_ONLY
|
#if COFFEE_APPEND_ONLY
|
||||||
if(fdp->offset < file->end) {
|
if(fdp->offset < file->end) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif /* COFFEE_APPEND_ONLY */
|
#endif /* COFFEE_APPEND_ONLY */
|
||||||
|
|
||||||
COFFEE_WRITE(buf, size, absolute_offset(file->page, fdp->offset));
|
COFFEE_WRITE(buf, size, absolute_offset(file->page, fdp->offset));
|
||||||
fdp->offset += size;
|
fdp->offset += size;
|
||||||
#if COFFEE_MICRO_LOGS
|
#if COFFEE_MICRO_LOGS
|
||||||
@ -1214,7 +1228,7 @@ cfs_opendir(struct cfs_dir *dir, const char *name)
|
|||||||
* Coffee is only guaranteed to support "/" and ".", but it does not
|
* Coffee is only guaranteed to support "/" and ".", but it does not
|
||||||
* currently enforce this.
|
* currently enforce this.
|
||||||
*/
|
*/
|
||||||
*(coffee_page_t *)dir->dummy_space = 0;
|
memset(dir->dummy_space, 0, sizeof(coffee_page_t));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -1224,14 +1238,19 @@ cfs_readdir(struct cfs_dir *dir, struct cfs_dirent *record)
|
|||||||
struct file_header hdr;
|
struct file_header hdr;
|
||||||
coffee_page_t page;
|
coffee_page_t page;
|
||||||
|
|
||||||
for(page = *(coffee_page_t *)dir->dummy_space; page < COFFEE_PAGE_COUNT;) {
|
memcpy(&page, dir->dummy_space, sizeof(coffee_page_t));
|
||||||
|
|
||||||
|
while(page < COFFEE_PAGE_COUNT) {
|
||||||
watchdog_periodic();
|
watchdog_periodic();
|
||||||
read_header(&hdr, page);
|
read_header(&hdr, page);
|
||||||
if(HDR_ACTIVE(hdr) && !HDR_LOG(hdr)) {
|
if(HDR_ACTIVE(hdr) && !HDR_LOG(hdr)) {
|
||||||
|
coffee_page_t next_page;
|
||||||
memcpy(record->name, hdr.name, sizeof(record->name));
|
memcpy(record->name, hdr.name, sizeof(record->name));
|
||||||
record->name[sizeof(record->name) - 1] = '\0';
|
record->name[sizeof(record->name) - 1] = '\0';
|
||||||
record->size = file_end(page);
|
record->size = file_end(page);
|
||||||
*(coffee_page_t *)dir->dummy_space = next_file(page, &hdr);
|
|
||||||
|
next_page = next_file(page, &hdr);
|
||||||
|
memcpy(dir->dummy_space, &next_page, sizeof(coffee_page_t));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
page = next_file(page, &hdr);
|
page = next_file(page, &hdr);
|
||||||
|
Loading…
Reference in New Issue
Block a user