Re: [PATCH v4 07/10] loop: Move loop_set_status_from_info() and friends up

2020-05-06 Thread Christoph Hellwig
On Wed, Apr 29, 2020 at 04:03:38PM +0200, Martijn Coenen wrote:
> So we can use it without forward declaration. This is a separate commit
> to make it easier to verify that this is just a move, without functional
> modifications.
> 
> Signed-off-by: Martijn Coenen 

Looks good,

Reviewed-by: Christoph Hellwig 


[PATCH v4 07/10] loop: Move loop_set_status_from_info() and friends up

2020-04-29 Thread Martijn Coenen
So we can use it without forward declaration. This is a separate commit
to make it easier to verify that this is just a move, without functional
modifications.

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

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 4a36a3f47503..60ba1ed95d77 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -962,6 +962,109 @@ static void loop_update_rotational(struct loop_device *lo)
blk_queue_flag_clear(QUEUE_FLAG_NONROT, q);
 }
 
+static int
+loop_release_xfer(struct loop_device *lo)
+{
+   int err = 0;
+   struct loop_func_table *xfer = lo->lo_encryption;
+
+   if (xfer) {
+   if (xfer->release)
+   err = xfer->release(lo);
+   lo->transfer = NULL;
+   lo->lo_encryption = NULL;
+   module_put(xfer->owner);
+   }
+   return err;
+}
+
+static int
+loop_init_xfer(struct loop_device *lo, struct loop_func_table *xfer,
+  const struct loop_info64 *i)
+{
+   int err = 0;
+
+   if (xfer) {
+   struct module *owner = xfer->owner;
+
+   if (!try_module_get(owner))
+   return -EINVAL;
+   if (xfer->init)
+   err = xfer->init(lo, i);
+   if (err)
+   module_put(owner);
+   else
+   lo->lo_encryption = xfer;
+   }
+   return err;
+}
+
+/**
+ * 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_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_fd(struct loop_device *lo, fmode_t mode,
   struct block_device *bdev, unsigned int arg)
 {
@@ -1085,43 +1188,6 @@ static int loop_set_fd(struct loop_device *lo, fmode_t 
mode,
return error;
 }
 
-static int
-loop_release_xfer(struct loop_device *lo)
-{
-   int err = 0;
-   struct loop_func_table *xfer = lo->lo_encryption;
-
-   if (xfer) {
-   if (xfer->release)
-   err = xfer->release(lo);
-   lo->transfer = NULL;
-   lo->lo_encryption = NULL;
-   module_put(xfer->owner);
-   }
-   return err;
-}
-
-static int
-loop_init_xfer(struct loop_device *lo, struct loop_func_table *xfer,
-  const struct loop_info64 *i)
-{
-   int err = 0;
-
-   if (xfer) {
-   struct module *owner = xfer->owner;
-
-   if (!try_module_get(owner))
-   return -EINVAL;
-   if (xfer->init)
-   err = xfer->init(lo, i);
-   if (err)
-   module_put(owner);
-   else
-   lo->lo_encryption = xfer;
-   }
-   return err;
-}
-
 static int __loop_clr_fd(struct loop_device *lo, bool release)
 {
struct file *filp = NULL;
@@ -1266,72