[patch 12/26] dm crypt: fix remove first_clone

2007-07-30 Thread Greg KH
-stable review patch.  If anyone has any objections, please let us know.

--

From: Olaf Kirch <[EMAIL PROTECTED]>

Get rid of first_clone in dm-crypt

This gets rid of first_clone, which is not really needed.  Apparently, cloned
bios used to share their bvec some time way in the past - this is no longer
the case.  Contrarily, this even hurts us if we try to create a clone off
first_clone after it has completed, and crypt_endio has destroyed its bvec.

Signed-off-by: Olaf Kirch <[EMAIL PROTECTED]>
Signed-off-by: Alasdair G Kergon <[EMAIL PROTECTED]>
Cc: Jens Axboe <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
Signed-off-by: Chris Wright <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2f9941b6c55d70103c1bc3f2c7676acd9f20bf8a

 drivers/md/dm-crypt.c |   34 ++
 1 file changed, 6 insertions(+), 28 deletions(-)

--- linux-2.6.21.6.orig/drivers/md/dm-crypt.c
+++ linux-2.6.21.6/drivers/md/dm-crypt.c
@@ -33,7 +33,6 @@
 struct crypt_io {
struct dm_target *target;
struct bio *base_bio;
-   struct bio *first_clone;
struct work_struct work;
atomic_t pending;
int error;
@@ -380,9 +379,8 @@ static int crypt_convert(struct crypt_co
  * This should never violate the device limitations
  * May return a smaller bio when running out of pages
  */
-static struct bio *
-crypt_alloc_buffer(struct crypt_io *io, unsigned int size,
-   struct bio *base_bio, unsigned int *bio_vec_idx)
+static struct bio *crypt_alloc_buffer(struct crypt_io *io, unsigned int size,
+ unsigned int *bio_vec_idx)
 {
struct crypt_config *cc = io->target->private;
struct bio *clone;
@@ -390,12 +388,7 @@ crypt_alloc_buffer(struct crypt_io *io, 
gfp_t gfp_mask = GFP_NOIO | __GFP_HIGHMEM;
unsigned int i;
 
-   if (base_bio) {
-   clone = bio_alloc_bioset(GFP_NOIO, base_bio->bi_max_vecs, 
cc->bs);
-   __bio_clone(clone, base_bio);
-   } else
-   clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, cc->bs);
-
+   clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, cc->bs);
if (!clone)
return NULL;
 
@@ -498,9 +491,6 @@ static void dec_pending(struct crypt_io 
if (!atomic_dec_and_test(>pending))
return;
 
-   if (io->first_clone)
-   bio_put(io->first_clone);
-
bio_endio(io->base_bio, io->base_bio->bi_size, io->error);
 
mempool_free(io, cc->io_pool);
@@ -618,8 +608,7 @@ static void process_write(struct crypt_i
 * so repeat the whole process until all the data can be handled.
 */
while (remaining) {
-   clone = crypt_alloc_buffer(io, base_bio->bi_size,
-  io->first_clone, _idx);
+   clone = crypt_alloc_buffer(io, base_bio->bi_size, _idx);
if (unlikely(!clone)) {
dec_pending(io, -ENOMEM);
return;
@@ -635,21 +624,11 @@ static void process_write(struct crypt_i
}
 
clone->bi_sector = cc->start + sector;
-
-   if (!io->first_clone) {
-   /*
-* hold a reference to the first clone, because it
-* holds the bio_vec array and that can't be freed
-* before all other clones are released
-*/
-   bio_get(clone);
-   io->first_clone = clone;
-   }
-
remaining -= clone->bi_size;
sector += bio_sectors(clone);
 
-   /* prevent bio_put of first_clone */
+   /* Grab another reference to the io struct
+* before we kick off the request */
if (remaining)
atomic_inc(>pending);
 
@@ -965,7 +944,6 @@ static int crypt_map(struct dm_target *t
io = mempool_alloc(cc->io_pool, GFP_NOIO);
io->target = ti;
io->base_bio = bio;
-   io->first_clone = NULL;
io->error = io->post_process = 0;
atomic_set(>pending, 0);
kcryptd_queue_io(io);

-- 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[patch 12/26] dm crypt: fix remove first_clone

2007-07-30 Thread Greg KH
-stable review patch.  If anyone has any objections, please let us know.

--

From: Olaf Kirch [EMAIL PROTECTED]

Get rid of first_clone in dm-crypt

This gets rid of first_clone, which is not really needed.  Apparently, cloned
bios used to share their bvec some time way in the past - this is no longer
the case.  Contrarily, this even hurts us if we try to create a clone off
first_clone after it has completed, and crypt_endio has destroyed its bvec.

Signed-off-by: Olaf Kirch [EMAIL PROTECTED]
Signed-off-by: Alasdair G Kergon [EMAIL PROTECTED]
Cc: Jens Axboe [EMAIL PROTECTED]
Signed-off-by: Andrew Morton [EMAIL PROTECTED]
Signed-off-by: Linus Torvalds [EMAIL PROTECTED]
Signed-off-by: Chris Wright [EMAIL PROTECTED]
Signed-off-by: Greg Kroah-Hartman [EMAIL PROTECTED]
---
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2f9941b6c55d70103c1bc3f2c7676acd9f20bf8a

 drivers/md/dm-crypt.c |   34 ++
 1 file changed, 6 insertions(+), 28 deletions(-)

--- linux-2.6.21.6.orig/drivers/md/dm-crypt.c
+++ linux-2.6.21.6/drivers/md/dm-crypt.c
@@ -33,7 +33,6 @@
 struct crypt_io {
struct dm_target *target;
struct bio *base_bio;
-   struct bio *first_clone;
struct work_struct work;
atomic_t pending;
int error;
@@ -380,9 +379,8 @@ static int crypt_convert(struct crypt_co
  * This should never violate the device limitations
  * May return a smaller bio when running out of pages
  */
-static struct bio *
-crypt_alloc_buffer(struct crypt_io *io, unsigned int size,
-   struct bio *base_bio, unsigned int *bio_vec_idx)
+static struct bio *crypt_alloc_buffer(struct crypt_io *io, unsigned int size,
+ unsigned int *bio_vec_idx)
 {
struct crypt_config *cc = io-target-private;
struct bio *clone;
@@ -390,12 +388,7 @@ crypt_alloc_buffer(struct crypt_io *io, 
gfp_t gfp_mask = GFP_NOIO | __GFP_HIGHMEM;
unsigned int i;
 
-   if (base_bio) {
-   clone = bio_alloc_bioset(GFP_NOIO, base_bio-bi_max_vecs, 
cc-bs);
-   __bio_clone(clone, base_bio);
-   } else
-   clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, cc-bs);
-
+   clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, cc-bs);
if (!clone)
return NULL;
 
@@ -498,9 +491,6 @@ static void dec_pending(struct crypt_io 
if (!atomic_dec_and_test(io-pending))
return;
 
-   if (io-first_clone)
-   bio_put(io-first_clone);
-
bio_endio(io-base_bio, io-base_bio-bi_size, io-error);
 
mempool_free(io, cc-io_pool);
@@ -618,8 +608,7 @@ static void process_write(struct crypt_i
 * so repeat the whole process until all the data can be handled.
 */
while (remaining) {
-   clone = crypt_alloc_buffer(io, base_bio-bi_size,
-  io-first_clone, bvec_idx);
+   clone = crypt_alloc_buffer(io, base_bio-bi_size, bvec_idx);
if (unlikely(!clone)) {
dec_pending(io, -ENOMEM);
return;
@@ -635,21 +624,11 @@ static void process_write(struct crypt_i
}
 
clone-bi_sector = cc-start + sector;
-
-   if (!io-first_clone) {
-   /*
-* hold a reference to the first clone, because it
-* holds the bio_vec array and that can't be freed
-* before all other clones are released
-*/
-   bio_get(clone);
-   io-first_clone = clone;
-   }
-
remaining -= clone-bi_size;
sector += bio_sectors(clone);
 
-   /* prevent bio_put of first_clone */
+   /* Grab another reference to the io struct
+* before we kick off the request */
if (remaining)
atomic_inc(io-pending);
 
@@ -965,7 +944,6 @@ static int crypt_map(struct dm_target *t
io = mempool_alloc(cc-io_pool, GFP_NOIO);
io-target = ti;
io-base_bio = bio;
-   io-first_clone = NULL;
io-error = io-post_process = 0;
atomic_set(io-pending, 0);
kcryptd_queue_io(io);

-- 
-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/