Re: [PATCH v2 4/6] block: loop: say goodby to bio

2014-08-31 Thread Ming Lei
On Sun, Aug 31, 2014 at 6:14 AM, Elliott, Robert (Server Storage)
 wrote:
>
>
>> -Original Message-
>> From: linux-kernel-ow...@vger.kernel.org [mailto:linux-kernel-
>> ow...@vger.kernel.org] On Behalf Of Ming Lei
>> Sent: Saturday, 30 August, 2014 11:08 AM
>> To: Jens Axboe; linux-kernel@vger.kernel.org; Dave Kleikamp
>> Cc: Zach Brown; Christoph Hellwig; Maxim Patlasov; Ming Lei
>> Subject: [PATCH v2 4/6] block: loop: say goodby to bio
> ...
>> -static int do_bio_filebacked(struct loop_device *lo, struct bio
>> *bio)
>> +static int do_req_filebacked(struct loop_device *lo, struct request
>> *rq)
>>  {
>>   loff_t pos;
>>   int ret;
>>
>> - pos = ((loff_t) bio->bi_iter.bi_sector << 9) + lo->lo_offset;
>> + pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
>>
>> - if (bio_rw(bio) == WRITE) {
>> + if (rq->cmd_flags & REQ_WRITE) {
>>   struct file *file = lo->lo_backing_file;
>>
>> - if (bio->bi_rw & REQ_FLUSH) {
>> + if (rq->cmd_flags & REQ_FLUSH) {
>>   ret = vfs_fsync(file, 0);
>>   if (unlikely(ret && ret != -EINVAL)) {
>>   ret = -EIO;
>> @@ -436,7 +439,7 @@ static int do_bio_filebacked(struct loop_device
>> *lo, struct bio *bio)
>>* encryption is enabled, because it may give an attacker
>>* useful information.
>>*/
>> - if (bio->bi_rw & REQ_DISCARD) {
>> + if (rq->cmd_flags & REQ_DISCARD) {
>>   struct file *file = lo->lo_backing_file;
>>   int mode = FALLOC_FL_PUNCH_HOLE |
>> FALLOC_FL_KEEP_SIZE;
>
> Can a REQ_WRITE_SAME make it through to here?

It can't because loop doesn't support WRITE_SAME.


Thanks,
--
Ming Lei
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 4/6] block: loop: say goodby to bio

2014-08-31 Thread Ming Lei
On Sun, Aug 31, 2014 at 6:14 AM, Elliott, Robert (Server Storage)
elli...@hp.com wrote:


 -Original Message-
 From: linux-kernel-ow...@vger.kernel.org [mailto:linux-kernel-
 ow...@vger.kernel.org] On Behalf Of Ming Lei
 Sent: Saturday, 30 August, 2014 11:08 AM
 To: Jens Axboe; linux-kernel@vger.kernel.org; Dave Kleikamp
 Cc: Zach Brown; Christoph Hellwig; Maxim Patlasov; Ming Lei
 Subject: [PATCH v2 4/6] block: loop: say goodby to bio
 ...
 -static int do_bio_filebacked(struct loop_device *lo, struct bio
 *bio)
 +static int do_req_filebacked(struct loop_device *lo, struct request
 *rq)
  {
   loff_t pos;
   int ret;

 - pos = ((loff_t) bio-bi_iter.bi_sector  9) + lo-lo_offset;
 + pos = ((loff_t) blk_rq_pos(rq)  9) + lo-lo_offset;

 - if (bio_rw(bio) == WRITE) {
 + if (rq-cmd_flags  REQ_WRITE) {
   struct file *file = lo-lo_backing_file;

 - if (bio-bi_rw  REQ_FLUSH) {
 + if (rq-cmd_flags  REQ_FLUSH) {
   ret = vfs_fsync(file, 0);
   if (unlikely(ret  ret != -EINVAL)) {
   ret = -EIO;
 @@ -436,7 +439,7 @@ static int do_bio_filebacked(struct loop_device
 *lo, struct bio *bio)
* encryption is enabled, because it may give an attacker
* useful information.
*/
 - if (bio-bi_rw  REQ_DISCARD) {
 + if (rq-cmd_flags  REQ_DISCARD) {
   struct file *file = lo-lo_backing_file;
   int mode = FALLOC_FL_PUNCH_HOLE |
 FALLOC_FL_KEEP_SIZE;

 Can a REQ_WRITE_SAME make it through to here?

It can't because loop doesn't support WRITE_SAME.


Thanks,
--
Ming Lei
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCH v2 4/6] block: loop: say goodby to bio

2014-08-30 Thread Elliott, Robert (Server Storage)


> -Original Message-
> From: linux-kernel-ow...@vger.kernel.org [mailto:linux-kernel-
> ow...@vger.kernel.org] On Behalf Of Ming Lei
> Sent: Saturday, 30 August, 2014 11:08 AM
> To: Jens Axboe; linux-kernel@vger.kernel.org; Dave Kleikamp
> Cc: Zach Brown; Christoph Hellwig; Maxim Patlasov; Ming Lei
> Subject: [PATCH v2 4/6] block: loop: say goodby to bio
...
> -static int do_bio_filebacked(struct loop_device *lo, struct bio
> *bio)
> +static int do_req_filebacked(struct loop_device *lo, struct request
> *rq)
>  {
>   loff_t pos;
>   int ret;
> 
> - pos = ((loff_t) bio->bi_iter.bi_sector << 9) + lo->lo_offset;
> + pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
> 
> - if (bio_rw(bio) == WRITE) {
> + if (rq->cmd_flags & REQ_WRITE) {
>   struct file *file = lo->lo_backing_file;
> 
> - if (bio->bi_rw & REQ_FLUSH) {
> + if (rq->cmd_flags & REQ_FLUSH) {
>   ret = vfs_fsync(file, 0);
>   if (unlikely(ret && ret != -EINVAL)) {
>   ret = -EIO;
> @@ -436,7 +439,7 @@ static int do_bio_filebacked(struct loop_device
> *lo, struct bio *bio)
>* encryption is enabled, because it may give an attacker
>* useful information.
>*/
> - if (bio->bi_rw & REQ_DISCARD) {
> + if (rq->cmd_flags & REQ_DISCARD) {
>   struct file *file = lo->lo_backing_file;
>   int mode = FALLOC_FL_PUNCH_HOLE |
> FALLOC_FL_KEEP_SIZE;

Can a REQ_WRITE_SAME make it through to here?


---
Rob ElliottHP Server Storage



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


[PATCH v2 4/6] block: loop: say goodby to bio

2014-08-30 Thread Ming Lei
Switch to block request completely.

Signed-off-by: Ming Lei 
---
 drivers/block/loop.c |   46 --
 1 file changed, 20 insertions(+), 26 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index b02122d..b1181b0 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -285,12 +285,12 @@ static int do_lo_send_write(struct loop_device *lo, 
struct bio_vec *bvec,
return ret;
 }
 
-static int lo_send(struct loop_device *lo, struct bio *bio, loff_t pos)
+static int lo_send(struct loop_device *lo, struct request *rq, loff_t pos)
 {
int (*do_lo_send)(struct loop_device *, struct bio_vec *, loff_t,
struct page *page);
struct bio_vec bvec;
-   struct bvec_iter iter;
+   struct req_iterator iter;
struct page *page = NULL;
int ret = 0;
 
@@ -304,7 +304,7 @@ static int lo_send(struct loop_device *lo, struct bio *bio, 
loff_t pos)
do_lo_send = do_lo_send_direct_write;
}
 
-   bio_for_each_segment(bvec, bio, iter) {
+   rq_for_each_segment(bvec, rq, iter) {
ret = do_lo_send(lo, , pos, page);
if (ret < 0)
break;
@@ -392,19 +392,22 @@ do_lo_receive(struct loop_device *lo,
 }
 
 static int
-lo_receive(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos)
+lo_receive(struct loop_device *lo, struct request *rq, int bsize, loff_t pos)
 {
struct bio_vec bvec;
-   struct bvec_iter iter;
+   struct req_iterator iter;
ssize_t s;
 
-   bio_for_each_segment(bvec, bio, iter) {
+   rq_for_each_segment(bvec, rq, iter) {
s = do_lo_receive(lo, , bsize, pos);
if (s < 0)
return s;
 
if (s != bvec.bv_len) {
-   zero_fill_bio(bio);
+   struct bio *bio;
+
+   __rq_for_each_bio(bio, rq)
+   zero_fill_bio(bio);
break;
}
pos += bvec.bv_len;
@@ -412,17 +415,17 @@ lo_receive(struct loop_device *lo, struct bio *bio, int 
bsize, loff_t pos)
return 0;
 }
 
-static int do_bio_filebacked(struct loop_device *lo, struct bio *bio)
+static int do_req_filebacked(struct loop_device *lo, struct request *rq)
 {
loff_t pos;
int ret;
 
-   pos = ((loff_t) bio->bi_iter.bi_sector << 9) + lo->lo_offset;
+   pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
 
-   if (bio_rw(bio) == WRITE) {
+   if (rq->cmd_flags & REQ_WRITE) {
struct file *file = lo->lo_backing_file;
 
-   if (bio->bi_rw & REQ_FLUSH) {
+   if (rq->cmd_flags & REQ_FLUSH) {
ret = vfs_fsync(file, 0);
if (unlikely(ret && ret != -EINVAL)) {
ret = -EIO;
@@ -436,7 +439,7 @@ static int do_bio_filebacked(struct loop_device *lo, struct 
bio *bio)
 * encryption is enabled, because it may give an attacker
 * useful information.
 */
-   if (bio->bi_rw & REQ_DISCARD) {
+   if (rq->cmd_flags & REQ_DISCARD) {
struct file *file = lo->lo_backing_file;
int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
 
@@ -446,22 +449,22 @@ static int do_bio_filebacked(struct loop_device *lo, 
struct bio *bio)
goto out;
}
ret = file->f_op->fallocate(file, mode, pos,
-   bio->bi_iter.bi_size);
+   blk_rq_bytes(rq));
if (unlikely(ret && ret != -EINVAL &&
 ret != -EOPNOTSUPP))
ret = -EIO;
goto out;
}
 
-   ret = lo_send(lo, bio, pos);
+   ret = lo_send(lo, rq, pos);
 
-   if ((bio->bi_rw & REQ_FUA) && !ret) {
+   if ((rq->cmd_flags & REQ_FUA) && !ret) {
ret = vfs_fsync(file, 0);
if (unlikely(ret && ret != -EINVAL))
ret = -EIO;
}
} else
-   ret = lo_receive(lo, bio, lo->lo_blocksize, pos);
+   ret = lo_receive(lo, rq, lo->lo_blocksize, pos);
 
 out:
return ret;
@@ -472,12 +475,6 @@ struct switch_request {
struct completion wait;
 };
 
-static inline int loop_handle_bio(struct loop_device *lo, struct bio *bio)
-{
-   int ret = do_bio_filebacked(lo, bio);
-   return ret;
-}
-
 /*
  * Do the actual switch; called from the BIO completion routine
  */
@@ -1557,7 +1554,6 @@ static void loop_queue_work(struct kthread_work *work)
const bool write = cmd->rq->cmd_flags & 

[PATCH v2 4/6] block: loop: say goodby to bio

2014-08-30 Thread Ming Lei
Switch to block request completely.

Signed-off-by: Ming Lei ming@canonical.com
---
 drivers/block/loop.c |   46 --
 1 file changed, 20 insertions(+), 26 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index b02122d..b1181b0 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -285,12 +285,12 @@ static int do_lo_send_write(struct loop_device *lo, 
struct bio_vec *bvec,
return ret;
 }
 
-static int lo_send(struct loop_device *lo, struct bio *bio, loff_t pos)
+static int lo_send(struct loop_device *lo, struct request *rq, loff_t pos)
 {
int (*do_lo_send)(struct loop_device *, struct bio_vec *, loff_t,
struct page *page);
struct bio_vec bvec;
-   struct bvec_iter iter;
+   struct req_iterator iter;
struct page *page = NULL;
int ret = 0;
 
@@ -304,7 +304,7 @@ static int lo_send(struct loop_device *lo, struct bio *bio, 
loff_t pos)
do_lo_send = do_lo_send_direct_write;
}
 
-   bio_for_each_segment(bvec, bio, iter) {
+   rq_for_each_segment(bvec, rq, iter) {
ret = do_lo_send(lo, bvec, pos, page);
if (ret  0)
break;
@@ -392,19 +392,22 @@ do_lo_receive(struct loop_device *lo,
 }
 
 static int
-lo_receive(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos)
+lo_receive(struct loop_device *lo, struct request *rq, int bsize, loff_t pos)
 {
struct bio_vec bvec;
-   struct bvec_iter iter;
+   struct req_iterator iter;
ssize_t s;
 
-   bio_for_each_segment(bvec, bio, iter) {
+   rq_for_each_segment(bvec, rq, iter) {
s = do_lo_receive(lo, bvec, bsize, pos);
if (s  0)
return s;
 
if (s != bvec.bv_len) {
-   zero_fill_bio(bio);
+   struct bio *bio;
+
+   __rq_for_each_bio(bio, rq)
+   zero_fill_bio(bio);
break;
}
pos += bvec.bv_len;
@@ -412,17 +415,17 @@ lo_receive(struct loop_device *lo, struct bio *bio, int 
bsize, loff_t pos)
return 0;
 }
 
-static int do_bio_filebacked(struct loop_device *lo, struct bio *bio)
+static int do_req_filebacked(struct loop_device *lo, struct request *rq)
 {
loff_t pos;
int ret;
 
-   pos = ((loff_t) bio-bi_iter.bi_sector  9) + lo-lo_offset;
+   pos = ((loff_t) blk_rq_pos(rq)  9) + lo-lo_offset;
 
-   if (bio_rw(bio) == WRITE) {
+   if (rq-cmd_flags  REQ_WRITE) {
struct file *file = lo-lo_backing_file;
 
-   if (bio-bi_rw  REQ_FLUSH) {
+   if (rq-cmd_flags  REQ_FLUSH) {
ret = vfs_fsync(file, 0);
if (unlikely(ret  ret != -EINVAL)) {
ret = -EIO;
@@ -436,7 +439,7 @@ static int do_bio_filebacked(struct loop_device *lo, struct 
bio *bio)
 * encryption is enabled, because it may give an attacker
 * useful information.
 */
-   if (bio-bi_rw  REQ_DISCARD) {
+   if (rq-cmd_flags  REQ_DISCARD) {
struct file *file = lo-lo_backing_file;
int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
 
@@ -446,22 +449,22 @@ static int do_bio_filebacked(struct loop_device *lo, 
struct bio *bio)
goto out;
}
ret = file-f_op-fallocate(file, mode, pos,
-   bio-bi_iter.bi_size);
+   blk_rq_bytes(rq));
if (unlikely(ret  ret != -EINVAL 
 ret != -EOPNOTSUPP))
ret = -EIO;
goto out;
}
 
-   ret = lo_send(lo, bio, pos);
+   ret = lo_send(lo, rq, pos);
 
-   if ((bio-bi_rw  REQ_FUA)  !ret) {
+   if ((rq-cmd_flags  REQ_FUA)  !ret) {
ret = vfs_fsync(file, 0);
if (unlikely(ret  ret != -EINVAL))
ret = -EIO;
}
} else
-   ret = lo_receive(lo, bio, lo-lo_blocksize, pos);
+   ret = lo_receive(lo, rq, lo-lo_blocksize, pos);
 
 out:
return ret;
@@ -472,12 +475,6 @@ struct switch_request {
struct completion wait;
 };
 
-static inline int loop_handle_bio(struct loop_device *lo, struct bio *bio)
-{
-   int ret = do_bio_filebacked(lo, bio);
-   return ret;
-}
-
 /*
  * Do the actual switch; called from the BIO completion routine
  */
@@ -1557,7 +1554,6 @@ static void loop_queue_work(struct kthread_work *work)
const bool write = cmd-rq-cmd_flags  REQ_WRITE;

RE: [PATCH v2 4/6] block: loop: say goodby to bio

2014-08-30 Thread Elliott, Robert (Server Storage)


 -Original Message-
 From: linux-kernel-ow...@vger.kernel.org [mailto:linux-kernel-
 ow...@vger.kernel.org] On Behalf Of Ming Lei
 Sent: Saturday, 30 August, 2014 11:08 AM
 To: Jens Axboe; linux-kernel@vger.kernel.org; Dave Kleikamp
 Cc: Zach Brown; Christoph Hellwig; Maxim Patlasov; Ming Lei
 Subject: [PATCH v2 4/6] block: loop: say goodby to bio
...
 -static int do_bio_filebacked(struct loop_device *lo, struct bio
 *bio)
 +static int do_req_filebacked(struct loop_device *lo, struct request
 *rq)
  {
   loff_t pos;
   int ret;
 
 - pos = ((loff_t) bio-bi_iter.bi_sector  9) + lo-lo_offset;
 + pos = ((loff_t) blk_rq_pos(rq)  9) + lo-lo_offset;
 
 - if (bio_rw(bio) == WRITE) {
 + if (rq-cmd_flags  REQ_WRITE) {
   struct file *file = lo-lo_backing_file;
 
 - if (bio-bi_rw  REQ_FLUSH) {
 + if (rq-cmd_flags  REQ_FLUSH) {
   ret = vfs_fsync(file, 0);
   if (unlikely(ret  ret != -EINVAL)) {
   ret = -EIO;
 @@ -436,7 +439,7 @@ static int do_bio_filebacked(struct loop_device
 *lo, struct bio *bio)
* encryption is enabled, because it may give an attacker
* useful information.
*/
 - if (bio-bi_rw  REQ_DISCARD) {
 + if (rq-cmd_flags  REQ_DISCARD) {
   struct file *file = lo-lo_backing_file;
   int mode = FALLOC_FL_PUNCH_HOLE |
 FALLOC_FL_KEEP_SIZE;

Can a REQ_WRITE_SAME make it through to here?


---
Rob ElliottHP Server Storage



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