[PATCH v2 5/6] block: loop: introduce lo_discard() and lo_req_flush()

2014-08-30 Thread Ming Lei
No behaviour change, just move the handling for REQ_DISCARD
and REQ_FLUSH in these two functions.

Signed-off-by: Ming Lei 
---
 drivers/block/loop.c |   73 +++---
 1 file changed, 40 insertions(+), 33 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index b1181b0..d7cdb60 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -415,6 +415,40 @@ lo_receive(struct loop_device *lo, struct request *rq, int 
bsize, loff_t pos)
return 0;
 }
 
+static int lo_discard(struct loop_device *lo, struct request *rq, loff_t pos)
+{
+   /*
+* We use punch hole to reclaim the free space used by the
+* image a.k.a. discard. However we do not support discard if
+* encryption is enabled, because it may give an attacker
+* useful information.
+*/
+   struct file *file = lo->lo_backing_file;
+   int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
+   int ret;
+
+   if ((!file->f_op->fallocate) || lo->lo_encrypt_key_size) {
+   ret = -EOPNOTSUPP;
+   goto out;
+   }
+
+   ret = file->f_op->fallocate(file, mode, pos, blk_rq_bytes(rq));
+   if (unlikely(ret && ret != -EINVAL && ret != -EOPNOTSUPP))
+   ret = -EIO;
+ out:
+   return ret;
+}
+
+static int lo_req_flush(struct loop_device *lo, struct request *rq)
+{
+   struct file *file = lo->lo_backing_file;
+   int ret = vfs_fsync(file, 0);
+   if (unlikely(ret && ret != -EINVAL))
+   ret = -EIO;
+
+   return ret;
+}
+
 static int do_req_filebacked(struct loop_device *lo, struct request *rq)
 {
loff_t pos;
@@ -423,46 +457,19 @@ static int do_req_filebacked(struct loop_device *lo, 
struct request *rq)
pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
 
if (rq->cmd_flags & REQ_WRITE) {
-   struct file *file = lo->lo_backing_file;
-
-   if (rq->cmd_flags & REQ_FLUSH) {
-   ret = vfs_fsync(file, 0);
-   if (unlikely(ret && ret != -EINVAL)) {
-   ret = -EIO;
-   goto out;
-   }
-   }
 
-   /*
-* We use punch hole to reclaim the free space used by the
-* image a.k.a. discard. However we do not support discard if
-* encryption is enabled, because it may give an attacker
-* useful information.
-*/
+   if (rq->cmd_flags & REQ_FLUSH)
+   ret = lo_req_flush(lo, rq);
+
if (rq->cmd_flags & REQ_DISCARD) {
-   struct file *file = lo->lo_backing_file;
-   int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
-
-   if ((!file->f_op->fallocate) ||
-   lo->lo_encrypt_key_size) {
-   ret = -EOPNOTSUPP;
-   goto out;
-   }
-   ret = file->f_op->fallocate(file, mode, pos,
-   blk_rq_bytes(rq));
-   if (unlikely(ret && ret != -EINVAL &&
-ret != -EOPNOTSUPP))
-   ret = -EIO;
+   ret = lo_discard(lo, rq, pos);
goto out;
}
 
ret = lo_send(lo, rq, pos);
 
-   if ((rq->cmd_flags & REQ_FUA) && !ret) {
-   ret = vfs_fsync(file, 0);
-   if (unlikely(ret && ret != -EINVAL))
-   ret = -EIO;
-   }
+   if ((rq->cmd_flags & REQ_FUA) && !ret)
+   ret = lo_req_flush(lo, rq);
} else
ret = lo_receive(lo, rq, lo->lo_blocksize, pos);
 
-- 
1.7.9.5

--
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 5/6] block: loop: introduce lo_discard() and lo_req_flush()

2014-08-30 Thread Ming Lei
No behaviour change, just move the handling for REQ_DISCARD
and REQ_FLUSH in these two functions.

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

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index b1181b0..d7cdb60 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -415,6 +415,40 @@ lo_receive(struct loop_device *lo, struct request *rq, int 
bsize, loff_t pos)
return 0;
 }
 
+static int lo_discard(struct loop_device *lo, struct request *rq, loff_t pos)
+{
+   /*
+* We use punch hole to reclaim the free space used by the
+* image a.k.a. discard. However we do not support discard if
+* encryption is enabled, because it may give an attacker
+* useful information.
+*/
+   struct file *file = lo-lo_backing_file;
+   int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
+   int ret;
+
+   if ((!file-f_op-fallocate) || lo-lo_encrypt_key_size) {
+   ret = -EOPNOTSUPP;
+   goto out;
+   }
+
+   ret = file-f_op-fallocate(file, mode, pos, blk_rq_bytes(rq));
+   if (unlikely(ret  ret != -EINVAL  ret != -EOPNOTSUPP))
+   ret = -EIO;
+ out:
+   return ret;
+}
+
+static int lo_req_flush(struct loop_device *lo, struct request *rq)
+{
+   struct file *file = lo-lo_backing_file;
+   int ret = vfs_fsync(file, 0);
+   if (unlikely(ret  ret != -EINVAL))
+   ret = -EIO;
+
+   return ret;
+}
+
 static int do_req_filebacked(struct loop_device *lo, struct request *rq)
 {
loff_t pos;
@@ -423,46 +457,19 @@ static int do_req_filebacked(struct loop_device *lo, 
struct request *rq)
pos = ((loff_t) blk_rq_pos(rq)  9) + lo-lo_offset;
 
if (rq-cmd_flags  REQ_WRITE) {
-   struct file *file = lo-lo_backing_file;
-
-   if (rq-cmd_flags  REQ_FLUSH) {
-   ret = vfs_fsync(file, 0);
-   if (unlikely(ret  ret != -EINVAL)) {
-   ret = -EIO;
-   goto out;
-   }
-   }
 
-   /*
-* We use punch hole to reclaim the free space used by the
-* image a.k.a. discard. However we do not support discard if
-* encryption is enabled, because it may give an attacker
-* useful information.
-*/
+   if (rq-cmd_flags  REQ_FLUSH)
+   ret = lo_req_flush(lo, rq);
+
if (rq-cmd_flags  REQ_DISCARD) {
-   struct file *file = lo-lo_backing_file;
-   int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
-
-   if ((!file-f_op-fallocate) ||
-   lo-lo_encrypt_key_size) {
-   ret = -EOPNOTSUPP;
-   goto out;
-   }
-   ret = file-f_op-fallocate(file, mode, pos,
-   blk_rq_bytes(rq));
-   if (unlikely(ret  ret != -EINVAL 
-ret != -EOPNOTSUPP))
-   ret = -EIO;
+   ret = lo_discard(lo, rq, pos);
goto out;
}
 
ret = lo_send(lo, rq, pos);
 
-   if ((rq-cmd_flags  REQ_FUA)  !ret) {
-   ret = vfs_fsync(file, 0);
-   if (unlikely(ret  ret != -EINVAL))
-   ret = -EIO;
-   }
+   if ((rq-cmd_flags  REQ_FUA)  !ret)
+   ret = lo_req_flush(lo, rq);
} else
ret = lo_receive(lo, rq, lo-lo_blocksize, pos);
 
-- 
1.7.9.5

--
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/