reuse merge_log to also do file extensions.
This commit is contained in:
parent
42dd7c37fc
commit
5fc9534188
@ -269,7 +269,7 @@ dir_cache_find(const char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -283,7 +283,7 @@ find_file(const char *name)
|
|||||||
if(page >= 0) {
|
if(page >= 0) {
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
page = 0;
|
page = 0;
|
||||||
do {
|
do {
|
||||||
read_header(&hdr, page);
|
read_header(&hdr, page);
|
||||||
@ -307,7 +307,7 @@ find_file(const char *name)
|
|||||||
}
|
}
|
||||||
watchdog_periodic();
|
watchdog_periodic();
|
||||||
} while(page < COFFEE_PAGE_COUNT);
|
} while(page < COFFEE_PAGE_COUNT);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -334,9 +334,8 @@ find_offset_in_file(int first_page)
|
|||||||
}
|
}
|
||||||
range_start = part_size * search_limit;
|
range_start = part_size * search_limit;
|
||||||
range_end = range_start + part_size;
|
range_end = range_start + part_size;
|
||||||
|
if(range_end + 1 > hdr.max_pages) {
|
||||||
if(range_end > hdr.max_pages) {
|
range_end = hdr.max_pages - 1;
|
||||||
range_end = hdr.max_pages;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -347,7 +346,7 @@ find_offset_in_file(int first_page)
|
|||||||
* are zeroes, then these are skipped from the calculation.
|
* are zeroes, then these are skipped from the calculation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for(page = first_page + range_end - 1; page >= first_page; page--) {
|
for(page = first_page + range_end; page >= first_page; page--) {
|
||||||
watchdog_periodic();
|
watchdog_periodic();
|
||||||
COFFEE_READ(buf, sizeof(buf), page * COFFEE_PAGE_SIZE);
|
COFFEE_READ(buf, sizeof(buf), page * COFFEE_PAGE_SIZE);
|
||||||
for(i = COFFEE_PAGE_SIZE - 1; i >= 0; i--) {
|
for(i = COFFEE_PAGE_SIZE - 1; i >= 0; i--) {
|
||||||
@ -650,12 +649,13 @@ create_log(coffee_page_t file_page, struct file_header *hdr)
|
|||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
merge_log(coffee_page_t file_page)
|
merge_log(coffee_page_t file_page, int extend)
|
||||||
{
|
{
|
||||||
coffee_page_t log_page, new_file_page;
|
coffee_page_t log_page, new_file_page;
|
||||||
struct file_header hdr, hdr2;
|
struct file_header hdr, hdr2;
|
||||||
int fd, n;
|
int fd, n;
|
||||||
coffee_offset_t offset;
|
coffee_offset_t offset;
|
||||||
|
coffee_page_t max_pages;
|
||||||
|
|
||||||
read_header(&hdr, file_page);
|
read_header(&hdr, file_page);
|
||||||
log_page = hdr.log_page;
|
log_page = hdr.log_page;
|
||||||
@ -669,9 +669,10 @@ merge_log(coffee_page_t file_page)
|
|||||||
* The reservation function adds extra space for the header, which has
|
* The reservation function adds extra space for the header, which has
|
||||||
* already been calculated with in the previous reservation.
|
* already been calculated with in the previous reservation.
|
||||||
*/
|
*/
|
||||||
|
max_pages = hdr.max_pages * (1 << extend);
|
||||||
new_file_page = reserve(hdr.name,
|
new_file_page = reserve(hdr.name,
|
||||||
hdr.max_pages * COFFEE_PAGE_SIZE - sizeof(hdr),
|
max_pages * COFFEE_PAGE_SIZE - sizeof(hdr),
|
||||||
1);
|
1);
|
||||||
if(new_file_page < 0) {
|
if(new_file_page < 0) {
|
||||||
cfs_close(fd);
|
cfs_close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
@ -693,8 +694,8 @@ merge_log(coffee_page_t file_page)
|
|||||||
}
|
}
|
||||||
} while(n != 0);
|
} while(n != 0);
|
||||||
|
|
||||||
if(remove_by_page(file_page, 1, 0) < 0) {
|
if(remove_by_page(file_page, 1, 0) < 0) {
|
||||||
remove_by_page(new_file_page, 0, 0);
|
remove_by_page(new_file_page, 0, 0);
|
||||||
cfs_close(fd);
|
cfs_close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -710,6 +711,7 @@ merge_log(coffee_page_t file_page)
|
|||||||
for(n = 0; n < COFFEE_FD_SET_SIZE; n++) {
|
for(n = 0; n < COFFEE_FD_SET_SIZE; n++) {
|
||||||
if(coffee_fd_set[n].file_page == file_page) {
|
if(coffee_fd_set[n].file_page == file_page) {
|
||||||
coffee_fd_set[n].file_page = new_file_page;
|
coffee_fd_set[n].file_page = new_file_page;
|
||||||
|
coffee_fd_set[n].max_pages = max_pages;
|
||||||
coffee_fd_set[n].flags &= ~COFFEE_FD_MODIFIED;
|
coffee_fd_set[n].flags &= ~COFFEE_FD_MODIFIED;
|
||||||
coffee_fd_set[n].next_log_record = 0;
|
coffee_fd_set[n].next_log_record = 0;
|
||||||
}
|
}
|
||||||
@ -773,7 +775,7 @@ write_log_page(struct file_desc *fdp, struct log_param *lp)
|
|||||||
if(log_record >= log_records) {
|
if(log_record >= log_records) {
|
||||||
/* The log is full; merge the log. */
|
/* The log is full; merge the log. */
|
||||||
PRINTF("Coffee: Merging the file %s with its log\n", hdr.name);
|
PRINTF("Coffee: Merging the file %s with its log\n", hdr.name);
|
||||||
return merge_log(fdp->file_page);
|
return merge_log(fdp->file_page, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Create a log structure. */
|
/* Create a log structure. */
|
||||||
@ -1006,10 +1008,12 @@ cfs_write(int fd, const void *buf, unsigned size)
|
|||||||
|
|
||||||
fdp = &coffee_fd_set[fd];
|
fdp = &coffee_fd_set[fd];
|
||||||
|
|
||||||
if(size + fdp->offset + sizeof(struct file_header) >
|
/* Attempt to extend the file if we try to write past the end. */
|
||||||
|
while(size + fdp->offset + sizeof(struct file_header) >
|
||||||
fdp->max_pages * COFFEE_PAGE_SIZE) {
|
fdp->max_pages * COFFEE_PAGE_SIZE) {
|
||||||
size = fdp->max_pages * COFFEE_PAGE_SIZE -
|
if(merge_log(fdp->file_page, 1) < 0) {
|
||||||
fdp->offset - sizeof(struct file_header);
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fdp->offset < fdp->end) {
|
if(fdp->offset < fdp->end) {
|
||||||
|
Loading…
Reference in New Issue
Block a user