Re: [PATCH v4 06/10] loop: Factor out configuring loop from status

2020-05-06 Thread Christoph Hellwig
On Wed, Apr 29, 2020 at 04:03:37PM +0200, Martijn Coenen wrote:
> Factor out this code into a separate function, so it can be reused by
> other code more easily.
> 
> Signed-off-by: Martijn Coenen 

Looks good,

Reviewed-by: Christoph Hellwig 


[PATCH v4 06/10] loop: Factor out configuring loop from status

2020-04-29 Thread Martijn Coenen
Factor out this code into a separate function, so it can be reused by
other code more easily.

Signed-off-by: Martijn Coenen 
---
 drivers/block/loop.c | 117 +--
 1 file changed, 67 insertions(+), 50 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 32755e874326..4a36a3f47503 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1266,13 +1266,78 @@ static int loop_clr_fd(struct loop_device *lo)
return __loop_clr_fd(lo, false);
 }
 
+/**
+ * loop_set_status_from_info - configure device from loop_info
+ * @lo: struct loop_device to configure
+ * @info: struct loop_info64 to configure the device with
+ *
+ * Configures the loop device parameters according to the passed
+ * in loop_info64 configuration.
+ */
 static int
-loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
+loop_set_status_from_info(struct loop_device *lo,
+ const struct loop_info64 *info)
 {
int err;
struct loop_func_table *xfer;
kuid_t uid = current_uid();
+
+   if ((unsigned int) info->lo_encrypt_key_size > LO_KEY_SIZE)
+   return -EINVAL;
+
+   err = loop_release_xfer(lo);
+   if (err)
+   return err;
+
+   if (info->lo_encrypt_type) {
+   unsigned int type = info->lo_encrypt_type;
+
+   if (type >= MAX_LO_CRYPT)
+   return -EINVAL;
+   xfer = xfer_funcs[type];
+   if (xfer == NULL)
+   return -EINVAL;
+   } else
+   xfer = NULL;
+
+   err = loop_init_xfer(lo, xfer, info);
+   if (err)
+   return err;
+
+   lo->lo_offset = info->lo_offset;
+   lo->lo_sizelimit = info->lo_sizelimit;
+   memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE);
+   memcpy(lo->lo_crypt_name, info->lo_crypt_name, LO_NAME_SIZE);
+   lo->lo_file_name[LO_NAME_SIZE-1] = 0;
+   lo->lo_crypt_name[LO_NAME_SIZE-1] = 0;
+
+   if (!xfer)
+   xfer = _funcs;
+   lo->transfer = xfer->transfer;
+   lo->ioctl = xfer->ioctl;
+
+   if ((lo->lo_flags & LO_FLAGS_AUTOCLEAR) !=
+(info->lo_flags & LO_FLAGS_AUTOCLEAR))
+   lo->lo_flags ^= LO_FLAGS_AUTOCLEAR;
+
+   lo->lo_encrypt_key_size = info->lo_encrypt_key_size;
+   lo->lo_init[0] = info->lo_init[0];
+   lo->lo_init[1] = info->lo_init[1];
+   if (info->lo_encrypt_key_size) {
+   memcpy(lo->lo_encrypt_key, info->lo_encrypt_key,
+  info->lo_encrypt_key_size);
+   lo->lo_key_owner = uid;
+   }
+
+   return 0;
+}
+
+static int
+loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
+{
+   int err;
struct block_device *bdev;
+   kuid_t uid = current_uid();
bool partscan = false;
bool size_changed = false;
loff_t validated_size;
@@ -1290,10 +1355,6 @@ loop_set_status(struct loop_device *lo, const struct 
loop_info64 *info)
err = -ENXIO;
goto out_unlock;
}
-   if ((unsigned int) info->lo_encrypt_key_size > LO_KEY_SIZE) {
-   err = -EINVAL;
-   goto out_unlock;
-   }
 
if (lo->lo_offset != info->lo_offset ||
lo->lo_sizelimit != info->lo_sizelimit) {
@@ -1320,54 +1381,10 @@ loop_set_status(struct loop_device *lo, const struct 
loop_info64 *info)
goto out_unfreeze;
}
 
-   err = loop_release_xfer(lo);
+   err = loop_set_status_from_info(lo, info);
if (err)
goto out_unfreeze;
 
-   if (info->lo_encrypt_type) {
-   unsigned int type = info->lo_encrypt_type;
-
-   if (type >= MAX_LO_CRYPT) {
-   err = -EINVAL;
-   goto out_unfreeze;
-   }
-   xfer = xfer_funcs[type];
-   if (xfer == NULL) {
-   err = -EINVAL;
-   goto out_unfreeze;
-   }
-   } else
-   xfer = NULL;
-
-   err = loop_init_xfer(lo, xfer, info);
-   if (err)
-   goto out_unfreeze;
-
-   lo->lo_offset = info->lo_offset;
-   lo->lo_sizelimit = info->lo_sizelimit;
-   memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE);
-   memcpy(lo->lo_crypt_name, info->lo_crypt_name, LO_NAME_SIZE);
-   lo->lo_file_name[LO_NAME_SIZE-1] = 0;
-   lo->lo_crypt_name[LO_NAME_SIZE-1] = 0;
-
-   if (!xfer)
-   xfer = _funcs;
-   lo->transfer = xfer->transfer;
-   lo->ioctl = xfer->ioctl;
-
-   if ((lo->lo_flags & LO_FLAGS_AUTOCLEAR) !=
-(info->lo_flags & LO_FLAGS_AUTOCLEAR))
-   lo->lo_flags ^= LO_FLAGS_AUTOCLEAR;
-
-   lo->lo_encrypt_key_size = info->lo_encrypt_key_size;
-   lo->lo_init[0] = info->lo_init[0];
-   lo->lo_init[1] = info->lo_init[1];
-   if