static int tapdisk_logfile_init_buffer(td_logfile_t *log, size_t size) { int prot, flags, err; if (!size) return -EINVAL; prot = PROT_READ|PROT_WRITE; flags = MAP_ANONYMOUS|MAP_PRIVATE; log->vbuf = mmap(NULL, page_align(size), prot, flags, -1, 0); if (log->vbuf == MAP_FAILED) { log->vbuf = NULL; goto fail; } err = mlock(log->vbuf, page_align(size)); if (err) goto fail; log->vbufsz = size; return 0; fail: tapdisk_logfile_free_buffer(log); err = -errno; return err; }
void tapdisk_logfile_close(td_logfile_t * log) { if (log->file) { fclose(log->file); log->file = NULL; } tapdisk_logfile_free_buffer(log); }