On Tue, 2009-03-03 at 17:02 -0600, Serge E. Hallyn wrote:
> >From 3bf32de589f6f6a456dbe721729a0d7273dfb7c4 Mon Sep 17 00:00:00 2001
> From: Serge Hallyn <se...@us.ibm.com>
> Date: Tue, 16 Dec 2008 22:35:16 +0000
> Subject: [PATCH 3/4] ltp: posix mqns: test vfs and mq interaction
> 
> Test that the interaction between mqueuefs and ipc namespaces
> is correct (one mqueuefs for each ipc namespace, living at least
> as long as the namespace)
> 
> Signed-off-by: Serge Hallyn <se...@us.ibm.com>

Thanks.

Regards--
Subrata

> ---
>  testcases/kernel/containers/mqns/mqns.h         |    1 +
>  testcases/kernel/containers/mqns/mqns_03.c      |  196 
> +++++++++++++++++++++++
>  testcases/kernel/containers/mqns/runmqnstest.sh |    2 +-
>  3 files changed, 198 insertions(+), 1 deletions(-)
>  create mode 100644 testcases/kernel/containers/mqns/mqns_03.c
> 
> diff --git a/testcases/kernel/containers/mqns/mqns.h 
> b/testcases/kernel/containers/mqns/mqns.h
> index df8fc4b..4bf1e1f 100644
> --- a/testcases/kernel/containers/mqns/mqns.h
> +++ b/testcases/kernel/containers/mqns/mqns.h
> @@ -9,5 +9,6 @@
> 
>  #define DEV_MQUEUE "/dev/mqueue"
>  #define SLASH_MQ1 "/MQ1"
> +#define SLASH_MQ2 "/MQ2"
> 
>  #endif /* __MQNS_H */
> diff --git a/testcases/kernel/containers/mqns/mqns_03.c 
> b/testcases/kernel/containers/mqns/mqns_03.c
> new file mode 100644
> index 0000000..e7f9877
> --- /dev/null
> +++ b/testcases/kernel/containers/mqns/mqns_03.c
> @@ -0,0 +1,196 @@
> +/*
> +* Copyright (c) International Business Machines Corp., 2009
> +* This program is free software; you can redistribute it and/or modify
> +* it under the terms of the GNU General Public License as published by
> +* the Free Software Foundation; either version 2 of the License, or
> +* (at your option) any later version.
> +*
> +* This program is distributed in the hope that it will be useful,
> +* but WITHOUT ANY WARRANTY; without even the implied warranty of
> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
> +* the GNU General Public License for more details.
> +* You should have received a copy of the GNU General Public License
> +* along with this program; if not, write to the Free Software
> +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> +*
> +* Author: Serge Hallyn <se...@us.ibm.com>
> +*
> +* Check ipcns+sb longevity
> +*
> +* Mount mqueue fs
> +* unshare
> +* In unshared process:
> +*    Create "/mq1" with mq_open()
> +*    Mount mqueuefs
> +*    Check that /mq1 exists
> +*    Create /dev/mqueue/mq2 through vfs (create(2))
> +*    Umount /dev/mqueue
> +*    Remount /dev/mqueue
> +*    Check that both /mq1 and /mq2 exist
> +
> +***************************************************************************/
> +
> +#define _GNU_SOURCE 1
> +#include <sys/wait.h>
> +#include <assert.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <string.h>
> +#include <errno.h>
> +#include "mqns.h"
> +
> +char *TCID = "posixmq_namespace_03";
> +int TST_TOTAL=1;
> +
> +int p1[2];
> +int p2[2];
> +
> +#define FNAM1 DEV_MQUEUE2 SLASH_MQ1
> +#define FNAM2 DEV_MQUEUE2 SLASH_MQ2
> +
> +int check_mqueue(void *vtest)
> +{
> +     char buf[30];
> +     mqd_t mqd;
> +     int rc;
> +     struct stat statbuf;
> +
> +     close(p1[1]);
> +     close(p2[0]);
> +
> +     read(p1[0], buf, 3); /* go */
> +
> +     mqd = mq_open(SLASH_MQ1, O_RDWR|O_CREAT|O_EXCL, 0755, NULL);
> +     if (mqd == -1) {
> +             write(p2[1], "mqfail", 7);
> +             tst_exit(3);
> +     }
> +
> +     mq_close(mqd);
> +
> +     rc = mount("mqueue", DEV_MQUEUE2, "mqueue", 0, NULL);
> +     if (rc == -1) {
> +             perror("mount");
> +             write(p2[1], "mount1", 7);
> +             tst_exit(3);
> +     }
> +
> +     rc = stat(FNAM1, &statbuf);
> +     if (rc == -1) {
> +             write(p2[1], "stat1", 6);
> +             tst_exit(3);
> +     }
> +
> +     rc = creat(FNAM2, 0755);
> +     if (rc == -1) {
> +             write(p2[1], "creat", 6);
> +             tst_exit(3);
> +     }
> +
> +     close(rc);
> +
> +     rc = umount(DEV_MQUEUE2);
> +     if (rc == -1) {
> +             perror("umount");
> +             write(p2[1], "umount", 7);
> +             tst_exit(3);
> +     }
> +
> +     rc = mount("mqueue", DEV_MQUEUE2, "mqueue", 0, NULL);
> +     if (rc == -1) {
> +             write(p2[1], "mount2", 7);
> +             tst_exit(3);
> +     }
> +
> +     rc = stat(FNAM1, &statbuf);
> +     if (rc == -1) {
> +             write(p2[1], "stat2", 7);
> +             tst_exit(3);
> +     }
> +
> +     rc = stat(FNAM2, &statbuf);
> +     if (rc == -1) {
> +             write(p2[1], "stat3", 7);
> +             tst_exit(3);
> +     }
> +
> +     write(p2[1], "done", 5);
> +
> +     tst_exit(0);
> +
> +     /* NOT REACHED */
> +     return 0;
> +}
> +
> +
> +int main(int argc, char *argv[])
> +{
> +     int r;
> +     char buf[30];
> +     int use_clone = T_UNSHARE;
> +
> +     if (argc == 2 && strcmp(argv[1], "-clone") == 0) {
> +             tst_resm(TINFO, "Testing posix mq namespaces through 
> clone(2).\n");
> +             use_clone = T_CLONE;
> +     } else
> +             tst_resm(TINFO, "Testing posix mq namespaces through 
> unshare(2).\n");
> +
> +     if (pipe(p1) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
> +     if (pipe(p2) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
> +
> +     /* fire off the test */
> +     r = do_clone_unshare_test(use_clone, CLONE_NEWIPC, check_mqueue, NULL);
> +     if (r < 0) {
> +             tst_resm(TFAIL, "failed clone/unshare\n");
> +             tst_exit(1);
> +     }
> +
> +     tst_resm(TINFO, "Checking correct umount+remount of mqueuefs\n");
> +
> +     mkdir(DEV_MQUEUE2, 0755);
> +
> +     close(p1[0]);
> +     close(p1[0]);
> +     close(p2[1]);
> +     write(p1[1], "go", 3);
> +
> +     read(p2[0], buf, 7);
> +     r = TFAIL;
> +     if (!strcmp(buf, "mqfail")) {
> +             tst_resm(TFAIL, "child process could not create mqueue\n");
> +             goto fail;
> +     } else if (!strcmp(buf, "mount1")) {
> +             tst_resm(TFAIL, "child process could not mount mqueue\n");
> +             goto fail;
> +     } else if (!strcmp(buf, "stat1x")) {
> +             tst_resm(TFAIL, "mq created by child is not in mqueuefs\n");
> +             goto fail;
> +     } else if (!strcmp(buf, "creat")) {
> +             tst_resm(TFAIL, "child couldn't creat mq through mqueuefs\n");
> +             goto fail;
> +     } else if (!strcmp(buf, "umount")) {
> +             tst_resm(TFAIL, "child couldn't umount mqueuefs\n");
> +             goto fail;
> +     } else if (!strcmp(buf, "mount2")) {
> +             tst_resm(TFAIL, "child couldn't remount mqueuefs\n");
> +             goto fail;
> +     } else if (!strcmp(buf, "stat2")) {
> +             tst_resm(TFAIL, "mq_open()d file gone after remount of 
> mqueuefs\n");
> +             goto fail;
> +     } else if (!strcmp(buf, "stat3")) {
> +             tst_resm(TFAIL, "creat(2)'d file gone after remount of 
> mqueuefs\n");
> +             goto fail;
> +     }
> +
> +     tst_resm(TPASS, "umount+remount of mqueuefs remounted the right fs\n");
> +
> +     r = 0;
> +fail:
> +     umount(DEV_MQUEUE2);
> +     rmdir(DEV_MQUEUE2);
> +     tst_exit(r);
> +
> +     /* NOT REACHED */
> +     return 0;
> +}
> diff --git a/testcases/kernel/containers/mqns/runmqnstest.sh 
> b/testcases/kernel/containers/mqns/runmqnstest.sh
> index 1252352..3d7ed02 100755
> --- a/testcases/kernel/containers/mqns/runmqnstest.sh
> +++ b/testcases/kernel/containers/mqns/runmqnstest.sh
> @@ -21,7 +21,7 @@
>  
> ################################################################################
> 
>  exit_code=0
> -tests_list='mqns_01 mqns_02'
> +tests_list='mqns_01 mqns_02 mqns_03'
> 
>  for t in $tests_list
>  do


------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to