Module: xenomai-3 Branch: next Commit: 10078a95d180c0bfbc2b1068ba1b46d842e87fe9 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=10078a95d180c0bfbc2b1068ba1b46d842e87fe9
Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> Date: Sat Oct 25 21:52:07 2014 +0200 cobalt/mqueue: use rtdm fd flags --- include/cobalt/uapi/syscall.h | 2 +- .../arch/x86/include/asm/xenomai/syscall32-table.h | 1 - kernel/cobalt/posix/mqueue.c | 79 +++----------------- kernel/cobalt/posix/mqueue.h | 7 -- kernel/cobalt/posix/syscall.c | 5 +- kernel/cobalt/posix/syscall32.c | 21 ------ kernel/cobalt/posix/syscall32.h | 4 - lib/cobalt/mq.c | 19 ++++- 8 files changed, 29 insertions(+), 109 deletions(-) diff --git a/include/cobalt/uapi/syscall.h b/include/cobalt/uapi/syscall.h index 025d2ff..0f74f37 100644 --- a/include/cobalt/uapi/syscall.h +++ b/include/cobalt/uapi/syscall.h @@ -63,7 +63,7 @@ #define sc_cobalt_mq_close 40 #define sc_cobalt_mq_unlink 41 #define sc_cobalt_mq_getattr 42 -#define sc_cobalt_mq_setattr 43 +/* 43 unimp */ #define sc_cobalt_mq_timedsend 44 #define sc_cobalt_mq_timedreceive 45 #define sc_cobalt_mq_notify 46 diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h index 1c84ef3..9f2f000 100644 --- a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h +++ b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h @@ -37,7 +37,6 @@ __COBALT_CALL32emu_THUNK(mutex_timedlock) __COBALT_CALL32emu_THUNK(cond_wait_prologue) __COBALT_CALL32emu_THUNK(mq_open) __COBALT_CALL32emu_THUNK(mq_getattr) -__COBALT_CALL32emu_THUNK(mq_setattr) __COBALT_CALL32emu_THUNK(mq_timedsend) __COBALT_CALL32emu_THUNK(mq_timedreceive) __COBALT_CALL32emu_THUNK(mq_notify) diff --git a/kernel/cobalt/posix/mqueue.c b/kernel/cobalt/posix/mqueue.c index 33d8310..b922d5c 100644 --- a/kernel/cobalt/posix/mqueue.c +++ b/kernel/cobalt/posix/mqueue.c @@ -31,7 +31,7 @@ #define COBALT_MSGMAX 65536 #define COBALT_MSGSIZEMAX (16*1024*1024) -#define COBALT_MSGPRIOMAX 32768 +#define COBALT_MSGPRIOMAX 32768 struct cobalt_mq { unsigned magic; @@ -62,7 +62,6 @@ struct cobalt_mq { }; struct cobalt_mqd { - long flags; struct cobalt_mq *mq; struct rtdm_fd fd; }; @@ -228,7 +227,7 @@ mqd_select(struct rtdm_fd *fd, struct xnselector *selector, switch(type) { case XNSELECT_READ: err = -EBADF; - if ((mqd->flags & COBALT_PERMS_MASK) == O_WRONLY) + if ((rtdm_fd_flags(fd) & COBALT_PERMS_MASK) == O_WRONLY) goto unlock_and_error; err = xnselect_bind(&mq->read_select, binding, @@ -240,7 +239,7 @@ mqd_select(struct rtdm_fd *fd, struct xnselector *selector, case XNSELECT_WRITE: err = -EBADF; - if ((mqd->flags & COBALT_PERMS_MASK) == O_RDONLY) + if ((rtdm_fd_flags(fd) & COBALT_PERMS_MASK) == O_RDONLY) goto unlock_and_error; err = xnselect_bind(&mq->write_select, binding, @@ -275,7 +274,7 @@ static inline int mqd_create(struct cobalt_mq *mq, unsigned long flags, int ufd) if (mqd == NULL) return -ENOSPC; - mqd->flags = flags; + mqd->fd.oflags = flags; mqd->mq = mq; return rtdm_fd_enter(&mqd->fd, ufd, COBALT_MQD_MAGIC, &mqd_ops); @@ -416,7 +415,7 @@ mq_trysend(struct cobalt_mqd *mqd, size_t len) unsigned flags; mq = mqd->mq; - flags = mqd->flags & COBALT_PERMS_MASK; + flags = rtdm_fd_flags(&mqd->fd) & COBALT_PERMS_MASK; if (flags != O_WRONLY && flags != O_RDWR) return ERR_PTR(-EBADF); @@ -442,7 +441,7 @@ mq_tryrcv(struct cobalt_mqd *mqd, size_t len) struct cobalt_mq *mq; mq = mqd->mq; - flags = mqd->flags & COBALT_PERMS_MASK; + flags = rtdm_fd_flags(&mqd->fd) & COBALT_PERMS_MASK; if (flags != O_RDONLY && flags != O_RDWR) return ERR_PTR(-EBADF); @@ -485,7 +484,7 @@ redo: if (msg != ERR_PTR(-EAGAIN)) goto out; - if (mqd->flags & O_NONBLOCK) + if (rtdm_fd_flags(&mqd->fd) & O_NONBLOCK) goto out; if (fetch_timeout) { @@ -614,7 +613,7 @@ redo: if (msg != ERR_PTR(-EAGAIN)) goto out; - if (mqd->flags & O_NONBLOCK) + if (rtdm_fd_flags(&mqd->fd) & O_NONBLOCK) goto out; if (fetch_timeout) { @@ -668,36 +667,13 @@ static inline int mq_getattr(struct cobalt_mqd *mqd, struct mq_attr *attr) mq = mqd->mq; *attr = mq->attr; xnlock_get_irqsave(&nklock, s); - attr->mq_flags = mqd->flags; + attr->mq_flags = rtdm_fd_flags(&mqd->fd); attr->mq_curmsgs = mq->nrqueued; xnlock_put_irqrestore(&nklock, s); return 0; } -static inline int mq_setattr(struct cobalt_mqd *mqd, - const struct mq_attr *__restrict__ attr, - struct mq_attr *__restrict__ oattr) -{ - struct cobalt_mq *mq; - long flags; - spl_t s; - - xnlock_get_irqsave(&nklock, s); - mq = mqd->mq; - if (oattr) { - *oattr = mq->attr; - oattr->mq_flags = mqd->flags; - oattr->mq_curmsgs = mq->nrqueued; - } - flags = (mqd->flags & COBALT_PERMS_MASK) - | (attr->mq_flags & ~COBALT_PERMS_MASK); - mqd->flags = flags; - xnlock_put_irqrestore(&nklock, s); - - return 0; -} - static inline int mq_notify(struct cobalt_mqd *mqd, unsigned index, const struct sigevent *evp) { @@ -901,43 +877,6 @@ COBALT_SYSCALL(mq_getattr, current, return __xn_safe_copy_to_user(u_attr, &attr, sizeof(attr)); } -int __cobalt_mq_setattr(mqd_t uqd, const struct mq_attr *attr, - struct mq_attr *oattr) -{ - struct cobalt_mqd *mqd; - int ret; - - mqd = cobalt_mqd_get(uqd); - if (IS_ERR(mqd)) - return PTR_ERR(mqd); - - trace_cobalt_mq_setattr(uqd, attr); - ret = mq_setattr(mqd, attr, oattr); - cobalt_mqd_put(mqd); - - return ret; -} - -COBALT_SYSCALL(mq_setattr, current, - int, (mqd_t uqd, const struct mq_attr __user *u_attr, - struct mq_attr __user *u_oattr)) -{ - struct mq_attr attr, oattr; - int ret; - - if (__xn_safe_copy_from_user(&attr, u_attr, sizeof(attr))) - return -EFAULT; - - ret = __cobalt_mq_setattr(uqd, &attr, &oattr); - if (ret) - return ret; - - if (u_oattr == NULL) - return 0; - - return __xn_safe_copy_to_user(u_oattr, &oattr, sizeof(oattr)); -} - static inline int mq_fetch_timeout(struct timespec *ts, const void __user *u_ts) { diff --git a/kernel/cobalt/posix/mqueue.h b/kernel/cobalt/posix/mqueue.h index 8fc42d0..43c862f 100644 --- a/kernel/cobalt/posix/mqueue.h +++ b/kernel/cobalt/posix/mqueue.h @@ -35,9 +35,6 @@ int __cobalt_mq_open(const char __user *u_name, int oflags, int __cobalt_mq_getattr(mqd_t uqd, struct mq_attr *attr); -int __cobalt_mq_setattr(mqd_t uqd, const struct mq_attr *attr, - struct mq_attr *oattr); - int __cobalt_mq_timedsend(mqd_t uqd, const void __user *u_buf, size_t len, unsigned int prio, const void __user *u_ts, int (*fetch_timeout)(struct timespec *ts, @@ -64,10 +61,6 @@ COBALT_SYSCALL_DECL(mq_unlink, COBALT_SYSCALL_DECL(mq_getattr, int, (mqd_t uqd, struct mq_attr __user *u_attr)); -COBALT_SYSCALL_DECL(mq_setattr, - int, (mqd_t uqd, const struct mq_attr __user *u_attr, - struct mq_attr __user *u_oattr)); - COBALT_SYSCALL_DECL(mq_timedsend, int, (mqd_t uqd, const void __user *u_buf, size_t len, unsigned int prio, diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c index 1b128f1..60a385b 100644 --- a/kernel/cobalt/posix/syscall.c +++ b/kernel/cobalt/posix/syscall.c @@ -557,7 +557,6 @@ static const cobalt_syshand cobalt_syscalls[] = { __COBALT_CALL_ENTRY(mq_close), __COBALT_CALL_ENTRY(mq_unlink), __COBALT_CALL_ENTRY(mq_getattr), - __COBALT_CALL_ENTRY(mq_setattr), __COBALT_CALL_ENTRY(mq_timedsend), __COBALT_CALL_ENTRY(mq_timedreceive), __COBALT_CALL_ENTRY(mq_notify), @@ -612,7 +611,8 @@ static const cobalt_syshand cobalt_syscalls[] = { __COBALT_CALL_ENTRY(serialdbg), __COBALT_CALL_ENTRY(sysconf), __COBALT_CALL_ENTRY(sysctl), - __COBALT_CALL_ENTRY(fcntl), + __COBALT_CALL_ENTRY(fcntl) + /* NO COMMA AT END */ #ifdef CONFIG_XENO_ARCH_SYS3264 #include <asm/xenomai/syscall32-table.h> #endif @@ -662,7 +662,6 @@ static const int cobalt_sysmodes[] = { __COBALT_MODE(mq_close, lostage), __COBALT_MODE(mq_unlink, lostage), __COBALT_MODE(mq_getattr, current), - __COBALT_MODE(mq_setattr, current), __COBALT_MODE(mq_timedsend, primary), __COBALT_MODE(mq_timedreceive, primary), __COBALT_MODE(mq_notify, primary), diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c index 9bc852e..61c619f 100644 --- a/kernel/cobalt/posix/syscall32.c +++ b/kernel/cobalt/posix/syscall32.c @@ -230,27 +230,6 @@ COBALT_SYSCALL32emu(mq_getattr, current, return sys32_put_mqattr(u_attr, &attr); } -COBALT_SYSCALL32emu(mq_setattr, current, - int, (mqd_t uqd, const struct compat_mq_attr __user *u_attr, - struct compat_mq_attr __user *u_oattr)) -{ - struct mq_attr attr, oattr; - int ret; - - ret = sys32_get_mqattr(&attr, u_attr); - if (ret) - return ret; - - ret = __cobalt_mq_setattr(uqd, &attr, &oattr); - if (ret) - return ret; - - if (u_oattr == NULL) - return 0; - - return sys32_put_mqattr(u_oattr, &oattr); -} - COBALT_SYSCALL32emu(mq_timedsend, primary, int, (mqd_t uqd, const void __user *u_buf, size_t len, unsigned int prio, diff --git a/kernel/cobalt/posix/syscall32.h b/kernel/cobalt/posix/syscall32.h index 99fe140..7c2be00 100644 --- a/kernel/cobalt/posix/syscall32.h +++ b/kernel/cobalt/posix/syscall32.h @@ -80,10 +80,6 @@ COBALT_SYSCALL32emu_DECL(mq_open, COBALT_SYSCALL32emu_DECL(mq_getattr, int, (mqd_t uqd, struct compat_mq_attr __user *u_attr)); -COBALT_SYSCALL32emu_DECL(mq_setattr, - int, (mqd_t uqd, const struct compat_mq_attr __user *u_attr, - struct compat_mq_attr __user *u_oattr)); - COBALT_SYSCALL32emu_DECL(mq_timedsend, int, (mqd_t uqd, const void __user *u_buf, size_t len, unsigned int prio, diff --git a/lib/cobalt/mq.c b/lib/cobalt/mq.c index 49e9db3..a1aed3b 100644 --- a/lib/cobalt/mq.c +++ b/lib/cobalt/mq.c @@ -258,12 +258,27 @@ COBALT_IMPL(int, mq_setattr, (mqd_t mqd, const struct mq_attr *__restrict__ attr, struct mq_attr *__restrict__ oattr)) { - int err; + int err = 0, flags; + + if (oattr) { + err = XENOMAI_SYSCALL2(sc_cobalt_mq_getattr, mqd, oattr); + if (err < 0) + goto out_err; + flags = oattr->mq_flags; + } else { + err = __WRAP(fcntl(mqd, F_GETFL)); + if (err < 0) + goto out_err; + flags = err; + } + + flags = (flags & ~O_NONBLOCK) | (attr->mq_flags & O_NONBLOCK); - err = XENOMAI_SYSCALL3(sc_cobalt_mq_setattr, mqd, attr, oattr); + err = __WRAP(fcntl(mqd, F_SETFL, flags)); if (!err) return 0; + out_err: errno = -err; return -1; } _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git