diff options
Diffstat (limited to 'drivers/md/bitmap.c')
| -rw-r--r-- | drivers/md/bitmap.c | 13 | 
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 47c68bc75a1..56df1cee8fb 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -1097,14 +1097,12 @@ void bitmap_daemon_work(struct bitmap *bitmap)  	}  	bitmap->allclean = 1; +	spin_lock_irqsave(&bitmap->lock, flags);  	for (j = 0; j < bitmap->chunks; j++) {  		bitmap_counter_t *bmc; -		spin_lock_irqsave(&bitmap->lock, flags); -		if (!bitmap->filemap) { +		if (!bitmap->filemap)  			/* error or shutdown */ -			spin_unlock_irqrestore(&bitmap->lock, flags);  			break; -		}  		page = filemap_get_page(bitmap, j); @@ -1121,6 +1119,8 @@ void bitmap_daemon_work(struct bitmap *bitmap)  					write_page(bitmap, page, 0);  					bitmap->allclean = 0;  				} +				spin_lock_irqsave(&bitmap->lock, flags); +				j |= (PAGE_BITS - 1);  				continue;  			} @@ -1181,9 +1181,10 @@ void bitmap_daemon_work(struct bitmap *bitmap)  					ext2_clear_bit(file_page_offset(j), paddr);  				kunmap_atomic(paddr, KM_USER0);  			} -		} -		spin_unlock_irqrestore(&bitmap->lock, flags); +		} else +			j |= PAGE_COUNTER_MASK;  	} +	spin_unlock_irqrestore(&bitmap->lock, flags);  	/* now sync the final page */  	if (lastpage != NULL) {  | 
