From 0ff7baf2d6d76909f61e2e3740a87436af6f1e88 Mon Sep 17 00:00:00 2001 From: Rhodez-x Date: Sat, 15 Dec 2018 20:13:38 +0100 Subject: [PATCH] Rewrite for passing file struct instead of just the ID --- lsfs_disk_controller.h | 100 +++++++++++++++++++++-------------------- lsfs_fuse.c | 17 +++---- 2 files changed, 60 insertions(+), 57 deletions(-) diff --git a/lsfs_disk_controller.h b/lsfs_disk_controller.h index dc4aa24..07e46d6 100644 --- a/lsfs_disk_controller.h +++ b/lsfs_disk_controller.h @@ -34,12 +34,12 @@ int lsfs_disk_getattr(lsfs_file* find_file, const char *path); //int lsfs_disk_delete_tag(lsfs_file_id file_id); int lsfs_disk_delete_file(lsfs_file_id file_id); int get_free_sectors(int num_sectors_needed, lsfs_sector_offset* output_array); -int lsfs_disk_read_data_from_file(lsfs_file_id file_id, int buffer_size, void* buffer_for_data); -int lsfs_disk_write_data_to_file(lsfs_file_id file_id, int data_length, char *data); +int lsfs_disk_read_data_from_file(lsfs_file* file, int buffer_size, void* buffer_for_data); +int lsfs_disk_write_data_to_file(lsfs_file* file, int data_length, char *data); //int lsfs_disk_rename_tag(lsfs_file_id file_id, char* new_filename); int lsfs_disk_rename_file(lsfs_file_id file_id, const char* new_filename); int lsfs_disk_load_disk(); -int write_data_to_disk(lsfs_sector_offset at_sector, void* data_to_write); +int write_data_to_disk(lsfs_sector_offset at_sector, uint32_t file_block_size, void* data_to_write); int read_data_from_disk(lsfs_sector_offset index, void* data_buffer); int write_data_to_disk_off(lsfs_sector_offset index, void* data_to_write, int offset); @@ -76,9 +76,10 @@ typedef struct struct_table_entry { char filename[256]; lsfs_file_id file_id; uint64_t file_size; - mif* ext_file_data; + mif* ext_file_data; + uint32_t file_block_size; // This tells how many block there are allocated for the specific file. eg. we read this amount of bloks for the file. struct { - uint64_t is_filename : 1; + uint32_t is_filename : 1; } control_bits; lsfs_sector_offset data_pointer[NUM_DATA_POINTERS] } __attribute__((packed)) table_entry; @@ -120,7 +121,7 @@ typedef struct lsfs_file { char* filename; uint32_t owner_id; uint64_t size; - uint64_t creation_date; + uint64_t creation_date; uint64_t access_time; uint64_t modification_time; lsfs_sector_offset *data; @@ -143,6 +144,7 @@ int lsfs_disk_getattr(lsfs_file* find_file, const char* path) { find_file->creation_date = (uint64_t) current_time; find_file->access_time = (uint64_t) current_time; find_file->modification_time = (uint64_t) current_time; + find_file->data = p_control.master_table[i].data_pointer; found = 1; } i++; @@ -152,16 +154,16 @@ int lsfs_disk_getattr(lsfs_file* find_file, const char* path) { -int lsfs_disk_read_data_from_file(lsfs_file_id file_id, int buffer_size, void* buffer_for_data) { +int lsfs_disk_read_data_from_file(lsfs_file *file, int buffer_size, void* buffer_for_data) { // TODO some offset, to tell where in the file we want to write int return_val = 0; for (int i = 0; i < NUM_DATA_POINTERS; ++i) { - if(p_control.master_table[file_id].data_pointer[i] == 0) { + if(file->data[i] == 0) { break; } - return_val += read_data_from_disk(p_control.master_table[file_id].data_pointer[i], buffer_for_data + (SECTOR_SIZE * i)); + return_val += read_data_from_disk(file->data[i], buffer_for_data + (SECTOR_SIZE * i)); } //time_t current_time; @@ -173,25 +175,22 @@ int lsfs_disk_read_data_from_file(lsfs_file_id file_id, int buffer_size, void* b return return_val; } -static inline time_t lsfs_disk_update_timestamps(mif *file) { - return file->last_modification_data = file->last_access_date = time(NULL); +static inline time_t lsfs_disk_update_timestamps(lsfs_file *file) { + return file->modification_time = file->access_time = time(NULL); } #define lsfs_num_sectors_for_size(x) (((x)+SECTOR_SIZE-1)&~(SECTOR_SIZE-1)) -int lsfs_disk_write_data_to_file(lsfs_file_id file_id, int data_length, char *data) { +int lsfs_disk_write_data_to_file(lsfs_file *file, int data_length, char *data) { int amount_written = data_length; - mif mif_record; - read_data_from_disk(file_id, &mif_record); - - lsfs_sector_offset current_sector = mif_record.file_size / SECTOR_SIZE; - unsigned int offset_in_sector = mif_record.file_size % SECTOR_SIZE; + lsfs_sector_offset current_sector = file->size / SECTOR_SIZE; + unsigned int offset_in_sector = file->size % SECTOR_SIZE; char *tmp_buffer = malloc(SECTOR_SIZE); assert(tmp_buffer); - read_data_from_disk(mif_record.one_level_pointer_data[current_sector], tmp_buffer); + read_data_from_disk(file->data[current_sector], tmp_buffer); memcpy(tmp_buffer + offset_in_sector, data, SECTOR_SIZE-offset_in_sector); data_length -= SECTOR_SIZE-offset_in_sector; @@ -202,7 +201,7 @@ int lsfs_disk_write_data_to_file(lsfs_file_id file_id, int data_length, char *da for (;;) { assert(current_sector <= NUM_DATA_POINTERS); - write_data_to_disk(p_control.master_table[file_id].data_pointer[current_sector], tmp_buffer); + write_data_to_disk(p_control.master_table[file->file_id].data_pointer[current_sector], 4, tmp_buffer); if (data_length <= 0) break; data += SECTOR_SIZE; @@ -222,38 +221,41 @@ int lsfs_disk_write_data_to_file(lsfs_file_id file_id, int data_length, char *da free(tmp_buffer); //lsfs_disk_update_timestamps(&mif_record); - p_control.master_table[file_id].file_size += amount_written; // update file size + p_control.master_table[file->file_id].file_size += amount_written; // update file size - write_data_to_disk(file_id, &p_control.master_table[file_id]); + write_data_to_disk(file->file_id, 4, &p_control.master_table[file->file_id]); return amount_written; } -time_t lsfs_disk_truncate_file(lsfs_file_id file_id) { - mif file_mif; - read_data_from_disk(file_id, &file_mif); - time_t result = lsfs_disk_update_timestamps(&file_mif); - file_mif.file_size = 0; - write_data_to_disk(file_id, &file_mif); - return result; -} +time_t lsfs_disk_truncate_file(lsfs_file *file, off_t offset) { + //mif file_mif; + //read_data_from_disk(file_id, &file_mif); + + time_t result = lsfs_disk_update_timestamps(file); -int lsfs_disk_rename_tag(lsfs_file_id file_id, char* new_filename) { - for (int i = 0; i < MAX_MASTER_TAGS; ++i) - { - if(p_control.master_table[i].file_id == file_id) { - memset(p_control.master_table[i].filename, 0, sizeof(p_control.master_table[i].filename)); - sprintf(p_control.master_table[i].filename, "%s", new_filename); - break; - } - } - // free the sectors including the tag table + file->size = (int) offset; // p_control.master_table[i].data_pointer[0]; //; - // Save the changes to disk - fseek ( disk , (p_control.fsci->master_tag_records[0] * SECTOR_SIZE) , SEEK_SET ); - fwrite(p_control.master_table, 1, sizeof(table_entry) * DEFAULT_MASTER_TABLE_SIZE, disk); - return 1; + write_data_to_disk(file->file_id, 4, NULL); + return result; } +// int lsfs_disk_rename_tag(lsfs_file_id file_id, char* new_filename) { +// for (int i = 0; i < MAX_MASTER_TAGS; ++i) +// { +// if(p_control.master_table[i].file_id == file_id) { +// memset(p_control.master_table[i].filename, 0, sizeof(p_control.master_table[i].filename)); +// sprintf(p_control.master_table[i].filename, "%s", new_filename); +// break; +// } +// } +// // free the sectors including the tag table + +// // Save the changes to disk +// fseek ( disk , (p_control.fsci->master_tag_records[0] * SECTOR_SIZE) , SEEK_SET ); +// fwrite(p_control.master_table, 1, sizeof(table_entry) * DEFAULT_MASTER_TABLE_SIZE, disk); +// return 1; +// } + int lsfs_disk_rename_file(lsfs_file_id file_id, const char* new_filename) { mif* mif_record = calloc(1, SECTOR_SIZE); read_data_from_disk(file_id, mif_record); @@ -267,7 +269,7 @@ int lsfs_disk_rename_file(lsfs_file_id file_id, const char* new_filename) { mif_record->last_modification_data = (uint64_t) current_time; mif_record->last_access_date = (uint64_t) current_time; - write_data_to_disk(file_id, mif_record); + write_data_to_disk(file_id, 4, mif_record); free(mif_record); return 1; } @@ -471,7 +473,7 @@ int get_free_sectors(int num_sectors_needed, lsfs_sector_offset* output_array) { p_control.fsci->next_free_sector++; } printf("Sector %lu is assignt\n", output_array[0]); - write_data_to_disk(0, p_control.fsci); + write_data_to_disk(0, 4, p_control.fsci); return p_control.fsci->next_free_sector; } @@ -580,21 +582,21 @@ lsfs_file_id lsfs_disk_create_file(char* filename, lsfs_file_id* tags, void* fil return return_id; } -int write_data_to_disk(lsfs_sector_offset index, void* data_to_write) { +int write_data_to_disk(lsfs_sector_offset index, uint32_t file_block_size, void* data_to_write) { fseek ( disk, (index * SECTOR_SIZE), SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. - int written = fwrite(data_to_write, 1, SECTOR_SIZE, disk); + int written = fwrite(data_to_write, 1, (4 * SECTOR_SIZE), disk); return written; } int write_data_to_disk_off(lsfs_sector_offset index, void* data_to_write, int offset) { fseek ( disk, (index * SECTOR_SIZE) + offset, SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. - int written = fwrite(data_to_write, 1, SECTOR_SIZE, disk); + int written = fwrite(data_to_write, 1, (4 * SECTOR_SIZE), disk); return written; } int read_data_from_disk(lsfs_sector_offset index, void* data_buffer) { fseek ( disk, (index * SECTOR_SIZE ), SEEK_SET ); // SEEK_SET start offset at index 0 and move 1 * SECTOR_SIZE, and write here. - int read = fread(data_buffer, 1, SECTOR_SIZE, disk); + int read = fread(data_buffer, 1, (4 * SECTOR_SIZE), disk); return read; } diff --git a/lsfs_fuse.c b/lsfs_fuse.c index 0fd3408..3306cd7 100644 --- a/lsfs_fuse.c +++ b/lsfs_fuse.c @@ -71,12 +71,13 @@ int lsfs_unlink(const char *path) { } int lsfs_truncate(const char *path, off_t offset) { - (void)offset; + (void)offset; // Truncate to this byte? + lsfs_file *found_file = calloc(1, sizeof(lsfs_file)); - //found_file->modification_time = modification_time - - // Truncate a file + lsfs_disk_getattr(found_file, path); + lsfs_disk_truncate_file(found_file, offset); + free(found_file); return 0; } @@ -196,7 +197,7 @@ int lsfs_write(const char *path, const char *content, size_t content_length, off time_t current_time; time ( ¤t_time ); - res = lsfs_disk_write_data_to_file(((lsfs_file*) file_info->fh)->file_id, content_length, (void*) content); + res = lsfs_disk_write_data_to_file(((lsfs_file*) file_info->fh), content_length, (void*) content); //((lsfs_file*) file_info->fh)->size += res; //((lsfs_file*) file_info->fh)->access_time = current_time; @@ -246,7 +247,7 @@ int lsfs_read( const char *path, char *buf, size_t size, off_t offset_to_next_en time_t current_time; time ( ¤t_time ); - int res = lsfs_disk_read_data_from_file( ((lsfs_file*) fi->fh)->file_id, size, buf); + int res = lsfs_disk_read_data_from_file( ((lsfs_file*) fi->fh), size, buf); ((lsfs_file*) fi->fh)->access_time = current_time; return res; } @@ -307,8 +308,8 @@ end: } int main( int argc, char *argv[] ) { - // "/home/rhodez-x/Documents/github/SingOS/bin/SingOS.img" - disk = fopen ("/home/rhodez-x/Documents/github/SingOS/bin/SingOS.img", "r+b"); + // "/home/rhodez-x/Documents/github/SingOS/SingOS.img" + disk = fopen ("/home/rhodez-x/Documents/github/SingOS/SingOS.img", "r+b"); p_control.fsci = malloc(sizeof(FSCI)); p_control.master_table = malloc(sizeof(table_entry) * DEFAULT_MASTER_TABLE_SIZE); lsfs_disk_load_disk();