Messages in this thread Patch in this message | | | Date | Tue, 10 Apr 2012 17:27:47 +0400 | From | Stanislav Kinsbursky <> | Subject | [CRIU] [PATCH v2 2/4] ipc: move all checkpoint-restore code under appropriate define |
| |
v2: added dummy compat_do_msg_peek_all() and do_msg_peek_all() functions used in case of CONFIG_CHECKPOINT_RESTORE is not defined.
All new checkpoint/restore code parts are now covered with CONFIG_CHECKPOINT_RESTORE macro. So it would be easy to remove them, in case the whole project fails.
--- ipc/compat.c | 8 +++++++- ipc/msg.c | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 1 deletions(-)
diff --git a/ipc/compat.c b/ipc/compat.c index 96cb9db..87317ff 100644 --- a/ipc/compat.c +++ b/ipc/compat.c @@ -334,7 +334,7 @@ long compat_sys_msgsnd(int first, int second, int third, void __user *uptr) return do_msgsnd(first, type, up->mtext, second, third); }
- +#ifdef CONFIG_CHECKPOINT_RESTORE static long compat_do_msg_peek_all(void __user *dest, struct msg_msg *msg, size_t bufsz) { struct compat_msgbuf_a __user *msgp = dest; @@ -354,6 +354,12 @@ static long compat_do_msg_peek_all(void __user *dest, struct msg_msg *msg, size_ return -EFAULT; return msgsz; } +#else +static long compat_do_msg_peek_all(void __user *dest, struct msg_msg *msg, size_t bufsz) +{ + return -EINVAL; +} +#endif
long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz) { diff --git a/ipc/msg.c b/ipc/msg.c index 017bf0b..af08fe6 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -762,6 +762,7 @@ static inline int convert_mode(long *msgtyp, int msgflg) return SEARCH_EQUAL; }
+#ifdef CONFIG_CHECKPOINT_RESTORE static long do_msg_peek_all(void __user *dest, struct msg_msg *msg, size_t bufsz) { struct msgbuf_a __user *msgp = dest; @@ -788,6 +789,12 @@ static long do_msg_peek_all(void __user *dest, struct msg_msg *msg, size_t bufsz return -EFAULT; return msgsz; } +#else +static long do_msg_peek_all(void __user *dest, struct msg_msg *msg, size_t bufsz) +{ + return -EINVAL; +} +#endif
static long do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz) { @@ -811,7 +818,9 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, struct msg_msg *msg; int mode; struct ipc_namespace *ns; +#ifdef CONFIG_CHECKPOINT_RESTORE size_t arrsz = bufsz; +#endif
if (msqid < 0 || (long) bufsz < 0) return -EINVAL; @@ -845,6 +854,7 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, walk_msg->m_type != 1) { msg = walk_msg; msgtyp = walk_msg->m_type - 1; +#ifdef CONFIG_CHECKPOINT_RESTORE } else if (msgflg & MSG_PEEK_ALL) { long ret;
@@ -855,6 +865,7 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, } buf += ret; arrsz -= ret; +#endif } else { msg = walk_msg; break; @@ -863,8 +874,10 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, tmp = tmp->next; } if (!IS_ERR(msg)) { +#ifdef CONFIG_CHECKPOINT_RESTORE if (msgflg & MSG_PEEK_ALL) goto out_unlock; +#endif /* * Found a suitable message. * Unlink it from the queue. @@ -959,8 +972,10 @@ out_unlock: if (IS_ERR(msg)) return PTR_ERR(msg);
+#ifdef CONFIG_CHECKPOINT_RESTORE if (msgflg & MSG_PEEK_ALL) return bufsz - arrsz; +#endif
bufsz = msg_fill(buf, msg, bufsz); free_msg(msg);
| |