int hlfs_take_snapshot(struct hlfs_ctrl *ctrl, const char *ssname) { //HLOG_DEBUG("enter func %s", __func__); //HLOG_DEBUG("create ssname is %s", ssname); if(ctrl == NULL || ssname ==NULL){ HLOG_ERROR("parameter error!"); return -1; } int ret = 0; if ((strlen(ssname) + 1) > HLFS_FILE_NAME_MAX) { HLOG_ERROR("error, snapshot name beyond max length!"); return -1; } g_mutex_lock(ctrl->hlfs_access_mutex); if (ctrl->rw_inode_flag == 0) { HLOG_ERROR("error, snapshot can not take when readonly"); g_mutex_unlock (ctrl->hlfs_access_mutex); return -1; } g_mutex_unlock (ctrl->hlfs_access_mutex); struct snapshot *_ss = NULL; if (0 == (ret=load_snapshot_by_name (ctrl->storage, \ SNAPSHOT_FILE, &_ss, ssname))){ HLOG_ERROR("snapshot %s is exist, use another snapshot name", \ ssname); return -1; }else{ HLOG_DEBUG("snapshot %s is not exist , create it ", ssname); } struct snapshot ss; memset(&ss, 0, sizeof(struct snapshot)); ss.timestamp = get_current_time(); g_strlcpy(ss.sname, ssname, strlen(ssname) + 1); g_mutex_lock(ctrl->hlfs_access_mutex); sprintf(ss.up_sname, "%s", ctrl->alive_ss_name); ss.inode_addr = ctrl->imap_entry.inode_addr; memset(ctrl->alive_ss_name, 0, MAX_FILE_NAME_LEN); sprintf(ctrl->alive_ss_name, "%s", ss.sname); g_mutex_unlock (ctrl->hlfs_access_mutex); ret = dump_alive_snapshot(ctrl->storage, ALIVE_SNAPSHOT_FILE, &ss); if (ret != 0) { HLOG_ERROR("dump snapshot alive error!"); return -1; } ret = dump_snapshot(ctrl->storage, SNAPSHOT_FILE, &ss); if (ret != 0) { HLOG_ERROR("dump snapshot error!"); return -1; } HLOG_INFO("Take Snapshot Succ- snapshot_name:%s,last_segno:%d, \ last_offset:%d", ssname, ctrl->last_segno, ctrl->last_offset); return ret; }
int hlfs_open_by_snapshot(struct hlfs_ctrl *ctrl, const char* snapshot, int flag) { //HLOG_DEBUG("enter func %s", __func__); if (NULL == ctrl || NULL == snapshot) { HLOG_ERROR("Parameter Error!"); return -1; } if ((strlen(snapshot) + 1) > HLFS_FILE_NAME_MAX) { HLOG_ERROR("snapshot name beyond max length"); return -1; } int ret = 0; struct snapshot *ss = NULL; if (0 == ctrl->storage->bs_file_is_exist(ctrl->storage, SNAPSHOT_FILE)) { if (0 > (ret = load_snapshot_by_name(ctrl->storage, SNAPSHOT_FILE, &ss, snapshot))) { HLOG_ERROR("load ss by name error"); g_free(ss); ret = -1; goto out; } } else { HLOG_ERROR("We have no snapshot at the moment"); ret = -1; goto out; } struct inode *inode = load_inode(ctrl->storage,ss->inode_addr); if (inode == NULL) { HLOG_ERROR("load_inode error!"); ret = -1; goto out; } memcpy(&(ctrl->inode), inode, sizeof(struct inode)); g_free(inode); ctrl->imap_entry.inode_no = HLFS_INODE_NO; ctrl->imap_entry.inode_addr = ss->inode_addr; if (0 == flag) { ctrl->rw_inode_flag = 0; } else if (1 == flag) { ctrl->rw_inode_flag = 1; } else { HLOG_ERROR("the bad flag for hlfs open by inode"); ret = -1; } memset(ctrl->alive_ss_name, 0, MAX_FILE_NAME_LEN); sprintf(ctrl->alive_ss_name, "%s", ss->sname); g_free(ss); ctrl->usage_ref += 1; out: //HLOG_DEBUG("leave func %s", __func__); return ret; }