On Wed, Nov 16, 2011 at 04:11:36PM +0800, Liu Yuan wrote: > +struct store_driver { > + const char *driver_name; > + int (*init)(char *path); > + int (*open)(uint32_t epoch, uint64_t oid, int flags, int *ret); > + ssize_t (*write)(uint64_t oid, int fd, void *buf, int len, off_t offset); > + ssize_t (*read)(uint64_t oid, int fd, void *buf, int len, off_t offset); > + int (*close)(int fd); > +}; Passing an fd round seems to make the interface fairly non-generic. A void pointer would allow the driver to store whatever it needs there (and simple drivers can still cast the fd into them without memory allocation). Also in the open routine I would: - return the return value, and the private data in the arguments, that makes the code a bit more readable - not pass posix open flags, but your own. It seems like the only one for now would be the create new file flag. - shouldn't the check for short writes, and the error code translation side inside the write method? |