16 #include <linux/capability.h>
22 #include <linux/sysctl.h>
23 #include <linux/poll.h>
25 #include <linux/msg.h>
28 #include <linux/netlink.h>
30 #include <linux/audit.h>
31 #include <linux/signal.h>
37 #include <linux/slab.h>
42 #define MQUEUE_MAGIC 0x19800202
43 #define DIRENT_SIZE 20
44 #define FILENT_SIZE 80
50 #define STATE_PENDING 1
107 return get_ipc_ns(inode->
i_sb->s_fs_info);
115 ns = __get_ns_from_inode(inode);
116 spin_unlock(&mq_lock);
146 info->
qsize +=
sizeof(*leaf);
149 rb_link_node(&leaf->
rb_node, parent, p);
152 info->
attr.mq_curmsgs++;
176 if (info->
attr.mq_curmsgs) {
178 "no tree element, but supposedly messages "
180 info->
attr.mq_curmsgs = 0;
187 "empty leaf node but we haven't implemented "
188 "lazy leaf delete!\n");
191 info->
qsize -=
sizeof(*leaf);
204 info->
qsize -=
sizeof(*leaf);
211 info->
attr.mq_curmsgs--;
236 unsigned long mq_bytes, mq_treesize;
238 inode->
i_fop = &mqueue_file_operations;
241 info = MQUEUE_I(inode);
244 INIT_LIST_HEAD(&info->
e_wait_q[0].list);
245 INIT_LIST_HEAD(&info->
e_wait_q[1].list);
274 mq_treesize = info->
attr.mq_maxmsg *
sizeof(
struct msg_msg) +
278 mq_bytes = mq_treesize + (info->
attr.mq_maxmsg *
279 info->
attr.mq_msgsize);
282 if (u->mq_bytes + mq_bytes < u->mq_bytes ||
284 spin_unlock(&mq_lock);
289 u->mq_bytes += mq_bytes;
290 spin_unlock(&mq_lock);
293 info->
user = get_uid(u);
298 inode->
i_op = &mqueue_dir_inode_operations;
309 static int mqueue_fill_super(
struct super_block *sb,
void *
data,
int silent)
317 sb->
s_op = &mqueue_super_ops;
321 return PTR_ERR(inode);
330 int flags,
const char *dev_name,
334 data =
current->nsproxy->ipc_ns;
335 return mount_ns(fs_type, flags, data, mqueue_fill_super);
338 static void init_once(
void *
foo)
345 static struct inode *mqueue_alloc_inode(
struct super_block *sb)
361 static void mqueue_destroy_inode(
struct inode *inode)
366 static void mqueue_evict_inode(
struct inode *inode)
370 unsigned long mq_bytes, mq_treesize;
379 ipc_ns = get_ns_from_inode(inode);
380 info = MQUEUE_I(inode);
381 spin_lock(&info->
lock);
385 spin_unlock(&info->
lock);
388 mq_treesize = info->
attr.mq_maxmsg *
sizeof(
struct msg_msg) +
392 mq_bytes = mq_treesize + (info->
attr.mq_maxmsg *
393 info->
attr.mq_msgsize);
398 user->mq_bytes -= mq_bytes;
407 spin_unlock(&mq_lock);
414 static int mqueue_create(
struct inode *dir,
struct dentry *
dentry,
423 ipc_ns = __get_ns_from_inode(dir);
435 spin_unlock(&mq_lock);
437 inode = mqueue_get_inode(dir->
i_sb, ipc_ns, mode, attr);
439 error = PTR_ERR(inode);
453 spin_unlock(&mq_lock);
459 static int mqueue_unlink(
struct inode *dir,
struct dentry *dentry)
461 struct inode *inode = dentry->
d_inode;
477 static ssize_t mqueue_read_file(
struct file *filp,
char __user *u_data,
478 size_t count, loff_t *off)
484 spin_lock(&info->
lock);
486 "QSIZE:%-10lu NOTIFY:%-5d SIGNO:%-5d NOTIFY_PID:%-6d\n",
491 info->
notify.sigev_signo : 0,
493 spin_unlock(&info->
lock);
494 buffer[
sizeof(
buffer)-1] =
'\0';
509 spin_lock(&info->
lock);
511 remove_notification(info);
513 spin_unlock(&info->
lock);
522 poll_wait(filp, &info->
wait_q, poll_tab);
524 spin_lock(&info->
lock);
525 if (info->
attr.mq_curmsgs)
528 if (info->
attr.mq_curmsgs < info->
attr.mq_maxmsg)
530 spin_unlock(&info->
lock);
544 if (walk->
task->static_prio <=
current->static_prio) {
563 wq_add(info, sr, ewp);
568 spin_unlock(&info->
lock);
579 spin_lock(&info->
lock);
595 spin_unlock(&info->
lock);
609 if (ptr == &info->
e_wait_q[sr].list)
631 info->
attr.mq_curmsgs == 1) {
633 switch (info->
notify.sigev_notify) {
639 sig_i.si_signo = info->
notify.sigev_signo;
642 sig_i.si_value = info->
notify.sigev_value;
667 static int prepare_timeout(
const struct timespec __user *u_abs_timeout,
672 if (!timespec_valid(ts))
675 *expires = timespec_to_ktime(*ts);
715 if (total_size + mq_treesize < total_size)
731 ret = mq_attr_ok(ipc_ns, attr);
743 ret = mq_attr_ok(ipc_ns, &def_attr);
757 static struct file *do_open(
struct path *path,
int oflag)
771 struct mq_attr __user *, u_attr)
786 audit_mq_open(oflag, mode, u_attr ? &attr :
NULL);
788 if (IS_ERR(name =
getname(u_name)))
789 return PTR_ERR(name);
799 if (IS_ERR(path.
dentry)) {
800 error = PTR_ERR(path.
dentry);
806 if (path.
dentry->d_inode) {
807 audit_inode(name, path.
dentry, 0);
812 filp = do_open(&path, oflag);
818 filp = do_create(ipc_ns, root->
d_inode,
820 u_attr ? &attr : NULL);
823 if (!path.
dentry->d_inode) {
827 audit_inode(name, path.
dentry, 0);
828 filp = do_open(&path, oflag);
834 error = PTR_ERR(filp);
853 struct dentry *dentry;
854 struct inode *inode =
NULL;
860 return PTR_ERR(name);
868 if (IS_ERR(dentry)) {
869 err = PTR_ERR(dentry);
934 if (msg_insert(sender->
msg, info))
944 size_t,
msg_len,
unsigned int, msg_prio,
945 const struct timespec __user *, u_abs_timeout)
959 int res = prepare_timeout(u_abs_timeout, &expires, &ts);
968 audit_mq_sendrecv(mqdes,
msg_len, msg_prio, timeout ? &ts :
NULL);
976 inode = f.
file->f_path.dentry->d_inode;
977 if (
unlikely(f.
file->f_op != &mqueue_file_operations)) {
981 info = MQUEUE_I(inode);
982 audit_inode(NULL, f.
file->f_path.dentry, 0);
997 if (IS_ERR(msg_ptr)) {
998 ret = PTR_ERR(msg_ptr);
1002 msg_ptr->
m_type = msg_prio;
1012 spin_lock(&info->
lock);
1016 INIT_LIST_HEAD(&new_leaf->
msg_list);
1018 info->
qsize +=
sizeof(*new_leaf);
1024 if (info->
attr.mq_curmsgs == info->
attr.mq_maxmsg) {
1029 wait.
msg = (
void *) msg_ptr;
1031 ret = wq_sleep(info,
SEND, timeout, &wait);
1039 receiver = wq_get_first_waiter(info,
RECV);
1041 pipelined_send(info, msg_ptr, receiver);
1044 ret = msg_insert(msg_ptr, info);
1053 spin_unlock(&info->
lock);
1064 size_t,
msg_len,
unsigned int __user *, u_msg_prio,
1065 const struct timespec __user *, u_abs_timeout)
1070 struct inode *
inode;
1077 if (u_abs_timeout) {
1078 int res = prepare_timeout(u_abs_timeout, &expires, &ts);
1084 audit_mq_sendrecv(mqdes,
msg_len, 0, timeout ? &ts :
NULL);
1092 inode = f.
file->f_path.dentry->d_inode;
1093 if (
unlikely(f.
file->f_op != &mqueue_file_operations)) {
1097 info = MQUEUE_I(inode);
1098 audit_inode(NULL, f.
file->f_path.dentry, 0);
1119 spin_lock(&info->
lock);
1123 INIT_LIST_HEAD(&new_leaf->
msg_list);
1125 info->
qsize +=
sizeof(*new_leaf);
1130 if (info->
attr.mq_curmsgs == 0) {
1132 spin_unlock(&info->
lock);
1137 ret = wq_sleep(info,
RECV, timeout, &wait);
1147 pipelined_receive(info);
1148 spin_unlock(&info->
lock);
1152 ret = msg_ptr->
m_ts;
1172 const struct sigevent __user *, u_notification)
1177 struct inode *
inode;
1182 if (u_notification) {
1188 audit_mq_notify(mqdes, u_notification ? ¬ification :
NULL);
1192 if (u_notification != NULL) {
1229 ret = PTR_ERR(sock);
1252 inode = f.
file->f_path.dentry->d_inode;
1253 if (
unlikely(f.
file->f_op != &mqueue_file_operations)) {
1257 info = MQUEUE_I(inode);
1260 spin_lock(&info->
lock);
1261 if (u_notification == NULL) {
1263 remove_notification(info);
1291 spin_unlock(&info->
lock);
1304 const struct mq_attr __user *, u_mqstat,
1305 struct mq_attr __user *, u_omqstat)
1308 struct mq_attr mqstat, omqstat;
1310 struct inode *
inode;
1313 if (u_mqstat !=
NULL) {
1326 inode = f.
file->f_path.dentry->d_inode;
1327 if (
unlikely(f.
file->f_op != &mqueue_file_operations)) {
1331 info = MQUEUE_I(inode);
1333 spin_lock(&info->
lock);
1335 omqstat = info->
attr;
1338 audit_mq_getsetattr(mqdes, &mqstat);
1339 spin_lock(&f.
file->f_lock);
1344 spin_unlock(&f.
file->f_lock);
1349 spin_unlock(&info->
lock);
1364 .create = mqueue_create,
1365 .unlink = mqueue_unlink,
1369 .flush = mqueue_flush_file,
1370 .poll = mqueue_poll_file,
1371 .read = mqueue_read_file,
1376 .alloc_inode = mqueue_alloc_inode,
1377 .destroy_inode = mqueue_destroy_inode,
1378 .evict_inode = mqueue_evict_inode,
1384 .mount = mqueue_mount,
1398 if (IS_ERR(ns->
mq_mnt)) {
1416 static int __init init_mqueue_fs(
void)
1423 if (mqueue_inode_cachep ==
NULL)
1437 goto out_filesystem;
1444 if (mq_sysctl_table)