struct sock_msg_q       message_q;
        unsigned int            send_tag;
        u8                      flags;
+       u16                     msglimit;
 };
 
 /* iucv socket options (SOL_IUCV) */
 #define SO_IPRMDATA_MSG        0x0080          /* send/recv IPRM_DATA msgs */
+#define SO_MSGLIMIT    0x1000          /* get/set IUCV MSGLIMIT */
 
 /* iucv related control messages (scm) */
 #define SCM_IUCV_TRGCLS        0x0001          /* target class control message */
 
        skb_queue_head_init(&iucv_sk(sk)->backlog_skb_q);
        iucv_sk(sk)->send_tag = 0;
        iucv_sk(sk)->flags = 0;
+       iucv_sk(sk)->msglimit = IUCV_QUEUELEN_DEFAULT;
 
        sk->sk_destruct = iucv_sock_destruct;
        sk->sk_sndtimeo = IUCV_CONN_TIMEOUT;
 
        iucv = iucv_sk(sk);
        /* Create path. */
-       iucv->path = iucv_path_alloc(IUCV_QUEUELEN_DEFAULT,
+       iucv->path = iucv_path_alloc(iucv->msglimit,
                                     IUCV_IPRMDATA, GFP_KERNEL);
        if (!iucv->path) {
                err = -ENOMEM;
                else
                        iucv->flags &= ~IUCV_IPRMDATA;
                break;
+       case SO_MSGLIMIT:
+               switch (sk->sk_state) {
+               case IUCV_OPEN:
+               case IUCV_BOUND:
+                       if (val < 1 || val > (u16)(~0))
+                               rc = -EINVAL;
+                       else
+                               iucv->msglimit = val;
+                       break;
+               default:
+                       rc = -EINVAL;
+                       break;
+               }
+               break;
        default:
                rc = -ENOPROTOOPT;
                break;
        case SO_IPRMDATA_MSG:
                val = (iucv->flags & IUCV_IPRMDATA) ? 1 : 0;
                break;
+       case SO_MSGLIMIT:
+               lock_sock(sk);
+               val = (iucv->path != NULL) ? iucv->path->msglim /* connected */
+                                          : iucv->msglimit;    /* default */
+               release_sock(sk);
+               break;
        default:
                return -ENOPROTOOPT;
        }
        memcpy(nuser_data + 8, niucv->src_name, 8);
        ASCEBC(nuser_data + 8, 8);
 
-       path->msglim = IUCV_QUEUELEN_DEFAULT;
+       /* set message limit for path based on msglimit of accepting socket */
+       niucv->msglimit = iucv->msglimit;
+       path->msglim = iucv->msglimit;
        err = iucv_path_accept(path, &af_iucv_handler, nuser_data, nsk);
        if (err) {
                err = iucv_path_sever(path, user_data);