Commit 5e829c82 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov

parasite: Unify error reporting scheme

Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 6661b555
...@@ -41,11 +41,18 @@ typedef struct { ...@@ -41,11 +41,18 @@ typedef struct {
} parasite_args_t; } parasite_args_t;
typedef struct { typedef struct {
long ret; long ret; /* custom ret code */
long sys_ret; long sys_ret; /* syscall ret code */
long line; long line; /* where we're failed */
} parasite_status_t; } parasite_status_t;
#define SET_PARASITE_STATUS(st, ret_code, sys_ret_code) \
do { \
st->ret = ret_code, \
st->sys_ret = sys_ret_code, \
st->line = __LINE__; \
} while (0)
typedef struct { typedef struct {
parasite_status_t status; parasite_status_t status;
struct vma_entry vma_entry; struct vma_entry vma_entry;
......
...@@ -94,12 +94,13 @@ static inline int should_dump_page(struct vma_entry *vmae, unsigned char mincore ...@@ -94,12 +94,13 @@ static inline int should_dump_page(struct vma_entry *vmae, unsigned char mincore
*/ */
static int dump_pages(parasite_args_cmd_dumppages_t *args) static int dump_pages(parasite_args_cmd_dumppages_t *args)
{ {
int ret = PARASITE_ERR_FAIL; parasite_status_t *st = &args->status;
unsigned long nrpages, pfn, length; unsigned long nrpages, pfn, length;
unsigned long prot_old, prot_new; unsigned long prot_old, prot_new;
unsigned char *map_brk = NULL; unsigned char *map_brk = NULL;
unsigned char *map; unsigned char *map;
parasite_status_t *st = &args->status;
int ret = PARASITE_ERR_FAIL;
args->nrpages_dumped = 0; args->nrpages_dumped = 0;
prot_old = prot_new = 0; prot_old = prot_new = 0;
...@@ -108,9 +109,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args) ...@@ -108,9 +109,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args)
args->fd = sys_open(args->open_path, args->open_flags, args->open_mode); args->fd = sys_open(args->open_path, args->open_flags, args->open_mode);
if ((long)args->fd < 0) { if ((long)args->fd < 0) {
sys_write_msg("sys_open failed\n"); sys_write_msg("sys_open failed\n");
ret = PARASITE_ERR_OPEN; SET_PARASITE_STATUS(st, PARASITE_ERR_OPEN, args->fd);
st->sys_ret = args->fd; ret = st->ret;
st->ret = ret, st->line = __LINE__;
goto err; goto err;
} }
} }
...@@ -135,9 +135,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args) ...@@ -135,9 +135,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args)
-1, 0); -1, 0);
if ((long)map < 0) { if ((long)map < 0) {
sys_write_msg("sys_mmap failed\n"); sys_write_msg("sys_mmap failed\n");
ret = PARASITE_ERR_MMAP; SET_PARASITE_STATUS(st, PARASITE_ERR_MMAP, (long)map);
st->sys_ret = (long)map; ret = st->ret;
st->ret = ret, st->line = __LINE__;
goto err; goto err;
} }
} }
...@@ -154,9 +153,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args) ...@@ -154,9 +153,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args)
prot_new); prot_new);
if (ret) { if (ret) {
sys_write_msg("sys_mprotect failed\n"); sys_write_msg("sys_mprotect failed\n");
ret = PARASITE_ERR_MPROTECT; SET_PARASITE_STATUS(st, PARASITE_ERR_MPROTECT, ret);
st->sys_ret = ret; ret = st->ret;
st->ret = ret, st->line = __LINE__;
goto err_free; goto err_free;
} }
} }
...@@ -169,9 +167,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args) ...@@ -169,9 +167,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args)
ret = sys_mincore((unsigned long)args->vma_entry.start, length, map); ret = sys_mincore((unsigned long)args->vma_entry.start, length, map);
if (ret) { if (ret) {
sys_write_msg("sys_mincore failed\n"); sys_write_msg("sys_mincore failed\n");
st->sys_ret = ret; SET_PARASITE_STATUS(st, PARASITE_ERR_MINCORE, ret);
ret = PARASITE_ERR_MINCORE; ret = st->ret;
st->ret = ret, st->line = __LINE__;
goto err_free; goto err_free;
} }
...@@ -190,10 +187,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args) ...@@ -190,10 +187,8 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args)
written += sys_write(args->fd, &vaddr, sizeof(vaddr)); written += sys_write(args->fd, &vaddr, sizeof(vaddr));
written += sys_write(args->fd, (void *)vaddr, PAGE_SIZE); written += sys_write(args->fd, (void *)vaddr, PAGE_SIZE);
if (written != sizeof(vaddr) + PAGE_SIZE) { if (written != sizeof(vaddr) + PAGE_SIZE) {
st->sys_ret = written; /* The caller are to decode value */ SET_PARASITE_STATUS(st, PARASITE_ERR_WRITE, written);
ret = PARASITE_ERR_WRITE; ret = st->ret;
sys_write_msg("sys_write on page failed\n");
st->ret = ret, st->line = __LINE__;
goto err_free; goto err_free;
} }
...@@ -209,16 +204,15 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args) ...@@ -209,16 +204,15 @@ static int dump_pages(parasite_args_cmd_dumppages_t *args)
(unsigned long)vma_entry_len(&args->vma_entry), (unsigned long)vma_entry_len(&args->vma_entry),
prot_old); prot_old);
if (ret) { if (ret) {
sys_write_msg("PANIC: Ouch! sys_mprotect failed on resore\n"); sys_write_msg("PANIC: Ouch! sys_mprotect failed on restore\n");
st->sys_ret = ret; SET_PARASITE_STATUS(st, PARASITE_ERR_MPROTECT, ret);
ret = PARASITE_ERR_MPROTECT; ret = st->ret;
st->ret = ret, st->line = __LINE__;
goto err_free; goto err_free;
} }
} }
/* on success ret = 0 */ /* on success ret = 0 */
st->ret = ret, st->line = __LINE__; SET_PARASITE_STATUS(st, ret, ret);
err_free: err_free:
if (map_brk) if (map_brk)
...@@ -231,17 +225,18 @@ err: ...@@ -231,17 +225,18 @@ err:
static int dump_sigact(parasite_args_cmd_dumpsigacts_t *args) static int dump_sigact(parasite_args_cmd_dumpsigacts_t *args)
{ {
int fd;
int ret = PARASITE_ERR_FAIL;
int sig;
struct sigaction act;
parasite_status_t *st = &args->status; parasite_status_t *st = &args->status;
struct sigaction act;
int fd, sig;
int ret = PARASITE_ERR_FAIL;
fd = sys_open(args->open_path, args->open_flags, args->open_mode); fd = sys_open(args->open_path, args->open_flags, args->open_mode);
if (fd < 0) { if (fd < 0) {
sys_write_msg("sys_open failed\n"); sys_write_msg("sys_open failed\n");
st->ret = PARASITE_ERR_OPEN, st->line = __LINE__; SET_PARASITE_STATUS(st, PARASITE_ERR_OPEN, fd);
return 1; ret = st->ret;
return ret;
} }
for (sig = 1; sig < SIGMAX; sig++) { for (sig = 1; sig < SIGMAX; sig++) {
...@@ -251,20 +246,23 @@ static int dump_sigact(parasite_args_cmd_dumpsigacts_t *args) ...@@ -251,20 +246,23 @@ static int dump_sigact(parasite_args_cmd_dumpsigacts_t *args)
ret = sys_sigaction(sig, NULL, &act); ret = sys_sigaction(sig, NULL, &act);
if (ret < 0) { if (ret < 0) {
sys_write_msg("sys_sigaction failed\n"); sys_write_msg("sys_sigaction failed\n");
st->ret = PARASITE_ERR_SIGACTION, st->line = __LINE__; SET_PARASITE_STATUS(st, PARASITE_ERR_SIGACTION, ret);
ret = st->ret;
goto err_close; goto err_close;
} }
ret = sys_write(fd, &act, sizeof(act)); ret = sys_write(fd, &act, sizeof(act));
if (ret != sizeof(act)) { if (ret != sizeof(act)) {
sys_write_msg("sys_write failed\n"); sys_write_msg("sys_write failed\n");
st->sys_ret = ret; SET_PARASITE_STATUS(st, PARASITE_ERR_WRITE, ret);
st->ret = PARASITE_ERR_WRITE, st->line = __LINE__; ret = st->ret;
ret = -1;
goto err_close; goto err_close;
} }
} }
st->ret = ret = 0, st->line = __LINE__;
ret = 0;
SET_PARASITE_STATUS(st, 0, ret);
err_close: err_close:
sys_close(fd); sys_close(fd);
return ret; return ret;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment