Author: glen                         Date: Mon Oct 26 15:49:24 2009 GMT
Module: packages                      Tag: HEAD
---- Log message:
- up to git 20091020
- version seems to be 0.4.9 from libmultipath/version.h

---- Files affected:
packages/multipath-tools:
   config.patch (1.1 -> 1.2) , multipath-tools-branch.diff (1.3 -> 1.4) , 
multipath-tools.spec (1.62 -> 1.63) , branch.sh (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/multipath-tools/config.patch
diff -u packages/multipath-tools/config.patch:1.1 
packages/multipath-tools/config.patch:1.2
--- packages/multipath-tools/config.patch:1.1   Wed Jul  1 11:29:33 2009
+++ packages/multipath-tools/config.patch       Mon Oct 26 16:49:18 2009
@@ -1,5 +1,5 @@
---- multipath-tools-0.4.8/multipath.conf.annotated~    2009-07-01 
12:26:22.000000000 +0300
-+++ multipath-tools-0.4.8/multipath.conf.annotated     2009-07-01 
12:26:52.668633417 +0300
+--- multipath-tools-0.4.8/multipath.conf.annotated~    2009-10-26 
16:56:24.000000000 +0200
++++ multipath-tools-0.4.8/multipath.conf.annotated     2009-10-26 
16:56:57.028914153 +0200
 @@ -7,7 +7,7 @@
  ## name  : defaults
  ## desc  : multipath-tools default settings
@@ -9,16 +9,25 @@
  #     #
  #     # name    : udev_dir
  #     # desc    : directory where udev creates its device nodes
-@@ -151,9 +151,9 @@
+@@ -163,8 +163,8 @@
  #     #           file.
  #     # values  : yes|no
  #     # default : no
 -#     user_friendly_names no
 -#
--#}
 +      user_friendly_names yes
 +
+ #     #
+ #     # name    : mode
+ #     # scope   : multipath
+@@ -191,8 +191,8 @@
+ #     # default : determined by the process
+ #     gid disk
+ #
+-#}
+-#     
 +}
- #     
++
  ##
  ## name    : blacklist
+ ## scope   : multipath & multipathd

================================================================
Index: packages/multipath-tools/multipath-tools-branch.diff
diff -u packages/multipath-tools/multipath-tools-branch.diff:1.3 
packages/multipath-tools/multipath-tools-branch.diff:1.4
--- packages/multipath-tools/multipath-tools-branch.diff:1.3    Thu Jan  1 
21:12:23 2009
+++ packages/multipath-tools/multipath-tools-branch.diff        Mon Oct 26 
16:49:18 2009
@@ -13,6 +13,45 @@
 +kpartx
 +multipath
 +multipathd
+diff --git a/FAQ b/FAQ
+index 35dc2f9..5ceb32b 100644
+--- a/FAQ
++++ b/FAQ
+@@ -63,3 +63,34 @@ current/default config like so:
+ lvm dumpconfig > /etc/lvm/lvm.conf
+ 
+ (tip from Christophe Saout)
++
++4. I see a lot of "io_setup failed" message using the directio checker
++======================================================================
++
++The directio path checker makes use of the asynchronous I/O API (aio) provided
++by modern Linux systems. Asynchronous I/O allows an application to submit I/O
++requests asynchronously and be notified later of their completion status. To
++allow this, we must allocate an asynchronous I/O context (an object of type
++aio_context_t) and this task is handled by the io_setup system call.
++
++A system wide limit on the number of AIO contexts that may be active
++simultaneously is imposed via the aio-max-nr sysctl parameter.
++
++Once this limit has been reached further calls to io_setup will fail with the
++error number EAGAIN leading to the "io_setup failed" messages seen for e.g. 
when
++running "multipath -ll".
++
++To avoid this problem the number of available aio contexts should be increased
++by setting the aio-max-nr parameter. This can be set on a one-time basis via 
the
++/proc file system, for e.g.:
++
++        # echo 131072 > /proc/sys/fs/aio-max-nr
++
++Doubles the number of available contexts from the default value of 65536.
++
++To make this setting persistent a line may be added to /etc/sysctl.conf:
++
++        fs.aio-max-nr = 131072
++
++Consult appropriate application and operating system tuning recommendations 
for
++guidance on appropriate values for this parameter.
 diff --git a/Makefile b/Makefile
 index ee554e7..54be0a5 100644
 --- a/Makefile
@@ -43,10 +82,10 @@
  ifeq   ($(MULTIPATH_VERSION),)
  VERSION = $(shell basename ${PWD} | cut -d'-' -f3)
 diff --git a/Makefile.inc b/Makefile.inc
-index 7e2d4e6..3e5bca0 100644
+index 7e2d4e6..7ec25d5 100644
 --- a/Makefile.inc
 +++ b/Makefile.inc
-@@ -13,31 +13,22 @@ ifeq ($(TOPDIR),)
+@@ -13,31 +13,31 @@ ifeq ($(TOPDIR),)
        TOPDIR  = ..
  endif
  
@@ -54,8 +93,14 @@
 -      CC = klcc
 -      klibcdir = /usr/lib/klibc
 -      libdm    = $(klibcdir)/lib/libdevmapper.a
--endif
--
++ifndef LIB
++      ifeq ($(shell test -d /lib64 && echo 1),1)
++              LIB=lib64
++      else
++              LIB=lib
++      endif
+ endif
+ 
  prefix      = 
  exec_prefix = $(prefix)
  bindir      = $(exec_prefix)/sbin
@@ -65,7 +110,8 @@
  mandir      = $(prefix)/usr/share/man/man8
  man5dir     = $(prefix)/usr/share/man/man5
  rcdir     = $(prefix)/etc/init.d
-+libdir            = $(prefix)/lib/multipath
++syslibdir   = $(prefix)/$(LIB)
++libdir            = $(prefix)/$(LIB)/multipath
  
  GZIP        = /bin/gzip -9 -c
 -
@@ -77,7 +123,7 @@
  
  OPTFLAGS     = -pipe -g -Wall -Wunused -Wstrict-prototypes
 -CFLAGS             = $(OPTFLAGS)
-+CFLAGS             = $(OPTFLAGS) -fPIC
++CFLAGS             = $(OPTFLAGS) -fPIC -DLIB_STRING=\"${LIB}\"
 +SHARED_FLAGS = -shared
  
  %.o:  %.c
@@ -326,29 +372,298 @@
  
  uninstall:
        rm -f $(DESTDIR)$(bindir)/$(EXEC)
