All of lore.kernel.org
 help / color / mirror / Atom feed
From: agk@sourceware.org <agk@sourceware.org>
To: lvm-devel@redhat.com
Subject: LVM2 ./WHATS_NEW lib/metadata/lv_manip.c
Date: 30 May 2009 00:09:28 -0000	[thread overview]
Message-ID: <20090530000928.27226.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	agk at sourceware.org	2009-05-30 00:09:27

Modified files:
	.              : WHATS_NEW 
	lib/metadata   : lv_manip.c 

Log message:
	Handle multi-extent mirror log allocation when smallest PV has only 1 extent.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.1133&r2=1.1134
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/lv_manip.c.diff?cvsroot=lvm2&r1=1.177&r2=1.178

--- LVM2/WHATS_NEW	2009/05/29 18:34:10	1.1133
+++ LVM2/WHATS_NEW	2009/05/30 00:09:27	1.1134
@@ -1,6 +1,7 @@
 Version 2.02.48 - 
 ===============================
-  Fix rpmlint in clvmd initscript
+  Handle multi-extent mirror log allocation when smallest PV has only 1 extent.
+  Add LSB standard headers and functions (incl. reload) to clvmd initscript.
   When creating new LV, double-check that name is not already in use.
   Remove /dev/vgname/lvname symlink automatically if LV is no longer visible.
   Rename internal vorigin LV to match visible LV.
--- LVM2/lib/metadata/lv_manip.c	2009/05/28 01:59:37	1.177
+++ LVM2/lib/metadata/lv_manip.c	2009/05/30 00:09:27	1.178
@@ -728,7 +728,8 @@
  */
 static int _alloc_parallel_area(struct alloc_handle *ah, uint32_t needed,
 				struct pv_area **areas,
-				uint32_t *ix, struct pv_area *log_area)
+				uint32_t *ix, struct pv_area *log_area,
+				uint32_t log_len)
 {
 	uint32_t area_len, remaining;
 	uint32_t s;
@@ -763,9 +764,7 @@
 	if (log_area) {
 		ah->log_area.pv = log_area->map->pv;
 		ah->log_area.pe = log_area->start;
-		ah->log_area.len = mirror_log_extents(ah->log_region_size,
-						      pv_pe_size(log_area->map->pv),
-						      area_len);
+		ah->log_area.len = log_len;
 		consume_pv_area(log_area, ah->log_area.len);
 	}
 
@@ -990,11 +989,15 @@
 	unsigned contiguous = 0, cling = 0, preferred_count = 0;
 	unsigned ix;
 	unsigned ix_offset = 0;	/* Offset for non-preferred allocations */
+	unsigned too_small_for_log_count; /* How many too small for log? */
 	uint32_t max_parallel;	/* Maximum extents to allocate */
 	uint32_t next_le;
 	struct seg_pvs *spvs;
 	struct dm_list *parallel_pvs;
 	uint32_t free_pes;
+	uint32_t log_len;
+	struct pv_area *log_area;
+	unsigned log_needs_allocating;
 
 	/* Is there enough total space? */
 	free_pes = pv_maps_size(pvms);
@@ -1121,25 +1124,49 @@
 		if ((contiguous || cling) && (preferred_count < ix_offset))
 			break;
 
-		/* Only allocate log_area the first time around */
-		if (ix + ix_offset < ah->area_count +
-			    ((ah->log_count && !ah->log_area.len) ?
-				ah->log_count : 0))
-			/* FIXME With ALLOC_ANYWHERE, need to split areas */
-			break;
-
 		/* sort the areas so we allocate from the biggest */
 		if (ix > 1)
 			qsort(areas + ix_offset, ix, sizeof(*areas),
 			      _comp_area);
 
-		/* First time around, use smallest area as log_area */
-		/* FIXME decide which PV to use at top of function instead */
-		if (!_alloc_parallel_area(ah, max_parallel, areas,
-					  allocated,
-					  (ah->log_count && !ah->log_area.len) ?
-						*(areas + ix_offset + ix - 1) :
-						NULL))
+		/*
+		 * First time around, if there's a log, allocate it on the
+		 * smallest device that has space for it.
+		 *
+		 * FIXME decide which PV to use at top of function instead
+		 */
+
+		log_needs_allocating = (ah->log_count && !ah->log_area.len) ?
+				       1 : 0;
+
+		too_small_for_log_count = 0;
+
+		if (!log_needs_allocating) {
+			log_len = 0;
+			log_area = NULL;
+		} else {
+			log_len = mirror_log_extents(ah->log_region_size,
+			    pv_pe_size((*areas)->map->pv),
+			    (max_parallel - *allocated) / ah->area_multiple);
+
+			/* How many areas are too small for the log? */
+			while (too_small_for_log_count < ix_offset + ix &&
+			       (*(areas + ix_offset + ix - 1 -
+				  too_small_for_log_count))->count < log_len)
+				too_small_for_log_count++;
+
+			log_area = *(areas + ix_offset + ix - 1 -
+				     too_small_for_log_count);
+		}
+
+		if (ix + ix_offset < ah->area_count +
+		    (log_needs_allocating ? ah->log_count +
+					    too_small_for_log_count : 0))
+			/* FIXME With ALLOC_ANYWHERE, need to split areas */
+			break;
+
+		if (!_alloc_parallel_area(ah, max_parallel, areas, allocated,
+					  log_area, log_len))
 			return_0;
 
 	} while (!contiguous && *allocated != needed && can_split);



             reply	other threads:[~2009-05-30  0:09 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-30  0:09 agk [this message]
  -- strict thread matches above, loose matches on Subject: below --
2012-05-11 22:19 LVM2 ./WHATS_NEW lib/metadata/lv_manip.c agk
2012-05-11 18:59 agk
2012-05-09 12:12 zkabelac
2012-03-05 14:12 zkabelac
2012-02-29 22:08 zkabelac
2012-02-22 17:14 jbrassow
2012-02-09 15:13 prajnoha
2012-02-08 13:02 zkabelac
2012-01-20 22:04 snitzer
2011-11-15 17:32 zkabelac
2011-11-15 17:28 zkabelac
2011-10-28 20:23 zkabelac
2011-10-28 20:17 zkabelac
2011-09-14 14:20 mbroz
2011-09-13 18:43 jbrassow
2011-06-29 17:05 agk
2011-04-07 21:49 jbrassow
2011-02-27  1:16 agk
2011-01-28  2:58 snitzer
2010-12-20 14:38 zkabelac
2010-12-01 12:56 zkabelac
2010-03-29 17:59 agk
2010-03-25 18:16 agk
2010-03-23 15:07 agk
2010-01-12 20:53 agk
2010-01-05 15:58 mbroz
2009-05-28  1:59 agk
2009-05-28  0:29 agk
2008-12-19 15:26 mbroz
2008-10-23 11:21 agk
2008-10-17 10:57 agk
2008-09-29  9:59 mbroz
2008-02-22 13:22 agk
2007-01-05 15:53 mbroz
2006-12-12 19:30 agk
2006-10-30 16:10 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=20090530000928.27226.qmail@sourceware.org \
    --to=agk@sourceware.org \
    --cc=lvm-devel@redhat.com \
    /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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.