Skip to content

Commit ae19703

Browse files
committed
Handle execv in SplitFS
1 parent 61b8fb8 commit ae19703

File tree

3 files changed

+141
-2
lines changed

3 files changed

+141
-2
lines changed

splitfs/fileops_hub.c

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ RETT_EXECVE _hub_EXECVE(INTF_EXECVE);
254254
RETT_EXECVP ALIAS_EXECVP(INTF_EXECVP) WEAK_ALIAS("_hub_EXECVP");
255255
RETT_EXECVP _hub_EXECVP(INTF_EXECVP);
256256

257+
RETT_EXECV ALIAS_EXECV(INTF_EXECV) WEAK_ALIAS("_hub_EXECV");
258+
RETT_EXECV _hub_EXECV(INTF_EXECV);
259+
257260
RETT_MKNOD ALIAS_MKNOD(INTF_MKNOD) WEAK_ALIAS("_hub_MKNOD");
258261
RETT_MKNOD _hub_MKNOD(INTF_MKNOD);
259262

@@ -923,6 +926,58 @@ RETT_EXECVP _hub_EXECVP(INTF_EXECVP) {
923926
return result;
924927
}
925928

929+
RETT_EXECV _hub_EXECV(INTF_EXECV) {
930+
int pid = getpid();
931+
char exec_hub_filename[BUF_SIZE];
932+
933+
HUB_CHECK_RESOLVE_FILEOPS(_hub_, EXECV);
934+
935+
struct Fileops_p* op_to_use = NULL;
936+
int result = -1, exec_hub_fd = -1, i = 0;
937+
int hub_ops[1024];
938+
unsigned long offset_in_map = 0;
939+
940+
for (i = 0; i < 1024; i++) {
941+
if (_hub_fd_lookup[i] == NULL)
942+
hub_ops[i] = 0;
943+
if (_hub_fd_lookup[i] == _hub_fileops)
944+
hub_ops[i] = 1;
945+
if (_hub_fd_lookup[i] == _hub_managed_fileops)
946+
hub_ops[i] = 2;
947+
}
948+
949+
sprintf(exec_hub_filename, "exec-hub-%d", pid);
950+
exec_hub_fd = shm_open(exec_hub_filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
951+
if (exec_hub_fd == -1) {
952+
printf("%s: %s\n", __func__, strerror(errno));
953+
assert(0);
954+
}
955+
956+
int res = _hub_fileops->FTRUNC64(exec_hub_fd, (1024*1024));
957+
if (res == -1) {
958+
printf("%s: ftruncate failed. Err = %s\n", __func__, strerror(errno));
959+
assert(0);
960+
}
961+
962+
char *shm_area = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED, exec_hub_fd, 0);
963+
if (shm_area == NULL) {
964+
printf("%s: mmap failed. Err = %s\n", __func__, strerror(errno));
965+
assert(0);
966+
}
967+
968+
if (memcpy(shm_area + offset_in_map, hub_ops, 1024 * sizeof(int)) == NULL) {
969+
printf("%s: memcpy of hub ops failed. Err = %s\n", __func__, strerror(errno));
970+
assert(0);
971+
}
972+
973+
offset_in_map += (1024 * sizeof(int));
974+
975+
op_to_use = _hub_managed_fileops;
976+
result = op_to_use->EXECV(CALL_EXECV);
977+
978+
return result;
979+
}
980+
926981
RETT_SHM_COPY _hub_SHM_COPY() {
927982

928983
HUB_CHECK_RESOLVE_FILEOPS(_hub_, SHM_COPY);

splitfs/fileops_nvp.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4912,6 +4912,84 @@ RETT_EXECVP _nvp_EXECVP(INTF_EXECVP) {
49124912
return _nvp_fileops->EXECVP(CALL_EXECVP);
49134913
}
49144914

4915+
RETT_EXECV _nvp_EXECV(INTF_EXECV) {
4916+
4917+
int exec_ledger_fd = -1, i = 0;
4918+
unsigned long offset_in_map = 0;
4919+
int pid = getpid();
4920+
char exec_nvp_filename[BUF_SIZE];
4921+
4922+
for (i = 0; i < 1024; i++) {
4923+
if (_nvp_fd_lookup[i].offset != NULL)
4924+
execve_fd_passing[i] = *(_nvp_fd_lookup[i].offset);
4925+
else
4926+
execve_fd_passing[i] = 0;
4927+
}
4928+
4929+
for (i = 0; i < OPEN_MAX; i++) {
4930+
if (_nvp_fd_lookup[i].node != NULL && _nvp_fd_lookup[i].valid)
4931+
_nvp_FSYNC(_nvp_fd_lookup[i].fd);
4932+
}
4933+
4934+
sprintf(exec_nvp_filename, "exec-ledger-%d", pid);
4935+
exec_ledger_fd = shm_open(exec_nvp_filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
4936+
if (exec_ledger_fd == -1) {
4937+
printf("%s: %s\n", __func__, strerror(errno));
4938+
assert(0);
4939+
}
4940+
4941+
int res = _nvp_fileops->FTRUNC64(exec_ledger_fd, (10*1024*1024));
4942+
if (res == -1) {
4943+
printf("%s: ftruncate failed. Err = %s\n", __func__, strerror(errno));
4944+
assert(0);
4945+
}
4946+
4947+
char *shm_area = mmap(NULL, 10*1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED, exec_ledger_fd, 0);
4948+
if (shm_area == NULL) {
4949+
printf("%s: mmap failed. Err = %s\n", __func__, strerror(errno));
4950+
assert(0);
4951+
}
4952+
4953+
if (memcpy(shm_area + offset_in_map, _nvp_fd_lookup, 1024 * sizeof(struct NVFile)) == NULL) {
4954+
printf("%s: memcpy of fd lookup failed. Err = %s\n", __func__, strerror(errno));
4955+
assert(0);
4956+
}
4957+
4958+
offset_in_map += (1024 * sizeof(struct NVFile));
4959+
4960+
if (memcpy(shm_area + offset_in_map, execve_fd_passing, 1024 * sizeof(int)) == NULL) {
4961+
printf("%s: memcpy of execve offset failed. Err = %s\n", __func__, strerror(errno));
4962+
assert(0);
4963+
}
4964+
4965+
offset_in_map += (1024 * sizeof(int));
4966+
4967+
4968+
if (memcpy(shm_area + offset_in_map, _nvp_node_lookup[0], 1024*sizeof(struct NVNode)) == NULL) {
4969+
printf("%s: memcpy of node lookup failed. Err = %s\n", __func__, strerror(errno));
4970+
assert(0);
4971+
}
4972+
4973+
offset_in_map += (1024*sizeof(struct NVNode));
4974+
4975+
if (memcpy(shm_area + offset_in_map, _nvp_ino_lookup, 1024 * sizeof(int)) == NULL) {
4976+
printf("%s: memcpy of ino lookup failed. Err = %s\n", __func__, strerror(errno));
4977+
assert(0);
4978+
}
4979+
4980+
offset_in_map += (1024 * sizeof(int));
4981+
4982+
if (memcpy(shm_area + offset_in_map, _nvp_free_node_list[0], 1024*sizeof(struct StackNode)) == NULL) {
4983+
printf("%s: memcpy of free node list failed. Err = %s\n", __func__, strerror(errno));
4984+
assert(0);
4985+
}
4986+
4987+
offset_in_map += (1024 * sizeof(struct StackNode));
4988+
4989+
nvp_free_dr_mmaps();
4990+
return _nvp_fileops->EXECV(CALL_EXECV);
4991+
}
4992+
49154993
#ifdef TRACE_FP_CALLS
49164994
RETT_FCLOSE _nvp_FCLOSE(INTF_FCLOSE)
49174995
{

splitfs/nv_common.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ int execv_done;
8787

8888
#define ALLOPS_FINITEPARAMS_WPAREN (READ) (FREAD) (WRITE) (FWRITE) (FSEEK) (FTELL) (FTELLO) (CLOSE) (FCLOSE) (SEEK) (FTRUNC) (DUP) (DUP2) (FORK) (VFORK) (READV) (WRITEV) (PIPE) (SOCKETPAIR) OPS_FINITEPARAMS_64 (PREAD) (PWRITE) (FSYNC) (FDSYNC) (SOCKET) (ACCEPT) (UNLINK) (UNLINKAT)
8989
//(POSIX_FALLOCATE) (POSIX_FALLOCATE64) (FALLOCATE) (STAT) (STAT64) (FSTAT) (FSTAT64) (LSTAT) (LSTAT64)
90-
#define ALLOPS_WPAREN (OPEN) (OPENAT) (CREAT) (EXECVE) (EXECVP) (FOPEN) (FOPEN64) (IOCTL) (TRUNC) (MKNOD) (MKNODAT) ALLOPS_FINITEPARAMS_WPAREN
90+
#define ALLOPS_WPAREN (OPEN) (OPENAT) (CREAT) (EXECVE) (EXECVP) (EXECV) (FOPEN) (FOPEN64) (IOCTL) (TRUNC) (MKNOD) (MKNODAT) ALLOPS_FINITEPARAMS_WPAREN
9191
#define SHM_WPAREN (SHM_COPY)
9292
// NOTE: clone is missing on purpose.(MMAP) (MUNMAP) (MSYNC) (CLONE) (MMAP64)
9393
#define METAOPS (MKDIR) (RENAME) (LINK) (SYMLINK) (RMDIR) (SYMLINKAT) (MKDIRAT)
@@ -96,7 +96,7 @@ int execv_done;
9696

9797
#define ALLOPS_FINITEPARAMS_WPAREN (READ) (WRITE) (CLOSE) (SEEK) (FTRUNC) (DUP) (DUP2) (FORK) (VFORK) (READV) (WRITEV) (PIPE) (SOCKETPAIR) OPS_FINITEPARAMS_64 (PREAD) (PWRITE) (FSYNC) (FDSYNC) (SOCKET) (ACCEPT) (UNLINK) (UNLINKAT)
9898
//(POSIX_FALLOCATE) (POSIX_FALLOCATE64) (FALLOCATE) (STAT) (STAT64) (FSTAT) (FSTAT64) (LSTAT) (LSTAT64)
99-
#define ALLOPS_WPAREN (OPEN) (OPENAT) (CREAT) (EXECVE) (EXECVP) (IOCTL) (TRUNC) (MKNOD) (MKNODAT) ALLOPS_FINITEPARAMS_WPAREN
99+
#define ALLOPS_WPAREN (OPEN) (OPENAT) (CREAT) (EXECVE) (EXECVP) (EXECV) (IOCTL) (TRUNC) (MKNOD) (MKNODAT) ALLOPS_FINITEPARAMS_WPAREN
100100
#define SHM_WPAREN (SHM_COPY)
101101
#define METAOPS (MKDIR) (RENAME) (LINK) (SYMLINK) (RMDIR) (SYMLINKAT) (MKDIRAT)
102102

@@ -195,6 +195,7 @@ struct Fileops_p* default_resolve_fileops(char* tree, char* name);
195195
#define ALIAS_CREAT creat
196196
#define ALIAS_EXECVE execve
197197
#define ALIAS_EXECVP execvp
198+
#define ALIAS_EXECV execv
198199
#define ALIAS_MKNOD __xmknod
199200
#define ALIAS_MKNODAT __xmknodat
200201

@@ -269,6 +270,7 @@ struct Fileops_p* default_resolve_fileops(char* tree, char* name);
269270
#define RETT_CREAT int
270271
#define RETT_EXECVE int
271272
#define RETT_EXECVP int
273+
#define RETT_EXECV int
272274
#define RETT_SHM_COPY void
273275
#define RETT_MKNOD int
274276
#define RETT_MKNODAT int
@@ -344,6 +346,7 @@ struct Fileops_p* default_resolve_fileops(char* tree, char* name);
344346
#define INTF_CREAT const char *path, mode_t mode
345347
#define INTF_EXECVE const char *filename, char *const argv[], char *const envp[]
346348
#define INTF_EXECVP const char *file, char *const argv[]
349+
#define INTF_EXECV const char *path, char *const argv[]
347350
#define INTF_SHM_COPY void
348351
#define INTF_MKNOD int ver, const char* path, mode_t mode, dev_t* dev
349352
#define INTF_MKNODAT int ver, int dirfd, const char* path, mode_t mode, dev_t* dev
@@ -419,6 +422,7 @@ struct Fileops_p* default_resolve_fileops(char* tree, char* name);
419422
#define CALL_CREAT path, mode
420423
#define CALL_EXECVE filename, argv, envp
421424
#define CALL_EXECVP file, argv
425+
#define CALL_EXECV path, argv
422426
#define CALL_MKNOD ver, path, mode, dev
423427
#define CALL_MKNODAT ver, dirfd, path, mode, dev
424428

@@ -492,6 +496,7 @@ struct Fileops_p* default_resolve_fileops(char* tree, char* name);
492496
#define PFFS_CREAT "%s, %i"
493497
#define PFFS_EXECVE "%s, %s, %s"
494498
#define PFFS_EXECVP "%s, %s"
499+
#define PFFS_EXECV "%s, %s"
495500
#define PFFS_SHM_COPY ""
496501
#define PFFS_MKNOD "%i, %s, %i, %p"
497502
#define PFFS_MKNODAT "%i, %i, %s, %i, %p"
@@ -567,6 +572,7 @@ struct Fileops_p* default_resolve_fileops(char* tree, char* name);
567572
#define STD_CREAT __creat
568573
#define STD_EXECVE __execve
569574
#define STD_EXECVP __execvp
575+
#define STD_EXECV __execv
570576
#define STD_MKNOD __xmknod
571577
#define STD_MKNODAT __xmknodat
572578

0 commit comments

Comments
 (0)