public inbox for lvm2-cvs@sourceware.org help / color / mirror / Atom feed
From: mbroz@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2 ./WHATS_NEW lib/metadata/metadata.c Date: Fri, 10 Apr 2009 09:56:00 -0000 [thread overview] Message-ID: <20090410095601.18446.qmail@sourceware.org> (raw) CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: mbroz@sourceware.org 2009-04-10 09:56:00 Modified files: . : WHATS_NEW lib/metadata : metadata.c Log message: Properly copy the whole pv structure for later use. The all_pvs list, used in vg_read, should make its own private copy of pv structures, otherwise (when vg will use its own pool) it will point to released memory pool. The same applies for get_pvs() call. Patch adds pv_list copy helper and adds explicit memory pool parameter into _copy_pv. (Please note that all these helper functions cannot guarantee that vg related fields are valid - proper vg read & lock must be used if it is requested.) Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.1083&r2=1.1084 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.208&r2=1.209 --- LVM2/WHATS_NEW 2009/04/10 09:54:36 1.1083 +++ LVM2/WHATS_NEW 2009/04/10 09:56:00 1.1084 @@ -1,5 +1,6 @@ Version 2.02.46 - ================================ + Use copy of PV structure when manipulating with global PV lists. Always return exit error status when locking of volume group fails. Fix mirror log convert validation question. Avoid referencing files from DESTDIR during build process. --- LVM2/lib/metadata/metadata.c 2009/04/02 15:01:11 1.208 +++ LVM2/lib/metadata/metadata.c 2009/04/10 09:56:00 1.209 @@ -198,11 +198,10 @@ return 1; } -static int _copy_pv(struct physical_volume *pv_to, +static int _copy_pv(struct dm_pool *pvmem, + struct physical_volume *pv_to, struct physical_volume *pv_from) { - struct dm_pool *pvmem = pv_from->fmt->cmd->mem; - memcpy(pv_to, pv_from, sizeof(*pv_to)); if (!(pv_to->vg_name = dm_pool_strdup(pvmem, pv_from->vg_name))) @@ -217,6 +216,25 @@ return 1; } +static struct pv_list *_copy_pvl(struct dm_pool *pvmem, struct pv_list *pvl_from) +{ + struct pv_list *pvl_to = NULL; + + if (!(pvl_to = dm_pool_zalloc(pvmem, sizeof(*pvl_to)))) + return_NULL; + + if (!(pvl_to->pv = dm_pool_alloc(pvmem, sizeof(*pvl_to->pv)))) + goto_bad; + + if(!_copy_pv(pvmem, pvl_to->pv, pvl_from->pv)) + goto_bad; + + return pvl_to; +bad: + dm_pool_free(pvmem, pvl_to); + return NULL; +} + int get_pv_from_vg_by_id(const struct format_type *fmt, const char *vg_name, const char *vgid, const char *pvid, struct physical_volume *pv) @@ -237,7 +255,7 @@ dm_list_iterate_items(pvl, &vg->pvs) { if (id_equal(&pvl->pv->id, (const struct id *) pvid)) { - if (!_copy_pv(pv, pvl->pv)) { + if (!_copy_pv(fmt->cmd->mem, pv, pvl->pv)) { log_error("internal PV duplication failed"); return_0; } @@ -1669,7 +1687,7 @@ return vg; } -static int _update_pv_list(struct dm_list *all_pvs, struct volume_group *vg) +static int _update_pv_list(struct dm_pool *pvmem, struct dm_list *all_pvs, struct volume_group *vg) { struct pv_list *pvl, *pvl2; @@ -1678,13 +1696,15 @@ if (pvl->pv->dev == pvl2->pv->dev) goto next_pv; } - /* PV is not on list so add it. Note that we don't copy it. */ - if (!(pvl2 = dm_pool_zalloc(vg->cmd->mem, sizeof(*pvl2)))) { + + /* + * PV is not on list so add it. + */ + if (!(pvl2 = _copy_pvl(pvmem, pvl))) { log_error("pv_list allocation for '%s' failed", pv_dev_name(pvl->pv)); return 0; } - pvl2->pv = pvl->pv; dm_list_add(all_pvs, &pvl2->list); next_pv: ; @@ -1899,7 +1919,7 @@ } if (!correct_vg) { correct_vg = vg; - if (!_update_pv_list(&all_pvs, correct_vg)) + if (!_update_pv_list(cmd->mem, &all_pvs, correct_vg)) return_NULL; continue; } @@ -1913,7 +1933,7 @@ /* FIXME Also ensure contents same - checksums same? */ if (correct_vg->seqno != vg->seqno) { inconsistent = 1; - if (!_update_pv_list(&all_pvs, vg)) + if (!_update_pv_list(cmd->mem, &all_pvs, vg)) return_NULL; if (vg->seqno > correct_vg->seqno) correct_vg = vg; @@ -2203,7 +2223,7 @@ struct str_list *strl; struct dm_list * uninitialized_var(results); const char *vgname, *vgid; - struct dm_list *pvh, *tmp; + struct pv_list *pvl, *pvl_copy; struct dm_list *vgids; struct volume_group *vg; int consistent = 0; @@ -2249,8 +2269,13 @@ /* Move PVs onto results list */ if (pvslist) - dm_list_iterate_safe(pvh, tmp, &vg->pvs) - dm_list_add(results, pvh); + dm_list_iterate_items(pvl, &vg->pvs) { + if (!(pvl_copy = _copy_pvl(cmd->mem, pvl))) { + log_error("PV list allocation failed"); + return 0; + } + dm_list_add(results, &pvl_copy->list); + } } init_pvmove(old_pvmove);
next reply other threads:[~2009-04-10 9:56 UTC|newest] Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top 2009-04-10 9:56 mbroz [this message] -- strict thread matches above, loose matches on Subject: below -- 2012-03-12 14:18 zkabelac 2012-02-23 0:11 agk 2012-02-13 11:01 zkabelac 2012-02-13 10:58 zkabelac 2012-02-13 10:51 zkabelac 2011-11-18 19:28 zkabelac 2011-10-24 10:24 zkabelac 2011-08-11 16:31 prajnoha 2011-08-04 15:18 zkabelac 2011-03-29 21:57 zkabelac 2011-03-11 15:06 prajnoha 2011-03-10 13:12 zkabelac 2010-12-08 10:45 zkabelac 2010-11-29 11:08 zkabelac 2010-08-19 23:03 mbroz 2010-06-22 21:10 mbroz 2010-05-21 12:45 zkabelac 2010-04-01 11:43 agk 2010-03-02 21:56 snitzer 2010-01-21 21:09 wysochanski 2010-01-05 16:01 mbroz 2009-12-18 12:45 mbroz 2009-12-18 12:44 mbroz 2009-12-11 13:14 zkabelac 2009-12-09 19:29 mbroz 2009-08-20 7:03 mbroz 2009-07-16 3:25 wysochanski 2009-05-27 13:19 agk 2009-05-12 19:09 mbroz 2009-04-22 9:31 mbroz 2009-01-26 22:43 agk 2008-09-25 15:59 mbroz 2008-06-03 17:56 agk 2008-05-08 18:06 agk 2008-04-07 22:12 agk 2008-04-04 15:41 wysochanski 2007-10-12 18:37 wysochanski 2007-07-02 21:48 wysochanski 2006-09-21 20:25 agk 2006-08-09 19:33 agk 2006-07-04 19:36 agk
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20090410095601.18446.qmail@sourceware.org \ --to=mbroz@sourceware.org \ --cc=lvm-devel@redhat.com \ --cc=lvm2-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).