void rozofs_ll_open_nb(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { ientry_t *ie = 0; int ret; void *buffer_p = NULL; ep_mfile_arg_t arg; /* ** allocate a context for saving the fuse parameters */ buffer_p = rozofs_fuse_alloc_saved_context(); if (buffer_p == NULL) { severe("out of fuse saved context"); errno = ENOMEM; goto error; } SAVE_FUSE_PARAM(buffer_p,req); SAVE_FUSE_PARAM(buffer_p,ino); SAVE_FUSE_STRUCT(buffer_p,fi,sizeof( struct fuse_file_info)); START_PROFILING_NB(buffer_p,rozofs_ll_open); DEBUG("open (%lu)\n", (unsigned long int) ino); if (!(ie = get_ientry_by_inode(ino))) { errno = ENOENT; goto error; } /* ** get the attributes of the file */ arg.eid = exportclt.eid; memcpy(arg.fid, ie->fid, sizeof (uuid_t)); /* ** now initiates the transaction towards the remote end */ ret = rozofs_export_send_common(&exportclt,ROZOFS_TMR_GET(TMR_EXPORT_PROGRAM),EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_ep_mfile_arg_t,(void *)&arg, rozofs_ll_open_cbk,buffer_p); if (ret < 0) goto error; /* ** no error just waiting for the answer */ return; error: fuse_reply_err(req, errno); /* ** release the buffer if has been allocated */ STOP_PROFILING_NB(buffer_p,rozofs_ll_open); if (buffer_p != NULL) rozofs_fuse_release_saved_context(buffer_p); return; }
void rozofs_ll_create_nb(fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, struct fuse_file_info *fi) { ientry_t *ie = 0; const struct fuse_ctx *ctx; ctx = fuse_req_ctx(req); epgw_mknod_arg_t arg; int ret; void *buffer_p = NULL; int trc_idx = rozofs_trc_req_name(srv_rozofs_ll_create,parent,(char*)name); /* ** allocate a context for saving the fuse parameters */ buffer_p = rozofs_fuse_alloc_saved_context(); if (buffer_p == NULL) { severe("out of fuse saved context"); errno = ENOMEM; goto error; } SAVE_FUSE_PARAM(buffer_p,req); SAVE_FUSE_PARAM(buffer_p,parent); SAVE_FUSE_STRING(buffer_p,name); SAVE_FUSE_PARAM(buffer_p,mode); SAVE_FUSE_PARAM(buffer_p,trc_idx); SAVE_FUSE_STRUCT(buffer_p,fi,sizeof( struct fuse_file_info)); START_PROFILING_NB(buffer_p,rozofs_ll_create); DEBUG("create (%lu,%s,%04o)\n", (unsigned long int) parent, name, (unsigned int) mode); if (strlen(name) > ROZOFS_FILENAME_MAX) { errno = ENAMETOOLONG; goto error; } if (!(ie = get_ientry_by_inode(parent))) { errno = ENOENT; goto error; } /* ** fill up the structure that will be used for creating the xdr message */ arg.arg_gw.eid = exportclt.eid; memcpy(arg.arg_gw.parent,ie->fid, sizeof (uuid_t)); arg.arg_gw.name = (char*)name; arg.arg_gw.uid = ctx->uid; arg.arg_gw.gid = ctx->gid; arg.arg_gw.mode = mode; /* ** now initiates the transaction towards the remote end */ #if 1 ret = rozofs_expgateway_send_routing_common(arg.arg_gw.eid,ie->fid,EXPORT_PROGRAM, EXPORT_VERSION, EP_MKNOD,(xdrproc_t) xdr_epgw_mknod_arg_t,(void *)&arg, rozofs_ll_create_cbk,buffer_p); #else ret = rozofs_export_send_common(&exportclt,EXPORT_PROGRAM, EXPORT_VERSION, EP_MKNOD,(xdrproc_t) xdr_epgw_mknod_arg_t,(void *)&arg, rozofs_ll_create_cbk,buffer_p); #endif if (ret < 0) goto error; /* ** no error just waiting for the answer */ return; error: fuse_reply_err(req, errno); rozofs_trc_rsp(srv_rozofs_ll_create,parent,NULL,1,trc_idx); STOP_PROFILING_NB(buffer_p,rozofs_ll_create); if (buffer_p != NULL) rozofs_fuse_release_saved_context(buffer_p); return; }
void rozofs_ll_getattr_nb(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { (void) fi; ientry_t *ie = 0; epgw_mfile_arg_t arg; int ret; struct stat stbuf; int trc_idx; errno = 0; trc_idx = rozofs_trc_req(srv_rozofs_ll_getattr,ino,NULL); DEBUG("getattr for inode: %lu\n", (unsigned long int) ino); void *buffer_p = NULL; /* ** allocate a context for saving the fuse parameters */ buffer_p = rozofs_fuse_alloc_saved_context(); if (buffer_p == NULL) { severe("out of fuse saved context"); errno = ENOMEM; goto error; } SAVE_FUSE_PARAM(buffer_p,req); SAVE_FUSE_PARAM(buffer_p,ino); SAVE_FUSE_PARAM(buffer_p,trc_idx); SAVE_FUSE_STRUCT(buffer_p,fi,sizeof( struct fuse_file_info)); START_PROFILING_NB(buffer_p,rozofs_ll_getattr); if (!(ie = get_ientry_by_inode(ino))) { errno = ENOENT; goto error; } /* ** In block mode the attributes of regular files are directly retrieved ** from the ie entry. For directories and links one ask to the exportd ** */ if ( /* check regular file */ ((((ie->timestamp+rozofs_tmr_get(TMR_FUSE_ATTR_CACHE)*1000000) > rozofs_get_ticker_us()) || (rozofs_mode == 1))&&(S_ISREG(ie->attrs.mode))) || /* check directory */ (((ie->pending_getattr_cnt>0)||((ie->timestamp+(rozofs_tmr_get(TMR_FUSE_ATTR_CACHE)*1000000)) > rozofs_get_ticker_us()))&&(S_ISDIR(ie->attrs.mode))) ) { mattr_to_stat(&ie->attrs, &stbuf, exportclt.bsize); stbuf.st_ino = ino; rz_fuse_reply_attr(req, &stbuf, rozofs_tmr_get(TMR_FUSE_ATTR_CACHE)); goto out; } /* ** fill up the structure that will be used for creating the xdr message */ arg.arg_gw.eid = exportclt.eid; memcpy(arg.arg_gw.fid, ie->fid, sizeof (uuid_t)); /* ** now initiates the transaction towards the remote end */ #if 1 ret = rozofs_expgateway_send_routing_common(arg.arg_gw.eid,ie->fid,EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_epgw_mfile_arg_t,(void *)&arg, rozofs_ll_getattr_cbk,buffer_p); #else ret = rozofs_export_send_common(&exportclt,EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_epgw_mfile_arg_t,(void *)&arg, rozofs_ll_getattr_cbk,buffer_p); #endif if (ret < 0) goto error; /* ** no error just waiting for the answer: increment the pending counter of getattr */ //ie->pending_getattr_cnt++; //if (ie->pending_getattr_cnt > rozofs_max_getattr_pending) rozofs_max_getattr_pending = ie->pending_getattr_cnt; //if (ie->pending_getattr_cnt > 1) rozofs_max_getattr_duplicate++; return; error: fuse_reply_err(req, errno); /* ** release the buffer if has been allocated */ out: rozofs_trc_rsp_attr(srv_rozofs_ll_getattr,0/*ino*/,(ie==NULL)?NULL:ie->attrs.fid,(errno==0)?0:1,(ie==NULL)?-1:ie->attrs.size,trc_idx); STOP_PROFILING_NB(buffer_p,rozofs_ll_getattr); if (buffer_p != NULL) rozofs_fuse_release_saved_context(buffer_p); return; }
void rozofs_ll_getattr_nb(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { (void) fi; ientry_t *ie = 0; epgw_mfile_arg_t arg; int ret; struct stat stbuf; DEBUG("getattr for inode: %lu\n", (unsigned long int) ino); void *buffer_p = NULL; /* ** allocate a context for saving the fuse parameters */ buffer_p = rozofs_fuse_alloc_saved_context(); if (buffer_p == NULL) { severe("out of fuse saved context"); errno = ENOMEM; goto error; } SAVE_FUSE_PARAM(buffer_p,req); SAVE_FUSE_PARAM(buffer_p,ino); SAVE_FUSE_STRUCT(buffer_p,fi,sizeof( struct fuse_file_info)); START_PROFILING_NB(buffer_p,rozofs_ll_getattr); if (!(ie = get_ientry_by_inode(ino))) { errno = ENOENT; goto error; } /* ** In block mode the attributes of regular files are directly retrieved ** from the ie entry. For directories and links one ask to the exportd ** */ if ((rozofs_mode == 1)&&(S_ISREG(ie->attrs.mode))) { mattr_to_stat(&ie->attrs, &stbuf); stbuf.st_ino = ino; fuse_reply_attr(req, &stbuf, rozofs_tmr_get(TMR_FUSE_ATTR_CACHE)); goto out; } /* ** fill up the structure that will be used for creating the xdr message */ arg.arg_gw.eid = exportclt.eid; memcpy(arg.arg_gw.fid, ie->fid, sizeof (uuid_t)); /* ** now initiates the transaction towards the remote end */ #if 1 ret = rozofs_expgateway_send_routing_common(arg.arg_gw.eid,ie->fid,EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_epgw_mfile_arg_t,(void *)&arg, rozofs_ll_getattr_cbk,buffer_p); #else ret = rozofs_export_send_common(&exportclt,EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_epgw_mfile_arg_t,(void *)&arg, rozofs_ll_getattr_cbk,buffer_p); #endif if (ret < 0) goto error; /* ** no error just waiting for the answer */ return; error: fuse_reply_err(req, errno); /* ** release the buffer if has been allocated */ out: STOP_PROFILING_NB(buffer_p,rozofs_ll_getattr); if (buffer_p != NULL) rozofs_fuse_release_saved_context(buffer_p); return; }
void rozofs_ll_open_nb(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { ientry_t *ie = 0; int ret; void *buffer_p = NULL; epgw_mfile_arg_t arg; file_t *file = NULL; errno = 0; /* ** Update the IO statistics */ rozofs_thr_cnt_update(rozofs_thr_counter[ROZOFSMOUNT_COUNTER_OTHER], 1); int trc_idx = rozofs_trc_req_flags(srv_rozofs_ll_open,ino,NULL,fi->flags); /* ** allocate a context for saving the fuse parameters */ buffer_p = rozofs_fuse_alloc_saved_context(); if (buffer_p == NULL) { severe("out of fuse saved context"); errno = ENOMEM; goto error; } SAVE_FUSE_PARAM(buffer_p,req); SAVE_FUSE_PARAM(buffer_p,ino); SAVE_FUSE_PARAM(buffer_p,trc_idx); SAVE_FUSE_STRUCT(buffer_p,fi,sizeof( struct fuse_file_info)); START_PROFILING_NB(buffer_p,rozofs_ll_open); DEBUG("open (%lu)\n", (unsigned long int) ino); if (!(ie = get_ientry_by_inode(ino))) { errno = ENOENT; goto error; } /* ** check if it is configured in block mode, in that case we avoid ** a transaction with the exportd */ if ((rozofs_mode == 1) || ((ie->timestamp+rozofs_tmr_get_attr_us(rozofs_is_directory_inode(ino))) > rozofs_get_ticker_us())) { /* ** allocate a context for the file descriptor */ file = rozofs_file_working_var_init(ie,ie->fid); if (rozofs_cache_mode == 1) fi->direct_io = 1; else { if (rozofs_cache_mode == 2) fi->keep_cache = 1; } /* ** save the opening flags */ file->open_flags = fi->flags; fi->fh = (unsigned long) file; /* ** update the statistics */ rzkpi_file_stat_update(ie->pfid,(int)0,RZKPI_OPEN); /* ** Take care of the file caching cache for hybrid SSD/HDD configuration */ rzcachetrack_file(ie->pfid,ie->attrs.attrs.size,ie->attrs.attrs.mtime); /* ** send back response to fuse */ fuse_reply_open(req, fi); goto out; } /* ** get the attributes of the file */ arg.arg_gw.eid = exportclt.eid; memcpy(arg.arg_gw.fid, ie->fid, sizeof (uuid_t)); /* ** now initiates the transaction towards the remote end */ /* ** In case the EXPORT LBG is down and we know this ientry, let's respond to ** the requester with the current available information */ if (common_config.client_fast_reconnect) { expgw_tx_routing_ctx_t routing_ctx; if (expgw_get_export_routing_lbg_info(arg.arg_gw.eid,ie->fid,&routing_ctx) != 0) { goto error; } if (north_lbg_get_state(routing_ctx.lbg_id[0]) != NORTH_LBG_UP) { goto short_cut; } } #if 1 ret = rozofs_expgateway_send_routing_common(arg.arg_gw.eid,ie->fid,EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_epgw_mfile_arg_t,(void *)&arg, rozofs_ll_open_cbk,buffer_p); #else ret = rozofs_export_send_common(&exportclt,EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_epgw_mfile_arg_t,(void *)&arg, rozofs_ll_open_cbk,buffer_p); #endif if (ret < 0) { /* ** In case of fast reconnect mode let's respond with the previously knows ** parameters instead of failing */ if (common_config.client_fast_reconnect) { short_cut: /* ** allocate a context for the file descriptor */ file = rozofs_file_working_var_init(ie,ie->fid); if (rozofs_cache_mode == 1) fi->direct_io = 1; else { if (rozofs_cache_mode == 2) fi->keep_cache = 1; } /* ** save the opening flags */ file->open_flags = fi->flags; fi->fh = (unsigned long) file; /* ** update the statistics */ rzkpi_file_stat_update(ie->pfid,(int)0,RZKPI_OPEN); /* ** Take care of the file caching cache for hybrid SSD/HDD configuration */ rzcachetrack_file(ie->pfid,ie->attrs.attrs.size,ie->attrs.attrs.mtime); /* ** send back response to fuse */ fuse_reply_open(req, fi); goto out; } goto error; } /* ** no error just waiting for the answer */ return; error: fuse_reply_err(req, errno); /* ** release the buffer if has been allocated */ out: rozofs_trc_rsp_attr(srv_rozofs_ll_open,(fuse_ino_t)file,(ie==NULL)?NULL:ie->attrs.attrs.fid,(errno==0)?0:1,(ie==NULL)?-1:ie->attrs.attrs.size,trc_idx); STOP_PROFILING_NB(buffer_p,rozofs_ll_open); if (buffer_p != NULL) rozofs_fuse_release_saved_context(buffer_p); return; }
void rozofs_ll_open_nb(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { ientry_t *ie = 0; int ret; void *buffer_p = NULL; epgw_mfile_arg_t arg; file_t *file = NULL; errno = 0; int trc_idx = rozofs_trc_req(srv_rozofs_ll_open,ino,NULL); /* ** allocate a context for saving the fuse parameters */ buffer_p = rozofs_fuse_alloc_saved_context(); if (buffer_p == NULL) { severe("out of fuse saved context"); errno = ENOMEM; goto error; } SAVE_FUSE_PARAM(buffer_p,req); SAVE_FUSE_PARAM(buffer_p,ino); SAVE_FUSE_PARAM(buffer_p,trc_idx); SAVE_FUSE_STRUCT(buffer_p,fi,sizeof( struct fuse_file_info)); START_PROFILING_NB(buffer_p,rozofs_ll_open); DEBUG("open (%lu)\n", (unsigned long int) ino); if (!(ie = get_ientry_by_inode(ino))) { errno = ENOENT; goto error; } /* ** check if it is configured in block mode, in that case we avoid ** a transaction with the exportd */ if ((rozofs_mode == 1) || ((ie->timestamp+rozofs_tmr_get(TMR_FUSE_ATTR_CACHE)*1000000) > rozofs_get_ticker_us())) { /* ** allocate a context for the file descriptor */ file = rozofs_file_working_var_init(ie,ie->fid); if (rozofs_cache_mode == 1) fi->direct_io = 1; else { if (rozofs_cache_mode == 2) fi->keep_cache = 1; } fi->fh = (unsigned long) file; /* ** update the statistics */ rzkpi_file_stat_update(ie->pfid,(int)0,RZKPI_OPEN); /* ** send back response to fuse */ fuse_reply_open(req, fi); goto out; } /* ** get the attributes of the file */ arg.arg_gw.eid = exportclt.eid; memcpy(arg.arg_gw.fid, ie->fid, sizeof (uuid_t)); /* ** now initiates the transaction towards the remote end */ #if 1 ret = rozofs_expgateway_send_routing_common(arg.arg_gw.eid,ie->fid,EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_epgw_mfile_arg_t,(void *)&arg, rozofs_ll_open_cbk,buffer_p); #else ret = rozofs_export_send_common(&exportclt,EXPORT_PROGRAM, EXPORT_VERSION, EP_GETATTR,(xdrproc_t) xdr_epgw_mfile_arg_t,(void *)&arg, rozofs_ll_open_cbk,buffer_p); #endif if (ret < 0) goto error; /* ** no error just waiting for the answer */ return; error: fuse_reply_err(req, errno); /* ** release the buffer if has been allocated */ out: rozofs_trc_rsp_attr(srv_rozofs_ll_open,(fuse_ino_t)file,(ie==NULL)?NULL:ie->attrs.fid,(errno==0)?0:1,(ie==NULL)?-1:ie->attrs.size,trc_idx); STOP_PROFILING_NB(buffer_p,rozofs_ll_open); if (buffer_p != NULL) rozofs_fuse_release_saved_context(buffer_p); return; }