void create_file_from_file(int dir_inum, const char *name) { FILE *infile = fopen(name, "rb"); inode *in = new_inode(file_size(name), FILE_INODE); write_inode_to_disk(in); create_dir_entry(name, dir_inum, in->num); append_file(in->num, infile, file_size(name)); free(in); fclose(infile); }
struct ref_cache *create_ref_cache(struct ref_store *refs, fill_ref_dir_fn *fill_ref_dir) { struct ref_cache *ret = xcalloc(1, sizeof(*ret)); ret->ref_store = refs; ret->fill_ref_dir = fill_ref_dir; ret->root = create_dir_entry(ret, "", 0, 1); return ret; }
CassError CassandraFS::create_file(const char* path, mode_t mode) { CassUuid uuid; cass_uuid_gen_time(ctxt->uuid_gen, &uuid); CassError error_value = CASS_OK; CassFuture* result_future = NULL; if (S_ISDIR(mode)) { result_future = create_dir_entry(path, mode); } else { result_future = create_file_entry(path, &uuid, mode); } CassFuture* result_future2 = create_sub_entry(path); CassFuture* result_future3 = NULL; if (!S_ISDIR(mode)) { result_future3 = create_physical_file(&uuid); } CassError err1 = cass_future_error_code(result_future); CassError err2 = cass_future_error_code(result_future2); CassError err3 = CASS_OK; if (result_future3 != NULL) { err3 = cass_future_error_code(result_future3); } if (err1 != CASS_OK) { cassandra_log_error(result_future); error_value = err1; } if (err2 != CASS_OK) { cassandra_log_error(result_future2); error_value = err2; } if (err3 != CASS_OK && result_future3 != NULL) { cassandra_log_error(result_future3); error_value = err3; } cass_future_free(result_future); cass_future_free(result_future2); if (result_future3 != NULL) { cass_future_free(result_future3); } return error_value; }
int check_page_dir(pid_t pid, char mode, addr_t address, frame_t *frame) { addr_t dir_offset = GET_PAGE_IND(address); bool present = false; nanosleep(&ACCESS_TIME_RAM, NULL); if (page_dir.dir_e[dir_offset].exists) { sys_proc_table = page_dir.dir_e[dir_offset].table_ref; check_page_table(pid, mode, address, frame); } else { dir_entry directEntry = create_dir_entry(pid); page_dir.dir_e[dir_offset] = directEntry; } sys_proc_table = NULL; }
// creates a new file that can be used in an OS byte create_file(dir_entry_t* de, char* filename, byte fn_length, byte* buf) { if(!create_dir_entry(de, filename, fn_length, buf)) { #if DEBUG pmsg("Couldn't create direntry!\r\n"); #endif return 0; } if(!write_dir_entry(de, buf)) { #if DEBUG pmsg("problem writing direntry!\r\n"); #endif return 0; } return 1; }
/* * Search for a directory entry directly within dir (without * recursing). Sort dir if necessary. subdirname must be a directory * name (i.e., end in '/'). If mkdir is set, then create the * directory if it is missing; otherwise, return NULL if the desired * directory cannot be found. dir must already be complete. */ static struct ref_dir *search_for_subdir(struct ref_dir *dir, const char *subdirname, size_t len, int mkdir) { int entry_index = search_ref_dir(dir, subdirname, len); struct ref_entry *entry; if (entry_index == -1) { if (!mkdir) return NULL; /* * Since dir is complete, the absence of a subdir * means that the subdir really doesn't exist; * therefore, create an empty record for it but mark * the record complete. */ entry = create_dir_entry(dir->cache, subdirname, len, 0); add_entry_to_dir(dir, entry); } else { entry = dir->entries[entry_index]; } return get_ref_dir(entry); }
/* 创建文件,若成功则返回文件描述符,否则返回-1 */ int32_t file_create(struct dir* parent_dir, char* filename, uint8_t flag) { /* 后续操作的公共缓冲区 */ void* io_buf = sys_malloc(1024); if (io_buf == NULL) { printk("in file_creat: sys_malloc for io_buf failed\n"); return -1; } uint8_t rollback_step = 0; // 用于操作失败时回滚各资源状态 /* 为新文件分配inode */ int32_t inode_no = inode_bitmap_alloc(cur_part); if (inode_no == -1) { printk("in file_creat: allocate inode failed\n"); return -1; } /* 此inode要从堆中申请内存,不可生成局部变量(函数退出时会释放) * 因为file_table数组中的文件描述符的inode指针要指向它.*/ struct inode* new_file_inode = (struct inode*)sys_malloc(sizeof(struct inode)); if (new_file_inode == NULL) { printk("file_create: sys_malloc for inode failded\n"); rollback_step = 1; goto rollback; } inode_init(inode_no, new_file_inode); // 初始化i结点 /* 返回的是file_table数组的下标 */ int fd_idx = get_free_slot_in_global(); if (fd_idx == -1) { printk("exceed max open files\n"); rollback_step = 2; goto rollback; } file_table[fd_idx].fd_inode = new_file_inode; file_table[fd_idx].fd_pos = 0; file_table[fd_idx].fd_flag = flag; file_table[fd_idx].fd_inode->write_deny = false; struct dir_entry new_dir_entry; memset(&new_dir_entry, 0, sizeof(struct dir_entry)); create_dir_entry(filename, inode_no, FT_REGULAR, &new_dir_entry); // create_dir_entry只是内存操作不出意外,不会返回失败 /* 同步内存数据到硬盘 */ /* a 在目录parent_dir下安装目录项new_dir_entry, 写入硬盘后返回true,否则false */ if (!sync_dir_entry(parent_dir, &new_dir_entry, io_buf)) { printk("sync dir_entry to disk failed\n"); rollback_step = 3; goto rollback; } memset(io_buf, 0, 1024); /* b 将父目录i结点的内容同步到硬盘 */ inode_sync(cur_part, parent_dir->inode, io_buf); memset(io_buf, 0, 1024); /* c 将新创建文件的i结点内容同步到硬盘 */ inode_sync(cur_part, new_file_inode, io_buf); /* d 将inode_bitmap位图同步到硬盘 */ bitmap_sync(cur_part, inode_no, INODE_BITMAP); /* e 将创建的文件i结点添加到open_inodes链表 */ list_push(&cur_part->open_inodes, &new_file_inode->inode_tag); new_file_inode->i_open_cnts = 1; sys_free(io_buf); return pcb_fd_install(fd_idx); /*创建文件需要创建相关的多个资源,若某步失败则会执行到下面的回滚步骤 */ rollback: switch (rollback_step) { case 3: /* 失败时,将file_table中的相应位清空 */ memset(&file_table[fd_idx], 0, sizeof(struct file)); case 2: sys_free(new_file_inode); case 1: /* 如果新文件的i结点创建失败,之前位图中分配的inode_no也要恢复 */ bitmap_set(&cur_part->inode_bitmap, inode_no, 0); break; } sys_free(io_buf); return -1; }