From: Piotr Neuman <sikkh@wp.pl>
To: user-mode-linux-devel@lists.sourceforge.net
Subject: [uml-devel] Simple db with separable io layer for humfs metadata.
Date: Fri, 9 Apr 2004 11:37:16 +0200 [thread overview]
Message-ID: <200404091137.16728.sikkh@wp.pl> (raw)
As Jeff Dike had requested that humfs db should allow UML to do actuall IO, I
have found 2 simple db-es suitable for such task. I was however unable to
find one that would have clear distinction of IO operations, like for example
using another lib to do it. My findings:
TDB: http://sourceforge.net/projects/tdb/ (it's used in samba project)
Need only reimplement 2 pretty simple functions:
static int tdb_write(TDB_CONTEXT *tdb, tdb_off off, void *buf, tdb_len len)
static int tdb_read(TDB_CONTEXT *tdb,tdb_off off,void *buf,tdb_len len,int cv)
The whole db is just two files: tdb.c and tdb.h which weight around 49KB, so
shipping it along with UML would be no problem imo.
For example (to show difficulty of reimplementing):
static int tdb_write(TDB_CONTEXT *tdb, tdb_off off, void *buf, tdb_len len)
{
if (tdb_oob(tdb, off + len, 0) != 0)
return -1;
if (tdb->map_ptr)
memcpy(off + (char *)tdb->map_ptr, buf, len);
#ifdef HAVE_PWRITE
else if (pwrite(tdb->fd, buf, len, off) != (ssize_t)len) {
#else
else if (lseek(tdb->fd, off, SEEK_SET) != off
|| write(tdb->fd, buf, len) != (ssize_t)len) {
#endif
TDB_LOG((tdb, 0,"tdb_write failed at %d len=%d (%s)\n",
off, len, strerror(errno)));
return TDB_ERRCODE(TDB_ERR_IO, -1);
}
return 0;
}
QDBM: http://qdbm.sourceforge.net/
In this case need to reimplement 4 functions (also simple):
static int dpwrite(int fd, const void *buf, int size);
static int dpseekwrite(int fd, int off, const void *buf, int size);
static int dpread(int fd, void *buf, int size);
static int dpseekread(int fd, int off, void *buf, int size);
Basic setup is: depot.c, depot.h, myconf.c and myconf.h - ~86KB. But
additional b+tree support allows for gracious recovery after crash, and
smaller file size than tdb at the cost of increasing code size to ~308KB.
qdbm is generally much more advanced and featurefull than tdb. It also has
plenty of interfaces to other languages, like perl (not counted in that size
approximation).
Example:
static int dpseekwrite(int fd, int off, const void *buf, int size){
char *lbuf;
assert(fd >= 0 && buf && size >= 0);
if(size < 1) return TRUE;
lbuf = (char *)buf;
if(off < 0){
if(lseek(fd, 0, SEEK_END) == -1){
dpecode = DP_ESEEK;
return FALSE;
}
} else {
if(lseek(fd, off, SEEK_SET) != off){
dpecode = DP_ESEEK;
return FALSE;
}
}
if(dpwrite(fd, lbuf, size) != size){
dpecode = DP_EWRITE;
return FALSE;
}
return TRUE;
}
Regards to UML developement team (Jeff Dike that is ;)
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
next reply other threads:[~2004-04-09 9:36 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-04-09 9:37 Piotr Neuman [this message]
2004-04-09 14:56 ` [uml-devel] Simple db with separable io layer for humfs metadata Jeff Dike
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200404091137.16728.sikkh@wp.pl \
--to=sikkh@wp.pl \
--cc=user-mode-linux-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.