linux/ipc/mqueue.c
<<
>>
Prefs
   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_PENDING   1
  51#define STATE_READY     2
  52
  53struct posix_msg_tree_node {
  54        struct rb_node          rb_node;
  55        struct list_head        msg_list;
  56        int                     priority;
  57};
  58
  59struct ext_wait_queue {         /* queue of sleeping tasks */
  60        struct task_struct *task;
  61        struct list_head list;
  62        struct msg_msg *msg;    /* ptr of loaded message */
  63        int state;              /* one of STATE_* values */
  64};
  65
  66struct mqueue_inode_info {
  67        spinlock_t lock;
  68        struct inode vfs_inode;
  69        wait_queue_head_t wait_q;
  70
  71        struct rb_root msg_tree;
  72        struct posix_msg_tree_node *node_cache;
  73        struct mq_attr attr;
  74
  75        struct sigevent notify;
  76        struct pid* notify_owner;
  77        struct user_namespace *notify_user_ns;
  78        struct user_struct *user;       /* user who created, for accounting */
  79        struct sock *notify_sock;
  80        struct sk_buff *notify_cookie;
  81
  82        /* for tasks waiting for free space and messages, respectively */
  83        struct ext_wait_queue e_wait_q[2];
  84
  85        unsigned long qsize; /* size of queue in memory (sum of all msgs) */
  86};
  87
  88static const struct inode_operations mqueue_dir_inode_operations;
  89static const struct file_operations mqueue_file_operations;
  90static const struct super_operations mqueue_super_ops;
  91static void remove_notification(struct mqueue_inode_info *info);
  92
  93static struct kmem_cache *mqueue_inode_cachep;
  94
  95static struct ctl_table_header * mq_sysctl_table;
  96
  97static inline struct mqueue_inode_info *MQUEUE_I(struct inode *inode)
  98{
  99        return container_of(inode, struct mqueue_inode_info, vfs_inode);
 100}
 101
 102/*
 103 * This routine should be called with the mq_lock held.
 104 */
 105static inline struct ipc_namespace *__get_ns_from_inode(struct inode *inode)
 106{
 107        return get_ipc_ns(inode->i_sb->s_fs_info);
 108}
 109
 110static struct ipc_namespace *get_ns_from_inode(struct inode *inode)
 111{
 112        struct ipc_namespace *ns;
 113
 114        spin_lock(&mq_lock);
 115        ns = __get_ns_from_inode(inode);
 116        spin_unlock(&mq_lock);
 117        return ns;
 118}
 119
 120/* Auxiliary functions to manipulate messages' list */
 121static int msg_insert(struct msg_msg *msg, struct mqueue_inode_info *info)
 122{
 123        struct rb_node **p, *parent = NULL;
 124        struct posix_msg_tree_node *leaf;
 125
 126        p = &info->msg_tree.rb_node;
 127        while (*p) {
 128                parent = *p;
 129                leaf = rb_entry(parent, struct posix_msg_tree_node, rb_node);
 130
 131                if (likely(leaf->priority == msg->m_type))
 132                        goto insert_msg;
 133                else if (msg->m_type < leaf->priority)
 134                        p = &(*p)->rb_left;
 135                else
 136                        p = &(*p)->rb_right;
 137        }
 138        if (info->node_cache) {
 139                leaf = info->node_cache;
 140                info->node_cache = NULL;
 141        } else {
 142                leaf = kmalloc(sizeof(*leaf), GFP_ATOMIC);
 143                if (!leaf)
 144                        return -ENOMEM;
 145                rb_init_node(&leaf->rb_node);
 146                INIT_LIST_HEAD(&leaf->msg_list);
 147                info->qsize += sizeof(*leaf);
 148        }
 149        leaf->priority = msg->m_type;
 150        rb_link_node(&leaf->rb_node, parent, p);
 151        rb_insert_color(&leaf->rb_node, &info->msg_tree);
 152insert_msg:
 153        info->attr.mq_curmsgs++;
 154        info->qsize += msg->m_ts;
 155        list_add_tail(&msg->m_list, &leaf->msg_list);
 156        return 0;
 157}
 158
 159static inline struct msg_msg *msg_get(struct mqueue_inode_info *info)
 160{
 161        struct rb_node **p, *parent = NULL;
 162        struct posix_msg_tree_node *leaf;
 163        struct msg_msg *msg;
 164
 165try_again:
 166        p = &info->msg_tree.rb_node;
 167        while (*p) {
 168                parent = *p;
 169                /*
 170                 * During insert, low priorities go to the left and high to the
 171                 * right.  On receive, we want the highest priorities first, so
 172                 * walk all the way to the right.
 173                 */
 174                p = &(*p)->rb_right;
 175        }
 176        if (!parent) {
 177                if (info->attr.mq_curmsgs) {
 178                        pr_warn_once("Inconsistency in POSIX message queue, "
 179                                     "no tree element, but supposedly messages "
 180                                     "should exist!\n");
 181                        info->attr.mq_curmsgs = 0;
 182                }
 183                return NULL;
 184        }
 185        leaf = rb_entry(parent, struct posix_msg_tree_node, rb_node);
 186        if (unlikely(list_empty(&leaf->msg_list))) {
 187                pr_warn_once("Inconsistency in POSIX message queue, "
 188                             "empty leaf node but we haven't implemented "
 189                             "lazy leaf delete!\n");
 190                rb_erase(&leaf->rb_node, &info->msg_tree);
 191                if (info->node_cache) {
 192                        info->qsize -= sizeof(*leaf);
 193                        kfree(leaf);
 194                } else {
 195                        info->node_cache = leaf;
 196                }
 197                goto try_again;
 198        } else {
 199                msg = list_first_entry(&leaf->msg_list,
 200                                       struct msg_msg, m_list);
 201                list_del(&msg->m_list);
 202                if (list_empty(&leaf->msg_list)) {
 203                        rb_erase(&leaf->rb_node, &info->msg_tree);
 204                        if (info->node_cache) {
 205                                info->qsize -= sizeof(*leaf);
 206                                kfree(leaf);
 207                        } else {
 208                                info->node_cache = leaf;
 209                        }
 210                }
 211        }
 212        info->attr.mq_curmsgs--;
 213        info->qsize -= msg->m_ts;
 214        return msg;
 215}
 216
 217static struct inode *mqueue_get_inode(struct super_block *sb,
 218                struct ipc_namespace *ipc_ns, umode_t mode,
 219                struct mq_attr *attr)
 220{
 221        struct user_struct *u = current_user();
 222        struct inode *inode;
 223        int ret = -ENOMEM;
 224
 225        inode = new_inode(sb);
 226        if (!inode)
 227                goto err;
 228
 229        inode->i_ino = get_next_ino();
 230        inode->i_mode = mode;
 231        inode->i_uid = current_fsuid();
 232        inode->i_gid = current_fsgid();
 233        inode->i_mtime = inode->i_ctime = inode->i_atime = CURRENT_TIME;
 234
 235        if (S_ISREG(mode)) {
 236                struct mqueue_inode_info *info;
 237                unsigned long mq_bytes, mq_treesize;
 238
 239                inode->i_fop = &mqueue_file_operations;
 240                inode->i_size = FILENT_SIZE;
 241                /* mqueue specific info */
 242                info = MQUEUE_I(inode);
 243                spin_lock_init(&info->lock);
 244                init_waitqueue_head(&info->wait_q);
 245                INIT_LIST_HEAD(&info->e_wait_q[0].list);
 246                INIT_LIST_HEAD(&info->e_wait_q[1].list);
 247                info->notify_owner = NULL;
 248                info->notify_user_ns = NULL;
 249                info->qsize = 0;
 250                info->user = NULL;      /* set when all is ok */
 251                info->msg_tree = RB_ROOT;
 252                info->node_cache = NULL;
 253                memset(&info->attr, 0, sizeof(info->attr));
 254                info->attr.mq_maxmsg = min(ipc_ns->mq_msg_max,
 255                                           ipc_ns->mq_msg_default);
 256                info->attr.mq_msgsize = min(ipc_ns->mq_msgsize_max,
 257                                            ipc_ns->mq_msgsize_default);
 258                if (attr) {
 259                        info->attr.mq_maxmsg = attr->mq_maxmsg;
 260                        info->attr.mq_msgsize = attr->mq_msgsize;
 261                }
 262                /*
 263                 * We used to allocate a static array of pointers and account
 264                 * the size of that array as well as one msg_msg struct per
 265                 * possible message into the queue size. That's no longer
 266                 * accurate as the queue is now an rbtree and will grow and
 267                 * shrink depending on usage patterns.  We can, however, still
 268                 * account one msg_msg struct per message, but the nodes are
 269                 * allocated depending on priority usage, and most programs
 270                 * only use one, or a handful, of priorities.  However, since
 271                 * this is pinned memory, we need to assume worst case, so
 272                 * that means the min(mq_maxmsg, max_priorities) * struct
 273                 * posix_msg_tree_node.
 274                 */
 275                mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
 276                        min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
 277                        sizeof(struct posix_msg_tree_node);
 278
 279                mq_bytes = mq_treesize + (info->attr.mq_maxmsg *
 280                                          info->attr.mq_msgsize);
 281
 282                spin_lock(&mq_lock);
 283                if (u->mq_bytes + mq_bytes < u->mq_bytes ||
 284                    u->mq_bytes + mq_bytes > rlimit(RLIMIT_MSGQUEUE)) {
 285                        spin_unlock(&mq_lock);
 286                        /* mqueue_evict_inode() releases info->messages */
 287                        ret = -EMFILE;
 288                        goto out_inode;
 289                }
 290                u->mq_bytes += mq_bytes;
 291                spin_unlock(&mq_lock);
 292
 293                /* all is ok */
 294                info->user = get_uid(u);
 295        } else if (S_ISDIR(mode)) {
 296                inc_nlink(inode);
 297                /* Some things misbehave if size == 0 on a directory */
 298                inode->i_size = 2 * DIRENT_SIZE;
 299                inode->i_op = &mqueue_dir_inode_operations;
 300                inode->i_fop = &simple_dir_operations;
 301        }
 302
 303        return inode;
 304out_inode:
 305        iput(inode);
 306err:
 307        return ERR_PTR(ret);
 308}
 309
 310static int mqueue_fill_super(struct super_block *sb, void *data, int silent)
 311{
 312        struct inode *inode;
 313        struct ipc_namespace *ns = data;
 314
 315        sb->s_blocksize = PAGE_CACHE_SIZE;
 316        sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
 317        sb->s_magic = MQUEUE_MAGIC;
 318        sb->s_op = &mqueue_super_ops;
 319
 320        inode = mqueue_get_inode(sb, ns, S_IFDIR | S_ISVTX | S_IRWXUGO, NULL);
 321        if (IS_ERR(inode))
 322                return PTR_ERR(inode);
 323
 324        sb->s_root = d_make_root(inode);
 325        if (!sb->s_root)
 326                return -ENOMEM;
 327        return 0;
 328}
 329
 330static struct dentry *mqueue_mount(struct file_system_type *fs_type,
 331                         int flags, const char *dev_name,
 332                         void *data)
 333{
 334        if (!(flags & MS_KERNMOUNT))
 335                data = current->nsproxy->ipc_ns;
 336        return mount_ns(fs_type, flags, data, mqueue_fill_super);
 337}
 338
 339static void init_once(void *foo)
 340{
 341        struct mqueue_inode_info *p = (struct mqueue_inode_info *) foo;
 342
 343        inode_init_once(&p->vfs_inode);
 344}
 345
 346static struct inode *mqueue_alloc_inode(struct super_block *sb)
 347{
 348        struct mqueue_inode_info *ei;
 349
 350        ei = kmem_cache_alloc(mqueue_inode_cachep, GFP_KERNEL);
 351        if (!ei)
 352                return NULL;
 353        return &ei->vfs_inode;
 354}
 355
 356static void mqueue_i_callback(struct rcu_head *head)
 357{
 358        struct inode *inode = container_of(head, struct inode, i_rcu);
 359        kmem_cache_free(mqueue_inode_cachep, MQUEUE_I(inode));
 360}
 361
 362static void mqueue_destroy_inode(struct inode *inode)
 363{
 364        call_rcu(&inode->i_rcu, mqueue_i_callback);
 365}
 366
 367static void mqueue_evict_inode(struct inode *inode)
 368{
 369        struct mqueue_inode_info *info;
 370        struct user_struct *user;
 371        unsigned long mq_bytes, mq_treesize;
 372        struct ipc_namespace *ipc_ns;
 373        struct msg_msg *msg;
 374
 375        clear_inode(inode);
 376
 377        if (S_ISDIR(inode->i_mode))
 378                return;
 379
 380        ipc_ns = get_ns_from_inode(inode);
 381        info = MQUEUE_I(inode);
 382        spin_lock(&info->lock);
 383        while ((msg = msg_get(info)) != NULL)
 384                free_msg(msg);
 385        kfree(info->node_cache);
 386        spin_unlock(&info->lock);
 387
 388        /* Total amount of bytes accounted for the mqueue */
 389        mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
 390                min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
 391                sizeof(struct posix_msg_tree_node);
 392
 393        mq_bytes = mq_treesize + (info->attr.mq_maxmsg *
 394                                  info->attr.mq_msgsize);
 395
 396        user = info->user;
 397        if (user) {
 398                spin_lock(&mq_lock);
 399                user->mq_bytes -= mq_bytes;
 400                /*
 401                 * get_ns_from_inode() ensures that the
 402                 * (ipc_ns = sb->s_fs_info) is either a valid ipc_ns
 403                 * to which we now hold a reference, or it is NULL.
 404                 * We can't put it here under mq_lock, though.
 405                 */
 406                if (ipc_ns)
 407                        ipc_ns->mq_queues_count--;
 408                spin_unlock(&mq_lock);
 409                free_uid(user);
 410        }
 411        if (ipc_ns)
 412                put_ipc_ns(ipc_ns);
 413}
 414
 415static int mqueue_create(struct inode *dir, struct dentry *dentry,
 416                                umode_t mode, bool excl)
 417{
 418        struct inode *inode;
 419        struct mq_attr *attr = dentry->d_fsdata;
 420        int error;
 421        struct ipc_namespace *ipc_ns;
 422
 423        spin_lock(&mq_lock);
 424        ipc_ns = __get_ns_from_inode(dir);
 425        if (!ipc_ns) {
 426                error = -EACCES;
 427                goto out_unlock;
 428        }
 429        if (ipc_ns->mq_queues_count >= HARD_QUEUESMAX ||
 430            (ipc_ns->mq_queues_count >= ipc_ns->mq_queues_max &&
 431             !capable(CAP_SYS_RESOURCE))) {
 432                error = -ENOSPC;
 433                goto out_unlock;
 434        }
 435        ipc_ns->mq_queues_count++;
 436        spin_unlock(&mq_lock);
 437
 438        inode = mqueue_get_inode(dir->i_sb, ipc_ns, mode, attr);
 439        if (IS_ERR(inode)) {
 440                error = PTR_ERR(inode);
 441                spin_lock(&mq_lock);
 442                ipc_ns->mq_queues_count--;
 443                goto out_unlock;
 444        }
 445
 446        put_ipc_ns(ipc_ns);
 447        dir->i_size += DIRENT_SIZE;
 448        dir->i_ctime = dir->i_mtime = dir->i_atime = CURRENT_TIME;
 449
 450        d_instantiate(dentry, inode);
 451        dget(dentry);
 452        return 0;
 453out_unlock:
 454        spin_unlock(&mq_lock);
 455        if (ipc_ns)
 456                put_ipc_ns(ipc_ns);
 457        return error;
 458}
 459
 460static int mqueue_unlink(struct inode *dir, struct dentry *dentry)
 461{
 462        struct inode *inode = dentry->d_inode;
 463
 464        dir->i_ctime = dir->i_mtime = dir->i_atime = CURRENT_TIME;
 465        dir->i_size -= DIRENT_SIZE;
 466        drop_nlink(inode);
 467        dput(dentry);
 468        return 0;
 469}
 470
 471/*
 472*       This is routine for system read from queue file.
 473*       To avoid mess with doing here some sort of mq_receive we allow
 474*       to read only queue size & notification info (the only values
 475*       that are interesting from user point of view and aren't accessible
 476*       through std routines)
 477*/
 478static ssize_t mqueue_read_file(struct file *filp, char __user *u_data,
 479                                size_t count, loff_t *off)
 480{
 481        struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode);
 482        char buffer[FILENT_SIZE];
 483        ssize_t ret;
 484
 485        spin_lock(&info->lock);
 486        snprintf(buffer, sizeof(buffer),
 487                        "QSIZE:%-10lu NOTIFY:%-5d SIGNO:%-5d NOTIFY_PID:%-6d\n",
 488                        info->qsize,
 489                        info->notify_owner ? info->notify.sigev_notify : 0,
 490                        (info->notify_owner &&
 491                         info->notify.sigev_notify == SIGEV_SIGNAL) ?
 492                                info->notify.sigev_signo : 0,
 493                        pid_vnr(info->notify_owner));
 494        spin_unlock(&info->lock);
 495        buffer[sizeof(buffer)-1] = '\0';
 496
 497        ret = simple_read_from_buffer(u_data, count, off, buffer,
 498                                strlen(buffer));
 499        if (ret <= 0)
 500                return ret;
 501
 502        filp->f_path.dentry->d_inode->i_atime = filp->f_path.dentry->d_inode->i_ctime = CURRENT_TIME;
 503        return ret;
 504}
 505
 506static int mqueue_flush_file(struct file *filp, fl_owner_t id)
 507{
 508        struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode);
 509
 510        spin_lock(&info->lock);
 511        if (task_tgid(current) == info->notify_owner)
 512                remove_notification(info);
 513
 514        spin_unlock(&info->lock);
 515        return 0;
 516}
 517
 518static unsigned int mqueue_poll_file(struct file *filp, struct poll_table_struct *poll_tab)
 519{
 520        struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode);
 521        int retval = 0;
 522
 523        poll_wait(filp, &info->wait_q, poll_tab);
 524
 525        spin_lock(&info->lock);
 526        if (info->attr.mq_curmsgs)
 527                retval = POLLIN | POLLRDNORM;
 528
 529        if (info->attr.mq_curmsgs < info->attr.mq_maxmsg)
 530                retval |= POLLOUT | POLLWRNORM;
 531        spin_unlock(&info->lock);
 532
 533        return retval;
 534}
 535
 536/* Adds current to info->e_wait_q[sr] before element with smaller prio */
 537static void wq_add(struct mqueue_inode_info *info, int sr,
 538                        struct ext_wait_queue *ewp)
 539{
 540        struct ext_wait_queue *walk;
 541
 542        ewp->task = current;
 543
 544        list_for_each_entry(walk, &info->e_wait_q[sr].list, list) {
 545                if (walk->task->static_prio <= current->static_prio) {
 546                        list_add_tail(&ewp->list, &walk->list);
 547                        return;
 548                }
 549        }
 550        list_add_tail(&ewp->list, &info->e_wait_q[sr].list);
 551}
 552
 553/*
 554 * Puts current task to sleep. Caller must hold queue lock. After return
 555 * lock isn't held.
 556 * sr: SEND or RECV
 557 */
 558static int wq_sleep(struct mqueue_inode_info *info, int sr,
 559                    ktime_t *timeout, struct ext_wait_queue *ewp)
 560{
 561        int retval;
 562        signed long time;
 563
 564        wq_add(info, sr, ewp);
 565
 566        for (;;) {
 567                set_current_state(TASK_INTERRUPTIBLE);
 568
 569                spin_unlock(&info->lock);
 570                time = schedule_hrtimeout_range_clock(timeout, 0,
 571                        HRTIMER_MODE_ABS, CLOCK_REALTIME);
 572
 573                while (ewp->state == STATE_PENDING)
 574                        cpu_relax();
 575
 576                if (ewp->state == STATE_READY) {
 577                        retval = 0;
 578                        goto out;
 579                }
 580                spin_lock(&info->lock);
 581                if (ewp->state == STATE_READY) {
 582                        retval = 0;
 583                        goto out_unlock;
 584                }
 585                if (signal_pending(current)) {
 586                        retval = -ERESTARTSYS;
 587                        break;
 588                }
 589                if (time == 0) {
 590                        retval = -ETIMEDOUT;
 591                        break;
 592                }
 593        }
 594        list_del(&ewp->list);
 595out_unlock:
 596        spin_unlock(&info->lock);
 597out:
 598        return retval;
 599}
 600
 601/*
 602 * Returns waiting task that should be serviced first or NULL if none exists
 603 */
 604static struct ext_wait_queue *wq_get_first_waiter(
 605                struct mqueue_inode_info *info, int sr)
 606{
 607        struct list_head *ptr;
 608
 609        ptr = info->e_wait_q[sr].list.prev;
 610        if (ptr == &info->e_wait_q[sr].list)
 611                return NULL;
 612        return list_entry(ptr, struct ext_wait_queue, list);
 613}
 614
 615
 616static inline void set_cookie(struct sk_buff *skb, char code)
 617{
 618        ((char*)skb->data)[NOTIFY_COOKIE_LEN-1] = code;
 619}
 620
 621/*
 622 * The next function is only to split too long sys_mq_timedsend
 623 */
 624static void __do_notify(struct mqueue_inode_info *info)
 625{
 626        /* notification
 627         * invoked when there is registered process and there isn't process
 628         * waiting synchronously for message AND state of queue changed from
 629         * empty to not empty. Here we are sure that no one is waiting
 630         * synchronously. */
 631        if (info->notify_owner &&
 632            info->attr.mq_curmsgs == 1) {
 633                struct siginfo sig_i;
 634                switch (info->notify.sigev_notify) {
 635                case SIGEV_NONE:
 636                        break;
 637                case SIGEV_SIGNAL:
 638                        /* sends signal */
 639
 640                        sig_i.si_signo = info->notify.sigev_signo;
 641                        sig_i.si_errno = 0;
 642                        sig_i.si_code = SI_MESGQ;
 643                        sig_i.si_value = info->notify.sigev_value;
 644                        /* map current pid/uid into info->owner's namespaces */
 645                        rcu_read_lock();
 646                        sig_i.si_pid = task_tgid_nr_ns(current,
 647                                                ns_of_pid(info->notify_owner));
 648                        sig_i.si_uid = from_kuid_munged(info->notify_user_ns, current_uid());
 649                        rcu_read_unlock();
 650
 651                        kill_pid_info(info->notify.sigev_signo,
 652                                      &sig_i, info->notify_owner);
 653                        break;
 654                case SIGEV_THREAD:
 655                        set_cookie(info->notify_cookie, NOTIFY_WOKENUP);
 656                        netlink_sendskb(info->notify_sock, info->notify_cookie);
 657                        break;
 658                }
 659                /* after notification unregisters process */
 660                put_pid(info->notify_owner);
 661                put_user_ns(info->notify_user_ns);
 662                info->notify_owner = NULL;
 663                info->notify_user_ns = NULL;
 664        }
 665        wake_up(&info->wait_q);
 666}
 667
 668static int prepare_timeout(const struct timespec __user *u_abs_timeout,
 669                           ktime_t *expires, struct timespec *ts)
 670{
 671        if (copy_from_user(ts, u_abs_timeout, sizeof(struct timespec)))
 672                return -EFAULT;
 673        if (!timespec_valid(ts))
 674                return -EINVAL;
 675
 676        *expires = timespec_to_ktime(*ts);
 677        return 0;
 678}
 679
 680static void remove_notification(struct mqueue_inode_info *info)
 681{
 682        if (info->notify_owner != NULL &&
 683            info->notify.sigev_notify == SIGEV_THREAD) {
 684                set_cookie(info->notify_cookie, NOTIFY_REMOVED);
 685                netlink_sendskb(info->notify_sock, info->notify_cookie);
 686        }
 687        put_pid(info->notify_owner);
 688        put_user_ns(info->notify_user_ns);
 689        info->notify_owner = NULL;
 690        info->notify_user_ns = NULL;
 691}
 692
 693static int mq_attr_ok(struct ipc_namespace *ipc_ns, struct mq_attr *attr)
 694{
 695        int mq_treesize;
 696        unsigned long total_size;
 697
 698        if (attr->mq_maxmsg <= 0 || attr->mq_msgsize <= 0)
 699                return -EINVAL;
 700        if (capable(CAP_SYS_RESOURCE)) {
 701                if (attr->mq_maxmsg > HARD_MSGMAX ||
 702                    attr->mq_msgsize > HARD_MSGSIZEMAX)
 703                        return -EINVAL;
 704        } else {
 705                if (attr->mq_maxmsg > ipc_ns->mq_msg_max ||
 706                                attr->mq_msgsize > ipc_ns->mq_msgsize_max)
 707                        return -EINVAL;
 708        }
 709        /* check for overflow */
 710        if (attr->mq_msgsize > ULONG_MAX/attr->mq_maxmsg)
 711                return -EOVERFLOW;
 712        mq_treesize = attr->mq_maxmsg * sizeof(struct msg_msg) +
 713                min_t(unsigned int, attr->mq_maxmsg, MQ_PRIO_MAX) *
 714                sizeof(struct posix_msg_tree_node);
 715        total_size = attr->mq_maxmsg * attr->mq_msgsize;
 716        if (total_size + mq_treesize < total_size)
 717                return -EOVERFLOW;
 718        return 0;
 719}
 720
 721/*
 722 * Invoked when creating a new queue via sys_mq_open
 723 */
 724static struct file *do_create(struct ipc_namespace *ipc_ns, struct inode *dir,
 725                        struct path *path, int oflag, umode_t mode,
 726                        struct mq_attr *attr)
 727{
 728        const struct cred *cred = current_cred();
 729        int ret;
 730
 731        if (attr) {
 732                ret = mq_attr_ok(ipc_ns, attr);
 733                if (ret)
 734                        return ERR_PTR(ret);
 735                /* store for use during create */
 736                path->dentry->d_fsdata = attr;
 737        } else {
 738                struct mq_attr def_attr;
 739
 740                def_attr.mq_maxmsg = min(ipc_ns->mq_msg_max,
 741                                         ipc_ns->mq_msg_default);
 742                def_attr.mq_msgsize = min(ipc_ns->mq_msgsize_max,
 743                                          ipc_ns->mq_msgsize_default);
 744                ret = mq_attr_ok(ipc_ns, &def_attr);
 745                if (ret)
 746                        return ERR_PTR(ret);
 747        }
 748
 749        mode &= ~current_umask();
 750        ret = vfs_create(dir, path->dentry, mode, true);
 751        path->dentry->d_fsdata = NULL;
 752        if (ret)
 753                return ERR_PTR(ret);
 754        return dentry_open(path, oflag, cred);
 755}
 756
 757/* Opens existing queue */
