Hello community,

here is the log from the commit of package lvm2 for openSUSE:Factory checked in 
at 2016-02-03 10:17:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/lvm2 (Old)
 and      /work/SRC/openSUSE:Factory/.lvm2.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "lvm2"

Changes:
--------
--- /work/SRC/openSUSE:Factory/lvm2/lvm2.changes        2015-12-18 
21:53:12.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.lvm2.new/lvm2.changes   2016-02-03 
10:17:36.000000000 +0100
@@ -1,0 +2,19 @@
+Thu Jan 28 03:47:31 UTC 2016 - [email protected]
+
+- Add 'Also=lvm2-lvmetad.socket' in '[Install]' section of lvm2-lvmetad.
+  service to remove lvm2-lvmetad.socket when disable lvm2-lvmetad.service.
+  (bsc#960044) 
+  add: lvm2-lvmetad.service-add-Also-lvm2-lvmetad.socket.patch
+
+-------------------------------------------------------------------
+Wed Jan 27 05:38:07 UTC 2016 - [email protected]
+
+- Split thin-provisioning-tools from lvm2 package for easier maintenance.
+- Update to lvm2-2.02.141 (device-mapper-1.02.115)
+  - Remove patches:
+     lvm2-do-not-strip-pdata_tools.patch: thin-provisioning-tools patch
+     lvmetad.c-ignore-lvmetad-global-handle-on-disconnect.patch:
+                                                          already in upstream
+     no_buildroot_shared.diff: LVM_SHARED_PATH dropped by upstream
+
+-------------------------------------------------------------------

Old:
----
  LVM2.2.02.120.tgz
  LVM2.2.02.120.tgz.asc
  lvm2-do-not-strip-pdata_tools.patch
  lvmetad.c-ignore-lvmetad-global-handle-on-disconnect.patch
  no_buildroot_shared.diff
  thin-provisioning-tools-v0.5.3.tar.gz

New:
----
  LVM2.2.02.141.tgz
  LVM2.2.02.141.tgz.asc
  lvm2-lvmetad.service-add-Also-lvm2-lvmetad.socket.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ lvm2.spec ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:38.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:38.000000000 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package lvm2
 #
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2016 SUSE LINUX Products GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -16,9 +16,8 @@
 #
 
 
-%define lvm2_version              2.02.120
-%define device_mapper_version     1.02.97
-%define thin_provisioning_version 0.5.3
+%define lvm2_version              2.02.141
+%define device_mapper_version     1.02.115
 
 %bcond_without clvm
 
@@ -37,15 +36,12 @@
 Source10:       cmirrord.ocf
 Source14:       baselibs.conf
 Source16:       csm-converter.tar.gz
-Source50:       thin-provisioning-tools-v%{thin_provisioning_version}.tar.gz
 
 # Upstream patches first
-Patch1:         lvmetad.c-ignore-lvmetad-global-handle-on-disconnect.patch
 
 # SUSE patches 1000- for LVM, 2000- for device mapper
 Patch1001:      improve_probing.diff
 Patch1002:      no-inc-audit.diff
-Patch1003:      no_buildroot_shared.diff
 Patch1004:      sys_mount_instead_linux_fs.diff
 
 #suse
@@ -77,6 +73,7 @@
 
 Patch1017:      version-plugins-in-libdir
 Patch1018:      dmeventd-fix-dso-name-wrong-compare.patch
+Patch1019:      lvm2-lvmetad.service-add-Also-lvm2-lvmetad.socket.patch        
 
 # device-mapper patches
 #suse, bnc#707253(also merged patch for bnc#479104)
@@ -88,8 +85,6 @@
 Patch2004:      udev_rules-update.diff
 #suse, bnc#875233
 Patch2005:      udev-Check-for-DM_NR_VALID_PATHS.patch
-# suse, boo#910327 - DO NOT STRIP pdata_tools - Before ever removing this 
patch, understand the issue
-Patch2006:      lvm2-do-not-strip-pdata_tools.patch
 Patch2007:      fsadm-add-support-for-btrfs.patch
 Patch2008:      Import-ID_FS_XXX-variables-bnc909358.patch
 Patch2009:      10-dm.rules-Reset-state-variable-for-spurious-events.patch
@@ -128,12 +123,10 @@
 
 
 %prep
-%setup -q -n LVM2.%{version} -a 50  -a 16 
+%setup -q -n LVM2.%{version} -a 16 
 
-%patch1 -p1
 %patch1001 -p1
 %patch1002 -p1
-%patch1003 -p1
 %patch1004 -p1
 %patch1005 -p1
 %patch1006 -p1
@@ -151,6 +144,7 @@
 %endif
 %patch1017 -p1
 %patch1018 -p1
+%patch1019 -p1
 
 %patch2000 -p1
 %patch2001 -p1
@@ -158,7 +152,6 @@
 %patch2003 -p1
 %patch2004 -p1
 %patch2005 -p1
-%patch2006 -p1
 %patch2007 -p1
 %patch2008 -p1
 %patch2009 -p1
@@ -220,12 +213,6 @@
 popd
 %endif
 
-pushd thin-provisioning-tools-%{thin_provisioning_version}
-autoreconf -fiv
-%configure --sbindir=/sbin --prefix="%_prefix"
-make %{?_smp_mflags}
-popd
-
 %install
 %make_install
 make install_system_dirs DESTDIR="%buildroot"
@@ -269,10 +256,6 @@
 ln -sf ../../sbin/lvm lvm
 popd
 
-pushd thin-provisioning-tools-%{thin_provisioning_version}
-%make_install
-popd
-
 %pre
 %service_add_pre blk-availability.service lvm2-monitor.service 
lvm2-lvmetad.socket lvm2-lvmetad.service 
 
@@ -461,6 +444,7 @@
 BuildRequires:  systemd-rpm-macros
 BuildRequires:  pkgconfig(libudev)
 Requires:       expat
+Requires:       thin-provisioning-tools >= 0.5.6
 Requires(post): coreutils
 Requires(postun): coreutils
 PreReq:         %insserv_prereq %fillup_prereq
@@ -498,20 +482,15 @@
 /%_lib/libdevmapper-event.so.1.02
 /sbin/dmsetup
 /sbin/dmeventd
-%_sbindir/thin_*
+/sbin/dmstats
+%_mandir/man8/dmstats.8.*
 %_mandir/man8/dmsetup.8.gz
 %_mandir/man8/dmeventd.8.gz
-%_mandir/man8/thin_*.8*
 %_udevrulesdir/10-dm.rules
 %_udevrulesdir/13-dm-disk.rules
 %_udevrulesdir/95-dm-notify.rules
 %_unitdir/dm-event.socket
 %_unitdir/dm-event.service
-%_sbindir/cache_*
-%_sbindir/era_*
-%_sbindir/pdata_tools
-%_mandir/man8/cache_*.8*
-%_mandir/man8/era_*.8*
 
 %package -n device-mapper-devel
 Summary:        Development package for the device mapper

++++++ LVM2.2.02.120.tgz -> LVM2.2.02.141.tgz ++++++
++++ 92966 lines of diff (skipped)

++++++ cluster_support_mirrord_log.diff ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -9,8 +9,10 @@
  tools/lvconvert.c            |    9 ---
  7 files changed, 109 insertions(+), 81 deletions(-)
 
---- a/daemons/cmirrord/Makefile.in
-+++ b/daemons/cmirrord/Makefile.in
+Index: LVM2.2.02.139/daemons/cmirrord/Makefile.in
+===================================================================
+--- LVM2.2.02.139.orig/daemons/cmirrord/Makefile.in
++++ LVM2.2.02.139/daemons/cmirrord/Makefile.in
 @@ -26,7 +26,7 @@ TARGETS = cmirrord
  
  include $(top_builddir)/make.tmpl
@@ -20,8 +22,10 @@
  LMLIBS += $(CPG_LIBS) $(SACKPT_LIBS)
  CFLAGS += $(CPG_CFLAGS) $(SACKPT_CFLAGS) $(EXTRA_EXEC_CFLAGS)
  LDFLAGS += $(EXTRA_EXEC_LDFLAGS)
---- a/daemons/cmirrord/cluster.c
-+++ b/daemons/cmirrord/cluster.c
+Index: LVM2.2.02.139/daemons/cmirrord/cluster.c
+===================================================================
+--- LVM2.2.02.139.orig/daemons/cmirrord/cluster.c
++++ LVM2.2.02.139/daemons/cmirrord/cluster.c
 @@ -22,6 +22,7 @@
  #include <errno.h>
  #include <signal.h>
@@ -30,10 +34,10 @@
  #if CMIRROR_HAS_CHECKPOINT
  #include <openais/saAis.h>
  #include <openais/saCkpt.h>
-@@ -151,9 +152,11 @@ struct clog_cpg {
+@@ -152,9 +153,11 @@ struct clog_cpg {
        struct checkpoint_data *checkpoint_list;
        int idx;
-       char debugging[DEBUGGING_HISTORY][128];
+       char debugging[DEBUGGING_HISTORY][DEBUGGING_BUFLEN];
 +      pthread_t thread_pid;
  };
  
@@ -42,7 +46,7 @@
  
  /*
   * cluster_send
-@@ -168,12 +171,14 @@ int cluster_send(struct clog_request *rq
+@@ -169,12 +172,14 @@ int cluster_send(struct clog_request *rq
        struct iovec iov;
        struct clog_cpg *entry;
  
@@ -57,7 +61,7 @@
  
        if (!found) {
                rq->u_rq.error = -ENOENT;
-@@ -254,11 +259,11 @@ static struct clog_request *get_matching
+@@ -255,11 +260,11 @@ static struct clog_request *get_matching
        return NULL;
  }
  
@@ -70,7 +74,7 @@
        struct clog_request *tmp = (struct clog_request *)rq_buffer;
  
        /*
-@@ -369,9 +374,13 @@ static struct clog_cpg *find_clog_cpg(cp
+@@ -370,9 +375,13 @@ static struct clog_cpg *find_clog_cpg(cp
  {
        struct clog_cpg *match;
  
@@ -85,7 +89,7 @@
  
        return NULL;
  }
-@@ -981,34 +990,21 @@ static int resend_requests(struct clog_c
+@@ -982,34 +991,21 @@ static int resend_requests(struct clog_c
        return r;
  }
  
@@ -132,7 +136,7 @@
  }
  
  static int flush_startup_list(struct clog_cpg *entry)
-@@ -1061,23 +1057,37 @@ static int flush_startup_list(struct clo
+@@ -1062,23 +1058,37 @@ static int flush_startup_list(struct clo
        return 0;
  }
  
@@ -176,7 +180,7 @@
  
        /*
         * Perform necessary endian and version compatibility conversions
-@@ -1373,7 +1383,7 @@ static void cpg_leave_callback(struct cl
+@@ -1384,7 +1394,7 @@ static void cpg_leave_callback(struct cl
                               size_t member_list_entries)
  {
        unsigned i;
@@ -185,7 +189,7 @@
        uint32_t lowest = match->lowest_id;
        struct clog_request *rq, *n;
        struct checkpoint_data *p_cp, *c_cp;
-@@ -1384,10 +1394,9 @@ static void cpg_leave_callback(struct cl
+@@ -1395,10 +1405,9 @@ static void cpg_leave_callback(struct cl
        /* Am I leaving? */
        if (my_cluster_id == left->nodeid) {
                LOG_DBG("Finalizing leave...");
@@ -198,7 +202,7 @@
  
                cluster_postsuspend(match->name.value, match->luid);
  
-@@ -1515,11 +1524,13 @@ static void cpg_config_callback(cpg_hand
+@@ -1526,11 +1535,13 @@ static void cpg_config_callback(cpg_hand
        struct clog_cpg *match;
        int found = 0;
  
@@ -212,7 +216,7 @@
  
        if (!found) {
                LOG_ERROR("Unable to find match for CPG config callback");
-@@ -1536,6 +1547,16 @@ static void cpg_config_callback(cpg_hand
+@@ -1547,6 +1558,16 @@ static void cpg_config_callback(cpg_hand
        else
                cpg_leave_callback(match, left_list,
                                   member_list, member_list_entries);
@@ -229,7 +233,7 @@
  }
  
  cpg_callbacks_t cpg_callbacks = {
-@@ -1603,12 +1624,16 @@ int create_cluster_cpg(char *uuid, uint6
+@@ -1614,12 +1635,16 @@ int create_cluster_cpg(char *uuid, uint6
        size_t size;
        struct clog_cpg *new = NULL;
        struct clog_cpg *tmp;
@@ -246,7 +250,7 @@
  
        new = malloc(sizeof(*new));
        if (!new) {
-@@ -1650,13 +1675,16 @@ int create_cluster_cpg(char *uuid, uint6
+@@ -1661,13 +1686,16 @@ int create_cluster_cpg(char *uuid, uint6
        }
  
        new->cpg_state = VALID;
@@ -266,7 +270,7 @@
  
        return 0;
  }
-@@ -1725,9 +1753,11 @@ int destroy_cluster_cpg(char *uuid)
+@@ -1736,9 +1764,11 @@ int destroy_cluster_cpg(char *uuid)
  {
        struct clog_cpg *del, *tmp;
  
@@ -278,8 +282,10 @@
  
        return 0;
  }
---- a/daemons/cmirrord/functions.c
-+++ b/daemons/cmirrord/functions.c
+Index: LVM2.2.02.139/daemons/cmirrord/functions.c
+===================================================================
+--- LVM2.2.02.139.orig/daemons/cmirrord/functions.c
++++ LVM2.2.02.139/daemons/cmirrord/functions.c
 @@ -19,6 +19,7 @@
  #include <sys/stat.h>
  #include <time.h>
@@ -288,7 +294,7 @@
  
  #define BYTE_SHIFT 3
  
-@@ -105,6 +106,9 @@ struct recovery_request {
+@@ -106,6 +107,9 @@ struct recovery_request {
  static DM_LIST_INIT(log_list);
  static DM_LIST_INIT(log_pending_list);
  
@@ -298,7 +304,7 @@
  static int log_test_bit(dm_bitset_t bs, int bit)
  {
        return dm_bit(bs, bit) ? 1 : 0;
-@@ -151,11 +155,15 @@ static struct log_c *get_log(const char
+@@ -152,11 +156,15 @@ static struct log_c *get_log(const char
  {
        struct log_c *lc;
  
@@ -315,7 +321,7 @@
        return NULL;
  }
  
-@@ -171,10 +179,14 @@ static struct log_c *get_pending_log(con
+@@ -172,10 +180,14 @@ static struct log_c *get_pending_log(con
  {
        struct log_c *lc;
  
@@ -331,7 +337,7 @@
  
        return NULL;
  }
-@@ -519,7 +531,9 @@ static int _clog_ctr(char *uuid, uint64_
+@@ -520,7 +532,9 @@ static int _clog_ctr(char *uuid, uint64_
                LOG_DBG("Disk log ready");
        }
  
@@ -341,7 +347,7 @@
  
        return 0;
  fail:
-@@ -643,7 +657,10 @@ static int clog_dtr(struct dm_ulog_reque
+@@ -644,7 +658,10 @@ static int clog_dtr(struct dm_ulog_reque
  
        LOG_DBG("[%s] Cluster log removed", SHORT_UUID(lc->uuid));
  
@@ -352,7 +358,7 @@
        if (lc->disk_fd != -1 && close(lc->disk_fd))
                LOG_ERROR("Failed to close disk log: %s",
                          strerror(errno));
-@@ -715,8 +732,13 @@ int cluster_postsuspend(char *uuid, uint
+@@ -716,8 +733,13 @@ int cluster_postsuspend(char *uuid, uint
        lc->resume_override = 0;
  
        /* move log to pending list */
@@ -366,7 +372,7 @@
  
        return 0;
  }
-@@ -820,9 +842,9 @@ no_disk:
+@@ -821,9 +843,9 @@ no_disk:
        if (commit_log && (lc->disk_fd >= 0)) {
                rq->error = write_log(lc);
                if (rq->error)
@@ -378,7 +384,7 @@
                lc->touched = 0;
        }
  out:
-@@ -904,8 +926,13 @@ int local_resume(struct dm_ulog_request
+@@ -905,8 +927,13 @@ int local_resume(struct dm_ulog_request
                }
  
                /* move log to official list */
@@ -392,7 +398,7 @@
        }
  
        return 0;
-@@ -1928,7 +1955,6 @@ void log_debug(void)
+@@ -1929,7 +1956,6 @@ void log_debug(void)
  
        LOG_ERROR("");
        LOG_ERROR("LOG COMPONENT DEBUGGING::");
@@ -400,7 +406,7 @@
        LOG_ERROR("Pending log list:");
        dm_list_iterate_items(lc, &log_pending_list) {
                LOG_ERROR("%s", lc->uuid);
-@@ -1938,6 +1964,7 @@ void log_debug(void)
+@@ -1939,6 +1965,7 @@ void log_debug(void)
                print_bits(lc->clean_bits, 1);
        }
  
@@ -408,8 +414,10 @@
        dm_list_iterate_items(lc, &log_list) {
                LOG_ERROR("%s", lc->uuid);
                LOG_ERROR("  recoverer        : %" PRIu32, lc->recoverer);
---- a/daemons/cmirrord/local.c
-+++ b/daemons/cmirrord/local.c
+Index: LVM2.2.02.139/daemons/cmirrord/local.c
+===================================================================
+--- LVM2.2.02.139.orig/daemons/cmirrord/local.c
++++ LVM2.2.02.139/daemons/cmirrord/local.c
 @@ -29,13 +29,13 @@
  
  static int cn_fd = -1;  /* Connector (netlink) socket fd */
@@ -433,9 +441,11 @@
  
        memset(send_buf, 0, sizeof(send_buf));
  
---- a/lib/metadata/mirror.c
-+++ b/lib/metadata/mirror.c
-@@ -1946,10 +1946,6 @@ int add_mirror_log(struct cmd_context *c
+Index: LVM2.2.02.139/lib/metadata/mirror.c
+===================================================================
+--- LVM2.2.02.139.orig/lib/metadata/mirror.c
++++ LVM2.2.02.139/lib/metadata/mirror.c
+@@ -1973,10 +1973,6 @@ int add_mirror_log(struct cmd_context *c
        unsigned old_log_count;
        int r = 0;
  
@@ -446,7 +456,7 @@
  
        if (dm_list_size(&lv->segments) != 1) {
                log_error("Multiple-segment mirror is not supported");
-@@ -2113,26 +2109,6 @@ int lv_add_mirrors(struct cmd_context *c
+@@ -2140,26 +2136,6 @@ int lv_add_mirrors(struct cmd_context *c
                return 0;
        }
  
@@ -473,9 +483,11 @@
  
        /* For corelog mirror, activation code depends on
         * the global mirror_in_sync status. As we are adding
---- a/lib/mirror/mirrored.c
-+++ b/lib/mirror/mirrored.c
-@@ -361,12 +361,15 @@ static int _add_log(struct dm_pool *mem,
+Index: LVM2.2.02.139/lib/mirror/mirrored.c
+===================================================================
+--- LVM2.2.02.139.orig/lib/mirror/mirrored.c
++++ LVM2.2.02.139/lib/mirror/mirrored.c
+@@ -293,12 +293,15 @@ static int _add_log(struct dm_pool *mem,
                        return 0;
                }
        } else {
@@ -492,9 +504,11 @@
                log_flags |= DM_CORELOG;
        }
  
---- a/tools/lvconvert.c
-+++ b/tools/lvconvert.c
-@@ -1364,15 +1364,6 @@ static int _lvconvert_mirrors_parse_para
+Index: LVM2.2.02.139/tools/lvconvert.c
+===================================================================
+--- LVM2.2.02.139.orig/tools/lvconvert.c
++++ LVM2.2.02.139/tools/lvconvert.c
+@@ -1222,15 +1222,6 @@ static int _lvconvert_mirrors_parse_para
        *new_log_count = arg_int_value(cmd, mirrorlog_ARG,
                                       arg_is_set(cmd, corelog_ARG) ? 
MIRROR_LOG_CORE : DEFAULT_MIRRORLOG);
  
@@ -507,6 +521,6 @@
 -              return 0;
 -      }
 -
-       log_verbose("Setting logging type to %s", 
get_mirror_log_name(*new_log_count));
+       log_verbose("Setting logging type to %s", 
get_mirror_log_name(*new_log_count));
  
        /*

++++++ cmirrord_remove_date_time_from_compilation.patch ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -2,12 +2,12 @@
 
 Signed-off-by: Thomas Renninger <[email protected]>
 
-Index: LVM2.2.02.98/daemons/cmirrord/clogd.c
+Index: LVM2.2.02.139/daemons/cmirrord/clogd.c
 ===================================================================
---- LVM2.2.02.98.orig/daemons/cmirrord/clogd.c
-+++ LVM2.2.02.98/daemons/cmirrord/clogd.c
-@@ -42,7 +42,6 @@ int main(int argc __attribute__((unused)
-       kill(getppid(), SIGTERM);
+--- LVM2.2.02.139.orig/daemons/cmirrord/clogd.c
++++ LVM2.2.02.139/daemons/cmirrord/clogd.c
+@@ -78,7 +78,6 @@ int main(int argc, char *argv[])
+               kill(getppid(), SIGTERM);
  
        LOG_PRINT("Starting cmirrord:");
 -      LOG_PRINT(" Built: "__DATE__" "__TIME__"\n");

++++++ device-mapper-dmsetup-export.patch ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -1,33 +1,42 @@
-Index: LVM2.2.02.110/man/dmsetup.8.in
+Index: LVM2.2.02.139/man/dmsetup.8.in
 ===================================================================
---- LVM2.2.02.110.orig/man/dmsetup.8.in
-+++ LVM2.2.02.110/man/dmsetup.8.in
-@@ -45,6 +45,9 @@ dmsetup \(em low level logical volume ma
- .RI [ device_name ]
- .RE
- .br
-+.B dmsetup export
-+.I [device_name]
-+.br
- .B dmsetup load
- .I device_name
- .RB [ \-\-table
-@@ -309,6 +312,10 @@ device_name in subsequent dmsetup comman
- If successful a device will appear as
- /dev/mapper/<device-name>.
- See below for information on the table format.
-+.IP \fBexport
-+.I [device_name]
+--- LVM2.2.02.139.orig/man/dmsetup.8.in
++++ LVM2.2.02.139/man/dmsetup.8.in
+@@ -97,7 +97,15 @@ dmsetup \(em low level logical volume ma
+ ..
+ .CMD_LOAD
+ .
+-.HP
++. HP
++.B dmsetup
++.de CMD_EXPORT
++.  BR export
++.  RI [device_name]
++..
++.CMD_EXPORT
++.
++. HP
+ .B dmsetup
+ .de CMD_LS
+ .  ad l
+@@ -564,6 +572,12 @@ Specify a one-line table directly on the
+ See below for more information on the table format.
+ .
+ .HP
++.BR \-\-export
++.IR export
 +.br
 +Outputs information in key/value format to be imported by other programs.
++.
++.HP
+ .BR \-\-udevcookie
+ .IR cookie
  .br
- .TP
- .B deps
-Index: LVM2.2.02.110/tools/dmsetup.c
+Index: LVM2.2.02.139/tools/dmsetup.c
 ===================================================================
---- LVM2.2.02.110.orig/tools/dmsetup.c
-+++ LVM2.2.02.110/tools/dmsetup.c
-@@ -1733,6 +1733,129 @@ static int _status(CMD_ARGS)
+--- LVM2.2.02.139.orig/tools/dmsetup.c
++++ LVM2.2.02.139/tools/dmsetup.c
+@@ -2177,6 +2177,129 @@ out:
        return r;
  }
  
@@ -157,11 +166,11 @@
  /* Show target names and their version numbers */
  static int _targets(CMD_ARGS)
  {
-@@ -3086,6 +3209,7 @@ static struct command _commands[] = {
-       {"info", "[<device>]", 0, -1, 1, _info},
-       {"deps", "[-o options] [<device>]", 0, -1, 1, _deps},
-       {"status", "[<device>] [--noflush] [--target <target_type>]", 0, -1, 1, 
_status},
-+      {"export", "[<device>]", 0, -1, 1, _export},
-       {"table", "[<device>] [--target <target_type>] [--showkeys]", 0, -1, 1, 
_status},
-       {"wait", "<device> [<event_nr>] [--noflush]", 0, 2, 0, _wait},
-       {"mknodes", "[<device>]", 0, -1, 1, _mknodes},
+@@ -5138,6 +5261,7 @@ static struct command _dmsetup_commands[
+       {"deps", "[-o <options>] [<device>]", 0, -1, 1, 0, _deps},
+       {"stats", "<command> [<options>] [<devices>]", 1, -1, 1, 1, _stats},
+       {"status", "[<device>] [--noflush] [--target <target_type>]", 0, -1, 1, 
0, _status},
++      {"export", "[<device>]", 0, -1, 1, 0, _export},
+       {"table", "[<device>] [--target <target_type>] [--showkeys]", 0, -1, 1, 
0, _status},
+       {"wait", "<device> [<event_nr>] [--noflush]", 0, 2, 0, 0, _wait},
+       {"mknodes", "[<device>]", 0, -1, 1, 0, _mknodes},

++++++ device-mapper-gcc-warnings.patch ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -1,17 +1,17 @@
-Index: LVM2.2.02.109/libdm/datastruct/hash.c
+Index: LVM2.2.02.139/libdm/datastruct/hash.c
 ===================================================================
---- LVM2.2.02.109.orig/libdm/datastruct/hash.c
-+++ LVM2.2.02.109/libdm/datastruct/hash.c
-@@ -19,7 +19,7 @@ struct dm_hash_node {
-       struct dm_hash_node *next;
+--- LVM2.2.02.139.orig/libdm/datastruct/hash.c
++++ LVM2.2.02.139/libdm/datastruct/hash.c
+@@ -20,7 +20,7 @@ struct dm_hash_node {
        void *data;
+       unsigned data_len;
        unsigned keylen;
 -      char key[0];
 +      unsigned char key[0];
  };
  
  struct dm_hash_table {
-@@ -136,7 +136,7 @@ void dm_hash_destroy(struct dm_hash_tabl
+@@ -137,7 +137,7 @@ void dm_hash_destroy(struct dm_hash_tabl
  static struct dm_hash_node **_find(struct dm_hash_table *t, const void *key,
                                   uint32_t len)
  {
@@ -20,7 +20,7 @@
        struct dm_hash_node **c;
  
        for (c = &t->slots[h]; *c; c = &((*c)->next)) {
-@@ -235,7 +235,8 @@ void dm_hash_wipe(struct dm_hash_table *
+@@ -361,7 +361,8 @@ void dm_hash_wipe(struct dm_hash_table *
  char *dm_hash_get_key(struct dm_hash_table *t __attribute__((unused)),
                      struct dm_hash_node *n)
  {
@@ -30,11 +30,11 @@
  }
  
  void *dm_hash_get_data(struct dm_hash_table *t __attribute__((unused)),
-Index: LVM2.2.02.109/libdm/ioctl/libdm-iface.c
+Index: LVM2.2.02.139/libdm/ioctl/libdm-iface.c
 ===================================================================
---- LVM2.2.02.109.orig/libdm/ioctl/libdm-iface.c
-+++ LVM2.2.02.109/libdm/ioctl/libdm-iface.c
-@@ -1751,7 +1751,7 @@ static struct dm_ioctl *_do_dm_ioctl(str
+--- LVM2.2.02.139.orig/libdm/ioctl/libdm-iface.c
++++ LVM2.2.02.139/libdm/ioctl/libdm-iface.c
+@@ -1834,7 +1834,7 @@ static struct dm_ioctl *_do_dm_ioctl(str
                             dmt->secure_data ? "W " : "",
                             dmt->query_inactive_table ? "I " : "",
                             dmt->enable_checks ? "C" : "",
@@ -42,4 +42,4 @@
 +                           (unsigned long long int)dmt->sector, 
_sanitise_message(dmt->message),
                             dmi->data_size, retry_repeat_count);
  #ifdef DM_IOCTLS
-       if (ioctl(_control_fd, command, dmi) < 0 &&
+       r = ioctl(_control_fd, command, dmi);

++++++ display-dm-name-for-lv-name.diff ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -4,10 +4,12 @@
  lib/display/display.c        |   13 +++++++++----
  3 files changed, 13 insertions(+), 4 deletions(-)
 
---- a/lib/config/config_settings.h
-+++ b/lib/config/config_settings.h
-@@ -905,6 +905,9 @@ cfg_array(global_cache_check_options_CFG
- cfg_array(global_cache_repair_options_CFG, "cache_repair_options", 
global_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, "#S" 
DEFAULT_CACHE_REPAIR_OPTIONS, vsn(2, 2, 108), NULL, 0, NULL,
+Index: LVM2.2.02.139/lib/config/config_settings.h
+===================================================================
+--- LVM2.2.02.139.orig/lib/config/config_settings.h
++++ LVM2.2.02.139/lib/config/config_settings.h
+@@ -947,6 +947,9 @@ cfg_array(global_cache_check_options_CFG
+ cfg_array(global_cache_repair_options_CFG, "cache_repair_options", 
global_CFG_SECTION, CFG_ALLOW_EMPTY | CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, 
DEFAULT_CACHE_REPAIR_OPTIONS_CONFIG, vsn(2, 2, 108), NULL, 0, NULL,
        "List of options passed to the cache_repair command.\n")
  
 +cfg(global_display_dm_name_for_lv_name_CFG, "display_dm_name_for_lv_name", 
global_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, 
DEFAULT_DISPLAY_DM_NAME_FOR_LV_NAME, vsn(2, 2, 98), NULL, 0, NULL,
@@ -15,9 +17,11 @@
 +
  cfg(global_system_id_source_CFG, "system_id_source", global_CFG_SECTION, 0, 
CFG_TYPE_STRING, DEFAULT_SYSTEM_ID_SOURCE, vsn(2, 2, 117), NULL, 0, NULL,
        "The method LVM uses to set the local system ID.\n"
-       "Volume Groups can also be given a system ID (by\n"
---- a/lib/config/defaults.h
-+++ b/lib/config/defaults.h
+       "Volume Groups can also be given a system ID (by vgcreate, vgchange,\n"
+Index: LVM2.2.02.139/lib/config/defaults.h
+===================================================================
+--- LVM2.2.02.139.orig/lib/config/defaults.h
++++ LVM2.2.02.139/lib/config/defaults.h
 @@ -33,6 +33,7 @@
  #define DEFAULT_OBTAIN_DEVICE_LIST_FROM_UDEV 1
  #define DEFAULT_EXTERNAL_DEVICE_INFO_SOURCE "none"
@@ -26,9 +30,11 @@
  #define DEFAULT_MD_COMPONENT_DETECTION 1
  #define DEFAULT_FW_RAID_COMPONENT_DETECTION 0
  #define DEFAULT_MD_CHUNK_ALIGNMENT 1
---- a/lib/display/display.c
-+++ b/lib/display/display.c
-@@ -462,10 +462,15 @@ int lvdisplay_full(struct cmd_context *c
+Index: LVM2.2.02.139/lib/display/display.c
+===================================================================
+--- LVM2.2.02.139.orig/lib/display/display.c
++++ LVM2.2.02.139/lib/display/display.c
+@@ -371,10 +371,15 @@ int lvdisplay_full(struct cmd_context *c
                          lv->vg->cmd->dev_dir, lv->vg->name, lv->name);
        else if (lv_is_visible(lv)) {
                /* Thin pool does not have /dev/vg/name link */

++++++ improve-mirror-legs-on-different-tag-pvs.patch ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -16,9 +16,11 @@
  lib/metadata/lv_manip.c |   34 +++++++++++++++++++++++++++++++---
  1 file changed, 31 insertions(+), 3 deletions(-)
 
---- a/lib/metadata/lv_manip.c
-+++ b/lib/metadata/lv_manip.c
-@@ -2455,6 +2455,25 @@ static uint32_t _calc_required_extents(s
+Index: LVM2.2.02.139/lib/metadata/lv_manip.c
+===================================================================
+--- LVM2.2.02.139.orig/lib/metadata/lv_manip.c
++++ LVM2.2.02.139/lib/metadata/lv_manip.c
+@@ -2518,6 +2518,25 @@ static uint32_t _calc_required_extents(s
        return required;
  }
  
@@ -44,7 +46,7 @@
  static void _clear_areas(struct alloc_state *alloc_state)
  {
        uint32_t s;
-@@ -2580,6 +2599,7 @@ static int _find_some_parallel_space(str
+@@ -2646,6 +2665,7 @@ static int _find_some_parallel_space(str
        const struct alloc_parms *alloc_parms = alloc_state->alloc_parms;
        unsigned ix = 0;
        unsigned last_ix;
@@ -52,16 +54,16 @@
        struct pv_map *pvm;
        struct pv_area *pva;
        unsigned preferred_count = 0;
-@@ -2700,9 +2720,17 @@ static int _find_some_parallel_space(str
+@@ -2766,9 +2786,17 @@ static int _find_some_parallel_space(str
                                        continue;
  
                                case USE_AREA:
--                                      if(check_areas_separate_tags(ah, 
alloc_state, ix_offset,
--                                                                   ix + 
ix_offset, pva) >= 0)
+-                                      if(check_areas_separate_tags(ah, 
alloc_state, alloc_state->num_positional_areas,
+-                                                                   ix + 
alloc_state->num_positional_areas, pva) >= 0)
 -                                              goto next_pv;
 +                                      ret = check_areas_separate_tags(ah,
-+                                                      alloc_state, ix_offset,
-+                                                      ix + ix_offset, pva);
++                                                      alloc_state, 
alloc_state->num_positional_areas,
++                                                      ix + 
alloc_state->num_positional_areas, pva);
 +                                      if (ret >= 0) {
 +                                              _replace_required_area(ah,
 +                                                      max_to_allocate,

++++++ improve_probing.diff ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -1,10 +1,10 @@
-Index: LVM2.2.02.111/lib/filters/filter-type.c
+Index: LVM2.2.02.141/lib/filters/filter-type.c
 ===================================================================
---- LVM2.2.02.111.orig/lib/filters/filter-type.c
-+++ LVM2.2.02.111/lib/filters/filter-type.c
+--- LVM2.2.02.141.orig/lib/filters/filter-type.c
++++ LVM2.2.02.141/lib/filters/filter-type.c
 @@ -12,6 +12,11 @@
   * along with this program; if not, write to the Free Software Foundation,
-  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
 +#include <sys/ioctl.h>
 +#include <linux/fs.h>

++++++ lvm2-lvmetad.service-add-Also-lvm2-lvmetad.socket.patch ++++++
>From 4b846bba24f8458130fa951f9248a7540084f641 Mon Sep 17 00:00:00 2001
From: Liuhua Wang <[email protected]>
Date: Tue, 29 Dec 2015 15:15:27 +0800
Subject: [PATCH] lvm2-lvmetad.service add Also=lvm2-lvmetad.socket

In order to avoid lvm2-lvmetad.service being activated when package
updating due to `systemctl restart/try-restart .socket` results in
corresponding service being activeted, we removed lvm2-lvmetad.socket
from %preun and %postun(bsc#914415), which causes brokent lvm2-lvmetad
.socket symbolic link left when package being uninstalled.

Add 'Also=lvm2-lvmetad.socket' in '[Install]' section of lvm2-lvmetad.
service to remove lvm2-lvmetad.socket when disable lvm2-lvmetad.service.

References: bsc#960044
Signed-off-by: [email protected]
---
 scripts/lvm2_lvmetad_systemd_red_hat.service.in | 1 +
 1 file changed, 1 insertion(+)

diff --git a/scripts/lvm2_lvmetad_systemd_red_hat.service.in 
b/scripts/lvm2_lvmetad_systemd_red_hat.service.in
index 8f4c60d..1deca87 100644
--- a/scripts/lvm2_lvmetad_systemd_red_hat.service.in
+++ b/scripts/lvm2_lvmetad_systemd_red_hat.service.in
@@ -15,4 +15,5 @@ Restart=on-abort
 PIDFile=@LVMETAD_PIDFILE@
 
 [Install]
+Also=lvm2-lvmetad.socket
 WantedBy=sysinit.target
-- 
1.8.4.5

++++++ make-mirror-legs-on-different-tag-pvs.patch ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -25,10 +25,12 @@
  man/lvcreate.8.in            |    4 ++++
  5 files changed, 60 insertions(+)
 
---- a/conf/example.conf.in
-+++ b/conf/example.conf.in
+Index: LVM2.2.02.139/conf/example.conf.in
+===================================================================
+--- LVM2.2.02.139.orig/conf/example.conf.in
++++ LVM2.2.02.139/conf/example.conf.in
 @@ -359,6 +359,23 @@ allocation {
-       # option is used directly.
+       # or erased unless the --wipesignatures option is used directly.
        wipe_signatures_when_zeroing_new_lvs = 1
  
 +      # Set to 1 to guarantee that mirror leg will always be placed on
@@ -51,9 +53,11 @@
        # Configuration option allocation/mirror_logs_require_separate_pvs.
        # Mirror logs and images will always use different PVs.
        # The default setting changed in version 2.02.85.
---- a/lib/config/config_settings.h
-+++ b/lib/config/config_settings.h
-@@ -457,6 +457,9 @@ cfg(allocation_mirror_logs_require_separ
+Index: LVM2.2.02.139/lib/config/config_settings.h
+===================================================================
+--- LVM2.2.02.139.orig/lib/config/config_settings.h
++++ LVM2.2.02.139/lib/config/config_settings.h
+@@ -449,6 +449,9 @@ cfg(allocation_mirror_logs_require_separ
        "Mirror logs and images will always use different PVs.\n"
        "The default setting changed in version 2.02.85.\n")
  
@@ -63,9 +67,11 @@
  cfg(allocation_cache_pool_metadata_require_separate_pvs_CFG, 
"cache_pool_metadata_require_separate_pvs", allocation_CFG_SECTION, 0, 
CFG_TYPE_BOOL, DEFAULT_CACHE_POOL_METADATA_REQUIRE_SEPARATE_PVS, vsn(2, 2, 
106), NULL, 0, NULL,
        "Cache pool metadata and data will always use different PVs.\n")
  
---- a/lib/config/defaults.h
-+++ b/lib/config/defaults.h
-@@ -132,6 +132,7 @@
+Index: LVM2.2.02.139/lib/config/defaults.h
+===================================================================
+--- LVM2.2.02.139.orig/lib/config/defaults.h
++++ LVM2.2.02.139/lib/config/defaults.h
+@@ -144,6 +144,7 @@
  #define DEFAULT_MAX_LV 0
  #define DEFAULT_ALLOC_POLICY ALLOC_NORMAL
  #define DEFAULT_MIRROR_LOGS_REQUIRE_SEPARATE_PVS 0
@@ -73,9 +79,11 @@
  #define DEFAULT_MAXIMISE_CLING 1
  #define DEFAULT_CLUSTERED 0
  
---- a/lib/metadata/lv_manip.c
-+++ b/lib/metadata/lv_manip.c
-@@ -1447,6 +1447,9 @@ struct alloc_handle {
+Index: LVM2.2.02.139/lib/metadata/lv_manip.c
+===================================================================
+--- LVM2.2.02.139.orig/lib/metadata/lv_manip.c
++++ LVM2.2.02.139/lib/metadata/lv_manip.c
+@@ -1550,6 +1550,9 @@ struct alloc_handle {
  
        unsigned maximise_cling;
        unsigned mirror_logs_separate;  /* Force mirror logs on separate PVs? */
@@ -85,7 +93,7 @@
  
        /*
         * RAID devices require a metadata area that accompanies each
-@@ -2542,6 +2545,32 @@ static int _limit_to_one_area_per_tag(st
+@@ -2608,6 +2611,32 @@ static int _limit_to_one_area_per_tag(st
  }
  
  /*
@@ -118,18 +126,18 @@
   * Returns 1 regardless of whether any space was found, except on error.
   */
  static int _find_some_parallel_space(struct alloc_handle *ah,
-@@ -2671,6 +2700,10 @@ static int _find_some_parallel_space(str
+@@ -2737,6 +2766,10 @@ static int _find_some_parallel_space(str
                                        continue;
  
                                case USE_AREA:
-+                                      if(check_areas_separate_tags(ah, 
alloc_state, ix_offset,
-+                                                                   ix + 
ix_offset, pva) >= 0)
++                                      if(check_areas_separate_tags(ah, 
alloc_state, alloc_state->num_positional_areas,
++                                                                   ix + 
alloc_state->num_positional_areas, pva) >= 0)
 +                                              goto next_pv;
 +
                                        /*
                                         * Except with ALLOC_ANYWHERE, replace 
first area with this
                                         * one which is smaller but still big 
enough.
-@@ -3151,6 +3184,7 @@ static struct alloc_handle *_alloc_init(
+@@ -3220,6 +3253,7 @@ static struct alloc_handle *_alloc_init(
        ah->parity_count = parity_count;
        ah->region_size = region_size;
        ah->alloc = alloc;
@@ -137,7 +145,7 @@
  
        /*
         * For the purposes of allocation, area_count and parity_count are
-@@ -3162,6 +3196,7 @@ static struct alloc_handle *_alloc_init(
+@@ -3231,6 +3265,7 @@ static struct alloc_handle *_alloc_init(
        ah->area_multiple = _calc_area_multiple(segtype, area_count + 
parity_count, stripes);
        //FIXME: s/mirror_logs_separate/metadata_separate/ so it can be used by 
others?
        ah->mirror_logs_separate = find_config_tree_bool(cmd, 
allocation_mirror_logs_require_separate_pvs_CFG, NULL);
@@ -145,9 +153,11 @@
  
        if (mirrors || stripes)
                total_extents = new_extents;
---- a/man/lvcreate.8.in
-+++ b/man/lvcreate.8.in
-@@ -333,6 +333,10 @@ Using \fIcore\fP means the mirror is reg
+Index: LVM2.2.02.139/man/lvcreate.8.in
+===================================================================
+--- LVM2.2.02.139.orig/man/lvcreate.8.in
++++ LVM2.2.02.139/man/lvcreate.8.in
+@@ -404,6 +404,10 @@ Using \fBcore\fP means the mirror is reg
  from the first device each time the logical volume is activated,
  like after every reboot.
  .br
@@ -155,6 +165,6 @@
 +same tag, see details(mirror_legs_require_separate_pvs) in lvm.conf.
 +
 +.br
- Using \fImirrored\fP will create a persistent log that is itself mirrored.
- .TP
- .BR \-\-monitor " {" \fIy | \fIn }
+ Using \fBmirrored\fP will create a persistent log that is itself mirrored.
+ .
+ .HP

++++++ no-inc-audit.diff ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -1,7 +1,7 @@
-Index: LVM2.2.02.111/lib/device/dev-io.c
+Index: LVM2.2.02.141/lib/device/dev-io.c
 ===================================================================
---- LVM2.2.02.111.orig/lib/device/dev-io.c
-+++ LVM2.2.02.111/lib/device/dev-io.c
+--- LVM2.2.02.141.orig/lib/device/dev-io.c
++++ LVM2.2.02.141/lib/device/dev-io.c
 @@ -30,6 +30,7 @@
  #  define u64 uint64_t                /* Missing without __KERNEL__ */
  #  undef WNOHANG              /* Avoid redefinition */
@@ -10,12 +10,12 @@
  #  include <linux/fs.h>               /* For block ioctl definitions */
  #  define BLKSIZE_SHIFT SECTOR_SHIFT
  #  ifndef BLKGETSIZE64                /* fs.h out-of-date */
-Index: LVM2.2.02.111/lib/filters/filter-type.c
+Index: LVM2.2.02.141/lib/filters/filter-type.c
 ===================================================================
---- LVM2.2.02.111.orig/lib/filters/filter-type.c
-+++ LVM2.2.02.111/lib/filters/filter-type.c
+--- LVM2.2.02.141.orig/lib/filters/filter-type.c
++++ LVM2.2.02.141/lib/filters/filter-type.c
 @@ -13,6 +13,7 @@
-  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  #include <sys/ioctl.h>
 +#define _LINUX_AUDIT_H_

++++++ use-mirrortype-asdefault-whenclvmdrunning.patch ++++++
--- /var/tmp/diff_new_pack.WOGKNg/_old  2016-02-03 10:17:39.000000000 +0100
+++ /var/tmp/diff_new_pack.WOGKNg/_new  2016-02-03 10:17:39.000000000 +0100
@@ -2,9 +2,11 @@
  tools/lvcreate.c |   28 ++++++++++++++++++++++++++--
  1 file changed, 26 insertions(+), 2 deletions(-)
 
---- a/tools/lvcreate.c
-+++ b/tools/lvcreate.c
-@@ -834,6 +834,28 @@ static int _read_activation_params(struc
+Index: LVM2.2.02.139/tools/lvcreate.c
+===================================================================
+--- LVM2.2.02.139.orig/tools/lvcreate.c
++++ LVM2.2.02.139/tools/lvcreate.c
+@@ -639,6 +639,28 @@ static int _read_activation_params(struc
        return 1;
  }
  
@@ -33,12 +35,12 @@
  static int _lvcreate_params(struct cmd_context *cmd,
                            int argc, char **argv,
                            struct lvcreate_params *lp,
-@@ -860,6 +882,8 @@ static int _lvcreate_params(struct lvcre
+@@ -689,6 +711,8 @@ static int _lvcreate_params(struct cmd_c
                mirror_default_cfg = (arg_uint_value(cmd, stripes_ARG, 1) > 1)
                        ? global_raid10_segtype_default_CFG : 
global_mirror_segtype_default_CFG;
                segtype_str = find_config_tree_str(cmd, mirror_default_cfg, 
NULL);
 +              if(clvmd_daemon_is_running())
 +                      segtype_str = "mirror";
        } else
-               segtype_str = "striped";
+               segtype_str = SEG_TYPE_NAME_STRIPED;
  


Reply via email to