diff options
Diffstat (limited to 'ipc/msgutil.c')
| -rw-r--r-- | ipc/msgutil.c | 43 | 
1 files changed, 43 insertions, 0 deletions
diff --git a/ipc/msgutil.c b/ipc/msgutil.c index 6471f1bdae9..ebfcbfa8b7f 100644 --- a/ipc/msgutil.c +++ b/ipc/msgutil.c @@ -102,7 +102,50 @@ out_err:  	free_msg(msg);  	return ERR_PTR(err);  } +#ifdef CONFIG_CHECKPOINT_RESTORE +struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst) +{ +	struct msg_msgseg *dst_pseg, *src_pseg; +	int len = src->m_ts; +	int alen; + +	BUG_ON(dst == NULL); +	if (src->m_ts > dst->m_ts) +		return ERR_PTR(-EINVAL); +	alen = len; +	if (alen > DATALEN_MSG) +		alen = DATALEN_MSG; + +	dst->next = NULL; +	dst->security = NULL; + +	memcpy(dst + 1, src + 1, alen); + +	len -= alen; +	dst_pseg = dst->next; +	src_pseg = src->next; +	while (len > 0) { +		alen = len; +		if (alen > DATALEN_SEG) +			alen = DATALEN_SEG; +		memcpy(dst_pseg + 1, src_pseg + 1, alen); +		dst_pseg = dst_pseg->next; +		len -= alen; +		src_pseg = src_pseg->next; +	} + +	dst->m_type = src->m_type; +	dst->m_ts = src->m_ts; + +	return dst; +} +#else +struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst) +{ +	return ERR_PTR(-ENOSYS); +} +#endif  int store_msg(void __user *dest, struct msg_msg *msg, int len)  {  	int alen;  |