All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Heinz J . Mauelshagen" <mauelshagen@sistina.com>
To: linux-lvm@sistina.com
Subject: Re: [linux-lvm] Redhat patches to LVM-1.0.3 tools
Date: Wed Mar  6 04:17:01 2002	[thread overview]
Message-ID: <20020306111442.F21935@sistina.com> (raw)
In-Reply-To: <20020305082545.GC30667@colombina.comedia.it>; from bluca@comedia.it on Tue, Mar 05, 2002 at 09:25:46AM +0100

Luca,

I heard about it yesterday.

TTBOMK none of the RedHat folks came back to us directly or on any LVM list :-(

They definitely should feed back the code changes to us or give
pointers, where to retrieve them.

Regards,
Heinz    -- The LVM Guy --


On Tue, Mar 05, 2002 at 09:25:46AM +0100, Luca Berra wrote:
> hello i took a peek to redhat rawhide lvm 1.0.3 patches
> and i found something interesting:
> 
> there is a patch for a new version of the pvmove call, which is
> probably accompained by a kernel patch, which i did not search
> for.
> 
> i don't recall seeing anything like this on the list, but maybe
> i just missed it.
> anyone here has any details about this?
> 
> regards,
> L.
> 
> 
> -- 
> Luca Berra -- bluca@comedia.it
>         Communication Media & Services S.r.l.
>  /"\
>  \ /     ASCII RIBBON CAMPAIGN
>   X        AGAINST HTML MAIL
>  / \

> --- LVM/1.0.3/kernel/lvm.h.~1~	Tue Feb 19 16:23:56 2002
> +++ LVM/1.0.3/kernel/lvm.h	Wed Feb 20 17:52:51 2002
> @@ -352,6 +352,7 @@
>  
>  /* physical extent */
>  #define	PE_LOCK_UNLOCK          _IOW ( 0xfe, 0x50, 1)
> +#define	PE_LOCKED_COPY          _IOW ( 0xfe, 0x51, 1)
>  
>  /* i/o protocol version */
>  #define	LVM_GET_IOP_VERSION     _IOR ( 0xfe, 0x98, 1)
> @@ -709,6 +710,16 @@
>  } pe_lock_req_t;
>  
>  
> +/* Request structure PE_COPY */
> +typedef struct {
> +	char lv_name[NAME_LEN];
> +	kdev_t old_dev;
> +	kdev_t new_dev;
> +	uint32_t old_pe;
> +	uint32_t new_pe;
> +} pe_copy_req_t;
> +
> +
>  /* Request structure LV_STATUS_BYNAME */
>  typedef struct {
>  	char lv_name[NAME_LEN];
> --- LVM/1.0.3/tools/lib/liblvm.h.~1~	Wed Feb 20 17:52:21 2002
> +++ LVM/1.0.3/tools/lib/liblvm.h	Wed Feb 20 17:53:53 2002
> @@ -329,6 +329,7 @@
>  int    pv_write_pe ( char*, pv_t *);
>  int    pv_write_with_pe ( char*, pv_t *);
>  int    pv_check_partitioned_whole(char *pv_name);
> +int    pv_locked_copy_pe( vg_t *, char *, kdev_t, kdev_t, uint, uint);
>  
>  /* LV functions */
>  char   *lv_change_vgname ( char *, char *);
> @@ -816,7 +817,8 @@
>  #define LVM_EVG_WRITE_WRITE                                                 404
>  #define LVM_ELV_PV_CREATE_NAME_FROM_KDEV_T                                  405
>  #define LVM_EPV_FLUSH_STAT                                                  406
> -#define LVM_MAX_ERROR							    407
> +#define LVM_EPV_LOCKED_COPY_EINVAL					    407
> +#define LVM_MAX_ERROR							    408
>  
>  
>  /*
> --- LVM/1.0.3/tools/lib/pv_move.c.~1~	Mon Feb 18 16:37:18 2002
> +++ LVM/1.0.3/tools/lib/pv_move.c	Wed Feb 20 18:03:33 2002
> @@ -347,11 +347,16 @@
>  
>  
>  /* perform the move of a physical extent */
> +/* Dynamically choose between the old and new version of the pvmove
> +   mechanism.  The old-style code performs the buffer copy, locking and
> +   remap in separate operations, and copies the chunks in user space.
> +   The new version uses a single kernel ioctl to do it all, but that
> +   (obviously) relies on having an updated kernel. */
>  int pv_move_pe ( vg_t *vg, char *buffer, size_t buffer_size,
> -                 long src_pv_index, long dst_pv_index,
> -                 long pe_source,    long pe_dest,
> -                 int opt_v, int opt_t,
> -                 int act_pe, int off_pe) {
> +		 long src_pv_index, long dst_pv_index,
> +		 long pe_source,    long pe_dest,
> +		 int opt_v, int opt_t,
> +		 int act_pe, int off_pe) {
>     int in = -1;
>     int out = -1;
>     int l = 0;
> @@ -362,7 +367,10 @@
>     char *lv_name_this = NULL;
>     size_t size = 0;
>     le_remap_req_t le_remap_req;
> -
> +   /* Record whether we are definitely using old- or new-style pvmove, or
> +      whether we don't know which yet. */
> +   static int old_style = 0, new_style = 0;
> +   
>     debug_enter ( "pv_move_pe -- CALLED\n");
>  
>     if ( src_pv_index < 0 || src_pv_index >= vg->pv_cur ||
> @@ -375,11 +383,13 @@
>        goto pv_move_pe_end;
>     }
>  
> -   if ( ( in = open ( vg->pv[src_pv_index]->pv_name, O_RDONLY)) == -1) {
> -      fprintf ( stderr, "%s -- couldn't open input physical volume %s\n",
> -                cmd, vg->pv[src_pv_index]->pv_name);
> -      ret = -LVM_EPV_MOVE_PE_OPEN_IN;
> -      goto pv_move_pe_end;
> +   if ( !new_style ) {
> +      if ( ( in = open ( vg->pv[src_pv_index]->pv_name, O_RDONLY)) == -1) {
> +	 fprintf ( stderr, "%s -- couldn't open input physical volume %s\n",
> +		   cmd, vg->pv[src_pv_index]->pv_name);
> +	 ret = -LVM_EPV_MOVE_PE_OPEN_IN;
> +	 goto pv_move_pe_end;
> +      }
>     }
>     
>     /* is this LV not allready on destination PV?
> @@ -447,43 +457,45 @@
>                 le_remap_req.new_pe);
>     }
>  
> -   if ( opt_v > 1) printf ( "%s -- opening output physical volume \"%s\"\n",
> -                            cmd, vg->pv[dst_pv_index]->pv_name);
> -   if ( ( out = open ( vg->pv[dst_pv_index]->pv_name,
> -                       O_WRONLY)) == -1) {
> -      fprintf ( stderr, "%s -- couldn't open output "
> -                        "physical volume \"%s\"\n",
> -                cmd, vg->pv[dst_pv_index]->pv_name);
> -      ret = -LVM_EPV_MOVE_PE_OPEN;
> -      goto pv_move_pe_end;
> -   }
> -
> -   if ( opt_v > 1) printf ( "%s -- llseeking input physical volume \"%s\"\n",
> -                            cmd, vg->pv[src_pv_index]->pv_name);
> -   offset = ( loff_t) le_remap_req.old_pe * SECTOR_SIZE;
> -   if ( ( result = _llseek ( in, offset, SEEK_SET)) == -1) {
> -      fprintf ( stderr, "%s -- couldn't llseek to sector %u on input "
> -                        "physical volume \"%s\"\n",
> -                cmd,
> -                le_remap_req.old_pe,
> -                vg->pv[src_pv_index]->pv_name);
> -      ret = -LVM_EPV_MOVE_PE_LLSEEK_IN;
> -      goto pv_move_pe_end;
> -   }
> -
> -   if ( opt_v > 1) printf ( "%s -- llseeking output physical volume \"%s\"\n",
> -                            cmd, vg->pv[dst_pv_index]->pv_name);
> -   offset = ( loff_t) le_remap_req.new_pe * SECTOR_SIZE;
> -   if ( ( result = llseek ( out, offset, SEEK_SET)) == -1) {
> -      fprintf ( stderr, "%s -- couldn't llseek to sector %u on output "
> -                        "physical volume \"%s\"\n",
> -                cmd,
> -                le_remap_req.new_pe,
> -                vg->pv[dst_pv_index]->pv_name);
> -      ret = -LVM_EPV_MOVE_PE_LLSEEK_OUT;
> -      goto pv_move_pe_end;
> +   if ( !new_style ) {
> +      if ( opt_v > 1) printf ( "%s -- opening output physical volume \"%s\"\n",
> +			       cmd, vg->pv[dst_pv_index]->pv_name);
> +      if ( ( out = open ( vg->pv[dst_pv_index]->pv_name,
> +			  O_WRONLY)) == -1) {
> +	 fprintf ( stderr, "%s -- couldn't open output "
> +			   "physical volume \"%s\"\n",
> +		   cmd, vg->pv[dst_pv_index]->pv_name);
> +	 ret = -LVM_EPV_MOVE_PE_OPEN;
> +	 goto pv_move_pe_end;
> +      }
> +
> +      if ( opt_v > 1) printf ( "%s -- llseeking input physical volume \"%s\"\n",
> +			       cmd, vg->pv[src_pv_index]->pv_name);
> +      offset = ( loff_t) le_remap_req.old_pe * SECTOR_SIZE;
> +      if ( ( result = llseek ( in, offset, SEEK_SET)) == -1) {
> +	 fprintf ( stderr, "%s -- couldn't llseek to sector %u on input "
> +			   "physical volume \"%s\"\n",
> +		   cmd,
> +		   le_remap_req.old_pe,
> +		   vg->pv[src_pv_index]->pv_name);
> +	 ret = -LVM_EPV_MOVE_PE_LLSEEK_IN;
> +	 goto pv_move_pe_end;
> +      }
> +
> +      if ( opt_v > 1) printf ( "%s -- llseeking output physical volume \"%s\"\n",
> +			       cmd, vg->pv[dst_pv_index]->pv_name);
> +      offset = ( loff_t) le_remap_req.new_pe * SECTOR_SIZE;
> +      if ( ( result = llseek ( out, offset, SEEK_SET)) == -1) {
> +	 fprintf ( stderr, "%s -- couldn't llseek to sector %u on output "
> +			   "physical volume \"%s\"\n",
> +		   cmd,
> +		   le_remap_req.new_pe,
> +		   vg->pv[dst_pv_index]->pv_name);
> +	 ret = -LVM_EPV_MOVE_PE_LLSEEK_OUT;
> +	 goto pv_move_pe_end;
> +      }
>     }
> -
> +   
>     if ( opt_v > 0)
>         printf ( "%s -- %s [PE %lu [%s [LE %d]] -> %s [PE %lu] [%d/%d]\n",
>                  cmd,
> @@ -498,6 +510,55 @@
>                  act_pe,
>                  off_pe);
>  
> +   /* Setup done, now comes crunch time.  Will the new-style
> +    * PV_LOCKED_COPY ioctl work? */
> +
> +   if ( !old_style ) {
> +      if ( opt_v > 1) printf ( "%s -- copying extent from %s::%s(0x%04x):%d "
> +			       "to %s(0x%04x):%d on disk\n", 
> +			       cmd, vg->pv[src_pv_index]->pv_name,
> +			       lv_name_this,
> +			       le_remap_req.old_dev, le_remap_req.old_pe,
> +			       vg->pv[dst_pv_index]->pv_name, 
> +			       le_remap_req.new_dev, le_remap_req.new_pe);
> +      if ( opt_t != 0 )
> +         /* Special case --- if we end up in this path, we skip the 
> +	  * new-style copy but we also want to bypass the fallback 
> +	  * into the old-style copy, too. */
> +	 goto done_new_pv_move;
> +      if ( ( ret = pv_locked_copy_pe(vg, lv_name_this,
> +				     le_remap_req.old_dev, 
> +				     le_remap_req.new_dev,
> +				     le_remap_req.old_pe, 
> +				     le_remap_req.new_pe) ) == 0 ) {
> +	 /* New style works --- next time we enter this function, we can
> +	  * skip all the setup for old-style copy. */
> +	 new_style = 1;
> +	 goto done_new_pv_move;
> +      }
> +      
> +      fprintf ( stderr, "%s -- ERROR \"%s\" copying extent "
> +		"from \"%s\"\n\n",
> +		cmd, lvm_error ( ret),
> +		vg->pv[src_pv_index]->pv_name);
> +
> +      /* If this is the first time we've tried new-style, and we
> +       * got an EINVAL back from the kernel, assume the ioctl
> +       * doesn't exist and try old-style pvmove instead. */
> +      if ( ret == -LVM_EPV_LOCKED_COPY_EINVAL && !old_style ) {
> +	  if ( opt_v > 1)
> +		printf ( "%s -- -EINVAL using PE_LOCKED_COPY, "
> +			 "falling back to old style pv_move "
> +			 "on \"%s\"\n",
> +			 cmd, vg->vg_name);
> +	  old_style = 1;
> +      } else
> +	  goto pv_move_pe_end;
> +   }
> +
> +   /* We failed.  <sniff>  OK, time to fall back to the old, buggy,
> +    * data-corrupting, deadlock-prone pvmove version. */
> +
>     /* lock extent in kernel */
>     if ( opt_v > 1) printf ( "%s -- locking physical extent %lu "
>                              "of \"%s\" in kernel\n",
> @@ -592,6 +653,8 @@
>        }
>     }
>  
> +done_new_pv_move:
> +
>     if ( opt_v > 1) printf ( "%s -- changing source \"%s\" in VGDA "
>                              "of kernel\n",
>                              cmd, vg->pv[src_pv_index]->pv_name);
> @@ -654,7 +717,7 @@
>  
>     debug_leave ( "pv_move_pe -- LEAVING with ret: %d\n", ret);
>     return ret;
> -} /* pv_move_pe() */
> +} /* pv_move_pe_old() */
>  
>  
>  void pv_move_interrupt ( int sig) {
> @@ -761,3 +824,46 @@
>     else
>        return 0;
>  }
> +
> +
> +int pv_locked_copy_pe( vg_t *vg, char *lv_name, 
> +		       kdev_t old_dev, kdev_t new_dev,
> +		       uint old_pe, uint new_pe) 
> +{
> +	pe_copy_req_t pe_copy_req;
> +	int group = -1;
> +	int ret;
> +	char group_file[NAME_LEN];
> +	
> +	debug_enter ( "pv_locked_copy_pe -- CALLED\n");
> +
> +	sprintf ( group_file, LVM_DIR_PREFIX "%s/group%c", vg->vg_name, 0);
> +	
> +	if ( ( group = open ( group_file, O_RDONLY)) == -1) {
> +		ret = -LVM_EPE_LOCK; /* FIX THIS ERR CODE */
> +		goto out;
> +	}
> +
> +	strcpy (pe_copy_req.lv_name, lv_name);
> +	pe_copy_req.old_dev = old_dev;
> +	pe_copy_req.new_dev = new_dev;
> +	pe_copy_req.old_pe = old_pe;
> +	pe_copy_req.new_pe = new_pe;
> +	
> +	printf("%s::%s: %04x %d, %04x %d\n", 
> +	       group_file, pe_copy_req.lv_name,
> +	       pe_copy_req.old_dev, pe_copy_req.old_pe,
> +	       pe_copy_req.new_dev, pe_copy_req.new_pe);
> +
> +	ret = ioctl(group, PE_LOCKED_COPY, &pe_copy_req);
> +	if (ret < 0)
> +		ret = -errno;
> +	if (ret == -EINVAL)
> +		ret = -LVM_EPV_LOCKED_COPY_EINVAL;
> +	
> +	close(group);
> +out:
> +	debug_leave ( "pv_locked_copy_pe -- LEAVING with ret: %d\n", ret);
> +	return ret;
> +}
> +
> --- LVM/1.0.3/tools/lib/pv_write.c.~1~	Wed Feb  6 14:17:47 2002
> +++ LVM/1.0.3/tools/lib/pv_write.c	Wed Feb 20 17:52:51 2002
> @@ -60,7 +60,7 @@
>  
>        /* convert core to disk data */
>        pv_disk = pv_copy_to_disk ( pv);
> -      if ( ( pv_handle = open ( pv_name, O_WRONLY)) == -1)
> +      if ( ( pv_handle = open ( pv_name, O_WRONLY, O_SYNC)) == -1)
>           ret = -LVM_EPV_WRITE_OPEN;
>        else if ( lseek ( pv_handle, pv->pv_on_disk.base, SEEK_SET) !=
>                  pv->pv_on_disk.base) ret = -LVM_EPV_WRITE_LSEEK;
> @@ -91,7 +91,6 @@
>        free ( pv_disk);
>     
>        if ( pv_handle != -1) {
> -         fsync ( pv_handle);
>           close ( pv_handle);
>        }
>     }
> --- LVM/1.0.3/tools/lib/pv_write_pe.c.~1~	Fri Jun 22 10:09:12 2001
> +++ LVM/1.0.3/tools/lib/pv_write_pe.c	Wed Feb 20 17:52:51 2002
> @@ -54,7 +54,7 @@
>        size = pv->pe_total * sizeof ( pe_disk_t);
>        if ( size + pv->pe_on_disk.base > LVM_VGDA_SIZE ( pv))
>           ret = -LVM_EPV_WRITE_PE_SIZE;;
> -      if ( ( pv_handle = open ( pv_name, O_WRONLY)) == -1)
> +      if ( ( pv_handle = open ( pv_name, O_WRONLY | O_SYNC)) == -1)
>           ret = -LVM_EPV_WRITE_PE_OPEN;
>        else if ( lseek ( pv_handle,  pv->pe_on_disk.base, SEEK_SET) !=
>                   pv->pe_on_disk.base)
> @@ -67,7 +67,6 @@
>        }
>     
>        if ( pv_handle != -1) {
> -         fsync ( pv_handle);
>           close ( pv_handle);
>        }
>     }

*** Software bugs are stupid.
    Nevertheless it needs not so stupid people to solve them ***

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Heinz Mauelshagen                                 Sistina Software Inc.
Senior Consultant/Developer                       Am Sonnenhang 11
                                                  56242 Marienrachdorf
                                                  Germany
Mauelshagen@Sistina.com                           +49 2626 141200
                                                       FAX 924446
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  reply	other threads:[~2002-03-06  4:17 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-03-05  2:25 [linux-lvm] Redhat patches to LVM-1.0.3 tools Luca Berra
2002-03-06  4:17 ` Heinz J . Mauelshagen [this message]
2002-03-06 15:41   ` Stephen C. Tweedie

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=20020306111442.F21935@sistina.com \
    --to=mauelshagen@sistina.com \
    --cc=linux-lvm@sistina.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.