X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Ffb-direct.c;h=9eca31fdae34357f09a303c918734b57486a735a;hb=4adf195fb2f36dfbd054745469fa1c580de2f61b;hp=87eae822e3ce2599ccac40cb44cbc3ca8ee8a92c;hpb=9778f344521a2a0a34582fae70f4d631c82dd7a6;p=libucw.git diff --git a/lib/fb-direct.c b/lib/fb-direct.c index 87eae822..9eca31fd 100644 --- a/lib/fb-direct.c +++ b/lib/fb-direct.c @@ -19,7 +19,6 @@ * and take care of locking. * * FIXME: what if the OS doesn't support O_DIRECT? - * FIXME: doc: don't mix threads * FIXME: unaligned seeks and partial writes? * FIXME: merge with other file-oriented fastbufs */ @@ -36,6 +35,7 @@ #include #include #include +#include static uns fbdir_cheat; static uns fbdir_buffer_size = 65536; @@ -195,7 +195,7 @@ fbdir_spout(struct fastbuf *f) r->len = ALIGN_TO(r->len, FBDIR_ALIGN); asio_submit(r); asio_sync(F->io_queue); - DBG("FB-DIRECT: Truncating at %Ld", (long long)f->pos); + DBG("FB-DIRECT: Truncating at %llu", (long long)f->pos); if (sh_ftruncate(F->fd, f->pos) < 0) die("Error truncating %s: %m", f->name); } @@ -210,19 +210,20 @@ fbdir_spout(struct fastbuf *f) F->active_buffer = r; } -static void +static int fbdir_seek(struct fastbuf *f, sh_off_t pos, int whence) { - DBG("FB-DIRECT: Seek %Ld %d", (long long)pos, whence); + DBG("FB-DIRECT: Seek %llu %d", (long long)pos, whence); if (whence == SEEK_SET && pos == f->pos) - return; + return 1; fbdir_change_mode(FB_DIRECT(f), M_NULL); // Wait for all async requests to finish sh_off_t l = sh_seek(FB_DIRECT(f)->fd, pos, whence); if (l < 0) - die("lseek on %s: %m", f->name); + return 0; f->pos = l; + return 1; } static struct asio_queue *