- void *hangover_buf, *hangover_buf_base = NULL;
- void *buf, *buf_base = NULL;
- int r, hangover, solid, bsize, alignment;
- ssize_t ret = -1;
-
- if ((bsize = sector_size(fd)) < 0)
- return bsize;
-
- hangover = count % bsize;
- solid = count - hangover;
- alignment = get_alignment(fd);
-
- if ((long)orig_buf & (alignment - 1)) {
- buf = aligned_malloc(&buf_base, count, alignment);
- if (!buf)
- goto out;
- memcpy(buf, orig_buf, count);
- } else
- buf = orig_buf;
-
- r = write(fd, buf, solid);
- if (r < 0 || r != solid)
- goto out;
-
- if (hangover) {
- hangover_buf = aligned_malloc(&hangover_buf_base, bsize, alignment);
- if (!hangover_buf)
- goto out;
-
- r = read(fd, hangover_buf, bsize);
- if (r < 0 || r != bsize)
- goto out;
-
- r = lseek(fd, -bsize, SEEK_CUR);
- if (r < 0)
- goto out;
- memcpy(hangover_buf, (char*)buf + solid, hangover);
-
- r = write(fd, hangover_buf, bsize);
- if (r < 0 || r != bsize)
- goto out;
+ if (!_memlock_count++) {
+ log_dbg(ctx, "Locking memory.");
+ if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) {
+ log_dbg(ctx, "Cannot lock memory with mlockall.");
+ _memlock_count--;
+ return 0;
+ }
+ errno = 0;
+ if (((_priority = getpriority(PRIO_PROCESS, 0)) == -1) && errno)
+ log_err(ctx, _("Cannot get process priority."));
+ else
+ if (setpriority(PRIO_PROCESS, 0, DEFAULT_PROCESS_PRIORITY))
+ log_dbg(ctx, "setpriority %d failed: %s",
+ DEFAULT_PROCESS_PRIORITY, strerror(errno));