d_fsdata = ame="L753"> 753a = ame="L75f">dentryueue.c#L747" id="L747" class="line" namm1e="L754"> 754        retu queue3                   attr;
<         7   /ss="liline" namts,         (O_ACCMODname="L700"> 700O_ACCMODn nothref{igned int, notieAdentry_opeeA 700eA(info->notieA 700eA(path, 7nfo->ts, path, notify_own7r76href="+code=EFAUL"L754" class="licode=info" cl" class="sref">mpc/mque" nam 700O_ACCMODn not)>-&g"L754" class="liO_RDWref="ipc/mqueue.O_RDWrass=  ( 754        user_ns" 7lass="sref">notify_user_7s76/a>(ret)
path, ;
 acref">ts, ->ts,         (code=info" cl" class="sref">mpc/mque" nam 700O_ACCMODn not]lass="sref">path, credinfo-7gt;mq_otificpermisshref="ipc/mqueue.cotificpermisshre id="L754" class="line" name="L754"> 754   pc/mqueue.c#L751" id="L751" class="line" name="L751"> 751        ret = ts,  754        u55"> 755<>);
ret)
path, }
);
 754        return dentry_opentruct credclass="sref">path, __user * 718    ef="+code7timespec" class="sref">t7mespe77nt ts<7a>)
