Hello community, here is the log from the commit of package makedumpfile checked in at Fri Mar 28 16:58:25 CET 2008. -------- --- makedumpfile/makedumpfile.changes 2008-02-07 10:04:45.000000000 +0100 +++ /mounts/work_src_done/STABLE/makedumpfile/makedumpfile.changes 2008-03-28 11:15:36.000000000 +0100 @@ -1,0 +2,10 @@ +Fri Mar 28 11:15:07 CET 2008 - bwalle@suse.de + +- update to 1.2.5 + o follow the changes of page flags. + To follow the changes of page flags in linux kernel, a new + makedumpfile can get these values from the vmcoreinfo data. + o Code Cleanup + o fix error return values of vtop(). + +------------------------------------------------------------------- Old: ---- makedumpfile-1.2.4.tar.bz2 New: ---- makedumpfile-1.2.5.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ makedumpfile.spec ++++++ --- /var/tmp/diff_new_pack.rJH862/_old 2008-03-28 16:58:06.000000000 +0100 +++ /var/tmp/diff_new_pack.rJH862/_new 2008-03-28 16:58:06.000000000 +0100 @@ -1,5 +1,5 @@ # -# spec file for package makedumpfile (Version 1.2.4) +# spec file for package makedumpfile (Version 1.2.5) # # Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. # This file and all modifications and additions to the pristine @@ -10,11 +10,12 @@ # norootforbuild + Name: makedumpfile BuildRequires: gcc-c++ libdw-devel libdw1 libelf-devel libelf0 libelf1 zlib-devel %define elfutils_version 0.124 License: GPL v2 or later -Version: 1.2.4 +Version: 1.2.5 Release: 1 Summary: Partial kernel dump Group: System/Kernel @@ -61,6 +62,13 @@ /bin/* %changelog +* Fri Mar 28 2008 bwalle@suse.de +- update to 1.2.5 + o follow the changes of page flags. + To follow the changes of page flags in linux kernel, a new + makedumpfile can get these values from the vmcoreinfo data. + o Code Cleanup + o fix error return values of vtop(). * Thu Feb 07 2008 bwalle@suse.de - update to 1.2.4 o Add linux-2.6.24 support. ++++++ makedumpfile-1.2.4.tar.bz2 -> makedumpfile-1.2.5.tar.bz2 ++++++ diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/makedumpfile/ia64.c new/makedumpfile/ia64.c --- old/makedumpfile/ia64.c 2008-02-07 04:05:22.000000000 +0100 +++ new/makedumpfile/ia64.c 2008-03-28 03:32:51.000000000 +0100 @@ -92,15 +92,15 @@ /* * Translate a virtual address to a physical address by using 3 levels paging. */ -unsigned long -vtop3_ia64(unsigned long long vaddr) +unsigned long long +vtop3_ia64(unsigned long vaddr) { - unsigned long paddr, temp, page_dir, pgd_pte, page_middle, pmd_pte; - unsigned long page_table, pte; + unsigned long long paddr, temp, page_dir, pgd_pte, page_middle, pmd_pte; + unsigned long long page_table, pte; if (SYMBOL(swapper_pg_dir) == NOT_FOUND_SYMBOL) { ERRMSG("Can't get the symbol of swapper_pg_dir.\n"); - return 0x0; + return NOT_PADDR; } /* @@ -110,8 +110,8 @@ temp = temp >> (PGDIR_SHIFT_3L - 3); page_dir = SYMBOL(swapper_pg_dir) + temp; if (!readmem(VADDR, page_dir, &pgd_pte, sizeof pgd_pte)) { - ERRMSG("Can't get pgd_pte (page_dir:%lx).\n", page_dir); - return 0x0; + ERRMSG("Can't get pgd_pte (page_dir:%llx).\n", page_dir); + return NOT_PADDR; } /* @@ -121,8 +121,8 @@ temp = temp >> (PMD_SHIFT - 3); page_middle = pgd_pte + temp; if (!readmem(PADDR, page_middle, &pmd_pte, sizeof pmd_pte)) { - ERRMSG("Can't get pmd_pte (page_middle:%lx).\n", page_middle); - return 0x0; + ERRMSG("Can't get pmd_pte (page_middle:%llx).\n", page_middle); + return NOT_PADDR; } /* @@ -132,8 +132,8 @@ temp = temp >> (PAGESHIFT() - 3); page_table = pmd_pte + temp; if (!readmem(PADDR, page_table, &pte, sizeof pte)) { - ERRMSG("Can't get pte (page_table:%lx).\n", page_table); - return 0x0; + ERRMSG("Can't get pte (page_table:%llx).\n", page_table); + return NOT_PADDR; } /* @@ -148,15 +148,15 @@ /* * Translate a virtual address to a physical address by using 4 levels paging. */ -unsigned long -vtop4_ia64(unsigned long long vaddr) +unsigned long long +vtop4_ia64(unsigned long vaddr) { - unsigned long paddr, temp, page_dir, pgd_pte, page_upper, pud_pte; - unsigned long page_middle, pmd_pte, page_table, pte; + unsigned long long paddr, temp, page_dir, pgd_pte, page_upper, pud_pte; + unsigned long long page_middle, pmd_pte, page_table, pte; if (SYMBOL(swapper_pg_dir) == NOT_FOUND_SYMBOL) { ERRMSG("Can't get the symbol of swapper_pg_dir.\n"); - return 0x0; + return NOT_PADDR; } /* @@ -166,8 +166,8 @@ temp = temp >> (PGDIR_SHIFT_4L - 3); page_dir = SYMBOL(swapper_pg_dir) + temp; if (!readmem(VADDR, page_dir, &pgd_pte, sizeof pgd_pte)) { - ERRMSG("Can't get pgd_pte (page_dir:%lx).\n", page_dir); - return 0x0; + ERRMSG("Can't get pgd_pte (page_dir:%llx).\n", page_dir); + return NOT_PADDR; } /* @@ -177,8 +177,8 @@ temp = temp >> (PUD_SHIFT - 3); page_upper = pgd_pte + temp; if (!readmem(PADDR, page_upper, &pud_pte, sizeof pud_pte)) { - ERRMSG("Can't get pud_pte (page_upper:%lx).\n", page_upper); - return 0x0; + ERRMSG("Can't get pud_pte (page_upper:%llx).\n", page_upper); + return NOT_PADDR; } /* @@ -188,8 +188,8 @@ temp = temp >> (PMD_SHIFT - 3); page_middle = pud_pte + temp; if (!readmem(PADDR, page_middle, &pmd_pte, sizeof pmd_pte)) { - ERRMSG("Can't get pmd_pte (page_middle:%lx).\n", page_middle); - return 0x0; + ERRMSG("Can't get pmd_pte (page_middle:%llx).\n", page_middle); + return NOT_PADDR; } /* @@ -199,8 +199,8 @@ temp = temp >> (PAGESHIFT() - 3); page_table = pmd_pte + temp; if (!readmem(PADDR, page_table, &pte, sizeof pte)) { - ERRMSG("Can't get pte (page_table:%lx).\n", page_table); - return 0x0; + ERRMSG("Can't get pte (page_table:%llx).\n", page_table); + return NOT_PADDR; } /* @@ -212,17 +212,17 @@ return paddr; } -unsigned long -vtop_ia64(unsigned long long vaddr) +unsigned long long +vtop_ia64(unsigned long vaddr) { - unsigned long paddr; + unsigned long long paddr; if (VADDR_REGION(vaddr) != KERNEL_VMALLOC_REGION) { - ERRMSG("vaddr(%llx) is not KERNEL_VMALLOC_REGION.\n", vaddr); - return 0x0; + ERRMSG("vaddr(%lx) is not KERNEL_VMALLOC_REGION.\n", vaddr); + return NOT_PADDR; } paddr = vaddr_to_paddr(vaddr); - if (paddr) + if (paddr != NOT_PADDR) return paddr; if (!is_vmalloc_addr_ia64(vaddr)) { @@ -241,9 +241,9 @@ * Translate a virtual address to a file offset. */ off_t -vaddr_to_offset_ia64(unsigned long long vaddr) +vaddr_to_offset_ia64(unsigned long vaddr) { - unsigned long paddr; + unsigned long long paddr; switch (VADDR_REGION(vaddr)) { case KERNEL_CACHED_REGION: @@ -262,6 +262,11 @@ ERRMSG("Unknown region (%ld)\n", VADDR_REGION(vaddr)); return 0x0; } + if (paddr == NOT_PADDR) { + ERRMSG("Can't convert a virtual address(%lx) to offset.\n", + vaddr); + return 0x0; + } return paddr_to_offset(paddr); } @@ -274,37 +279,39 @@ unsigned long long addr, dirp, entry; if (!is_xen_vaddr(kvaddr)) - return 0; + return NOT_PADDR; if (is_direct(kvaddr)) return (unsigned long)kvaddr - DIRECTMAP_VIRT_START; if (!is_frame_table_vaddr(kvaddr)) - return 0; + return NOT_PADDR; addr = kvaddr - VIRT_FRAME_TABLE_ADDR; dirp = SYMBOL(frametable_pg_dir) - DIRECTMAP_VIRT_START; dirp += ((addr >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return FALSE; + return NOT_PADDR; dirp = entry & _PFN_MASK; if (!dirp) - return 0; + return NOT_PADDR; + dirp += ((addr >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return FALSE; + return NOT_PADDR; dirp = entry & _PFN_MASK; if (!dirp) - return 0; + return NOT_PADDR; + dirp += ((addr >> PAGESHIFT()) & (PTRS_PER_PTE - 1)) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return FALSE; + return NOT_PADDR; if (!(entry & _PAGE_P)) - return 0; + return NOT_PADDR; entry = (entry & _PFN_MASK) + (addr & ((1UL << PAGESHIFT()) - 1)); diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/makedumpfile/makedumpfile.8 new/makedumpfile/makedumpfile.8 --- old/makedumpfile/makedumpfile.8 2008-02-07 04:05:22.000000000 +0100 +++ new/makedumpfile/makedumpfile.8 2008-03-28 03:32:51.000000000 +0100 @@ -1,4 +1,4 @@ -.TH MAKEDUMPFILE 8 "February 2008" "makedumpfile v1.2.4" "Linux System Administrator's Manual" +.TH MAKEDUMPFILE 8 "March 2008" "makedumpfile v1.2.5" "Linux System Administrator's Manual" .SH NAME makedumpfile \- make a small dumpfile of kdump .SH SYNOPSIS diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/makedumpfile/makedumpfile.c new/makedumpfile/makedumpfile.c --- old/makedumpfile/makedumpfile.c 2008-02-07 04:05:22.000000000 +0100 +++ new/makedumpfile/makedumpfile.c 2008-03-28 03:32:51.000000000 +0100 @@ -77,10 +77,10 @@ vaddr_to_paddr(unsigned long long vaddr) { int i; - unsigned long long paddr; + unsigned long long paddr = NOT_PADDR; struct pt_load_segment *pls; - for (i = paddr = 0; i < info->num_load_memory; i++) { + for (i = 0; i < info->num_load_memory; i++) { pls = &info->pt_load_segments[i]; if ((vaddr >= pls->virt_start) && (vaddr < pls->virt_end)) { @@ -1883,6 +1883,10 @@ ENUM_NUMBER_INIT(NR_FREE_PAGES, "NR_FREE_PAGES"); ENUM_NUMBER_INIT(N_ONLINE, "N_ONLINE"); + ENUM_NUMBER_INIT(PG_lru, "PG_lru"); + ENUM_NUMBER_INIT(PG_private, "PG_private"); + ENUM_NUMBER_INIT(PG_swapcache, "PG_swapcache"); + TYPEDEF_SIZE_INIT(nodemask_t, "nodemask_t"); return TRUE; @@ -1897,6 +1901,18 @@ } int +get_value_for_old_linux() +{ + if (NUMBER(PG_lru) == NOT_FOUND_NUMBER) + NUMBER(PG_lru) = PG_lru_ORIGINAL; + if (NUMBER(PG_private) == NOT_FOUND_NUMBER) + NUMBER(PG_private) = PG_private_ORIGINAL; + if (NUMBER(PG_swapcache) == NOT_FOUND_NUMBER) + NUMBER(PG_swapcache) = PG_swapcache_ORIGINAL; + return TRUE; +} + +int get_str_osrelease_from_vmlinux() { struct utsname system_utsname; @@ -2108,6 +2124,10 @@ WRITE_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES); WRITE_NUMBER("N_ONLINE", N_ONLINE); + WRITE_NUMBER("PG_lru", PG_lru); + WRITE_NUMBER("PG_private", PG_private); + WRITE_NUMBER("PG_swapcache", PG_swapcache); + /* * write the source file of 1st kernel */ @@ -2324,6 +2344,10 @@ READ_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES); READ_NUMBER("N_ONLINE", N_ONLINE); + READ_NUMBER("PG_lru", PG_lru); + READ_NUMBER("PG_private", PG_private); + READ_NUMBER("PG_swapcache", PG_swapcache); + READ_SRCFILE("pud_t", pud_t); return TRUE; @@ -3249,6 +3273,8 @@ return FALSE; unlink(info->name_vmcoreinfo); } + if (!get_value_for_old_linux()) + return FALSE; out: if (info->dump_level <= DL_EXCLUDE_ZERO) { if (!get_mem_map_without_mm()) @@ -4104,7 +4130,7 @@ if (!write_cache_bufsz(&bm2)) goto out; - if (info->flag_exclude_free) + if (info->dump_level & DL_EXCLUDE_FREE) if (!exclude_free_page(&bm2)) goto out; @@ -5868,6 +5894,47 @@ REPORT_MSG("\n"); } +int +create_dumpfile() +{ + if (!open_files_for_creating_dumpfile()) + return FALSE; + + if (!initial()) + return FALSE; + + if (!create_dump_bitmap()) + return FALSE; + + if (info->flag_flatten) { + if (!write_start_flat_header()) + return FALSE; + } + if (info->flag_elf_dumpfile) { + if (!write_elf_header()) + return FALSE; + if (!write_elf_pages()) + return FALSE; + } else { + if (!write_kdump_header()) + return FALSE; + if (!write_kdump_pages()) + return FALSE; + if (!write_kdump_bitmap()) + return FALSE; + } + if (info->flag_flatten) { + if (!write_end_flat_header()) + return FALSE; + } + + if (!close_files_for_creating_dumpfile()) + return FALSE; + + print_report(); + + return TRUE; +} static struct option longopts[] = { {"xen-syms", required_argument, NULL, 'X'}, @@ -5909,8 +5976,6 @@ break; case 'd': info->dump_level = atoi(optarg); - if (info->dump_level & DL_EXCLUDE_FREE) - info->flag_exclude_free = 1; break; case 'E': info->flag_elf_dumpfile = 1; @@ -6096,42 +6161,9 @@ MSG("\n"); MSG("The dumpfile is saved to %s.\n", info->name_dumpfile); } else { - if (!open_files_for_creating_dumpfile()) - goto out; - - if (!initial()) - goto out; - - if (!create_dump_bitmap()) + if (!create_dumpfile()) goto out; - if (info->flag_flatten) { - if (!write_start_flat_header()) - goto out; - } - if (info->flag_elf_dumpfile) { - if (!write_elf_header()) - goto out; - if (!write_elf_pages()) - goto out; - } else { - if (!write_kdump_header()) - goto out; - if (!write_kdump_pages()) - goto out; - if (!write_kdump_bitmap()) - goto out; - } - if (info->flag_flatten) { - if (!write_end_flat_header()) - goto out; - } - - if (!close_files_for_creating_dumpfile()) - goto out; - - print_report(); - MSG("\n"); MSG("The dumpfile is saved to %s.\n", info->name_dumpfile); } diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/makedumpfile/makedumpfile.h new/makedumpfile/makedumpfile.h --- old/makedumpfile/makedumpfile.h 2008-02-07 04:05:22.000000000 +0100 +++ new/makedumpfile/makedumpfile.h 2008-03-28 03:32:51.000000000 +0100 @@ -54,10 +54,12 @@ /* * Page flags + * + * TODO: _ORIGINAL should be changed to _2_6_XX. */ -#define PG_lru (5) -#define PG_private (11) /* Has something at ->private */ -#define PG_swapcache (15) /* Swap page: swp_entry_t in private */ +#define PG_lru_ORIGINAL (5) +#define PG_private_ORIGINAL (11) /* Has something at ->private */ +#define PG_swapcache_ORIGINAL (15) /* Swap page: swp_entry_t in private */ #define PAGE_MAPPING_ANON (1) @@ -91,9 +93,9 @@ return ((mask & addr) != 0); } -#define isLRU(flags) test_bit(PG_lru, flags) -#define isPrivate(flags) test_bit(PG_private, flags) -#define isSwapCache(flags) test_bit(PG_swapcache, flags) +#define isLRU(flags) test_bit(NUMBER(PG_lru), flags) +#define isPrivate(flags) test_bit(NUMBER(PG_private), flags) +#define isSwapCache(flags) test_bit(NUMBER(PG_swapcache), flags) static inline int isAnon(unsigned long mapping) @@ -689,7 +691,6 @@ int flag_vmlinux; /* flag of vmlinux */ int flag_generate_vmcoreinfo;/* flag of generating vmcoreinfo file */ int flag_read_vmcoreinfo; /* flag of reading vmcoreinfo file */ - int flag_exclude_free; /* flag of excluding free page */ int flag_show_usage; /* flag of showing usage */ int flag_show_version; /* flag of showing version */ int flag_flatten; /* flag of outputting flattened @@ -919,6 +920,13 @@ struct number_table { long NR_FREE_PAGES; long N_ONLINE; + + /* + * Page flags + */ + long PG_lru; + long PG_private; + long PG_swapcache; }; #define LEN_SRCFILE (100) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/makedumpfile/Makefile new/makedumpfile/Makefile --- old/makedumpfile/Makefile 2008-02-07 04:05:22.000000000 +0100 +++ new/makedumpfile/Makefile 2008-03-28 03:32:51.000000000 +0100 @@ -1,7 +1,7 @@ # makedumpfile -VERSION=1.2.4 -DATE=7 February 2008 +VERSION=1.2.5 +DATE=28 March 2008 CC = gcc CFLAGS = -g -O2 -Wall -D_FILE_OFFSET_BITS=64 \ diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/makedumpfile/README new/makedumpfile/README --- old/makedumpfile/README 2008-02-07 04:05:22.000000000 +0100 +++ new/makedumpfile/README 2008-03-28 03:32:51.000000000 +0100 @@ -39,7 +39,7 @@ # make; make install * SUPPORTED KERNELS - makedumpfile (version 1.2.4) supports the following kernels. + makedumpfile (version 1.2.5) supports the following kernels. | FLATMEM | DISCONTIGMEM | SPARSEMEM |-------------------+-------------------+------------------- diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/makedumpfile/x86_64.c new/makedumpfile/x86_64.c --- old/makedumpfile/x86_64.c 2008-02-07 04:05:22.000000000 +0100 +++ new/makedumpfile/x86_64.c 2008-03-28 03:32:51.000000000 +0100 @@ -188,32 +188,36 @@ unsigned long long dirp, entry; if (!is_xen_vaddr(kvaddr)) - return 0; + return NOT_PADDR; if (is_direct(kvaddr)) return (unsigned long)kvaddr - DIRECTMAP_VIRT_START; - dirp = kvtop_xen_x86_64(SYMBOL(pgd_l4)); + if ((dirp = kvtop_xen_x86_64(SYMBOL(pgd_l4))) == NOT_PADDR) + return NOT_PADDR; dirp += pml4_index(kvaddr) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return 0; + return NOT_PADDR; if (!(entry & _PAGE_PRESENT)) - return 0; + return NOT_PADDR; + dirp = entry & ENTRY_MASK; dirp += pgd_index(kvaddr) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return 0; + return NOT_PADDR; if (!(entry & _PAGE_PRESENT)) - return 0; + return NOT_PADDR; + dirp = entry & ENTRY_MASK; dirp += pmd_index(kvaddr) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return 0; + return NOT_PADDR; if (!(entry & _PAGE_PRESENT)) - return 0; + return NOT_PADDR; + if (entry & _PAGE_PSE) { entry = (entry & ENTRY_MASK) + (kvaddr & ((1UL << PMD_SHIFT) - 1)); return entry; @@ -221,10 +225,10 @@ dirp = entry & ENTRY_MASK; dirp += pte_index(kvaddr) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return 0; + return NOT_PADDR; if (!(entry & _PAGE_PRESENT)) { - return 0; + return NOT_PADDR; } entry = (entry & ENTRY_MASK) + (kvaddr & ((1UL << PTE_SHIFT) - 1)); diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/makedumpfile/x86.c new/makedumpfile/x86.c --- old/makedumpfile/x86.c 2008-02-07 04:05:22.000000000 +0100 +++ new/makedumpfile/x86.c 2008-03-28 03:32:51.000000000 +0100 @@ -49,25 +49,28 @@ unsigned long long dirp, entry; if (!is_xen_vaddr(kvaddr)) - return 0; + return NOT_PADDR; if (is_direct(kvaddr)) return (unsigned long)kvaddr - DIRECTMAP_VIRT_START; - dirp = kvtop_xen_x86(SYMBOL(pgd_l3)); + if ((dirp = kvtop_xen_x86(SYMBOL(pgd_l3))) == NOT_PADDR) + return NOT_PADDR; dirp += ((kvaddr >> PGDIR_SHIFT_3LEVEL) & (PTRS_PER_PGD_3LEVEL - 1)) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return 0; + return NOT_PADDR; if (!(entry & _PAGE_PRESENT)) - return 0; + return NOT_PADDR; + dirp = entry & ENTRY_MASK; dirp += ((kvaddr >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return 0; + return NOT_PADDR; if (!(entry & _PAGE_PRESENT)) - return 0; + return NOT_PADDR; + if (entry & _PAGE_PSE) { entry = (entry & ENTRY_MASK) + (kvaddr & ((1UL << PMD_SHIFT) - 1)); return entry; @@ -75,10 +78,10 @@ dirp = entry & ENTRY_MASK; dirp += ((kvaddr >> PTE_SHIFT) & (PTRS_PER_PTE - 1)) * sizeof(unsigned long long); if (!readmem(PADDR, dirp, &entry, sizeof(entry))) - return 0; + return NOT_PADDR; if (!(entry & _PAGE_PRESENT)) { - return 0; + return NOT_PADDR; } entry = (entry & ENTRY_MASK) + (kvaddr & ((1UL << PTE_SHIFT) - 1)); ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org