[Gluster-devel] FIRST_CHILD(frame->this)->fops->create

Ian Latter ian.latter at midnightcode.org
Thu Aug 6 05:07:50 UTC 2009



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 at gluster.com>
>To: "Ian Latter" <ian.latter at midnightcode.org>
>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/





More information about the Gluster-devel mailing list