int fs_stateRead(struct fs_dump_state * state, void * buf, size_t len) { int ret = 0; #ifdef FS_STATE_USE_MMAP if (fs_stateCheckIOSafety(state, len)) { ViceLog(0, ("fs_stateRead: read beyond EOF for dump file '%s'\n", state->fn)); ret = 1; goto done; } memcpy(buf, state->mmap.cursor, len); fs_stateIncCursor(state, len); #else if (read(state->fd, buf, len) != len) { ViceLog(0, ("fs_stateRead: read failed\n")); ret = 1; goto done; } #endif done: return ret; }
int fs_stateReadV(struct fs_dump_state * state, struct iovec * iov, int niov) { int i, ret = 0; size_t len = 0; for (i=0; i < niov; i++) { len += iov[i].iov_len; } #ifdef FS_STATE_USE_MMAP if (fs_stateCheckIOSafety(state, len)) { ViceLog(0, ("fs_stateRead: read beyond EOF for dump file '%s'\n", state->fn)); ret = 1; goto done; } for (i=0; i < niov; i++) { memcpy(iov[i].iov_base, state->mmap.cursor, iov[i].iov_len); fs_stateIncCursor(state, iov[i].iov_len); } #else if (readv(state->fd, iov, niov) != len) { ViceLog(0, ("fs_stateReadV: read failed\n")); ret = 1; goto done; } #endif done: return ret; }
int fs_stateWrite(struct fs_dump_state * state, void * buf, size_t len) { int ret = 0; #ifdef FS_STATE_USE_MMAP if (fs_stateCheckIOSafety(state, len)) { if (fs_stateResizeFile(state, len)) { ViceLog(0, ("fs_stateWrite: could not resize dump file '%s'\n", state->fn)); ret = 1; goto done; } } memcpy(state->mmap.cursor, buf, len); fs_stateIncCursor(state, len); #else if (write(state->fd, buf, len) != len) { ViceLog(0, ("fs_stateWrite: write failed\n")); ret = 1; goto done; } #endif done: return ret; }
static int fs_stateMapFile(struct fs_dump_state * state, int preserve_flag ) { int ret = 0, flags; switch(state->mode) { case FS_STATE_LOAD_MODE: flags = PROT_READ | PROT_WRITE; /* loading involves a header invalidation */ break; case FS_STATE_DUMP_MODE: flags = PROT_WRITE; break; default: ViceLog(0, ("fs_stateMapFile: invalid dump state mode\n")); return 1; } state->mmap.map = afs_mmap(NULL, state->file_len, flags, MAP_SHARED, state->fd, 0); if (state->mmap.map == MAP_FAILED) { state->mmap.size = 0; state->mmap.map = NULL; ViceLog(0, ("fs_stateMapFile: failed to memory map file '%s'\n", state->fn)); ret = 1; goto done; } state->mmap.size = state->file_len; state->mmap.cursor = state->mmap.map; if (preserve_flag) { /* don't lose track of where we are during a file resize */ afs_foff_t curr_offset = state->mmap.offset; state->mmap.offset = 0; fs_stateIncCursor(state, curr_offset); } else { /* reset offset */ state->mmap.offset = 0; } /* for state loading, accesses will be sequential, so let's give * the VM subsystem a heads up */ if (state->mode == FS_STATE_LOAD_MODE) { /* XXX madvise may not exist on all platforms, so * we may need to add some ifdefs at some point... */ flags = MADV_SEQUENTIAL | MADV_WILLNEED; #ifdef AFS_SUN510_ENV flags |= MADV_ACCESS_LWP; /* added in solaris 9 12/02 */ #endif madvise(state->mmap.map, state->mmap.size, flags); } done: return ret; }
int fs_stateWriteV(struct fs_dump_state * state, struct iovec * iov, int niov) { int i, ret = 0; size_t len = 0; for (i=0; i < niov; i++) { len += iov[i].iov_len; } #ifdef FS_STATE_USE_MMAP if (fs_stateCheckIOSafety(state, len)) { if (fs_stateResizeFile(state, len)) { ViceLog(0, ("fs_stateWrite: could not resize dump file '%s'\n", state->fn)); ret = 1; goto done; } } for (i=0; i < niov; i++) { memcpy(state->mmap.cursor, iov[i].iov_base, iov[i].iov_len); fs_stateIncCursor(state, iov[i].iov_len); } #else #ifndef AFS_NT40_ENV if (writev(state->fd, iov, niov) != len) { ViceLog(0, ("fs_stateWriteV: write failed\n")); ret = 1; goto done; } #else /* AFS_NT40_ENV */ for (i=0; i < niov; i++) { if (write(state->fd, iov[i].iov_base, iov[i].iov_len) != iov[i].iov_len) { ViceLog(0, ("fs_stateWriteV: write failed\n")); ret = 1; goto done; } } #endif /* AFS_NT40_ENV */ #endif done: return ret; }