Excellent - thanks Avati. This also, then, confirms that my fd_create() version was failing because of the incorrectly populated loc structure. It also didn't occur to me that the server xlator would have the type of sample code I could use for this ... I'm working my way through server_create() now ... and server_loc_fill() from server-helpers.c ... It looks like you've opened some good avenues here; if I get stuck I'll post back. Thanks for your help - I look forward to contributing to the project. ----- Original Message ----- >From: "Anand Avati" <avati@xxxxxxxxxxx> >To: "Ian Latter" <ian.latter@xxxxxxxxxxxxxxxx> >Subject: Re: [Gluster-devel] FIRST_CHILD(frame->this)->fops->create >Date: Wed, 05 Aug 2009 20:29:27 -0700 > > If this is the actual code below you have in your fop, please look for > the comments inline - > > > Example code for the "hang" case, from my prototype (inside > > a function called from inside the xlator->write handler); > > > > � � � �loc_t data_loc; > > � � � �char path[255]; > > � � � �char name[255]; > > � � � �char * data_path; > > � � � �char * data_name; > > � � � �int32_t flags; > > � � � �mode_t mode; > > � � � �fd_t * fd; > > > > � � � �memset(path, 0, sizeof(path)); > > � � � �if(snprintf(path, sizeof(path) - 1, "/data.db") <= 0) > > � � � � �return -1; > > > > � � � �memset(name, 0, sizeof(name)); > > � � � �if(snprintf(name, sizeof(name) - 1, "data.db") <= 0) > > � � � � �return -1; > > > > � � � �data_path = CALLOC(1, strlen(path) + 1); > > � � � �ERR_ABORT(data_path); > > � � � �memset(data_path, 0, sizeof(data_path)); > > � � � �memcpy(data_path, path, strlen(path)); > > > > � � � �data_name = CALLOC(1, strlen(name) + 1); > > � � � �ERR_ABORT(data_name); > > � � � �memset(data_name, 0, sizeof(data_name)); > > � � � �memcpy(data_name, name, strlen(name)); > > > > � � � �memset(&data_loc, 0, sizeof(data_loc)); > > � � � �data_loc.inode = NULL; �// redundant > > you need to have the loc->inode and loc->parent members filled in > properly. See fuse-bridge.c and server-protocol.c on how to generate > create()able inodes and fds. To reach the parent inode of the > directory where the file needs to be created, refer the > fuse_loc_fill() or server_loc_fill() functions. > > > � � � �data_loc.path = data_path; > > � � � �data_loc.name = data_name; > > > > � � � �flags = O_CREAT | O_RDWR | O_EXCL; > > > > � � � �mode = (mode_t)0700; > > > > � � � �memset(fd, 0, sizeof(fd_t)); > > > > � � � �STACK_WIND(frame, > > � � � � � � � � � �xlator_func_writev_create_cbk, > > � � � � � � � � � �FIRST_CHILD(frame->this), > > � � � � � � � � � �FIRST_CHILD(frame->this)->fops->create, > > � � � � � � � � � �&data_loc, flags, mode, &fd); > > the fd pointer should be pre-allocated with fd_create(). Refer > fuse_create() and fuse_create_cbk() to figure out the right things to > do. If you can describe your requirements in more detail, we can > suggest a few tips and directions on how to proceed. > > > � � � �gf_log(this->name, GF_LOG_WARNING, "Hung above me"); > > Avati > -- Ian Latter Late night coder .. http://midnightcode.org/