dentry_opeSYSCALL_DEFINE4ef="+code=cred"SYSCALL_DEFINE4 id="L754" class="li id="L7"line" name="L744"754" id=,/ss="li_cookie(struct prepare_timeout(c      if (prepare_t="mquelass="lin     return dentry_ope *dir, 7out, sizeof(struct <7 href7"+code=timespec" class737        } else {
prepare_timeout(c      if ( 672                ret7rn -<7 href=" class="sref">attr;
timespe7_vali7(d_fsdata = ame="L753"> 753a = amf">d_fsdata = ame="L753"> 753a = alass="sref">path,  674                ret7rn -<775a>(d_fsdata */
        }
 = alass="sref">path, cred;
prepare_tmquelasslass="sref">path,  755timespec_to7ktime7/a>(*dentry->dir,erroode=dentry" claserrooref">dentry->(*file *do_create(stru        const struct ef="+code=cred" class=L751"> 751         751        do_create(stru>dentry-> 6787/a>}
        } else vfsmout ef="+code=cred"vfsmout ef="+code=do_create" mt ef="+code=cred"mnhref="ipc/mqueue.c#L750ue.c#L743" id="L743" class="line" name="L743"> 743 t ef="+code=cred"ma> t stru>dentry->ts<7ss="sref">mqueue_inode_i7fo(* 75oo"/mqueue.c#L744" id="L74t ef="+code=cred"mnhref=e" name="L743"> 743 7/s="roo"stru>dentry->7a>)
NULL;
->notify_owner != <7 href7"+codea>->mq_="a href="ipc/mqueue.u_        a>->        const s"> 670{
(notify7cookie, timespec)))
 audit_ id="L7"line" name="L7audit_ id="L7 id="L754" class="lief="+code=dentry_open" class="sref">dentry_ope path-="a href="ipc/mqueue.u_        a?et = ->path, info-> 74s="sref">7nfo->mq_IS_ERref="ipc/mqueue.IS_ERr id="L754" class="limquesref">prepare_tmquelasseue.c#L744" id="L7getmquesref">prepare_tgetmque id="L754" class="li="mquesref">prepare_t="mquelassu_abs_timeout" class="sref"7ify_owner7 class="sref">notify_own7r79 id="L739" class="lincode=out" class="sref"PTR_ERref="ipc/mqueue.PTR_ERr id="L754" class="limquesref">prepare_tmquelassclass="sref">path, notify_user_7s7= path, 7a>;
 700O_CLOEXEClassclass="sref">path, mq_a7tr(prepare_tef="iutmque" id="L672" class="line" name7ef">attr<7a>)
7695        int NULL;
 6967       unsigned long  erroode=dentry" claserrooref"                nomutex="ipc/mqueue.c#L645"mutex="ipc="L67t =  75oo"/mqu"> 751        "> 751        path, 7attr-> 753a = a" id="L742" clas="L751" class="line" name="L751+ue.c#L744" id="L7lookup_one_lL7"line" name="L7lookup_one_lL7 id="L754" class="limquesref">prepare_tmquelass="sref">path-roo" name="L753"> 75oo"/mqu="sref">path->(prepare_tmquelasscclass="sref">path,  689                ret8rn -<8 href="+code=EINVAL" class="sref"IS_ERref="ipc/mqueue.IS_ERr id="L754" class="li = ame="L753"> 753a = a" id="L742" clas="L751" class="line" name="L751ref="+code=capable" class="s8ef">capab8e(C" name="L686"> erroode=dentry" claserrooref"   t" class="sref"PTR_ERref="ipc/mqueue.PTR_ERr id="L754" class="li = ame="L753"> 753a = a" id="L742" clas="L751" class="line" name="L751rlass="sref">path, capab8e>;
mq_msgsi8e >  718   8703  8                     ret8rn -<8 href="+code=EL754" class="li = ame="L753"> 753a = a" id="L742" clasmt ef="+code=cred"mnhref="ipc/mqueue.c#L750mnhge" name="L753"> 7mnhge" id="L754" class="li t ef="+code=cred"mnhref=); name="L718"> 718   8753  8 >)
ipc_ns->mq_code=info" cl" class="sref">mpc/mque" nammq_ = ame="L753"> 753a = a" id="L742" clas="L751" class="line" name="L751"> 751        )f=esize"756" class="line" name="ame=" al649"y> 756 659  8707  8                     ret8rn -<80="line" name="L737"> "+code=EL754" class="liaudit_mespace" class="srefaudit_mespa id="L754" class="limquesref">prepare_tmquelass="sref">path- = ame="L753"> 753a = a" id="L742" clas="L751" class="line" name="L751rlass="sref">path,   8 ttr->u_ae" class="sref">mq_code=info" cl" class="sref">mpc/mque" nam 709        <8pan c81 id="L739" class="lin" class="sref">C" name="L686"> erroode=dentry" claserrooref"   >timespec)))
EXISref="ipc/mqueue.cEXISr" id="L672" class="line" name8=attr" cl8ss="sref">attr-><8 href8"+code=mq_maxmsg" classsssssssssssssssgoto    return capab8               return -<8 href81HARD_MSGMAX" class="sssssssss" name="L718"> 718   8ref">mq_m8xmsg * sizeof(struct8C" name="L686"> "ip>        }
 = a"ipc/mqueue.c#L750758" class="line" name="L7ueue.3lat =  754        return path, mq_maxmsg, attr;
8zeof(stru8t NULL;
attr->mq_msg_max ||
NULL;
-> <   8               return -<8 href81="line" name="L737"> "+code=E" name="L718"> 718   8r97  8/mqueue.c#L718" id="L7188 clas81abs_timeout" class="sref">u_a" name="L686"> "ip>        }
 = a"ipc/mqueue.c#L750758c class="line" name="L724"> 724c/mqueue.c#L750ue.c#L743" id="L743" class="lin="sref">path-roo" name="L753"> 75oo"/mqu"> 751        r name="L718"> 718   8    retur8 0;
CCCCCCCCCCCCCCCCCt =  754        return dir,  7198/a>}
path-="a href="ipc/mqueue.u_        a?et = ->path,  718   82 * Invo8ed wh82SGSIZEMAX" cl"e=attr" class="sref">attr;
8ue.c#L7238 id="L723" class="line" 8ame="82MQ_PRIO_MAX" class="sFAULT" class="sref"> = ame="L753"> 753a = a" id="L742" clas="L751" class="line" name="L751"> 751        )f= class="sref">attr;
8ueof(stru8ode=inode" class="sref">8node<8a> * erroode=dentry" claserrooref"   >timespec)))
NOENref="ipc/mqueue.cNOENr" id="L672" class="line" name8f="+code=8mode_t" class="sref">umo8e_t mq_a8tr 718   8207  8a>)
 L754" class="liaudit_mespace" class="srefaudit_mespa id="L754" class="limquesref">prepare_tmquelass="sref">path- = ame="L753"> 753a = a" id="L742" clas="L751" class="line" name="L751rlass="sref">path, cred =  "ip>        }
 = a"ipc/mqueue.c#L750758" class="line" name="L7ueue.3lat =  754        return path,  729 8     83 id="L739" cl" name="L718"> 718   8sref">ret8/a>;
path,  731     8  if 8IS_ERref="ipc/mqueue.IS_ERr id="L754" class="li"ip>        }
 = a_abs_timeout" class="sref"8f="+code=8pc_ns" class="sref">ipc_8s8 dir,"ip>        }
 = a_lass="sref">path,  733         8     8if (path, ER8_PTR<8a>( erroode=dentry" claserrooref"   t" class="sref"PTR_ERref="ipc/mqueue.PTR_ERr id="L754" class="li"ip>        }
 = a_lass="sref">path, /   return path, d_fsda8a83" class="line" name="L686"> 4 754 =  754   _lass="sref">path,   8c/mqueue.c#L737" id="L738" cla8s="lin   return path, mq_attr8mq_erroode=dentry" claserrooref")f= class="sref">attr;
8>def_attr8/a>;
ipc/mn" id_fdname="L754"> 754pc/mn" id_fd id="L754" class="li"e=sig_i" class="sd"sre_lass="sref">path, ipc_ns->dentry->ip8_ns-> 718   8="sref">i8c_ns->dir, utex=un"ipc/mqueue.c#L645"mutex=un"ipce.3lat =  75oo"/mqu"> 751        "> 751        path, 8> 718   8ns" class8"sref">ipc_ns, &8a hre8="+cod   return prepare_tef="iutmque" id:ass="sref">path,  745         8     84e=mq_treesize" namprepare_tiutmque" id"L754" class="limquesref">prepare_tmquelassclass="sref">path, ER8_PTR<8a>(path,   8ref="ipc/mqueue.c#L747" 8d="L787" cla" name="L718"> 718   8=class="s8   }
mod8 &= ~(struct prepare_timeout(c      if (prepare_t="mquelassabs_timeout" class="sref"8 href="+c8de=mode" class="sref">mo8e8 attr;
8code=d_fs8ata" class="sref">d_fsda8a85y_user_ns" clline" nampath,  752 8     8if (prepare_tmquelasslass="sref">path, ER8_PTR<8a>(path, ofl8g855a>(d_fsdatamespace" class="sref">ipc_namespace *ipc_name->dentry->cred);
d_fsdatam+code=file" class="sref">file *do_create(stru        const struct ef="+code=cred" class=L751"> 751         751        do_create(stru>dentry->}
        } else vfsmout ef="+code=cred"vfsmout ef="+code=do_create" mt ef="+code=cred"mnhref="ipc/mqueue.c#L750ue.c#L743" id="L743" class="line" name="L743"> 743 t ef="+code=cred"ma> t stru>dentry-> 757 78retu queu83                   prepare_tmquelasseue.c#L744" id="L7getmquesref">prepare_tgetmque id="L754" class="li="mquesref">prepare_t="mquelassu>dentry->prepare_tmquelassccdentry->info->prepare_tmquelassclass="sref">path, 8nfo->notify_own8r86sgsize_max" c"sref">dir,errde=dentry" claserr"sreeue.c#L744" id="L74t _wat _wri50" class="line" 4t _wat _wri50 id="L754" class="li t ef="+code=cred"mnhref=);691" class="line" name="8sf="+code8lass="sref">notify_user_8s86/a>(mq_errde=dentry" claserr"srecdentry->prepare_tef="mquelasslass="sref">path, credinfo-8gt; 743 7/s="roo"stru"> 751        "> 751        );
 ="L751" class="line" name="L751+ue.c#L744" id="L7lookup_one_lL7"line" name="L7lookup_one_lL7 id="L754" class="limquesref">prepare_tmquelass="sref">path-4t ef="+code=cred"mnhref=e" name="L743"> 743 7/s="roo"stru="sref">path->(prepare_tmquelasscclass="sref">path, __user * errde=dentry" claserr"sreeue.c#L744" id="L7PTR_ERref="ipc/mqueue.PTR_ERr id="L754" class="li="L751" class="line" name="L751rlass="sref">path, t8mespe87 id="L739" class="lingoto    return path, ts<8a>)
 718   8s="sref">8out, sizeof(struct <8 href87id="L691" class="line" name="8"L672"> 682                ret8rn -<87sgsize_max" c"sref">dir,mespace" class="sref">ipc_name-> 751        lass="sref">path, timespe8_vali87/a>(mespace" class="sref">ipc_namef="+code=capable" class="s8"L674"> 684                ret8rn -<87>( errde=dentry" claserr"sreeue>timespec)))
NOENref="ipc/mqueue.cNOENr" id="L672" class="line" name8"">cred;
attr;
8"55"> 7558class="sref">timespec_to8ktime87ode=total_size" class" class="sref">mholref="+code=cred"mholr id="L754" class="limespace" class="sref">ipc_name="L672" class="line" name8"ss="line8/mqueue.c#L677" id="L6778 clas87="line" name="L737"> L754" class="lierrde=dentry" claserr"sreeue.c#L744" id="L7nameun"in="line" name="L7nameun"in= id="L754" class="li="L751" class="line" name="L751"> 751         751        ="sref">path-="L751" class="line" name="L751rlass="sref">path,  718   8678"> 6788/a>}
currdiutname="L754"> 75diute.3lasref">path-="L751" class="line" name="L751rlass="sref">path, ts<8ss="sref">mqueue_inode_i8fopath, 8a>)
path, notify_owner != <8 href88sgsize_max" c"sref">dir, utex=un"ipc/mqueue.c#L645"mutex=un"ipce.3lat =  743 7/s="roo"stru"> 751        "> 751        path, mq_mespace" class="sref">ipc_nameass="sref">path,  68cookie,  75iiute.3lasref">path-mespace" class="sref">ipc_name="L672" class="line" name8ass="sref8>info-> 718   8/a>);
prepare_tef="mquelass:ass="sref">path, info->noiutmquesref">prepare_tiutmque" id"L754" class="limquesref">prepare_tmquelassclass="sref">path, 8nfo->notify_own8r89 id="L739" clcode=out" class="sref"errde=dentry" claserr"srelass="sref">path, notify_user_8s8=  718   8u="sref">8a>;
}
 659  8="+code=m8_attr" class="sref">mq_a8tr( 659  8=L674"> 68a>)

message, tspanit registersnitselfili tsps="line" name="L659"> 659  8=ss="sref8695        int 
receivers. A sender checks tsatmlist befhrefadd/a>
tsp"ipcs="line" name="L659"> 659  8=a>);

receiver, tspanits="line" name="L659"> 659  8=ss="line8/a>;
 659  8=="sref">8attr-> 659  9"L699"> 699                ret9rn -<9 href=L756" class="line" namommTsp"receiver accepts
tsp"messageland rede=os withef= grabb/a>
tsp"659 659  9"1699"> 699ass="sref">notify_user_9SYS_R9SOURCEL756" class="line" namommspin"ipc.mTsprefhrefanllinermedi5" iSTATE_PENDINGomenteland memory barrierss="line" name="L659"> 659  9"2699"> 699>;
 659  9"3699"> 699a>}
sem.cf="ipmhrefdetails.s="line" name="L659"> 659  9703  9                     ret9rn -<90/a>( 659  9753  9 >)
 659  9763  9 95        int  659  9e7lass="s9e      unsigned long  659  9e8lass="s9ea>;

"sre"line" name="L659"> 659  9e9lass="s9ettr->
messagellino
a"659 659  9ine" name9"L709"> 709        <9pan c91href=L756" class="line" namomss="line" name="L659"> 659  9=attr" cl9ss="sref">attr-><9 href9"+codement">/sref">path-mettrttrnoiipef="id_sendsref">prepare_tiipef="id_send" id">(NULL;
NULL;
capab9               return -<9 href91HARD_MSGMAX" class="sssssssssssssssssss>( 740="sr" ef="+code=do_create" messagename="L740"> 740essageef="= href="+code=ret" class=9=3699"> 69xmsg * sizeof(struct9Cssssssssss>(path, mq_maxmsg, attr;
9zeof(stru9t  743 740=""sreeue.c#L744" id="L74essagename="L740"> 740essageef="lass="sref">path, attr-> 743path,  <  receiverde=dentry" clasreceiver_name" name="L743"> 743path, nowake_up_process"line" name="L7wake_up_process" id"L754" class="lireceiverde=dentry" clasreceiver_name" name="L743"> 743path, path, currenceiverde=dentry" clasreceiver_name" name="L743"> 743path,  7199/a>}
 718   9eue.c#L729" id="L721" class="line"9name=92id="L691" class="line" name="92 * Invo9ed wh92 creating a new queue via s/* iipef="id_receive() -ce" tsprefis task wai
"smsys_ idtimedsend()s="line" name="L659"> 659  9ue.c#L7239 id="L723" class="line" 9ame="92/a>( 659  9ueof(stru9ode=inode" class="sref">9node<9a> */sref">path-mettrttrnoiipef="id_receivesref">prepare_tiipef="id_receive" id">(NULL;
NULL;
path, umo9e_t attr;
9="+code=m9_attr" class="sref">mq_a9tr(*path-mefef">NULL;
path,   9a>)
 79 class="s9ef">cred = sender"line" name="L7>ender4 729 9     93 id="L739" class="lineing a new queue via s/* ="ippollomss="line" name="L659"> 659  9sref">ret9/a>;
NULL;
 743
path,  731     9  if 93HARD_MSGMAX" class="srede=olass="sref">path, ipc_9s93SGSIZEMAX" cl" name="L718"> 718   9ce.c#L7239"L733"> 733         9     93GEV_THREAD" ce" class="sref">mq_0="sinser 740="sinserpath-sender"line" name="L7>ender4 743 740=""sre=e.c#L744" id="L7cefef">NULL;
path, ER9_PTR<9a>(path,  743path, d_fsda9a93" class="line" name="L686"> sender"line" name="L7>ender4 743path,   9c/mqueue.c#L737" id="L739" cla93otify_owner" class="sref">nowake_up_process"line" name="L7wake_up_process" id"L754" class="lisender"line" name="L7>ender4 743path, mq_attr9path, def_attr9/a>;
currsender"line" name="L7>ender4 743path, ipc_ns-> 718   9"sref">ip9_ns->i9c_ns->NULL;
(struct prepare_timeout(c      if (9>currsiz href="+code=path"siz hr"sre=e.c#L744" id="L7m="slL7"line" name="L7m="slL7"sre=eunsig"id lin     return NULL;
ipc_ns, &9a hre94>(ts, (struct prepare_timeout(c      if (path,  745         9     94 attr;
9ef="+code9ERR_PTR" class="sref">ER9_PTR<94a>(*        }
 = alass="sref">path,   9ref="ipc/mqueue.c#L747" 9d="L7948>(*ipc_namespace *ipc_namlass="sref">path, (* 743
path, mod9 &= ~        } else ex _wait_t" clde=dentry" clasex _wait_t" clef="+code=do_create" receiverde=dentry" clasreceiver_namlass="sref">path, mo9e951>(* 740="sr" ef="+code=do_create" m="sphref="ipc/mqueue.0="sphref="lass="sref">path, ip9ata" class="sref">d_fsda9a95y_user_ns" cl>(NULL;
NULL;
path, i9e" name="L752"> 752 9     95sgsize_max" c"sref">dir,ktimehref="+code=path"ktimehref="+me="L743"> 743->dentry->ER9_PTR<9a>(ts, (struct ofl9g955a>(d_fsdataposix_0="stree_espace" class="srefposix_0="stree_espaef="+code=do_create" newslLafce" class="srefnewslLafef="e->dentry->);
 7re=ef="e}
 659  9ass="line9 name="L757"> 757-> =  = path, path, info->path, ip9nfo-> = path, i9 class="sref">notify_own9r96SGSIZEMAX" cl" name="L718"> 718   9sf="+code9lass="sref">notify_user_9s96/a>(< name="L718"> 718   9ss" class9ref="ipc/mqueue.c#L664" 9d="L696>(NULL;
NULL;
path, credinfo-9gt;timespec)))
INVAode=dentry" clas
INVAo"srelass="sref">path,  659  9}
noaudit_ idsendrecvde=dentry" clasaudit_ idsendrecv id="L754" class="li ides"line" name="L7mqdes"sre=e.c#L744" id="L7m="slL7"line" name="L7m="slL7"sre=e   return NULL;
 = path, __user *t9mespe97ent_umask" class="sref">curr"ip>        }
 = a"ipc/mqueue.c#L750fge" name="L753"> 7fge" id="L754" class="li ides"line" name="L7mqdes"sreclass="sref">path, ts<9a>)
"ip>        }
 = a_af="+code=capable" class="s9s="sref">9out, sizeof(struct <9 href97HARD_MSGMAX" class="sode=do_create" re" name="L753"> 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  692                ret9rn -<97="+code=msg_msg" clasgoto    return timespe9_vali97/a>( 718   9"L674"> 694                ret9rn -<97href="+code=EINVAL" class="sr9"">cred;
ipc_name-> = ae" name="L743"> 743 75f_ne"  = a" id="L742" clas="L751" class="line" name="L751"> 751        ="L672" class="line" name9sf="+code9class="sref">timespec_to9ktime97ode=total_sizINVAL" class="sref"=nlikel1" class="line" =nlikel1 id="L754" class="li"ip>        }
 = ae" name="L743"> 743        }
de=to! = NULL;
 L754" class="lire" name="L753"> 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  75ef="feut"srelass="sref">path,  6789/a>}
 718   96ref">ts<9ss="sref">mqueue_inode_i9foNULL;
->NULL;
ipc_name="L672" class="line" name96="sref">9a>)
dir,"ip>        }
 = ae" name="L743"> 743 75f_ne"  = a" id="L742" clas="L751" class="line" name="L751e="L672" class="line" name96L672"> 69f">notify_owner != <9 href98sgsiz"L672" class="line" name96f="+code9_notify == mq_=nlikel1" class="line" =nlikel1 id="T"L754" class="li"ip>        }
 = ae" name="L743"> 743 69cookie,  7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  75ef="feut"srelass="sref">path,  718   96ss="line9f">info-> 79s="sref">9nfo->mq_=nlikel1" class="line" =nlikel1 id="L754" class="li ="slL7"line" name="L7m="slL7"sre " nae" namNULL;
 743<"+code=dentry" class="sref"" id="L742" clasmq_0="siz f">NULL;
notify_own9r99 id="L739" class="line" name="L739">re" name="L753"> 7re=ef="etimespec)))
MSGSIZEhref="+code=pat
MSGSIZE"srelass="sref">path, notify_user_9s99otify_owner" class="sgoto    return  75ef="feut"srelass="sref">path, 9a>;
 718   9ulass="sr9/a>}
mq_a9tr 659  9=L674"> 69a>)

659 659  9=ss="sref9695        int  74loadsr"  id="L754" class="li="0="sphref="ipc/mqueue.u_0="sphref="=e.c#L744" id="L7m="slL7"line" name="L7m="slL7"sree="L672" class="line" name9=a>);
;
 L754" class="lire" name="L753"> 7re=ef="e9attr-> 75ef="feut"srelass="sref">path,  610"L69->10"L_default" cl" n/pre>-&gdo fe/d3/bc56d951a7f3e48ce46c973a4a26974f4b60_3/10"L6>ss="sref">path,  610"ass="sref">notify_user_10"as>10"1=mq_treesize" nam 743path,  610">;
;>10"2=mq_treesize" nam 743NULL;
NULL;
path,  610"a>}
>10"sgsiz"L672" class="line" name10"4699"> 610"attr" class="sref">mq_a10"at>10"href="+code=ELing a new queue via s/*s="line" name="L659"> 659  10"5699"> 610">)
)>10"href= 721 659  10"6699"> 610"95        int 10"e=mq_ 721 659  10"7699"> 610"      unsigned long 10" id="L756" class="line" namooooooooo* fall back no
tsatzINVipcessary. i"line" name="L659"> 659  10"8699"> 610"a>;
>10"otifyL756" class="line" namooooooooo*ss="line" name="L659"> 659  10"9699"> 610"ttr->10"y_user_ns" cle" cT" class="sref">mefef">NULL;
 743NULL;
path,  610"L709"> 709        <10"L7>10"L"line" name="L737"> L754" class="linewslLafce" class="srefnewslLafef="e-> 610ss="sref">attr-><10ss=>10" path,  610               return -<10   >10"2=mq_treesize" namNULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name10"3699"> 610xmsg * sizeof(struct10xms>10"sgsiz"L672" class="line" name1014699"> 610">mq_maxmsg, m>10"/a>(mefef">NULL;
 743NULL;
 610t  659  1016699"> 610="sref">attr-> =  743 610mq_treesize < 10"ode=total_size" class" class="sref">INIT_LIST_HEADef="ipc/mqueue.INIT_LIST_HEAD id="t =  743 610               return -<10   >10"="line" name="L737"> L754" class="limefef">NULL;
 743NULL;
-> 610/mqueue.c#L718" id="L71810/mq>10"abs_timeout" class="s" name="L686"> mefef">NULL;
 743NULL;
 610 0;
 L754" class="linewslLafce" class="srefnewslLafef="e->dentry-> 610/a>}
attr;
10 2699"> 610" id="L721" class="line"10" i>10 HARD_MSGMAX" class="sode=do_create" kfreece" class="srefkfree id="L754" class="linewslLafce" class="srefnewslLafef=")="L672" class="line" name1023699"> 610 class="comment"> * Invo10 cl>10 SGSIZEMAX" cl" name="L718"> 718   10 4699"> 610 id="L723" class="line" 10 id>10 /a>(< name="L718"> 718   10 5699"> 610ode=inode" class="sref">10ode>10 >(NULL;
 743<"+code=dentry" class="sref"" id="L742" clasmq_cur0="sf">NULL;
NULL;
 743<"+code=dentry" class="sref"" id="L742" clasmq_0axr" name="L740"> 740q_0axr" ef=")f="+code=capable" class="s1026699"> 610mode_t" class="sref">umo10mod>10          }
 = ae" name="L743"> 743NULL;
NULL;
 610_attr" class="sref">mq_a10_at>10 ode=total_size" classde=mode"L754" class="lire" name="L753"> 7re=ef="etimespec)))
AGAINhref="+code=pat
AGAINref">dentry-> 610a>)
 "e=attr" class="sref">attr;
10 9699"> 610ef">cred = 10 abs_timeout" class="sde=mode"L754" class="liwait/span>
        const struct ef="+code=cred" class=L751>dentry-> 610e" name="L729"> 729 10e" >10e"bs_timeout" class="sde=mode"L754" class="liwait/span>
 740=""sreeue(void *)sode=do_create" m="sphref="ipc/mqueue.0="sphref="lass="sref">path,  610/a>;
path,  610ame="L731"> 731     10ame>10eHARD_MSGMAX" class="sssssssssL754" class="lire" name="L753"> 7re=ef="eNULL;
 =  610pc_ns" class="sref">ipc_10pc_>10e="+code=msg_msg" clas"sref">CLing a new queue via s/*s="line" name="L659"> 659  1034699"> 610"L733"> 733         10"L7>10e/a>( must be"called
with mefee" na"ipc held,lands="line" name="L659"> 659  1035699"> 610ERR_PTR" class="sref">ER10ERR>10ehref= 721 659  1036699"> 610              10ee=mq_ 721 659  1037699"> 610ata" class="sref">d_fsda10ata>10eode=total_size" classde=mode"goto    return path,  610c/mqueue.c#L737" id="L7310c/m>10e="line" name="L737"> "ass="sref">path,  610class="sref">mq_attr10cla>10e9>(*attr;
104L699"> 610/a>;
 L754" class="lireceiverde=dentry" clasreceiver_nameue.c#L744" id="L7wq_get_firs _waiter"line" name="L7wq_get_firs _waitere.3lasref">path-mefef">NULL;
NULL;
 610sref">ipc_ns->10/otify_owner" class="sde=NULL" class="srefeceiverde=dentry" clasreceiver_namer" class="sref">attr;
1042699"> 610_ns->prepare_tiipef="id_send" id"sref">path-mefef">NULL;
 610c_ns->attr;
1044699"> 610> 659  1045699"> 610"sref">ipc_ns, &10"sr>10/Y_REMOVED" class="sre"L737"> L754" class="lire" name="L753"> 7re=ef="e 740="sinserpath-m="sphref="ipc/mqueue.0="sphref="=e.c#L744" id="L7cefef">NULL;
 610"L745"> 745         10"L7>10/  7re=ef="eass="sref">path,  610ERR_PTR" class="sref">ER10ERR>10/ode=total_size" classde=mode"""""""""goto    return path,  610ref="ipc/mqueue.c#L747" 10ref>10/="line" name="L737"> "L737"> L754" class="li__do_notif1" class="line" __do_notif1" id"sref">path-mefef">NULL;
 610   }
path,  610 &= ~ mespace" class="sref">ipc_nam"> 751        ipc_nam"> 751        ipc_nam"> 751        path,  610de=mode" class="sref">mo10de=>10 CURRENT_TIMEhref="+code=patCURRENT_TIMElasslass="sref">path,  610ata" class="sref">d_fsda10ata>10 718   10<3699"> 610e" name="L752"> 752 10e" >10path,  610ERR_PTR" class="sref">ER10ERR>10NULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name1055699"> 610=oflag" class="sref">ofl10=of>10<5gsiz.c#L744" id="L7ef="freece" class="srefef="freeef=":ass="sref">path,  610>);
 7re=ef="eass="sref">path,  610/a>}
freesr" name="L740"> 74freesr" e.3lasref">path-m="sphref="ipc/mqueue.0="sphref="_="L672" class="line" name1058699"> 610 name="L757"> 75710<8gsiz.c#L744" id="L7ef="feutname="L754"> 75ef="feut"sre:ass="sref">path,  6103                   10< id="L748" class="line" namefeutname="L754"> 75fiute.3lasref">path-"ip>        }
 = a_="L672" class="line" name106L699"> 610   10  gsiz.c#L744" id="L7ef=name="L754"> 75ef="sre:ass="sref">path,  610f">info->>10 otify_owner" code=out" class="sref"fe" name="L753"> 7re=ef="="L672" class="line" name1062699"> 610nfo-> 718   1063699"> 610 class="sref">notify_own10 cl>10 sgsiz"L672" class="line" name1064699"> 610lass="sref">notify_user_10las>10 4gsiz.c#L744" id="L7SYSCALL_DEFINE5ef="ipc/mqueue.SYSCALL_DEFINE5 id="L754" class="li idtimedreceivesref">prepare_t idtimedreceiveef="=e.c#L744" id="L7mqdhref="+code=path"mqdhr"sre=e.c#L744" id="L7mqdes"line" name="L7mqdes"sre=escookie(struct prepare_timeout(c      if ( 610ref="ipc/mqueue.c#L664" 10ref>10 Y_REMOVED" class="srec/mqueue.c#L750siz href="+code=path"siz hr"sre=e.c#L744" id="L7m="slL7"line" name="L7m="slL7"sre=eunsig"id linkie(struct prepare_timeout(c      if (NULL;
 610" class="sref">info-10" c>10  ts, (struct prepare_timeout(c      if (path,  610>);
attr;
1068699"> 610/a>}
nossiz href="+code=path"ssiz hr"sreut" class="sref"fe" name="L753"> 7re=ef="="L672" class="line" name1069699"> 610f">__user *>10 9>(* 740="sr" ef="+code=do_create" m="sphref="ipc/mqueue.0="sphref="lass="sref">path,  610timespec" class="sref">t10tim>10ti>(*        }
 = alass="sref">path,  610a>)
        } else mespace" class="sref">ipc_namespace *ipc_namlass="sref">path,  610out, sizeof(struct <10out>10ty_user_ns" cl>(NULL;
NULL;
path,  6102                ret10210t3_user_ns" cl>( 743
path,  610id" class="sref">timespe10id">10thref="+code=EL nam 743->dentry-> 6104                ret10410t5a>(d_fsdatatimesperef">ts, (struct  610/a>;
d_fsdataposix_0="stree_espace" class="srefposix_0="stree_espaef="+code=do_create" newslLafce" class="srefnewslLafef="e->dentry-> 610class="sref">timespec_to10cla>10tsgsiz" name="L659"> 659  10t8699"> 610/mqueue.c#L677" id="L67710/mq>10t/a> 610 0;
-> =  = /a>(struct  610/a>}
path,  610ss="sref">mqueue_inode_i10ss=>10/otify_owner" class="ssssssssscode=out" class="sref"fes"line" name="L7res"srelass="sref">path,  610a>)
 = path,  610f">notify_owner != <10f">>10/SGSIZEMAX" cl" name="L718"> 718   1084699"> 610_notify ==  718   1085699"> 610cookie,  = path,  610>info-> 718   1087699"> 610ref="ipc/mqueue.c#L686" 10ref>10/" class="line" name="L686"> "ip>        }
 = a"ipc/mqueue.c#L750fge" name="L753"> 7fge" id="L754" class="li ides"line" name="L7mqdes"sreclass="sref">path,  610f">info->>10//a>"ip>        }
 = a_af="+code=capable" class="s10/9699"> 610nfo-> re" name="L753"> 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  610 class="sref">notify_own10 cl>10 cbs_timeout" class="sgoto    return  610lass="sref">notify_user_10las>10 1GSIZEMAX" cl" name="L718"> 718   1092699"> 610a>;
 610/a>}
dir,mespace" class="sref">ipc_name-> = ae" name="L743"> 743 75f_ne"  = a" id="L742" clas="L751" class="line" name="L751"> 751        ="L672" class="line" name10 4699"> 610_attr" class="sref">mq_a10_at>10 GEV_THREAD" ce" class="sref">mq_=nlikel1" class="line" =nlikel1 id="a>-> = ae" name="L743"> 743        }
de=to! = NULL;
 610a>)
 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  610695        int 10   75ef="feut"srelass="sref">path,  610       unsigned long 10 7id="L739" cl" name="L718"> 718   10 8699"> 610/a>;
nomefef">NULL;
->NULL;
ipc_name="L672" class="line" name10 9699"> 610attr->dir,"ip>        }
 = ae" name="L743"> 743 75f_ne"  = a" id="L742" clas="L751" class="line" name="L751e="L672" class="line" name11"L699"> 611"L69->11"L_def"L672" class="line" name11"1699"> 611"ass="sref">notify_user_11"as>110otify_owner" INVAL" class="sref"=nlikel1" class="line" =nlikel1 id="T"L754" class="li"ip>        }
 = ae" name="L743"> 743 611">;
;>110HARD_MSGMAX" class="sode=do_create" re" name="L753"> 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  611"a>}
>110="+code=msg_msg" clasgoto    return  75ef="feut"srelass="sref">path,  611"attr" class="sref">mq_a11"at>11"href="+code=E" name="L718"> 718   11"5699"> 611">)
)>110href="+code=EINVAL" class="sr1106699"> 611"95        int 110e=mq_treesize"ing a new queue via s/* checks INVbuffer is big enough *ss="line" name="L659"> 659  11"7699"> 611"      unsigned long 110ode=total_sizINVAL" class="sref"=nlikel1" class="line" =nlikel1 id="L754" class="li ="slL7"line" name="L7m="slL7"sre "lnae" namNULL;
 743<"+code=dentry" class="sref"" id="L742" clasmq_0="siz f">NULL;
 611"a>;
>110="line" name="L737"> L754" class="lire" name="L753"> 7re=ef="etimespec)))
MSGSIZEhref="+code=pat
MSGSIZE"srelass="sref">path,  611"ttr->110abs_timeout" class="sgoto    return  75ef="feut"srelass="sref">path,  611"L709"> 709        <11"L7>111 id="L739" cl" name="L718"> 718   1111699"> 611ss="sref">attr-><11ss=>11" path,  611               return -<11   >11"2=mq_treesize"ing a new queue via s/*s="line" name="L659"> 659  11"3699"> 611xmsg * sizeof(struct11xms>11"sgsiz 721 659  1114699"> 611">mq_maxmsg, m>111/a>( 659  11"5699"> 611t  659  1116699"> 611="sref">attr-> 659  11"7699"> 611mq_treesize < 111ode=total_sizINVAT" class="sref">mefef">NULL;
 743NULL;
path,  611               return -<11   >11"="line" name="L737"> L754" class="linewslLafce" class="srefnewslLafef="e-> 611/mqueue.c#L718" id="L71811/mq>111="+code=def_attr" class="sref1"2L699"> 611 0;
NULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name11 1699"> 611/a>}
path,  611" id="L721" class="line"11" i>11 HARD_MSGMAX" e" cT" class="sref">mefef">NULL;
 743NULL;
 611 class="comment"> * Invo11 cl>112="+code=msg_msg" clascing a new queue via s/* Save our sperulntive allocntionllino
tsp"cach o*ss="line" name="L659"> 659  11 4699"> 611 id="L723" class="line" 11 id>112href="+code=Emask" class="sref">currrbsinit_espace" class="srefrbsinit_espa id="t =  743 611ode=inode" class="sref">11ode>112Y_REMOVED" class="srec/mqueue.c#L750INIT_LIST_HEADef="ipc/mqueue.INIT_LIST_HEAD id="t =  743 611mode_t" class="sref">umo11mod>11  mefef">NULL;
 743NULL;
-> 611_attr" class="sref">mq_a11_at>11 ode=total_size" class" class="sref">mefef">NULL;
 743NULL;
 611a>)
attr;
11 9699"> 611ef">cred = 11 abs_timeout" class="sa>-> 611e" name="L729"> 729 11e" >113 id="L739" cl" name="L718"> 718   11e1699"> 611/a>;
path,  611ame="L731"> 731     11ame>113HARD_MSGMAX" e" c" namNULL;
 743<"+code=dentry" class="sref"" id="L742" clasmq_cur0="sf">NULL;
 611pc_ns" class="sref">ipc_11pc_>11e="+code=msg_msg" clasINVAL" class="sref""ip>        }
 = ae" name="L743"> 743NULL;
NULL;
 611"L733"> 733         11"L7>113href="+code=Emask" clssssssssLc#L744" id="L7spin_un"ipc/mqueue.c#L645"spin_un"ipc id="t = NULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name1135699"> 611ERR_PTR" class="sref">ER11ERR>113Y_REMOVED" class="sre"L737"> L754" class="lire" name="L753"> 7re=ef="etimespec)))
AGAINhref="+code=pat
AGAINref">dentry-> 611              113 attr;
1137699"> 611ata" class="sref">d_fsda11ata>11eode=total_size" classde=mode"timespec)))wait/span>
        const struct ef="+code=cred" class=L751>dentry-> 611c/mqueue.c#L737" id="L7311c/m>11e="line" name="L737"> de=mode"timespec)))wait/span>
path,  611class="sref">mq_attr11cla>113abs_timeout" class="sde=mode"L754" class="lire" name="L753"> 7re=ef="eNULL;
NULL;
 =  611/a>;
 de=mode"L754" class="lim="sphref="ipc/mqueue.0="sphref="+ue.c#L744" id="L7wait/span>
 740=""sre="L672" class="line" name1141699"> 611sref">ipc_ns->11/otify_owner" class="s" name="L718"> 718   1142699"> 611_ns->attr;
1143699"> 611c_ns-> 70="sge" id="L754" class="limefef">NULL;
 611> 718   1145699"> 611"sref">ipc_ns, &11"sr>11/Y_REMOVED" class="sreL754" class="limespace" class="sref">ipc_nam"> 751        ipc_nam"> 751        ipc_nam"> 751         718   1146699"> 611"L745"> 745         11"L7>11/ path,  611ERR_PTR" class="sref">ER11ERR>114sgsiz" name="L659"> 659  11/8699"> 611ref="ipc/mqueue.c#L747" 11ref>11/="line" name="L737"> cing a new queue via s/* There is now free space in"659 659  11/9699"> 611   }
prepare_tiipef="id_receive id="L754" class="limefef">NULL;
 611 &= ~ spin_un"ipc/mqueue.c#L645"spin_un"ipc id="t = NULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name1151699"> 611de=mode" class="sref">mo11de=>11 7re=ef="e 611ata" class="sref">d_fsda11ata>11 718   11<3699"> 611e" name="L752"> 752 11e" >115="+code=msg_mle=NULL" class="srefe" name="L753"> 7re=ef="e 611ERR_PTR" class="sref">ER11ERR>115href="+code=Emask" class="sref">currre" name="L753"> 7re=ef="e 743 611=oflag" class="sref">ofl11=of>115href="+code=EINVAL" class="sr11<6699"> 611>);
NULL;
prepare_tpf="us=" id="L754" class="lim="sphref="ipc/mqueue.0="sphref="e" name="L743"> 743NULL;
NULL;
 611/a>}
 storesr" name="L740"> 74storesr"  id="L754" class="li="0="sphref="ipc/mqueue.u_0="sphref="=e.c#L744" id="L7m="sphref="ipc/mqueue.0="sphref="=e.c#L744" id="L70="sphref="ipc/mqueue.0="sphref="e" name="L743"> 743 611 name="L757"> 757115="line" name="L737"> de=mode"timespec)))re" name="L753"> 7re=ef="etimespec)))
FAULThref="+code=pat
FAULTef="="L672" class="line" name1159699"> 6113                   115abs_timeout" class="s"ass="sref">path,  611   116/bs_timeout" class="s" name="L686"> freesr" name="L740"> 74freesr" e.3lasref">path-m="sphref="ipc/mqueue.0="sphref="_="L672" class="line" name1161699"> 611f">info->>1161GSIZEMAX" cl" name="L718"> 718   1162699"> 611nfo->path-ef="feutname="L754"> 75ef="feut"sre:ass="sref">path,  611 class="sref">notify_own11 cl>116sgsize_max" c"sref">dir,feutname="L754"> 75fiute.3lasref">path-"ip>        }
 = a_="L672" class="line" name1164699"> 611lass="sref">notify_user_11las>11 4gsiz.c#L744" id="L7ef=name="L754"> 75ef="sre:ass="sref">path,  611ref="ipc/mqueue.c#L664" 11ref>11 Y_REMOVED" clcode=out" class="sref"fe" name="L753"> 7re=ef="="L672" class="line" name11 6699"> 611" class="sref">info-11" c>11   718   1167699"> 611>);
 659  1168699"> 611/a>}
 659  1169699"> 611f">__user *>11 9>(*< 721 659  117L699"> 611timespec" class="sref">t11tim>11ti>(*< 721 659  11t1699"> 611a>)
 659  11t2699"> 611out, sizeof(struct <11out>11ty_use 721 659  11t3699"> 6112                ret112117sgsiz.c#L744" id="L7SYSCALL_DEFINE2 name="L753"> 7SYSCALL_DEFINE2e.3lasref">path-mq_notif1" class="line" mq_notif1ef="=e.c#L744" id="L70qdhref="+code=path"mqdhr"sre=e.c#L744" id="L7mqdes"line" name="L7mqdes"sre=" name="L659"> 659  11t4699"> 611id" class="sref">timespe11id">117href="+code=Emask" clss="li737        } else sigevct ef="+code=cred"sigevct ref="        } else lass="sref">prepare_timeout(c      if ( 659  11t5699"> 6114                ret11411t5a>(<="+code=capable" class="s11t6699"> 611/a>;
 7re=ef="="L672" class="line" name11t7699"> 611class="sref">timespec_to11cla>117ode=total_siz737        } else  */
        }
 = alass="sref">path,  611/mqueue.c#L677" id="L67711/mq>11t/a>path,  611 0;
        } else mespace" class="sref">ipc_namespace *ipc_namlass="sref">path,  611/a>}
        } else sigevct ef="+code=cred"sigevct ref="        } else notificntionef="ipc/mqueue.notificntion = alass="sref">path,  611ss="sref">mqueue_inode_i11ss=>1181>(*NULL;
NULL;
path,  611a>)
(path,  611f">notify_owner != <11f">>118sgsiz"L672" class="line" name1184699"> 611_notify == mq_="notificntionef="ipc/mqueue.u_notificntion = a_f="+code=capable" class="s1185699"> 611cookie, mq_copy_fromass="sref">prepare_tcopy_fromass=" id="t =  659  11/6699"> 611>info->iz of(737        } else sigevct ef="+code=cred"sigevct ref=))_" name="L659"> 659  1187699"> 611ref="ipc/mqueue.c#L686" 11ref>118ode=total_size" classclass="scode=ou>timespec)))
FAULThref="+code=pat
FAULTef="="L672" class="line" name11/8699"> 611f">info->>11//a> 718   11/9699"> 611nfo-> 611 class="sref">notify_own11 cl>1190"line" name=.c#L744" id="L7audit_ idnotif1" class="line" audit_ idnotif1e.3lasref">path-mqdes"line" name="L7mqdes"sre=e.c#L744" id="L7="notificntionef="ipc/mqueue.u_notificntion = ae?et = ->path,  611lass="sref">notify_user_11las>119 path,  611a>;
->dentry-> 611/a>}
dir,sipc/mqueue.c#L645"sipc id=e->dentry-> 611_attr" class="sref">mq_a11_at>11 GEV_THREAD" ce" class="sref">mq_="notificntionef="ipc/mqueue.u_notificntion = ae!-> 611a>)
-> 611695        int 11  -> 611       unsigned long 119ode=total_size" classde=mode""""""L754" class="linotificntionef="ipc/mqueue.notificntion = a" id="L742" clasmigevdnotif1" class="line" migevdnotif1 = ae!-> 611/a>;
 de=mode"code=ou>timespec)))
INVAode=dentry" clas
INVAoref">dentry-> 611attr-> 612"L69->120a"line" name="L737"> de=mode"T" class="sref">valid_sig"alde=dentry" clasvalid_sig"al id="L754" class="linotificntionef="ipc/mqueue.notificntion = a" id="L742" clasmigevdsig"ef">NULL;
 612"ass="sref">notify_user_12"as>120otify_owner" class="ssssssssscode=ou>timespec)))
INVAode=dentry" clas
INVAoref">dentry-> 612">;
;>120HARD_MSGMAX" class="s" name="L718"> 718   12"3699"> 612"a>}
>120="+code=msg_msg" claslNVAL" class="sref"notificntionef="ipc/mqueue.notificntion = a" id="L742" clasmigevdnotif1" class="line" migevdnotif1 = ae 612"attr" class="sref">mq_a12"at>120href="+code=Emask" cllllllllllongsode=do_create" timeeef="ipc/mqueue.timeeref">dentry-> 612">)
)>120href="+code=EINVAL" class="sr1206699"> 612"95        int 120  659  12"7699"> 612"      unsigned long 120ode=total_size" classclass="s" name="L686"> ncce" class="srefncef="e-> 612"a>;
>120="line" name="L737"> sg" claslNVAT" class="sref">ncce" class="srefncef=")f="+code=capable" class="s12"9699"> 612"ttr->120abs_timeout" class="se" classclass="s" name="L686"> re" name="L753"> 7re=ef="etimespec)))
NOMEMde=dentry" clas
NOMEMref">dentry-> 612"L709"> 709        <12"L7>121a"line" name="L737"> de=mode"""""""""goto    return  612ss="sref">attr-><12ss=>121otify_owner" class="sssssssss" name="L718"> 718   12"2699"> 612               return -<12   >121HARD_MSGMAX" class="ssg" claslNVAlass="sref">mq_copy_fromass="sref">prepare_tcopy_fromass=" id="" class="sref">ncce" class="srefncef=""> 751         659  12"3699"> 612xmsg * sizeof(struct12xms>121="+code=msg_msg" clas"sref">Ce" classclass="s" name="L686"> notificntionef="ipc/mqueue.notificntion = a" id="L742" clasmigevdvalclde=dentry" clasmigevdvalcl = a" id="L742" clasmivalsphref="ipc/mqueue.mivalsphr = a=" name="L659"> 659  12"4699"> 612">mq_maxmsg, m>121href="+code=Emask" cllllllllle" classclass="s" name="L686"> NOTIFY_COOKIE_LENhref="+code=patNOTIFY_COOKIE_LEN"sre_af="+code=capable" class="s12"5699"> 612t  class="s" name="L686"> re" name="L753"> 7re=ef="etimespec)))
FAULThref="+code=pat
FAULTef="="L672" class="line" name1216699"> 612="sref">attr-> 612mq_treesize < 121ode=total_size" classclass="s" name="L718"> 718   12"8699"> 612               return -<12   >12"="lin name="L718"> 718   12"9699"> 612/mqueue.c#L718" id="L71812/mq>121abs_timeout" class="sde=mode"Ling a new queue via s/* TODO: add ameeader?o*ss="line" name="L659"> 659  122L699"> 612 0;
 de=mode"L754" class="liskb_eutname="L754"> 75skb_eut id="" class="sref">ncce" class="srefncef="=e.c#L744" id="L7NOTIFY_COOKIE_LENhref="+code=patNOTIFY_COOKIE_LEN"sre_="L672" class="line" name12 1699"> 612/a>}
 659  1222699"> 612" id="L721" class="line"12" i>122g_defsref">path-re=51" class="line" re=51_def:ass="sref">path,  612 class="comment"> * Invo12 cl>122="+code=msg_msg" clasde=mode"L754" class="li"ip>        }
 = a"ipc/mqueue.c#L750fge" name="L753"> 7fge" id="L754" class="linotificntionef="ipc/mqueue.notificntion = a" id="L742" clasmigevdsig"ef">NULL;
 612 id="L723" class="line" 12 id>122href="+code=Emask" cllllllllllNVAT" class="sref">"ip>        }
 = a_f="+code=capable" class="s12 5699"> 612ode=inode" class="sref">12ode>122Y_REMOVED" class="sresg" clasde=mode"L754" class="lire" name="L753"> 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  612mode_t" class="sref">umo12mod>12   612_attr" class="sref">mq_a12_at>12 ode=total_size" classssssssss" name="L718"> 718   12 8699"> 612a>)
 de=mode"timespec)))sipc/mqueue.c#L645"sipc id=e->        }
 id="L754" class="li"ip>        }
 = a_="L672" class="line" name12 9699"> 612ef">cred = 12 abs_timeout" class="sde=mode"timespec)))feutname="L754"> 75fiute.3lasref">path-"ip>        }
 = a_="L672" class="line" name123L699"> 612e" name="L729"> 729 12e" >123a"line" name="L737"> de=mode"lNVAlass="sref">mq_IS_ERR        }
path-sipc/mqueue.c#L645"sipc id=_af="+code=capable" class="s12e1699"> 612/a>;
 re" name="L753"> 7re=ef="epath-sipc/mqueue.c#L645"sipc id=_="L672" class="line" name1232699"> 612ame="L731"> 731     12ame>123HARD_MSGMAX" class="ssg" clasde=mode"timespec)))sipc/mqueue.c#L645"sipc id=e->dentry-> 612pc_ns" class="sref">ipc_12pc_>12e="+code=msg_msg" classsssssssssssssssgoto    return  612"L733"> 733         12"L7>123href="+code=Emask" clssssssss" name="L718"> 718   1235699"> 612ERR_PTR" class="sref">ER12ERR>123href="+code=EINVAL" class="sr1236699"> 612              123 )))timeeef="ipc/mqueue.timeeref"e-> 612ata" class="sref">d_fsda12ata>12eode=total_size" classde=mode"timespec)))re" name="L753"> 7re=ef="epath-sipc/mqueue.c#L645"sipc id==e.c#L744" id="L7ncce" class="srefncef="=et = path,  612c/mqueue.c#L737" id="L7312c/m>12e="line" name="L737"> de=mode"le=NULL" class="srefe" name="L753"> 7re=ef="e 612class="sref">mq_attr12cla>123abs_timeout" class="sde=mode"ssssssssgoto    return path,  612/a>;
 de=mode"le=NULL" class="srefe" name="L753"> 7re=ef="af="+code=capable" class="s1241699"> 612sref">ipc_ns->12/otify_owner" class="se" classde=mode"timespec)))sipc/mqueue.c#L645"sipc id=e->dentry-> 612_ns->)))ncce" class="srefncef="e->dentry-> 612c_ns-> 612> 718   1245699"> 612"sref">ipc_ns, &12"sr>12/Y_REMOVED" class="sre" name="L718"> 718   1246699"> 612"L745"> 745         12"L7>12/  718   1247699"> 612ERR_PTR" class="sref">ER12ERR>124sgsiz" name="L659"> 659  12/8699"> 612ref="ipc/mqueue.c#L747" 12ref>124otify_owner" class="sref">no"ip>        }
 = a"ipc/mqueue.c#L750fge" name="L753"> 7fge" id="L754" class="li ides"line" name="L7mqdes"sreclass="sref">path,  612   }
"ip>        }
 = a_f="+code=capable" class="s125L699"> 612 &= ~ re" name="L753"> 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  612de=mode" class="sref">mo12de=>12 612ata" class="sref">d_fsda12ata>12 718   12<3699"> 612e" name="L752"> 752 12e" >125sgsiz"L672" class="line" name12<4699"> 612ERR_PTR" class="sref">ER12ERR>125href="+code=E   return ipc_name-> = ae" name="L743"> 743 75f_ne"  = a" id="L742" clas="L751" class="line" name="L751"> 751        ="L672" class="line" name1255699"> 612=oflag" class="sref">ofl12=of>1255bs_timeout" lNVA1                }
 = ae" name="L743"> 743        }
de=to! = NULL;
 612>);
 re" name="L753"> 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  612/a>}
 75ef="feut"srelass="sref">path,  612 name="L757"> 757125/a> 718   1259699"> 6123                   125 id="L748" class="line" namemefef">NULL;
->NULL;
ipc_name="L672" class="line" name126L699"> 612   126L_def"L672" class="line" name1261699"> 612f">info->>1261GSIZEMAX" cl" name="L686"> re" name="L753"> 7re=ef="e 612nfo->NULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name1263699"> 612 class="sref">notify_own12 cl>126="+code=msg_mle=NULL" class="sre="notificntionef="ipc/mqueue.u_notificntion = ae 612lass="sref">notify_user_12las>126href="+code=Emask" cle" c" namNULL;
 743 612ref="ipc/mqueue.c#L664" 12ref>126Y_REMOVED" class="sresg" clas" name="L686"> remove"notificntionef="ipc/mqueue.remove"notificntion id="L754" class="limefef">NULL;
 612" class="sref">info-12" c>126 )))mespace" class="sref">ipc_nam"> 751        ipc_nam"> 751        path,  612>);
 718   1268699"> 612/a>}
NULL;
 743 612f">__user *>126abs_timeout" class="s" name="L686"> re" name="L753"> 7re=ef="etimespec)))
BUSYde=dentry" clas
BUSYlasslass="sref">path,  612timespec" class="sref">t12tim>1270"line" name="e=attr="+code=capable" class="s12t1699"> 612a>)
 612out, sizeof(struct <12out>127HARD_MSGMAX" class="scase  id="L742" clasSIGEV_NONEhref="+code=patSIGEV_NONEef=":ass="sref">path,  6122                ret122127="+code=msg_msg" clasde=mode"L754" class="limefef">NULL;
 743path,  612id" class="sref">timespe12id">127href="+code=Emask" clllllllllbreaklass="sref">path,  6124                ret124127Y_REMOVED" class="srecase  id="L742" clasSIGEV_THREADef="ipc/mqueue.SIGEV_THREADref=:ass="sref">path,  612/a>;
)))mefef">NULL;
 743path,  612class="sref">timespec_to12cla>127ode=total_size" classde=mode"timespec)))mefef">NULL;
 743path,  612/mqueue.c#L677" id="L67712/mq>127="line" name="L737"> de=mode"timespec)))sipc/mqueue.c#L645"sipc id=e->dentry-> 612 0;
)))ncce" class="srefncef="e->dentry-> 612/a>}
 de=mode"L754" class="limefef">NULL;
 743dentry-> 612ss="sref">mqueue_inode_i12ss=>128otify_owner" class="se" classbreaklass="sref">path,  612a>)
path,  612f">notify_owner != <12f">>128="+code=msg_msg" clasde=mode"L754" class="limefef">NULL;
 743NULL;
NULL;
path,  612_notify == NULL;
 743path,  612cookie, NULL;
 743path,  612>info->path,  612ref="ipc/mqueue.c#L686" 12ref>128ode=total_size" class" name="L718"> 718   12/8699"> 612f">info->>128="lin name="L718"> 718   12/9699"> 612nfo-> mefef">NULL;
 743 get_pidef="ipc/mqueue.get_pid id="L754" class="lit   _tgidef="ipc/mqueue.t   _tgid id="L754" class="listruct ef="+code=cred" class=L751_alass="sref">path,  612 class="sref">notify_own12 cl>129/bs_timeout" class="s" name="L686"> mefef">NULL;
 743NULL;
 get_ss="_nsf">NULL;
NULL;
path,  612lass="sref">notify_user_12las>129otify_owner" class="sL754" class="limespace" class="sref">ipc_nam"> 751        ipc_nam"> 751        path,  612a>;
 718   12 3699"> 612/a>}
dir,spin_un"ipc/mqueue.c#L645"spin_un"ipc id="t = NULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name12 4699"> 612_attr" class="sref">mq_a12_at>1294gsiz.c#L744" id="L7ef="feutname="L754"> 75ef="feut"sre:ass="sref">path,  612a>)
 743 75fiute.3lasref">path-"ip>        }
 = a_="L672" class="line" name12 6699"> 612695        int 12   75ef="sre:ass="sref">path,  612       unsigned long 129ode=total_size" c" nam 612/a>;
 me="L743"> 743path-sipc/mqueue.c#L645"sipc id==e.c#L744" id="L7ncce" class="srefncef="_="L672" class="line" name12 9699"> 612attr-> 613"L69->130a"line" name="L737"> " nampath-ncce" class="srefncef="_="L672" class="line" name13"1699"> 613"ass="sref">notify_user_13"as>1301GSIZEMAX" cl" name="L718"> 718   13"2699"> 613">;
;>130HARD_MSGMAX" code=out" class="sref"fe" name="L753"> 7re=ef="="L672" class="line" name13"3699"> 613"a>}
>130="+co" name="L718"> 718   13"4699"> 613"attr" class="sref">mq_a13"at>130/a>(< name="L718"> 718   13"5699"> 613">)
)>130href=.c#L744" id="L7SYSCALL_DEFINE3 name="L753"> 7SYSCALL_DEFINE3e.3lasref">path-mqsge"seta+code=dentry" clasmqsge"seta+co id==e.c#L744" id="L70qdhref="+code=path"mqdhr"sre=e.c#L744" id="L7mqdes"line" name="L7mqdes"sre=" name="L659"> 659  1306699"> 613"95        int 130 prepare_timeout(c      if (prepare_t="mq>( 7"sre=" name="L659"> 659  1307699"> 613"      unsigned long 130ode=total_size" class737        } else mqsa+code=dentry" clasmqsa+co id="        } else lass="sref">prepare_timeout(c      if (prepare_t="omq>( 7"sre)"+code=capable" class="s1308699"> 613"a>;
>130="lin="+code=capable" class="s13"9699"> 613"ttr->130abs_timeout" line" nam 7re=ef="="L672" class="line" name131L699"> 613"L709"> 709        <13"L7>131i>(*prepare_tmq>( 7"sre=    return ( 7sref">prepare_tomq>( 7"sre="L672" class="line" name1311699"> 613ss="sref">attr-><13ss=>1311>(*        }
 = alass="sref">path,  613               return -<13   >131y_user_ns" cl>(ipc_namespace *ipc_namlass="sref">path,  613xmsg * sizeof(struct13xms>131="+code=msg_m737        } else {
59NULL;
NULL;
path,  613">mq_maxmsg, m>131/a>(< name="L718"> 718   13"5699"> 613t         ( 7sref">prepare_t="mq>( 7"sree!-> 613="sref">attr->mq_copy_fromass="sref">prepare_tcopy_fromass=" id="t = prepare_tmq>( 7"sre=    return prepare_t="mq>( 7"sre=l>iz of(737        } else mqsa+code=dentry" clasmqsa+co id=))_" name="L659"> 659  1317699"> 613mq_treesize < 131ode=total_size" classclass="scode=ou>timespec)))
FAULThref="+code=pat
FAULTef="="L672" class="line" name13"8699"> 613               return -<13   >131="line" name="L737"> e" class="sref">mq_mq>( 7sref">prepare_tmq>( 7"sre" id="L742" clas/q_flags"line" name="L7mq_flags"line"/mque(~ id="L742" clasO_NONBLOCK"line" name="L7O_NONBLOCK id=))"L672" class="line" name13"9699"> 613/mqueue.c#L718" id="L71813/mq>131abs_timeout" class="sde=mode"code=ou>timespec)))
INVAode=dentry" clas
INVAoref">dentry-> 613 0;
 718   13 1699"> 613/a>}
path,  613" id="L721" class="line"13" i>1322=mq_treesize" nam        }
 = a"ipc/mqueue.c#L750fge" name="L753"> 7fge" id="L754" class="li ides"line" name="L7mqdes"sreclass="sref">path,  613 class="comment"> * Invo13 cl>132="+code=msg_mle=NT" class="sref">"ip>        }
 = a_f="+code=capable" class="s13 4699"> 613 id="L723" class="line" 13 id>132href="+code=Emask" cl" nam 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  613ode=inode" class="sref">13ode>132Y_REMOVED" class="sregoto    return  613mode_t" class="sref">umo13mod>132  718   1327699"> 613_attr" class="sref">mq_a13_at>132sgsiz" name="L659"> 659  13 8699"> 613a>)
nomespace" class="sref">ipc_name-> = ae" name="L743"> 743 75f_ne"  = a" id="L742" clas="L751" class="line" name="L751"> 751        ="L672" class="line" name13 9699"> 613ef">cred = 132abs_timeout" lNVA   return         }
 = ae" name="L743"> 743        }
de=to! = NULL;
 613e" name="L729"> 729 13e" >133a"line" name="L737"> " nam 7re=ef="etimespec)))
BADFde=dentry" clas
BADF"srelass="sref">path,  613/a>;
 75ef="feut"srelass="sref">path,  613ame="L731"> 731     13ame>133g_default" cl" name="L718"> 718   1333699"> 613pc_ns" class="sref">ipc_13pc_>133sgsize_max" c"sref">dir,mefef">NULL;
->NULL;
ipc_name="L672" class="line" name1334699"> 613"L733"> 733         13"L7>133/a>(< name="L718"> 718   1335699"> 613ERR_PTR" class="sref">ER13ERR>133Y_REMOVED" clme="L743"> 743NULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name1336699"> 613              133  613ata" class="sref">d_fsda13ata>13eode=total_siz   return ( 7sref">prepare_tomq>( 7"sreeNULL;
 743 613c/mqueue.c#L737" id="L7313c/m>133otify_owner" class="sref">noemq>( 7sref">prepare_tomq>( 7"sre" id="L742" clas/q_flags"line" name="L7mq_flags"line-> = ae" name="L743"> 743 613class="sref">mq_attr13cla>133abs_timeout" lNVA   return prepare_t="mq>( 7"sreaf="+code=capable" class="s134L699"> 613/a>;
 me="L743"> 743 = prepare_tmq>( 7"sre_="L672" class="line" name1341699"> 613sref">ipc_ns->13/otify_owner" class="sme="L743"> 743        }
 = ae" name="L743"> 743 613_ns->mq_mq>( 7sref">prepare_tmq>( 7"sre" id="L742" clas/q_flags"line" name="L7mq_flags"line"/mque id="L742" clasO_NONBLOCK"line" name="L7O_NONBLOCK id=)"L672" class="line" name1343699"> 613c_ns->-> = ae" name="L743"> 743-> 613> 613"sref">ipc_ns, &13"sr>13/Y_REMOVED" class="srede=mode"a>-> = ae" name="L743"> 743 613"L745"> 745         13"L7>134  spin_un"ipc/mqueue.c#L645"spin_un"ipc id="t =         }
 = ae" name="L743"> 743 613ERR_PTR" class="sref">ER13ERR>134sgsiz" name="L659"> 659  13/8699"> 613ref="ipc/mqueue.c#L747" 13ref>134="line" name="L737"> me="L743"> 743ipc_nam"> 751        ipc_nam"> 751        pat 659  13/9699"> 613   }
 718   135L699"> 613 &= ~ 613de=mode" class="sref">mo13de=>1351GSIZEMAX" cl" name="L686"> spin_un"ipc/mqueue.c#L645"spin_un"ipc id="t = NULL;
 743<"ipc/mqueue.c#L645""ipc id=_="L672" class="line" name1352699"> 613ata" class="sref">d_fsda13ata>13 613e" name="L752"> 752 13e" >135sgsize_max" c"sref">dir,re" name="L753"> 7re=ef="e 613ERR_PTR" class="sref">ER13ERR>135href="+code=ElNVA   return prepare_t="omq>( 7"sree!->->prepare_tcopy_toass=" id="L754" class="li="omq>( 7sref">prepare_t="omq>( 7"sre=et = prepare_tomq>( 7"sre=" name="L659"> 659  1355699"> 613=oflag" class="sref">ofl13=of>135Y_REMOVED" class="srede=mode""""""""""""""""""""""""">iz of(737        } else mqsa+code=dentry" clasmqsa+co id=))_" name="L659"> 659  13<6699"> 613>);
 re" name="L753"> 7re=ef="etimespec)))
FAULThref="+code=pat
FAULTef="="L672" class="line" name1357699"> 613/a>}
 659  1358699"> 613 name="L757"> 757135/a> 75ef="feut"sre:ass="sref">path,  6133                   135 id="L748" class="line" namefeutname="L754"> 75fiute.3lasref">path-"ip>        }
 = a_="L672" class="line" name136L699"> 613   136L_def   return path,  613f">info->>1361GSIZEMAX" clcode=out" class="sref"fe" name="L753"> 7re=ef="="L672" class="line" name1362699"> 613nfo-> 718   1363699"> 613 class="sref">notify_own13 cl>136sgsiz"L672" class="line" name1364699"> 613lass="sref">notify_user_13las>136href=>( 7ic"ss="li737        } else mespah7uerationsf">NULL;
NULL;
 613ref="ipc/mqueue.c#L664" 13ref>136Y_REMOVED" cl" id="L742" claslooku>        }
ef="e 659  13 6699"> 613" class="sref">info-13" c>136 prepare_tcreateef="eprepare_t{
59 659  13 7699"> 613>);
 659  13 8699"> 613/a>}
 613f">__user *>136abs_t"L672" class="line" name137L699"> 613timespec" class="sref">t13tim>1370"lin>( 7ic"ss="li737        } else "ipcL7uerationsf">NULL;
NULL;
 613a>)
 75flus ef="e 659  13t2699"> 613out, sizeof(struct <13out>137HARD_MSGMAX" " id="L742" claspollde=dentry" claspollef="e 659  13t3699"> 6132                ret132137="+code=msg_m" id="L742" clasreadef="ipc/mqueue.readef="e 659  13t4699"> 613id" class="sref">timespe13id">137href="+code=E" id="L742" clasllseec/mqueue.c#L645""lseecef="e 659  13t5699"> 6134                ret134137Y_REM}="L672" class="line" name13t6699"> 613/a>;
 613class="sref">timespec_to13cla>137ode=t>( 7ic"ss="li737        } else suuerL7uerationsf">NULL;
NULL;
 613/mqueue.c#L677" id="L67713/mq>137="line" name=" id="L742" clasalloc_mespace" class="srefalloc_mespaef="e 659  13t9699"> 613 0;
->3dentry59"> 659  13evict7oyhmespace" class="sevict7oyhme137abs_timeout" " id="L742" cevict7oyhmespace" class="sL742" cevict7oyhmeef="eNULL1372"fmc#L664" 13ref>136Y_REMOVED" c672"fmespec_to13cla>13VED" c672"fmef="e 659  13t569lasSIGEV_S3GNAode=dentry" clasSIGEV_3IGNAo38q_" name="L718"> 718   1363 clasmigev3sig"ef">NULL;
 613timessystem_typ13ss="sref">attrssystem_typ1ss="li737        } else s_typ13ss="sref">attr } else s_typ1ations = aeL754" class="li{
59attrlasmc#L664" 1699"> 612/aineing">"="li{
"" classe 6134 659  13mouL754" class="lit mouL7137abs_timeout" " id="L742" cmouL754" class="lit m742" cmouL7ef="e 613/a8  659  13kiy" s->686" 12ref>128ode=total_s3ze" c38re=" name="L659"> 659  13 869699"> 612f3>info->>12838n}="L672" class="line" name1369" class="l3struct ef="+code=cred" cl3ss=L731_alasable" class="s13"96mq7oyit6"> get_ss="_nsf">mq7oyit6">     ine" name1364699"> 613lpc_credclace mefes="L7mq_flags"line"/mque id="L74 _ss="_nsf3>NULL;
path,  mefes="L7ue.c#L645"spin_un"ipmq7"li{
s_couL754" class="lit m77"li{
s_couL7 hass=> 752 13e" >135sgsize_max"a>;
 718   1 name="L686"> mefes="L7ue.c#L645"spin_un"ipmq7"li{
s_max54" class="lit m77"li{
s_maxl" name=s_timeout" " id="DFLT_/a>,mSMAX54" class="lit DFLT_/a>,mSMAX>1361GSIZEMAX" clc name="L743"> 743<"ipc/mqueue.c#L6453"ipc 39siz"L672" class="line" name1 name="L686"> mefes="L7ue.c#L645"spin_un"ipmq7msg_max54" class="lit m77msg_maxiz"L672" cls_timeout" " id="DFLT_MSGMAX54" class="lit DFLT_MSGMAX>1361GSIZEMAX" clc clasmigev3ef="feutname="L754"> 75ef3"feut3sre:ass="sref">path,  mefes="L7ue.c#L645"spin_un"ipmq7msg="sr_max54" class="lit m77msg="sr_maxe:ass="s_timeout" " id="DFLT_MSGSIZEMAX54" class="lit DFLT_MSGSIZEMAX>1361GSIZEMAX" clc "> 6134-"ip>        }
 396iz"L672" class="line" name1 name="L686"> mefes="L7ue.c#L645"spin_un"ipmq7msg_c/mqueu54" class="lit m77msg_c/mqueue:ass="s_timeout" " id="DFLT_MSG54" class="lit DFLT_MSG>1361GSIZEMAX" clc 99"> 613/a44" id="L7ef=name="L754">375ef=39a h"L672" class="line" name1 name="L686"> mefes="L7ue.c#L645"spin_un"ipmq7msg="sr_c/mqueu54" class="lit m77msg="sr_c/mqueu hass=> timeout" " id="DFLT_MSGSIZE54" class="lit DFLT_MSGSIZE>1361GSIZEMAX" clc uerL7usf">ref="+sipc/mqueue.c#L645"3ipc i39ss" name="L718"> 718   12/3c id==e.c#3744" id="L7ncce" class="s3efnce39re:ass="sref">path,  mefes="L7ue.c#L645"spin_un"ipmq7mL754" class="lit m77mL7137abs_timeout" " id="kerncmouL7_data>attr } else s_typ1atios="line" net="iksdname="L686"> mefes="L7mref=13f">>1361GSIZEMAX" cl4tre" c" na4 612e" name="L729"> 729 12e" >123a"line" name="L737"> d name="L686"> mefes="L7ue.c#L645"spin_un"ipmq7mL754" class="lit m77mL7137a href="+co{
59path-ncce" class="s4efnce40e_="L672" class="lineable" class="s13"96erL> re" name="L753"> 7r name="L686"> mefes="L7ue.c#L645"spin_un"ipmq7mL754" class="lit m77mL7137a ref=13f">>1361GSIZEMAX" cl4t2e.3lasre4"IMEhref="+code=patCURREN4ZEMAX40=_="L672" class="line>path,  mefes="L7ue.c#L645"spin_un"ipmq7mL754" class="lit m77mL7137abs_timeout" " id=" class="sde=mode"timespec)))ncce" class="srefncef4ode=out" c4ass="sref"fe" name="L753"4 7re=40d=)"L672" class="line>path,  743<"ipc/mqueue.c#L6454>130=40siz"L672" cla672" class="line" name13624699"> 613"4ttr" class="sref">mq_a13"4t>13040re:ass="sref">path 13e" >135sgsize_max4=e.c#L744"4id="L7mqdes"line" name="L4mqdes4sre=" 672" class="line" name1362467.c#L744"4i4" id="L7ef=name="L754">4q>( 740="="L672" class="line" name1354 (( 7sref">prepare_t="o4q>( 74sre)"+voide" class="s13"96mq7cleaL7ub * sizeof(struct13xms7cleaL7ub * s     ine" name1364699"> 613lpc_credclace mefes="L7mq_flags"line"/mque id="L7499"> 613"a4;
130=4lin="+ef="+co{
59path,  mefes="L7ue.c#L645"spin_un"ipmq7mL754" class="lit m77mL7137aue.c#L645"spin_un"ipmL7_s->)))ncce" class="srefncef4 return ( 7sref">prepare_to4q>( 74sre="L672" class="line" name13624queue.c#L748" id="L"ip>        }
41=_="L672" class="line" name1354espace4*ipc4namlasvoide" class="s13"96mq7put7mL754" class="lit m77put7mL7     ine" name1364699"> 613lpc_credclace mefes="L7mq_flags"line"/mque id="L74="+code=do4create" cefef">NULL;
4amefe4f="lasef="+co{
59 613"4mq_maxmsg, 13141re:ass="sref">path,  7r name="L686"> mefes="L7ue.c#L645"spin_un"ipmq7mL754" class="lit m77mL7137a ref=13f">>1361GSIZEMAX" cl4-><4 href="+code=dentry" clas4="sre41re=" 672" class="line" name13624    } else4mqsa+code=dentry" clasmqs4+co i41="="L672" class="line" name1354timespec)))
FAULThref="+code=pat4FAULT4f="="L672" clable" class="s13"96_7oyit54" class="lit _7oyitss="li737       oyit6 } else s 613"a4BLOCK"line" name="L7O_NON4LOCK 41in="+ef="+co{
59)))
INVAode=dentry" clas4INVAo4ef">dentryable" class="s13"96erLoL>132a"l4ne" n4me=" name="L718"> 718   13 4699"> 613/4>}
path,  612/aineing">"="li{
eGSIZE cache"" classeofl13=of>135Y_REMOVED" li{
eGSIZE  * sizeof(struct13xms>131="+code=msg_m73), 0e"ip>        }
 =4a_f="+code=capable" cl672" class="line>path, >1361GSIZEMAX" cl4/>timespec4/a>)))
BADFde=dentry" cla4
BADF4srelass="sref"" name1342699"> 613_n elseGSIZE cache="L742" claslook } elseGSIZE cache=137abs>1315bs_timeout" lNVA1        ( 7sef=13f">>1361GSIZEMAX" cl4//a>-><4turn  659"9699"> 613/mqueue.c#L71NOMEM1        )))ncce" class="srefncef4    } else4ss="sref">umo13mod>132  718   1324699"> 613_4ttr" class="sref">mq_a13_4t>1324gsiz" name="L651699"> 612/acomm"L75>/* /mqure failures - they are not fatal */" classame="L718"> 718   132469"> 613"a4path, >1361GSIZEMAX" cl4nsf">NULL<4a>;
 718   1354/>timespec4/a>)))
BADFde=dentry" cla4
BADF43def"L672" class="line" name1erLoL>system3de=>1351GSIZEMAX" cl" na } else s_typ13ss="sref">attr } else s_typ1atio ref=13f">>1361GSIZEMAX" cl4n99"> 613/4ef="feutname="L754"> 75ef4"feut4srelass="sref"" name1342699"> 613erLoL>>1361GSIZEMAX" cl4ame="L731"4 731     13ame>133g_d4fault43d=)"L672" class="line>,  613/a>;
uysctl> 613"4733"> 733         13"47>1334a>(< name="L718"> 718   1335699"> 7oyit54" class="lit 335699"> 7oyit3de=>1351GSIZEMAX" cl" na } id="t = >1361GSIZEMAX" cl4n/a>-><4"> 743<"ipc/mqueue.c#L6454"ipc 4d=_="L672" class="line" name1334699"> 613 4            1334 get_ss="_nsf">mq7oyit6">     1351GSIZEMAX" cl" nameit6lpc_cs>1361GSIZEMAX" cl4n99"> 613_43"> 743 613erLoL>>1361GSIZEMAX" cl4a9"> 613"a4NBLOCK"line" name="L7O_NO4BLOCK43=))"L672" class="line>,  613/a>;
system>prepare_t="mq4( 7"s44" " name="L718"> 718   1354= ( 7sref">prepare_tm4>( 7"44id:ass="sref">path 13e" >135sgsize_max4e="L743"> 443 613/a>;
system>14a href=O_N4NBLOCK"line" name="L7O_NO4BLOCK44siz"L672" class="line" name1unregistrL7system>attr } else s_typ1atio ref=13f">>1361GSIZEMAX" cl4="+code=mq4ms13>>134href="+code=Em4sk" c44>(< name="L718"> 718a>;
uysctl>14a/a>-><4NBLOCK"line" name="L7O_NO4BLOCK4id=="L672" cla" name1342699"> 613_n7sysctl_tabid="L742" clasreade7sysctl_tabid137asef=13f">>1361GSIZEMAX" cl4e="L743"> 443 659ss="line" name1unregistrL7sysctl_tabid="L742" clasreaunregistrL7sysctl_tabid re" name="L753"> 7r_n7sysctl_tabid="L742" clasreade7sysctl_tabid137asref=13f">>1361GSIZEMAX" cl4=99"> 613_4R_PTR" class="sref">ER13E4R>13444d=="L672" class="line" name1kmem cachec name13"L742" clascreakmem cachec name13 re" name="L753"> 7r_n elseGSIZE cache="L742" claslook } elseGSIZE cache=137asref=13f">>1361GSIZEMAX" cl4=9"> 613"a4TIMEhref="+code=patCURREN4_TIME4asslass="sref">path, 13/abs4timeo4t" " n672" class="line" name13624699"> 613<4a> &= ~ 718   13 4 name="L744"> 743<"ipc/mqueue.c#L6454"ipc 4d=_="L" class="s13"96_7oyitca699"> 613out,_7oyitca69 re" name="L753"> 7royit6 } else s>1361GSIZEMAX" cl4699"> 613a4a" class="sref">d_fsda13a4a>13<4_def"L


The original LXR software by the/a>, LXR commuyityatios=this experim"L7al version by a>, lxL@refux.noatio.
lxL.refux.no kindly hostrd by a>, Redpill Lefpro ASatios=provider of Lefuxlass=ulting and t>( 7ic"ss services since 1995.