OSDN Git Service

crypto: talitos - HMAC SNOOP NO AFEU mode requires SW icv checking.
[android-x86/kernel.git] / ipc / mqueue.c
1 /*
2  * POSIX message queues filesystem for Linux.
3  *
4  * Copyright (C) 2003,2004  Krzysztof Benedyczak    (golbi@mat.uni.torun.pl)
5  *                          Michal Wronski          (michal.wronski@gmail.com)
6  *
7  * Spinlocks:               Mohamed Abbas           (abbas.mohamed@intel.com)
8  * Lockless receive & send, fd based notify:
9  *                          Manfred Spraul          (manfred@colorfullife.com)
10  *
11  * Audit:                   George Wilson           (ltcgcw@us.ibm.com)
12  *
13  * This file is released under the GPL.
14  */
15
16 #include <linux/capability.h>
17 #include <linux/init.h>
18 #include <linux/pagemap.h>
19 #include <linux/file.h>
20 #include <linux/mount.h>
21 #include <linux/namei.h>
22 #include <linux/sysctl.h>
23 #include <linux/poll.h>
24 #include <linux/mqueue.h>
25 #include <linux/msg.h>
26 #include <linux/skbuff.h>
27 #include <linux/vmalloc.h>
28 #include <linux/netlink.h>
29 #include <linux/syscalls.h>
30 #include <linux/audit.h>
31 #include <linux/signal.h>
32 #include <linux/mutex.h>
33 #include <linux/nsproxy.h>
34 #include <linux/pid.h>
35 #include <linux/ipc_namespace.h>
36 #include <linux/user_namespace.h>
37 #include <linux/slab.h>
38
39 #include <net/sock.h>
40 #include "util.h"
41
42 #define MQUEUE_MAGIC    0x19800202
43 #define DIRENT_SIZE     20
44 #define FILENT_SIZE     80
45
46 #define SEND            0
47 #define RECV            1
48
49 #define STATE_NONE      0
50 #define STATE_READY     1
51
52 struct posix_msg_tree_node {
53         struct rb_node          rb_node;
54         struct list_head        msg_list;
55         int                     priority;
56 };
57
58 struct ext_wait_queue {         /* queue of sleeping tasks */
59         struct task_struct *task;
60         struct list_head list;
61         struct msg_msg *msg;    /* ptr of loaded message */
62         int state;              /* one of STATE_* values */
63 };
64
65 struct mqueue_inode_info {
66         spinlock_t lock;
67         struct inode vfs_inode;
68         wait_queue_head_t wait_q;
69
70         struct rb_root msg_tree;
71         struct posix_msg_tree_node *node_cache;
72         struct mq_attr attr;
73
74         struct sigevent notify;
75         struct pid *notify_owner;
76         struct user_namespace *notify_user_ns;
77         struct user_struct *user;       /* user who created, for accounting */
78         struct sock *notify_sock;
79         struct sk_buff *notify_cookie;
80
81         /* for tasks waiting for free space and messages, respectively */
82         struct ext_wait_queue e_wait_q[2];
83
84         unsigned long qsize; /* size of queue in memory (sum of all msgs) */
85 };
86
87 static const struct inode_operations mqueue_dir_inode_operations;
88 static const struct file_operations mqueue_file_operations;
89 static const struct super_operations mqueue_super_ops;
90 static void remove_notification(struct mqueue_inode_info *info);
91
92 static struct kmem_cache *mqueue_inode_cachep;
93
94 static struct ctl_table_header *mq_sysctl_table;
95
96 static inline struct mqueue_inode_info *MQUEUE_I(struct inode *inode)
97 {
98         return container_of(inode, struct mqueue_inode_info, vfs_inode);
99 }
100
101 /*
102  * This routine should be called with the mq_lock held.
103  */
104 static inline struct ipc_namespace *__get_ns_from_inode(struct inode *inode)
105 {
106         return get_ipc_ns(inode->i_sb->s_fs_info);
107 }
108
109 static struct ipc_namespace *get_ns_from_inode(struct inode *inode)
110 {
111         struct ipc_namespace *ns;
112
113         spin_lock(&mq_lock);
114         ns = __get_ns_from_inode(inode);
115         spin_unlock(&mq_lock);
116         return ns;
117 }
118
119 /* Auxiliary functions to manipulate messages' list */
120 static int msg_insert(struct msg_msg *msg, struct mqueue_inode_info *info)
121 {
122         struct rb_node **p, *parent = NULL;
123         struct posix_msg_tree_node *leaf;
124
125         p = &info->msg_tree.rb_node;
126         while (*p) {
127                 parent = *p;
128                 leaf = rb_entry(parent, struct posix_msg_tree_node, rb_node);
129
130                 if (likely(leaf->priority == msg->m_type))
131                         goto insert_msg;
132                 else if (msg->m_type < leaf->priority)
133                         p = &(*p)->rb_left;
134                 else
135                         p = &(*p)->rb_right;
136         }
137         if (info->node_cache) {
138                 leaf = info->node_cache;
139                 info->node_cache = NULL;
140         } else {
141                 leaf = kmalloc(sizeof(*leaf), GFP_ATOMIC);
142                 if (!leaf)
143                         return -ENOMEM;
144                 INIT_LIST_HEAD(&leaf->msg_list);
145         }
146         leaf->priority = msg->m_type;
147         rb_link_node(&leaf->rb_node, parent, p);
148         rb_insert_color(&leaf->rb_node, &info->msg_tree);
149 insert_msg:
150         info->attr.mq_curmsgs++;
151         info->qsize += msg->m_ts;
152         list_add_tail(&msg->m_list, &leaf->msg_list);
153         return 0;
154 }
155
156 static inline struct msg_msg *msg_get(struct mqueue_inode_info *info)
157 {
158         struct rb_node **p, *parent = NULL;
159         struct posix_msg_tree_node *leaf;
160         struct msg_msg *msg;
161
162 try_again:
163         p = &info->msg_tree.rb_node;
164         while (*p) {
165                 parent = *p;
166                 /*
167                  * During insert, low priorities go to the left and high to the
168                  * right.  On receive, we want the highest priorities first, so
169                  * walk all the way to the right.
170                  */
171                 p = &(*p)->rb_right;
172         }
173         if (!parent) {
174                 if (info->attr.mq_curmsgs) {
175                         pr_warn_once("Inconsistency in POSIX message queue, "
176                                      "no tree element, but supposedly messages "
177                                      "should exist!\n");
178                         info->attr.mq_curmsgs = 0;
179                 }
180                 return NULL;
181         }
182         leaf = rb_entry(parent, struct posix_msg_tree_node, rb_node);
183         if (unlikely(list_empty(&leaf->msg_list))) {
184                 pr_warn_once("Inconsistency in POSIX message queue, "
185                              "empty leaf node but we haven't implemented "
186                              "lazy leaf delete!\n");
187                 rb_erase(&leaf->rb_node, &info->msg_tree);
188                 if (info->node_cache) {
189                         kfree(leaf);
190                 } else {
191                         info->node_cache = leaf;
192                 }
193                 goto try_again;
194         } else {
195                 msg = list_first_entry(&leaf->msg_list,
196                                        struct msg_msg, m_list);
197                 list_del(&msg->m_list);
198                 if (list_empty(&leaf->msg_list)) {
199                         rb_erase(&leaf->rb_node, &info->msg_tree);
200                         if (info->node_cache) {
201                                 kfree(leaf);
202                         } else {
203                                 info->node_cache = leaf;
204                         }
205                 }
206         }
207         info->attr.mq_curmsgs--;
208         info->qsize -= msg->m_ts;
209         return msg;
210 }
211
212 static struct inode *mqueue_get_inode(struct super_block *sb,
213                 struct ipc_namespace *ipc_ns, umode_t mode,
214                 struct mq_attr *attr)
215 {
216         struct user_struct *u = current_user();
217         struct inode *inode;
218         int ret = -ENOMEM;
219
220         inode = new_inode(sb);
221         if (!inode)
222                 goto err;
223
224         inode->i_ino = get_next_ino();
225         inode->i_mode = mode;
226         inode->i_uid = current_fsuid();
227         inode->i_gid = current_fsgid();
228         inode->i_mtime = inode->i_ctime = inode->i_atime = current_time(inode);
229
230         if (S_ISREG(mode)) {
231                 struct mqueue_inode_info *info;
232                 unsigned long mq_bytes, mq_treesize;
233
234                 inode->i_fop = &mqueue_file_operations;
235                 inode->i_size = FILENT_SIZE;
236                 /* mqueue specific info */
237                 info = MQUEUE_I(inode);
238                 spin_lock_init(&info->lock);
239                 init_waitqueue_head(&info->wait_q);
240                 INIT_LIST_HEAD(&info->e_wait_q[0].list);
241                 INIT_LIST_HEAD(&info->e_wait_q[1].list);
242                 info->notify_owner = NULL;
243                 info->notify_user_ns = NULL;
244                 info->qsize = 0;
245                 info->user = NULL;      /* set when all is ok */
246                 info->msg_tree = RB_ROOT;
247                 info->node_cache = NULL;
248                 memset(&info->attr, 0, sizeof(info->attr));
249                 info->attr.mq_maxmsg = min(ipc_ns->mq_msg_max,
250                                            ipc_ns->mq_msg_default);
251                 info->attr.mq_msgsize = min(ipc_ns->mq_msgsize_max,
252                                             ipc_ns->mq_msgsize_default);
253                 if (attr) {
254                         info->attr.mq_maxmsg = attr->mq_maxmsg;
255                         info->attr.mq_msgsize = attr->mq_msgsize;
256                 }
257                 /*
258                  * We used to allocate a static array of pointers and account
259                  * the size of that array as well as one msg_msg struct per
260                  * possible message into the queue size. That's no longer
261                  * accurate as the queue is now an rbtree and will grow and
262                  * shrink depending on usage patterns.  We can, however, still
263                  * account one msg_msg struct per message, but the nodes are
264                  * allocated depending on priority usage, and most programs
265                  * only use one, or a handful, of priorities.  However, since
266                  * this is pinned memory, we need to assume worst case, so
267                  * that means the min(mq_maxmsg, max_priorities) * struct
268                  * posix_msg_tree_node.
269                  */
270                 mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
271                         min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
272                         sizeof(struct posix_msg_tree_node);
273
274                 mq_bytes = mq_treesize + (info->attr.mq_maxmsg *
275                                           info->attr.mq_msgsize);
276
277                 spin_lock(&mq_lock);
278                 if (u->mq_bytes + mq_bytes < u->mq_bytes ||
279                     u->mq_bytes + mq_bytes > rlimit(RLIMIT_MSGQUEUE)) {
280                         spin_unlock(&mq_lock);
281                         /* mqueue_evict_inode() releases info->messages */
282                         ret = -EMFILE;
283                         goto out_inode;
284                 }
285                 u->mq_bytes += mq_bytes;
286                 spin_unlock(&mq_lock);
287
288                 /* all is ok */
289                 info->user = get_uid(u);
290         } else if (S_ISDIR(mode)) {
291                 inc_nlink(inode);
292                 /* Some things misbehave if size == 0 on a directory */
293                 inode->i_size = 2 * DIRENT_SIZE;
294                 inode->i_op = &mqueue_dir_inode_operations;
295                 inode->i_fop = &simple_dir_operations;
296         }
297
298         return inode;
299 out_inode:
300         iput(inode);
301 err:
302         return ERR_PTR(ret);
303 }
304
305 static int mqueue_fill_super(struct super_block *sb, void *data, int silent)
306 {
307         struct inode *inode;
308         struct ipc_namespace *ns = sb->s_fs_info;
309
310         sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
311         sb->s_blocksize = PAGE_SIZE;
312         sb->s_blocksize_bits = PAGE_SHIFT;
313         sb->s_magic = MQUEUE_MAGIC;
314         sb->s_op = &mqueue_super_ops;
315
316         inode = mqueue_get_inode(sb, ns, S_IFDIR | S_ISVTX | S_IRWXUGO, NULL);
317         if (IS_ERR(inode))
318                 return PTR_ERR(inode);
319
320         sb->s_root = d_make_root(inode);
321         if (!sb->s_root)
322                 return -ENOMEM;
323         return 0;
324 }
325
326 static struct dentry *mqueue_mount(struct file_system_type *fs_type,
327                          int flags, const char *dev_name,
328                          void *data)
329 {
330         struct ipc_namespace *ns;
331         if (flags & MS_KERNMOUNT) {
332                 ns = data;
333                 data = NULL;
334         } else {
335                 ns = current->nsproxy->ipc_ns;
336         }
337         return mount_ns(fs_type, flags, data, ns, ns->user_ns, mqueue_fill_super);
338 }
339
340 static void init_once(void *foo)
341 {
342         struct mqueue_inode_info *p = (struct mqueue_inode_info *) foo;
343
344         inode_init_once(&p->vfs_inode);
345 }
346
347 static struct inode *mqueue_alloc_inode(struct super_block *sb)
348 {
349         struct mqueue_inode_info *ei;
350
351         ei = kmem_cache_alloc(mqueue_inode_cachep, GFP_KERNEL);
352         if (!ei)
353                 return NULL;
354         return &ei->vfs_inode;
355 }
356
357 static void mqueue_i_callback(struct rcu_head *head)
358 {
359         struct inode *inode = container_of(head, struct inode, i_rcu);
360         kmem_cache_free(mqueue_inode_cachep, MQUEUE_I(inode));
361 }
362
363 static void mqueue_destroy_inode(struct inode *inode)
364 {
365         call_rcu(&inode->i_rcu, mqueue_i_callback);
366 }
367
368 static void mqueue_evict_inode(struct inode *inode)
369 {
370         struct mqueue_inode_info *info;
371         struct user_struct *user;
372         struct ipc_namespace *ipc_ns;
373         struct msg_msg *msg, *nmsg;
374         LIST_HEAD(tmp_msg);
375
376         clear_inode(inode);
377
378         if (S_ISDIR(inode->i_mode))
379                 return;
380
381         ipc_ns = get_ns_from_inode(inode);
382         info = MQUEUE_I(inode);
383         spin_lock(&info->lock);
384         while ((msg = msg_get(info)) != NULL)
385                 list_add_tail(&msg->m_list, &tmp_msg);
386         kfree(info->node_cache);
387         spin_unlock(&info->lock);
388
389         list_for_each_entry_safe(msg, nmsg, &tmp_msg, m_list) {
390                 list_del(&msg->m_list);
391                 free_msg(msg);
392         }
393
394         user = info->user;
395         if (user) {
396                 unsigned long mq_bytes, mq_treesize;
397
398                 /* Total amount of bytes accounted for the mqueue */
399                 mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
400                         min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
401                         sizeof(struct posix_msg_tree_node);
402
403                 mq_bytes = mq_treesize + (info->attr.mq_maxmsg *
404                                           info->attr.mq_msgsize);
405
406                 spin_lock(&mq_lock);
407                 user->mq_bytes -= mq_bytes;
408                 /*
409                  * get_ns_from_inode() ensures that the
410                  * (ipc_ns = sb->s_fs_info) is either a valid ipc_ns
411                  * to which we now hold a reference, or it is NULL.
412                  * We can't put it here under mq_lock, though.
413                  */
414                 if (ipc_ns)
415                         ipc_ns->mq_queues_count--;
416                 spin_unlock(&mq_lock);
417                 free_uid(user);
418         }
419         if (ipc_ns)
420                 put_ipc_ns(ipc_ns);
421 }
422
423 static int mqueue_create(struct inode *dir, struct dentry *dentry,
424                                 umode_t mode, bool excl)
425 {
426         struct inode *inode;
427         struct mq_attr *attr = dentry->d_fsdata;
428         int error;
429         struct ipc_namespace *ipc_ns;
430
431         spin_lock(&mq_lock);
432         ipc_ns = __get_ns_from_inode(dir);
433         if (!ipc_ns) {
434                 error = -EACCES;
435                 goto out_unlock;
436         }
437
438         if (ipc_ns->mq_queues_count >= ipc_ns->mq_queues_max &&
439             !capable(CAP_SYS_RESOURCE)) {
440                 error = -ENOSPC;
441                 goto out_unlock;
442         }
443         ipc_ns->mq_queues_count++;
444         spin_unlock(&mq_lock);
445
446         inode = mqueue_get_inode(dir->i_sb, ipc_ns, mode, attr);
447         if (IS_ERR(inode)) {
448                 error = PTR_ERR(inode);
449                 spin_lock(&mq_lock);
450                 ipc_ns->mq_queues_count--;
451                 goto out_unlock;
452         }
453
454         put_ipc_ns(ipc_ns);
455         dir->i_size += DIRENT_SIZE;
456         dir->i_ctime = dir->i_mtime = dir->i_atime = current_time(dir);
457
458         d_instantiate(dentry, inode);
459         dget(dentry);
460         return 0;
461 out_unlock:
462         spin_unlock(&mq_lock);
463         if (ipc_ns)
464                 put_ipc_ns(ipc_ns);
465         return error;
466 }
467
468 static int mqueue_unlink(struct inode *dir, struct dentry *dentry)
469 {
470         struct inode *inode = d_inode(dentry);
471
472         dir->i_ctime = dir->i_mtime = dir->i_atime = current_time(dir);
473         dir->i_size -= DIRENT_SIZE;
474         drop_nlink(inode);
475         dput(dentry);
476         return 0;
477 }
478
479 /*
480 *       This is routine for system read from queue file.
481 *       To avoid mess with doing here some sort of mq_receive we allow
482 *       to read only queue size & notification info (the only values
483 *       that are interesting from user point of view and aren't accessible
484 *       through std routines)
485 */
486 static ssize_t mqueue_read_file(struct file *filp, char __user *u_data,
487                                 size_t count, loff_t *off)
488 {
489         struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
490         char buffer[FILENT_SIZE];
491         ssize_t ret;
492
493         spin_lock(&info->lock);
494         snprintf(buffer, sizeof(buffer),
495                         "QSIZE:%-10lu NOTIFY:%-5d SIGNO:%-5d NOTIFY_PID:%-6d\n",
496                         info->qsize,
497                         info->notify_owner ? info->notify.sigev_notify : 0,
498                         (info->notify_owner &&
499                          info->notify.sigev_notify == SIGEV_SIGNAL) ?
500                                 info->notify.sigev_signo : 0,
501                         pid_vnr(info->notify_owner));
502         spin_unlock(&info->lock);
503         buffer[sizeof(buffer)-1] = '\0';
504
505         ret = simple_read_from_buffer(u_data, count, off, buffer,
506                                 strlen(buffer));
507         if (ret <= 0)
508                 return ret;
509
510         file_inode(filp)->i_atime = file_inode(filp)->i_ctime = current_time(file_inode(filp));
511         return ret;
512 }
513
514 static int mqueue_flush_file(struct file *filp, fl_owner_t id)
515 {
516         struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
517
518         spin_lock(&info->lock);
519         if (task_tgid(current) == info->notify_owner)
520                 remove_notification(info);
521
522         spin_unlock(&info->lock);
523         return 0;
524 }
525
526 static unsigned int mqueue_poll_file(struct file *filp, struct poll_table_struct *poll_tab)
527 {
528         struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
529         int retval = 0;
530
531         poll_wait(filp, &info->wait_q, poll_tab);
532
533         spin_lock(&info->lock);
534         if (info->attr.mq_curmsgs)
535                 retval = POLLIN | POLLRDNORM;
536
537         if (info->attr.mq_curmsgs < info->attr.mq_maxmsg)
538                 retval |= POLLOUT | POLLWRNORM;
539         spin_unlock(&info->lock);
540
541         return retval;
542 }
543
544 /* Adds current to info->e_wait_q[sr] before element with smaller prio */
545 static void wq_add(struct mqueue_inode_info *info, int sr,
546                         struct ext_wait_queue *ewp)
547 {
548         struct ext_wait_queue *walk;
549
550         ewp->task = current;
551
552         list_for_each_entry(walk, &info->e_wait_q[sr].list, list) {
553                 if (walk->task->static_prio <= current->static_prio) {
554                         list_add_tail(&ewp->list, &walk->list);
555                         return;
556                 }
557         }
558         list_add_tail(&ewp->list, &info->e_wait_q[sr].list);
559 }
560
561 /*
562  * Puts current task to sleep. Caller must hold queue lock. After return
563  * lock isn't held.
564  * sr: SEND or RECV
565  */
566 static int wq_sleep(struct mqueue_inode_info *info, int sr,
567                     ktime_t *timeout, struct ext_wait_queue *ewp)
568 {
569         int retval;
570         signed long time;
571
572         wq_add(info, sr, ewp);
573
574         for (;;) {
575                 __set_current_state(TASK_INTERRUPTIBLE);
576
577                 spin_unlock(&info->lock);
578                 time = schedule_hrtimeout_range_clock(timeout, 0,
579                         HRTIMER_MODE_ABS, CLOCK_REALTIME);
580
581                 if (ewp->state == STATE_READY) {
582                         retval = 0;
583                         goto out;
584                 }
585                 spin_lock(&info->lock);
586                 if (ewp->state == STATE_READY) {
587                         retval = 0;
588                         goto out_unlock;
589                 }
590                 if (signal_pending(current)) {
591                         retval = -ERESTARTSYS;
592                         break;
593                 }
594                 if (time == 0) {
595                         retval = -ETIMEDOUT;
596                         break;
597                 }
598         }
599         list_del(&ewp->list);
600 out_unlock:
601         spin_unlock(&info->lock);
602 out:
603         return retval;
604 }
605
606 /*
607  * Returns waiting task that should be serviced first or NULL if none exists
608  */
609 static struct ext_wait_queue *wq_get_first_waiter(
610                 struct mqueue_inode_info *info, int sr)
611 {
612         struct list_head *ptr;
613
614         ptr = info->e_wait_q[sr].list.prev;
615         if (ptr == &info->e_wait_q[sr].list)
616                 return NULL;
617         return list_entry(ptr, struct ext_wait_queue, list);
618 }
619
620
621 static inline void set_cookie(struct sk_buff *skb, char code)
622 {
623         ((char *)skb->data)[NOTIFY_COOKIE_LEN-1] = code;
624 }
625
626 /*
627  * The next function is only to split too long sys_mq_timedsend
628  */
629 static void __do_notify(struct mqueue_inode_info *info)
630 {
631         /* notification
632          * invoked when there is registered process and there isn't process
633          * waiting synchronously for message AND state of queue changed from
634          * empty to not empty. Here we are sure that no one is waiting
635          * synchronously. */
636         if (info->notify_owner &&
637             info->attr.mq_curmsgs == 1) {
638                 struct siginfo sig_i;
639                 switch (info->notify.sigev_notify) {
640                 case SIGEV_NONE:
641                         break;
642                 case SIGEV_SIGNAL:
643                         /* sends signal */
644
645                         sig_i.si_signo = info->notify.sigev_signo;
646                         sig_i.si_errno = 0;
647                         sig_i.si_code = SI_MESGQ;
648                         sig_i.si_value = info->notify.sigev_value;
649                         /* map current pid/uid into info->owner's namespaces */
650                         rcu_read_lock();
651                         sig_i.si_pid = task_tgid_nr_ns(current,
652                                                 ns_of_pid(info->notify_owner));
653                         sig_i.si_uid = from_kuid_munged(info->notify_user_ns, current_uid());
654                         rcu_read_unlock();
655
656                         kill_pid_info(info->notify.sigev_signo,
657                                       &sig_i, info->notify_owner);
658                         break;
659                 case SIGEV_THREAD:
660                         set_cookie(info->notify_cookie, NOTIFY_WOKENUP);
661                         netlink_sendskb(info->notify_sock, info->notify_cookie);
662                         break;
663                 }
664                 /* after notification unregisters process */
665                 put_pid(info->notify_owner);
666                 put_user_ns(info->notify_user_ns);
667                 info->notify_owner = NULL;
668                 info->notify_user_ns = NULL;
669         }
670         wake_up(&info->wait_q);
671 }
672
673 static int prepare_timeout(const struct timespec __user *u_abs_timeout,
674                            ktime_t *expires, struct timespec *ts)
675 {
676         if (copy_from_user(ts, u_abs_timeout, sizeof(struct timespec)))
677                 return -EFAULT;
678         if (!timespec_valid(ts))
679                 return -EINVAL;
680
681         *expires = timespec_to_ktime(*ts);
682         return 0;
683 }
684
685 static void remove_notification(struct mqueue_inode_info *info)
686 {
687         if (info->notify_owner != NULL &&
688             info->notify.sigev_notify == SIGEV_THREAD) {
689                 set_cookie(info->notify_cookie, NOTIFY_REMOVED);
690                 netlink_sendskb(info->notify_sock, info->notify_cookie);
691         }
692         put_pid(info->notify_owner);
693         put_user_ns(info->notify_user_ns);
694         info->notify_owner = NULL;
695         info->notify_user_ns = NULL;
696 }
697
698 static int mq_attr_ok(struct ipc_namespace *ipc_ns, struct mq_attr *attr)
699 {
700         int mq_treesize;
701         unsigned long total_size;
702
703         if (attr->mq_maxmsg <= 0 || attr->mq_msgsize <= 0)
704                 return -EINVAL;
705         if (capable(CAP_SYS_RESOURCE)) {
706                 if (attr->mq_maxmsg > HARD_MSGMAX ||
707                     attr->mq_msgsize > HARD_MSGSIZEMAX)
708                         return -EINVAL;
709         } else {
710                 if (attr->mq_maxmsg > ipc_ns->mq_msg_max ||
711                                 attr->mq_msgsize > ipc_ns->mq_msgsize_max)
712                         return -EINVAL;
713         }
714         /* check for overflow */
715         if (attr->mq_msgsize > ULONG_MAX/attr->mq_maxmsg)
716                 return -EOVERFLOW;
717         mq_treesize = attr->mq_maxmsg * sizeof(struct msg_msg) +
718                 min_t(unsigned int, attr->mq_maxmsg, MQ_PRIO_MAX) *
719                 sizeof(struct posix_msg_tree_node);
720         total_size = attr->mq_maxmsg * attr->mq_msgsize;
721         if (total_size + mq_treesize < total_size)
722                 return -EOVERFLOW;
723         return 0;
724 }
725
726 /*
727  * Invoked when creating a new queue via sys_mq_open
728  */
729 static struct file *do_create(struct ipc_namespace *ipc_ns, struct inode *dir,
730                         struct path *path, int oflag, umode_t mode,
731                         struct mq_attr *attr)
732 {
733         const struct cred *cred = current_cred();
734         int ret;
735
736         if (attr) {
737                 ret = mq_attr_ok(ipc_ns, attr);
738                 if (ret)
739                         return ERR_PTR(ret);
740                 /* store for use during create */
741                 path->dentry->d_fsdata = attr;
742         } else {
743                 struct mq_attr def_attr;
744
745                 def_attr.mq_maxmsg = min(ipc_ns->mq_msg_max,
746                                          ipc_ns->mq_msg_default);
747                 def_attr.mq_msgsize = min(ipc_ns->mq_msgsize_max,
748                                           ipc_ns->mq_msgsize_default);
749                 ret = mq_attr_ok(ipc_ns, &def_attr);
750                 if (ret)
751                         return ERR_PTR(ret);
752         }
753
754         mode &= ~current_umask();
755         ret = vfs_create(dir, path->dentry, mode, true);
756         path->dentry->d_fsdata = NULL;
757         if (ret)
758                 return ERR_PTR(ret);
759         return dentry_open(path, oflag, cred);
760 }
761
762 /* Opens existing queue */
763 static struct file *do_open(struct path *path, int oflag)
764 {
765         static const int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE,
766                                                   MAY_READ | MAY_WRITE };
767         int acc;
768         if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY))
769                 return ERR_PTR(-EINVAL);
770         acc = oflag2acc[oflag & O_ACCMODE];
771         if (inode_permission(d_inode(path->dentry), acc))
772                 return ERR_PTR(-EACCES);
773         return dentry_open(path, oflag, current_cred());
774 }
775
776 SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, umode_t, mode,
777                 struct mq_attr __user *, u_attr)
778 {
779         struct path path;
780         struct file *filp;
781         struct filename *name;
782         struct mq_attr attr;
783         int fd, error;
784         struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
785         struct vfsmount *mnt = ipc_ns->mq_mnt;
786         struct dentry *root = mnt->mnt_root;
787         int ro;
788
789         if (u_attr && copy_from_user(&attr, u_attr, sizeof(struct mq_attr)))
790                 return -EFAULT;
791
792         audit_mq_open(oflag, mode, u_attr ? &attr : NULL);
793
794         if (IS_ERR(name = getname(u_name)))
795                 return PTR_ERR(name);
796
797         fd = get_unused_fd_flags(O_CLOEXEC);
798         if (fd < 0)
799                 goto out_putname;
800
801         ro = mnt_want_write(mnt);       /* we'll drop it in any case */
802         error = 0;
803         inode_lock(d_inode(root));
804         path.dentry = lookup_one_len(name->name, root, strlen(name->name));
805         if (IS_ERR(path.dentry)) {
806                 error = PTR_ERR(path.dentry);
807                 goto out_putfd;
808         }
809         path.mnt = mntget(mnt);
810
811         if (oflag & O_CREAT) {
812                 if (d_really_is_positive(path.dentry)) {        /* entry already exists */
813                         audit_inode(name, path.dentry, 0);
814                         if (oflag & O_EXCL) {
815                                 error = -EEXIST;
816                                 goto out;
817                         }
818                         filp = do_open(&path, oflag);
819                 } else {
820                         if (ro) {
821                                 error = ro;
822                                 goto out;
823                         }
824                         audit_inode_parent_hidden(name, root);
825                         filp = do_create(ipc_ns, d_inode(root),
826                                                 &path, oflag, mode,
827                                                 u_attr ? &attr : NULL);
828                 }
829         } else {
830                 if (d_really_is_negative(path.dentry)) {
831                         error = -ENOENT;
832                         goto out;
833                 }
834                 audit_inode(name, path.dentry, 0);
835                 filp = do_open(&path, oflag);
836         }
837
838         if (!IS_ERR(filp))
839                 fd_install(fd, filp);
840         else
841                 error = PTR_ERR(filp);
842 out:
843         path_put(&path);
844 out_putfd:
845         if (error) {
846                 put_unused_fd(fd);
847                 fd = error;
848         }
849         inode_unlock(d_inode(root));
850         if (!ro)
851                 mnt_drop_write(mnt);
852 out_putname:
853         putname(name);
854         return fd;
855 }
856
857 SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name)
858 {
859         int err;
860         struct filename *name;
861         struct dentry *dentry;
862         struct inode *inode = NULL;
863         struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
864         struct vfsmount *mnt = ipc_ns->mq_mnt;
865
866         name = getname(u_name);
867         if (IS_ERR(name))
868                 return PTR_ERR(name);
869
870         audit_inode_parent_hidden(name, mnt->mnt_root);
871         err = mnt_want_write(mnt);
872         if (err)
873                 goto out_name;
874         inode_lock_nested(d_inode(mnt->mnt_root), I_MUTEX_PARENT);
875         dentry = lookup_one_len(name->name, mnt->mnt_root,
876                                 strlen(name->name));
877         if (IS_ERR(dentry)) {
878                 err = PTR_ERR(dentry);
879                 goto out_unlock;
880         }
881
882         inode = d_inode(dentry);
883         if (!inode) {
884                 err = -ENOENT;
885         } else {
886                 ihold(inode);
887                 err = vfs_unlink(d_inode(dentry->d_parent), dentry, NULL);
888         }
889         dput(dentry);
890
891 out_unlock:
892         inode_unlock(d_inode(mnt->mnt_root));
893         if (inode)
894                 iput(inode);
895         mnt_drop_write(mnt);
896 out_name:
897         putname(name);
898
899         return err;
900 }
901
902 /* Pipelined send and receive functions.
903  *
904  * If a receiver finds no waiting message, then it registers itself in the
905  * list of waiting receivers. A sender checks that list before adding the new
906  * message into the message array. If there is a waiting receiver, then it
907  * bypasses the message array and directly hands the message over to the
908  * receiver. The receiver accepts the message and returns without grabbing the
909  * queue spinlock:
910  *
911  * - Set pointer to message.
912  * - Queue the receiver task for later wakeup (without the info->lock).
913  * - Update its state to STATE_READY. Now the receiver can continue.
914  * - Wake up the process after the lock is dropped. Should the process wake up
915  *   before this wakeup (due to a timeout or a signal) it will either see
916  *   STATE_READY and continue or acquire the lock to check the state again.
917  *
918  * The same algorithm is used for senders.
919  */
920
921 /* pipelined_send() - send a message directly to the task waiting in
922  * sys_mq_timedreceive() (without inserting message into a queue).
923  */
924 static inline void pipelined_send(struct wake_q_head *wake_q,
925                                   struct mqueue_inode_info *info,
926                                   struct msg_msg *message,
927                                   struct ext_wait_queue *receiver)
928 {
929         receiver->msg = message;
930         list_del(&receiver->list);
931         wake_q_add(wake_q, receiver->task);
932         /*
933          * Rely on the implicit cmpxchg barrier from wake_q_add such
934          * that we can ensure that updating receiver->state is the last
935          * write operation: As once set, the receiver can continue,
936          * and if we don't have the reference count from the wake_q,
937          * yet, at that point we can later have a use-after-free
938          * condition and bogus wakeup.
939          */
940         receiver->state = STATE_READY;
941 }
942
943 /* pipelined_receive() - if there is task waiting in sys_mq_timedsend()
944  * gets its message and put to the queue (we have one free place for sure). */
945 static inline void pipelined_receive(struct wake_q_head *wake_q,
946                                      struct mqueue_inode_info *info)
947 {
948         struct ext_wait_queue *sender = wq_get_first_waiter(info, SEND);
949
950         if (!sender) {
951                 /* for poll */
952                 wake_up_interruptible(&info->wait_q);
953                 return;
954         }
955         if (msg_insert(sender->msg, info))
956                 return;
957
958         list_del(&sender->list);
959         wake_q_add(wake_q, sender->task);
960         sender->state = STATE_READY;
961 }
962
963 SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
964                 size_t, msg_len, unsigned int, msg_prio,
965                 const struct timespec __user *, u_abs_timeout)
966 {
967         struct fd f;
968         struct inode *inode;
969         struct ext_wait_queue wait;
970         struct ext_wait_queue *receiver;
971         struct msg_msg *msg_ptr;
972         struct mqueue_inode_info *info;
973         ktime_t expires, *timeout = NULL;
974         struct timespec ts;
975         struct posix_msg_tree_node *new_leaf = NULL;
976         int ret = 0;
977         WAKE_Q(wake_q);
978
979         if (u_abs_timeout) {
980                 int res = prepare_timeout(u_abs_timeout, &expires, &ts);
981                 if (res)
982                         return res;
983                 timeout = &expires;
984         }
985
986         if (unlikely(msg_prio >= (unsigned long) MQ_PRIO_MAX))
987                 return -EINVAL;
988
989         audit_mq_sendrecv(mqdes, msg_len, msg_prio, timeout ? &ts : NULL);
990
991         f = fdget(mqdes);
992         if (unlikely(!f.file)) {
993                 ret = -EBADF;
994                 goto out;
995         }
996
997         inode = file_inode(f.file);
998         if (unlikely(f.file->f_op != &mqueue_file_operations)) {
999                 ret = -EBADF;
1000                 goto out_fput;
1001         }
1002         info = MQUEUE_I(inode);
1003         audit_file(f.file);
1004
1005         if (unlikely(!(f.file->f_mode & FMODE_WRITE))) {
1006                 ret = -EBADF;
1007                 goto out_fput;
1008         }
1009
1010         if (unlikely(msg_len > info->attr.mq_msgsize)) {
1011                 ret = -EMSGSIZE;
1012                 goto out_fput;
1013         }
1014
1015         /* First try to allocate memory, before doing anything with
1016          * existing queues. */
1017         msg_ptr = load_msg(u_msg_ptr, msg_len);
1018         if (IS_ERR(msg_ptr)) {
1019                 ret = PTR_ERR(msg_ptr);
1020                 goto out_fput;
1021         }
1022         msg_ptr->m_ts = msg_len;
1023         msg_ptr->m_type = msg_prio;
1024
1025         /*
1026          * msg_insert really wants us to have a valid, spare node struct so
1027          * it doesn't have to kmalloc a GFP_ATOMIC allocation, but it will
1028          * fall back to that if necessary.
1029          */
1030         if (!info->node_cache)
1031                 new_leaf = kmalloc(sizeof(*new_leaf), GFP_KERNEL);
1032
1033         spin_lock(&info->lock);
1034
1035         if (!info->node_cache && new_leaf) {
1036                 /* Save our speculative allocation into the cache */
1037                 INIT_LIST_HEAD(&new_leaf->msg_list);
1038                 info->node_cache = new_leaf;
1039                 new_leaf = NULL;
1040         } else {
1041                 kfree(new_leaf);
1042         }
1043
1044         if (info->attr.mq_curmsgs == info->attr.mq_maxmsg) {
1045                 if (f.file->f_flags & O_NONBLOCK) {
1046                         ret = -EAGAIN;
1047                 } else {
1048                         wait.task = current;
1049                         wait.msg = (void *) msg_ptr;
1050                         wait.state = STATE_NONE;
1051                         ret = wq_sleep(info, SEND, timeout, &wait);
1052                         /*
1053                          * wq_sleep must be called with info->lock held, and
1054                          * returns with the lock released
1055                          */
1056                         goto out_free;
1057                 }
1058         } else {
1059                 receiver = wq_get_first_waiter(info, RECV);
1060                 if (receiver) {
1061                         pipelined_send(&wake_q, info, msg_ptr, receiver);
1062                 } else {
1063                         /* adds message to the queue */
1064                         ret = msg_insert(msg_ptr, info);
1065                         if (ret)
1066                                 goto out_unlock;
1067                         __do_notify(info);
1068                 }
1069                 inode->i_atime = inode->i_mtime = inode->i_ctime =
1070                                 current_time(inode);
1071         }
1072 out_unlock:
1073         spin_unlock(&info->lock);
1074         wake_up_q(&wake_q);
1075 out_free:
1076         if (ret)
1077                 free_msg(msg_ptr);
1078 out_fput:
1079         fdput(f);
1080 out:
1081         return ret;
1082 }
1083
1084 SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
1085                 size_t, msg_len, unsigned int __user *, u_msg_prio,
1086                 const struct timespec __user *, u_abs_timeout)
1087 {
1088         ssize_t ret;
1089         struct msg_msg *msg_ptr;
1090         struct fd f;
1091         struct inode *inode;
1092         struct mqueue_inode_info *info;
1093         struct ext_wait_queue wait;
1094         ktime_t expires, *timeout = NULL;
1095         struct timespec ts;
1096         struct posix_msg_tree_node *new_leaf = NULL;
1097
1098         if (u_abs_timeout) {
1099                 int res = prepare_timeout(u_abs_timeout, &expires, &ts);
1100                 if (res)
1101                         return res;
1102                 timeout = &expires;
1103         }
1104
1105         audit_mq_sendrecv(mqdes, msg_len, 0, timeout ? &ts : NULL);
1106
1107         f = fdget(mqdes);
1108         if (unlikely(!f.file)) {
1109                 ret = -EBADF;
1110                 goto out;
1111         }
1112
1113         inode = file_inode(f.file);
1114         if (unlikely(f.file->f_op != &mqueue_file_operations)) {
1115                 ret = -EBADF;
1116                 goto out_fput;
1117         }
1118         info = MQUEUE_I(inode);
1119         audit_file(f.file);
1120
1121         if (unlikely(!(f.file->f_mode & FMODE_READ))) {
1122                 ret = -EBADF;
1123                 goto out_fput;
1124         }
1125
1126         /* checks if buffer is big enough */
1127         if (unlikely(msg_len < info->attr.mq_msgsize)) {
1128                 ret = -EMSGSIZE;
1129                 goto out_fput;
1130         }
1131
1132         /*
1133          * msg_insert really wants us to have a valid, spare node struct so
1134          * it doesn't have to kmalloc a GFP_ATOMIC allocation, but it will
1135          * fall back to that if necessary.
1136          */
1137         if (!info->node_cache)
1138                 new_leaf = kmalloc(sizeof(*new_leaf), GFP_KERNEL);
1139
1140         spin_lock(&info->lock);
1141
1142         if (!info->node_cache && new_leaf) {
1143                 /* Save our speculative allocation into the cache */
1144                 INIT_LIST_HEAD(&new_leaf->msg_list);
1145                 info->node_cache = new_leaf;
1146         } else {
1147                 kfree(new_leaf);
1148         }
1149
1150         if (info->attr.mq_curmsgs == 0) {
1151                 if (f.file->f_flags & O_NONBLOCK) {
1152                         spin_unlock(&info->lock);
1153                         ret = -EAGAIN;
1154                 } else {
1155                         wait.task = current;
1156                         wait.state = STATE_NONE;
1157                         ret = wq_sleep(info, RECV, timeout, &wait);
1158                         msg_ptr = wait.msg;
1159                 }
1160         } else {
1161                 WAKE_Q(wake_q);
1162
1163                 msg_ptr = msg_get(info);
1164
1165                 inode->i_atime = inode->i_mtime = inode->i_ctime =
1166                                 current_time(inode);
1167
1168                 /* There is now free space in queue. */
1169                 pipelined_receive(&wake_q, info);
1170                 spin_unlock(&info->lock);
1171                 wake_up_q(&wake_q);
1172                 ret = 0;
1173         }
1174         if (ret == 0) {
1175                 ret = msg_ptr->m_ts;
1176
1177                 if ((u_msg_prio && put_user(msg_ptr->m_type, u_msg_prio)) ||
1178                         store_msg(u_msg_ptr, msg_ptr, msg_ptr->m_ts)) {
1179                         ret = -EFAULT;
1180                 }
1181                 free_msg(msg_ptr);
1182         }
1183 out_fput:
1184         fdput(f);
1185 out:
1186         return ret;
1187 }
1188
1189 /*
1190  * Notes: the case when user wants us to deregister (with NULL as pointer)
1191  * and he isn't currently owner of notification, will be silently discarded.
1192  * It isn't explicitly defined in the POSIX.
1193  */
1194 SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
1195                 const struct sigevent __user *, u_notification)
1196 {
1197         int ret;
1198         struct fd f;
1199         struct sock *sock;
1200         struct inode *inode;
1201         struct sigevent notification;
1202         struct mqueue_inode_info *info;
1203         struct sk_buff *nc;
1204
1205         if (u_notification) {
1206                 if (copy_from_user(&notification, u_notification,
1207                                         sizeof(struct sigevent)))
1208                         return -EFAULT;
1209         }
1210
1211         audit_mq_notify(mqdes, u_notification ? &notification : NULL);
1212
1213         nc = NULL;
1214         sock = NULL;
1215         if (u_notification != NULL) {
1216                 if (unlikely(notification.sigev_notify != SIGEV_NONE &&
1217                              notification.sigev_notify != SIGEV_SIGNAL &&
1218                              notification.sigev_notify != SIGEV_THREAD))
1219                         return -EINVAL;
1220                 if (notification.sigev_notify == SIGEV_SIGNAL &&
1221                         !valid_signal(notification.sigev_signo)) {
1222                         return -EINVAL;
1223                 }
1224                 if (notification.sigev_notify == SIGEV_THREAD) {
1225                         long timeo;
1226
1227                         /* create the notify skb */
1228                         nc = alloc_skb(NOTIFY_COOKIE_LEN, GFP_KERNEL);
1229                         if (!nc) {
1230                                 ret = -ENOMEM;
1231                                 goto out;
1232                         }
1233                         if (copy_from_user(nc->data,
1234                                         notification.sigev_value.sival_ptr,
1235                                         NOTIFY_COOKIE_LEN)) {
1236                                 ret = -EFAULT;
1237                                 goto out;
1238                         }
1239
1240                         /* TODO: add a header? */
1241                         skb_put(nc, NOTIFY_COOKIE_LEN);
1242                         /* and attach it to the socket */
1243 retry:
1244                         f = fdget(notification.sigev_signo);
1245                         if (!f.file) {
1246                                 ret = -EBADF;
1247                                 goto out;
1248                         }
1249                         sock = netlink_getsockbyfilp(f.file);
1250                         fdput(f);
1251                         if (IS_ERR(sock)) {
1252                                 ret = PTR_ERR(sock);
1253                                 sock = NULL;
1254                                 goto out;
1255                         }
1256
1257                         timeo = MAX_SCHEDULE_TIMEOUT;
1258                         ret = netlink_attachskb(sock, nc, &timeo, NULL);
1259                         if (ret == 1) {
1260                                 sock = NULL;
1261                                 goto retry;
1262                         }
1263                         if (ret) {
1264                                 sock = NULL;
1265                                 nc = NULL;
1266                                 goto out;
1267                         }
1268                 }
1269         }
1270
1271         f = fdget(mqdes);
1272         if (!f.file) {
1273                 ret = -EBADF;
1274                 goto out;
1275         }
1276
1277         inode = file_inode(f.file);
1278         if (unlikely(f.file->f_op != &mqueue_file_operations)) {
1279                 ret = -EBADF;
1280                 goto out_fput;
1281         }
1282         info = MQUEUE_I(inode);
1283
1284         ret = 0;
1285         spin_lock(&info->lock);
1286         if (u_notification == NULL) {
1287                 if (info->notify_owner == task_tgid(current)) {
1288                         remove_notification(info);
1289                         inode->i_atime = inode->i_ctime = current_time(inode);
1290                 }
1291         } else if (info->notify_owner != NULL) {
1292                 ret = -EBUSY;
1293         } else {
1294                 switch (notification.sigev_notify) {
1295                 case SIGEV_NONE:
1296                         info->notify.sigev_notify = SIGEV_NONE;
1297                         break;
1298                 case SIGEV_THREAD:
1299                         info->notify_sock = sock;
1300                         info->notify_cookie = nc;
1301                         sock = NULL;
1302                         nc = NULL;
1303                         info->notify.sigev_notify = SIGEV_THREAD;
1304                         break;
1305                 case SIGEV_SIGNAL:
1306                         info->notify.sigev_signo = notification.sigev_signo;
1307                         info->notify.sigev_value = notification.sigev_value;
1308                         info->notify.sigev_notify = SIGEV_SIGNAL;
1309                         break;
1310                 }
1311
1312                 info->notify_owner = get_pid(task_tgid(current));
1313                 info->notify_user_ns = get_user_ns(current_user_ns());
1314                 inode->i_atime = inode->i_ctime = current_time(inode);
1315         }
1316         spin_unlock(&info->lock);
1317 out_fput:
1318         fdput(f);
1319 out:
1320         if (sock)
1321                 netlink_detachskb(sock, nc);
1322         else if (nc)
1323                 dev_kfree_skb(nc);
1324
1325         return ret;
1326 }
1327
1328 SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
1329                 const struct mq_attr __user *, u_mqstat,
1330                 struct mq_attr __user *, u_omqstat)
1331 {
1332         int ret;
1333         struct mq_attr mqstat, omqstat;
1334         struct fd f;
1335         struct inode *inode;
1336         struct mqueue_inode_info *info;
1337
1338         if (u_mqstat != NULL) {
1339                 if (copy_from_user(&mqstat, u_mqstat, sizeof(struct mq_attr)))
1340                         return -EFAULT;
1341                 if (mqstat.mq_flags & (~O_NONBLOCK))
1342                         return -EINVAL;
1343         }
1344
1345         f = fdget(mqdes);
1346         if (!f.file) {
1347                 ret = -EBADF;
1348                 goto out;
1349         }
1350
1351         inode = file_inode(f.file);
1352         if (unlikely(f.file->f_op != &mqueue_file_operations)) {
1353                 ret = -EBADF;
1354                 goto out_fput;
1355         }
1356         info = MQUEUE_I(inode);
1357
1358         spin_lock(&info->lock);
1359
1360         omqstat = info->attr;
1361         omqstat.mq_flags = f.file->f_flags & O_NONBLOCK;
1362         if (u_mqstat) {
1363                 audit_mq_getsetattr(mqdes, &mqstat);
1364                 spin_lock(&f.file->f_lock);
1365                 if (mqstat.mq_flags & O_NONBLOCK)
1366                         f.file->f_flags |= O_NONBLOCK;
1367                 else
1368                         f.file->f_flags &= ~O_NONBLOCK;
1369                 spin_unlock(&f.file->f_lock);
1370
1371                 inode->i_atime = inode->i_ctime = current_time(inode);
1372         }
1373
1374         spin_unlock(&info->lock);
1375
1376         ret = 0;
1377         if (u_omqstat != NULL && copy_to_user(u_omqstat, &omqstat,
1378                                                 sizeof(struct mq_attr)))
1379                 ret = -EFAULT;
1380
1381 out_fput:
1382         fdput(f);
1383 out:
1384         return ret;
1385 }
1386
1387 static const struct inode_operations mqueue_dir_inode_operations = {
1388         .lookup = simple_lookup,
1389         .create = mqueue_create,
1390         .unlink = mqueue_unlink,
1391 };
1392
1393 static const struct file_operations mqueue_file_operations = {
1394         .flush = mqueue_flush_file,
1395         .poll = mqueue_poll_file,
1396         .read = mqueue_read_file,
1397         .llseek = default_llseek,
1398 };
1399
1400 static const struct super_operations mqueue_super_ops = {
1401         .alloc_inode = mqueue_alloc_inode,
1402         .destroy_inode = mqueue_destroy_inode,
1403         .evict_inode = mqueue_evict_inode,
1404         .statfs = simple_statfs,
1405 };
1406
1407 static struct file_system_type mqueue_fs_type = {
1408         .name = "mqueue",
1409         .mount = mqueue_mount,
1410         .kill_sb = kill_litter_super,
1411         .fs_flags = FS_USERNS_MOUNT,
1412 };
1413
1414 int mq_init_ns(struct ipc_namespace *ns)
1415 {
1416         ns->mq_queues_count  = 0;
1417         ns->mq_queues_max    = DFLT_QUEUESMAX;
1418         ns->mq_msg_max       = DFLT_MSGMAX;
1419         ns->mq_msgsize_max   = DFLT_MSGSIZEMAX;
1420         ns->mq_msg_default   = DFLT_MSG;
1421         ns->mq_msgsize_default  = DFLT_MSGSIZE;
1422
1423         ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns);
1424         if (IS_ERR(ns->mq_mnt)) {
1425                 int err = PTR_ERR(ns->mq_mnt);
1426                 ns->mq_mnt = NULL;
1427                 return err;
1428         }
1429         return 0;
1430 }
1431
1432 void mq_clear_sbinfo(struct ipc_namespace *ns)
1433 {
1434         ns->mq_mnt->mnt_sb->s_fs_info = NULL;
1435 }
1436
1437 void mq_put_mnt(struct ipc_namespace *ns)
1438 {
1439         kern_unmount(ns->mq_mnt);
1440 }
1441
1442 static int __init init_mqueue_fs(void)
1443 {
1444         int error;
1445
1446         mqueue_inode_cachep = kmem_cache_create("mqueue_inode_cache",
1447                                 sizeof(struct mqueue_inode_info), 0,
1448                                 SLAB_HWCACHE_ALIGN|SLAB_ACCOUNT, init_once);
1449         if (mqueue_inode_cachep == NULL)
1450                 return -ENOMEM;
1451
1452         /* ignore failures - they are not fatal */
1453         mq_sysctl_table = mq_register_sysctl_table();
1454
1455         error = register_filesystem(&mqueue_fs_type);
1456         if (error)
1457                 goto out_sysctl;
1458
1459         spin_lock_init(&mq_lock);
1460
1461         error = mq_init_ns(&init_ipc_ns);
1462         if (error)
1463                 goto out_filesystem;
1464
1465         return 0;
1466
1467 out_filesystem:
1468         unregister_filesystem(&mqueue_fs_type);
1469 out_sysctl:
1470         if (mq_sysctl_table)
1471                 unregister_sysctl_table(mq_sysctl_table);
1472         kmem_cache_destroy(mqueue_inode_cachep);
1473         return error;
1474 }
1475
1476 device_initcall(init_mqueue_fs);