[linux-lvm] Re: [patch] oops with snapshot / 2.4.29

Marcelo Tosatti marcelo.tosatti at cyclades.com
Thu Mar 31 12:23:46 UTC 2005


On Wed, Mar 30, 2005 at 03:56:19PM -0800, dean gaudet wrote:
> having looked at the oops below and studied the code a bit more i think 
> that the safest thing to do for 2.4.x to fix this race condition is to get 
> rid of the unsafe promote-to-front hash list traversal.  i considered 
> other fixes (such as a separate spinlock for just the hash list, or a 
> small array of them to give some amount of concurrency) ... but in the 
> interests of stability the following patch seems the most appropriate.
> 
> besides... nobody has responded to my mail, so perhaps proposing this 
> patch to marcelo will cause folks to wake up and object :)
> 
> -dean
> 
> Signed-off-by: dean gaudet <dean at arctic.org>
> 
> --- linux-2.4.29/drivers/md/lvm-snap.c.orig	2005-03-25 22:03:43.000000000 -0800
> +++ linux-2.4.29/drivers/md/lvm-snap.c	2005-03-30 01:46:17.000000000 -0800
> @@ -119,7 +119,6 @@ static inline lv_block_exception_t *lvm_
>  	unsigned long mask = lv->lv_snapshot_hash_mask;
>  	int chunk_size = lv->lv_chunk_size;
>  	lv_block_exception_t *ret;
> -	int i = 0;
>  
>  	hash_table =
>  	    &hash_table[hashfn(org_dev, org_start, mask, chunk_size)];
> @@ -132,15 +131,9 @@ static inline lv_block_exception_t *lvm_
>  		exception = list_entry(next, lv_block_exception_t, hash);
>  		if (exception->rsector_org == org_start &&
>  		    exception->rdev_org == org_dev) {
> -			if (i) {
> -				/* fun, isn't it? :) */
> -				list_del(next);
> -				list_add(next, hash_table);
> -			}
>  			ret = exception;
>  			break;
>  		}
> -		i++;
>  	}
>  	return ret;
>  }

Hi dean, 

The hash table write is not performed anymore (ie your suggestion is already in).

D 1.15 05/01/26 13:01:33-02:00 mauelshagen at redhat.com[marcelo] 16 15 0/7/750
P drivers/md/lvm-snap.c
C fix panics while backing up LVM snapshots


===== lvm-snap.c 1.14 vs 1.15 =====
--- 1.14/drivers/md/lvm-snap.c	2004-03-13 02:25:25 -03:00
+++ 1.15/drivers/md/lvm-snap.c	2005-01-26 13:01:33 -02:00
@@ -119,7 +119,6 @@
 	unsigned long mask = lv->lv_snapshot_hash_mask;
 	int chunk_size = lv->lv_chunk_size;
 	lv_block_exception_t *ret;
-	int i = 0;
 
 	hash_table =
 	    &hash_table[hashfn(org_dev, org_start, mask, chunk_size)];
@@ -132,15 +131,9 @@
 		exception = list_entry(next, lv_block_exception_t, hash);
 		if (exception->rsector_org == org_start &&
 		    exception->rdev_org == org_dev) {
-			if (i) {
-				/* fun, isn't it? :) */
-				list_del(next);
-				list_add(next, hash_table);
-			}
 			ret = exception;
 			break;
 		}
-		i++;
 	}
 	return ret;
 }




More information about the linux-lvm mailing list