+diff --git a/kpartx/dasd.c b/kpartx/dasd.c
+index f31111f..dcdf678 100644
+--- a/kpartx/dasd.c
++++ b/kpartx/dasd.c
+@@ -6,6 +6,7 @@
+  * Mostly taken from drivers/s390/block/dasd.c
+  *
+  * Copyright (c) 2005, Hannes Reinecke, SUSE Linux Products GmbH
++ * Copyright IBM Corporation, 2009
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+@@ -40,7 +41,7 @@
+ #include "byteorder.h"
+ #include "dasd.h"
+ 
+-unsigned long sectors512(unsigned long sectors, int blocksize)
++unsigned long long sectors512(unsigned long long sectors, int blocksize)
+ {
+       return sectors * (blocksize >> 9);
+ }
+@@ -52,16 +53,14 @@ read_dasd_pt(int fd, struct slice all, struct slice *sp, 
int ns)
+ {
+       int retval = -1;
+       int blocksize;
+-      long disksize;
+-      unsigned long offset, size;
++      uint64_t disksize;
++      uint64_t offset, size, fmt_size;
+       dasd_information_t info;
+       struct hd_geometry geo;
+       char type[5] = {0,};
+-      char name[7] = {0,};
+-      unsigned char *label_raw;
+       volume_label_t vlabel;
+       unsigned char *data = NULL;
+-      unsigned int blk;
++      uint64_t blk;
+       int fd_dasd = -1;
+       struct stat sbuf;
+       dev_t dev;
+@@ -129,9 +128,10 @@ read_dasd_pt(int fd, struct slice all, struct slice *sp, 
int ns)
+       if (ioctl(fd_dasd, HDIO_GETGEO, (unsigned long)&geo) != 0) {
+               goto out;
+       }
+-      
+-      if (ioctl(fd_dasd, BLKGETSIZE, &disksize) != 0)
++
++      if (ioctl(fd_dasd, BLKGETSIZE64, &disksize) != 0)
+               goto out;
++      disksize >>= 9;
+ 
+       if (ioctl(fd_dasd, BLKSSZGET, &blocksize) != 0)
+               goto out;
+@@ -153,17 +153,14 @@ read_dasd_pt(int fd, struct slice all, struct slice *sp, 
int ns)
+               perror("read");
+               goto out;
+       }
+-      vtoc_ebcdic_dec(data, type, 4);
+ 
+       if ((!info.FBA_layout) && (!strcmp(info.type, "ECKD")))
+-              label_raw = &data[8];
+-      else
+-              label_raw = &data[4];
+-
+-      name[6] = '\0';
+-      vtoc_ebcdic_dec(label_raw, name, 6);
+-
+-      memcpy (&vlabel, data, sizeof(volume_label_t));
++              memcpy (&vlabel, data, sizeof(vlabel));
++      else {
++              bzero(&vlabel,4);
++              memcpy (&vlabel.vollbl, data, sizeof(vlabel) - 4);
++      }
++      vtoc_ebcdic_dec(vlabel.vollbl, type, 4);
+ 
+       /*
+        * Three different types: CMS1, VOL1 and LNX1/unlabeled
+@@ -172,16 +169,16 @@ read_dasd_pt(int fd, struct slice all, struct slice *sp, 
int ns)
+               /*
+                * VM style CMS1 labeled disk
+                */
+-              int *label = (int *) &vlabel;
++              unsigned int *label = (unsigned int *) &vlabel;
+ 
+-              if (label[13] != 0) {
++              blocksize = label[4];
++              if (label[14] != 0) {
+                       /* disk is reserved minidisk */
+-                      blocksize = label[3];
+-                      offset = label[13];
+-                      size   = sectors512(label[7] - 1, blocksize);
++                      offset = label[14];
++                      size   = sectors512(label[8] - 1, blocksize);
+               } else {
+                       offset = info.label_block + 1;
+-                      size   = disksize;
++                      size   = sectors512(label[8], blocksize);
+               }
+               sp[0].start = sectors512(offset, blocksize);
+               sp[0].size  = size - sp[0].start;
+@@ -207,18 +204,20 @@ read_dasd_pt(int fd, struct slice all, struct slice *sp, 
int ns)
+                       /* skip FMT4 / FMT5 / FMT7 labels */
+                       if (EBCtoASC[f1.DS1FMTID] == '4'
+                           || EBCtoASC[f1.DS1FMTID] == '5'
+-                          || EBCtoASC[f1.DS1FMTID] == '7') {
++                          || EBCtoASC[f1.DS1FMTID] == '7'
++                          || EBCtoASC[f1.DS1FMTID] == '9') {
+                               blk++;
+                               continue;
+                       }
+ 
+-                      /* only FMT1 valid at this point */
+-                      if (EBCtoASC[f1.DS1FMTID] != '1')
++                      /* only FMT1 and FMT8 valid at this point */
++                      if (EBCtoASC[f1.DS1FMTID] != '1' &&
++                          EBCtoASC[f1.DS1FMTID] != '8')
+                               break;
+ 
+                       /* OK, we got valid partition data */
+                       offset = cchh2blk(&f1.DS1EXT1.llimit, &geo);
+-                      size  = cchh2blk(&f1.DS1EXT1.ulimit, &geo) - 
++                      size  = cchh2blk(&f1.DS1EXT1.ulimit, &geo) -
+                               offset + geo.sectors;
+                       sp[counter].start = sectors512(offset, blocksize);
+                       sp[counter].size  = sectors512(size, blocksize);
+@@ -230,8 +229,27 @@ read_dasd_pt(int fd, struct slice all, struct slice *sp, 
int ns)
+               /*
+                * Old style LNX1 or unlabeled disk
+                */
++              if (strncmp(type, "LNX1", 4) == 0) {
++                      if (vlabel.ldl_version == 0xf2) {
++                              fmt_size = sectors512(vlabel.formatted_blocks,
++                                                    blocksize);
++                      } else if (!strcmp(info.type, "ECKD")) {
++                              /* formated w/o large volume support */
++                              fmt_size = geo.cylinders * geo.heads
++                                      * geo.sectors * (blocksize >> 9);
++                      } else {
++                              /* old label and no usable disk geometry
++                               * (e.g. DIAG) */
++                              fmt_size = disksize;
++                      }
++                      size = disksize;
++                      if (fmt_size < size)
++                              size = fmt_size;
++              } else
++                      size = disksize;
++
+               sp[0].start = sectors512(info.label_block + 1, blocksize);
+-              sp[0].size  = disksize - sp[0].start;
++              sp[0].size  = size - sp[0].start;
+               retval = 1;
+       }
+ 
+diff --git a/kpartx/dasd.h b/kpartx/dasd.h
+index 4a5ba86..0ed7c80 100644
+--- a/kpartx/dasd.h
++++ b/kpartx/dasd.h
+@@ -6,6 +6,7 @@
+  * Mostly taken from drivers/s390/block/dasd.c
+  *
+  * Copyright (c) 2005, Hannes Reinecke, SUSE Linux Products GmbH
++ * Copyright IBM Corporation, 2009
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+@@ -66,7 +67,9 @@ typedef struct volume_label
+       char labperci[4];       /* no of labels per CI (FBA), blanks for CKD */
+       char res2[4];           /* reserved                                  */
+       char lvtoc[14];         /* owner code for LVTOC                      */
+-      char res3[29];          /* reserved                                  */
++      char res3[28];          /* reserved                                  */
++      char ldl_version;       /* version number, valid for ldl format      */
++      uint64_t formatted_blocks; /* valid when ldl_version >= f2           */
+ } __attribute__ ((packed)) volume_label_t;
+ 
+ 
+@@ -160,6 +163,7 @@ typedef struct dasd_information_t {
+ #define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,dasd_information_t)
+ #define BLKGETSIZE _IO(0x12,96)
+ #define BLKSSZGET _IO(0x12,104)
++#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* device size in bytes (u64 
*arg)*/
+ 
+ /*
+  * Only compile this on S/390. Doesn't make any sense
+@@ -239,7 +243,7 @@ static unsigned char EBCtoASC[256] =
+ };
+ 
+ static inline void 
+-vtoc_ebcdic_dec (const unsigned char *source, char *target, int l) 
++vtoc_ebcdic_dec (const char *source, char *target, int l)
+ {
+       int i;
+ 
+@@ -248,24 +252,41 @@ vtoc_ebcdic_dec (const unsigned char *source, char 
*target, int l)
+ }
+ 
+ /*
+- * compute the block number from a 
++ * compute the block number from a
+  * cyl-cyl-head-head structure
+  */
+-static inline int
+-cchh2blk (cchh_t *ptr, struct hd_geometry *geo) {
+-        return ptr->cc * geo->heads * geo->sectors +
+-             ptr->hh * geo->sectors;
+-}
++static inline uint64_t
++cchh2blk (cchh_t *ptr, struct hd_geometry *geo)
++{
++      uint64_t cyl;
++      uint16_t head;
+ 
++      /*decode cylinder and heads for large volumes */
++      cyl = ptr->hh & 0xFFF0;
++      cyl <<= 12;
++      cyl |= ptr->cc;
++      head = ptr->hh & 0x000F;
++      return cyl * geo->heads * geo->sectors +
++             head * geo->sectors;
++}
+ 
+ /*
+- * compute the block number from a 
++ * compute the block number from a
+  * cyl-cyl-head-head-block structure
+  */
+-static inline int
+-cchhb2blk (cchhb_t *ptr, struct hd_geometry *geo) {
+-        return ptr->cc * geo->heads * geo->sectors +
+-              ptr->hh * geo->sectors +
++static inline uint64_t
++cchhb2blk (cchhb_t *ptr, struct hd_geometry *geo)
++{
++      uint64_t cyl;
++      uint16_t head;
++
++      /*decode cylinder and heads for large volumes */
++      cyl = ptr->hh & 0xFFF0;
++      cyl <<= 12;
++      cyl |= ptr->cc;
++      head = ptr->hh & 0x000F;
++      return  cyl * geo->heads * geo->sectors +
++              head * geo->sectors +
+               ptr->b;
+ }
+ 
 diff --git a/kpartx/devmapper.c b/kpartx/devmapper.c
-index 6e3e198..893d6dd 100644
+index 6e3e198..dea1501 100644
 --- a/kpartx/devmapper.c
 +++ b/kpartx/devmapper.c
-@@ -4,10 +4,12 @@
+@@ -4,10 +4,11 @@
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
 +#include <stdint.h>
  #include <libdevmapper.h>
  #include <ctype.h>
- #include <linux/kdev_t.h>
+-#include <linux/kdev_t.h>
  #include <errno.h>
 +#include "devmapper.h"
  
  #define UUID_PREFIX "part%d-"
  #define MAX_PREFIX_LEN 8
-@@ -72,10 +74,10 @@ dm_simplecmd (int task, const char *name) {
+@@ -51,7 +52,7 @@ dm_prereq (char * str, int x, int y, int z)
+ }
+ 
+ extern int
+-dm_simplecmd (int task, const char *name) {
++dm_simplecmd (int task, const char *name, int no_flush) {
+       int r = 0;
+       struct dm_task *dmt;
+ 
+@@ -62,6 +63,10 @@ dm_simplecmd (int task, const char *name) {
+               goto out;
+ 
+       dm_task_no_open_count(dmt);
++      dm_task_skip_lockfs(dmt);
++
++      if (no_flush)
++              dm_task_no_flush(dmt);
+ 
+       r = dm_task_run(dmt);
+ 
+@@ -72,10 +77,11 @@ dm_simplecmd (int task, const char *name) {
  
  extern int
  dm_addmap (int task, const char *name, const char *target,
 -         const char *params, unsigned long size, const char *uuid, int part) {
-+         const char *params, uint64_t size, const char *uuid, int part) {
++         const char *params, uint64_t size, const char *uuid, int part,
++         mode_t mode, uid_t uid, gid_t gid) {
        int r = 0;
        struct dm_task *dmt;
 -      char *prefixed_uuid;
@@ -356,17 +671,36 @@
  
        if (!(dmt = dm_task_create (task)))
                return 0;
+@@ -98,6 +104,13 @@ dm_addmap (int task, const char *name, const char *target,
+                       goto addout;
+       }
+ 
++      if (!dm_task_set_mode(dmt, mode))
++              goto addout;
++      if (!dm_task_set_uid(dmt, uid))
++              goto addout;
++      if (!dm_task_set_gid(dmt, gid))
++              goto addout;
++
+       dm_task_no_open_count(dmt);
+ 
+       r = dm_task_run (dmt);
 diff --git a/kpartx/devmapper.h b/kpartx/devmapper.h
-index ccdbead..2bd27d2 100644
+index ccdbead..09cdced 100644
 --- a/kpartx/devmapper.h
 +++ b/kpartx/devmapper.h
-@@ -1,7 +1,7 @@
+@@ -1,7 +1,11 @@
++#define MAJOR(dev)      ((dev & 0xfff00) >> 8)
++#define MINOR(dev)      ((dev & 0xff) | ((dev >> 12) & 0xfff00))
++#define MKDEV(ma,mi)    ((mi & 0xff) | (ma << 8) | ((mi & ~0xff) << 12))
++
  int dm_prereq (char *, int, int, int);
- int dm_simplecmd (int, const char *);
+-int dm_simplecmd (int, const char *);
 -int dm_addmap (int, const char *, const char *, const char *, unsigned long,
 -             char *, int);
++int dm_simplecmd (int, const char *, int);
 +int dm_addmap (int, const char *, const char *, const char *, uint64_t,
-+             const char *, int);
++             const char *, int, mode_t, uid_t, gid_t);
  int dm_map_present (char *);
  char * dm_mapname(int major, int minor);
  dev_t dm_get_first_dep(char *devname);
@@ -484,10 +818,10 @@
  Operate verbosely
  .SH "SEE ALSO"
 diff --git a/kpartx/kpartx.c b/kpartx/kpartx.c
-index dbe2ee2..237d958 100644
+index dbe2ee2..b61a81f 100644
 --- a/kpartx/kpartx.c
 +++ b/kpartx/kpartx.c
-@@ -25,6 +25,7 @@
+@@ -25,11 +25,11 @@
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
@@ -495,7 +829,12 @@
  #include <sys/stat.h>
  #include <sys/types.h>
  #include <ctype.h>
-@@ -82,7 +83,7 @@ initpts(void)
+ #include <libdevmapper.h>
+-#include <linux/kdev_t.h>
+ 
+ #include "devmapper.h"
+ #include "crc32.h"
+@@ -82,7 +82,7 @@ initpts(void)
        addpts("sun", read_sun_pt);
  }
  
@@ -504,7 +843,7 @@
  
  /* Used in gpt.c */
  int force_gpt=0;
-@@ -94,6 +95,7 @@ usage(void) {
+@@ -94,6 +94,7 @@ usage(void) {
        printf("\t-d del partition devmappings\n");
        printf("\t-l list partitions devmappings that would be added by -a\n");
        printf("\t-p set device name-partition number delimiter\n");
@@ -512,7 +851,7 @@
        printf("\t-v verbose\n");
        return 1;
  }
-@@ -187,8 +189,7 @@ main(int argc, char **argv){
+@@ -187,8 +188,7 @@ main(int argc, char **argv){
        struct slice all;
        struct pt *ptp;
        enum action what = LIST;
@@ -522,7 +861,13 @@
        int verbose = 0;
        char partname[PARTNAME_SIZE], params[PARTNAME_SIZE + 16];
        char * loopdev = NULL;
-@@ -202,7 +203,6 @@ main(int argc, char **argv){
+@@ -197,12 +197,12 @@ main(int argc, char **argv){
+       char *mapname = NULL;
+       int loopro = 0;
+       int hotplug = 0;
++      int loopcreated = 0;
+       struct stat buf;
+ 
        initpts();
        init_crc32();
  
@@ -554,7 +899,15 @@
                exit(1);
        }
  
-@@ -331,10 +323,9 @@ main(int argc, char **argv){
+@@ -300,6 +292,7 @@ main(int argc, char **argv){
+                               fprintf(stderr, "can't set up loop\n");
+                               exit (1);
+                       }
++                      loopcreated = 1;
+               }
+               device = loopdev;
+       }
+@@ -331,10 +324,9 @@ main(int argc, char **argv){
                perror(device);
                exit(1);
        }
@@ -566,7 +919,7 @@
        for (i = 0; i < ptct; i++) {
                ptp = &pts[i];
  
-@@ -366,16 +357,16 @@ main(int argc, char **argv){
+@@ -366,16 +358,16 @@ main(int argc, char **argv){
  
                                slices[j].minor = m++;
  
@@ -587,7 +940,7 @@
                                        int k = slices[j].container - 1;
  
                                        if (slices[j].size == 0)
-@@ -387,9 +378,9 @@ main(int argc, char **argv){
+@@ -387,9 +379,9 @@ main(int argc, char **argv){
                                        slices[j].minor = m++;
  
                                        start = slices[j].start - 
slices[k].start;
@@ -599,7 +952,19 @@
                                               slices[k].minor, start);
                                        c--;
                                }
-@@ -401,7 +392,7 @@ main(int argc, char **argv){
+@@ -398,10 +390,19 @@ main(int argc, char **argv){
+                                       break;
+                       }
+ 
++                      if (loopcreated && S_ISREG (buf.st_mode)) {
++                              if (del_loop(device)) {
++                                      if (verbose)
++                                              printf("can't del loop : %s\n",
++                                                      device);
++                                      exit(1);
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/multipath-tools/config.patch?r1=1.1&r2=1.2&f=u
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/multipath-tools/multipath-tools-branch.diff?r1=1.3&r2=1.4&f=u
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/multipath-tools/multipath-tools.spec?r1=1.62&r2=1.63&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to