Exemple #1
0
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);
} 
Exemple #2
0
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;
}
Exemple #3
0
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;

}
Exemple #4
0
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;
}
Exemple #5
0
// 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;
}
Exemple #6
0
/*
 * 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);
}
Exemple #7
0
/* 创建文件,若成功则返回文件描述符,否则返回-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;
}