From: Martijn Coenen <maco@android.com>
To: axboe@kernel.dk, hch@lst.de, ming.lei@redhat.com
Cc: narayan@google.com, zezeozue@google.com, kernel-team@android.com,
maco@google.com, bvanassche@acm.org, Chaitanya.Kulkarni@wdc.com,
jaegeuk@kernel.org, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org, Martijn Coenen <maco@android.com>
Subject: [PATCH v4 06/10] loop: Factor out configuring loop from status
Date: Wed, 29 Apr 2020 16:03:37 +0200 [thread overview]
Message-ID: <20200429140341.13294-7-maco@android.com> (raw)
In-Reply-To: <20200429140341.13294-1-maco@android.com>
Factor out this code into a separate function, so it can be reused by
other code more easily.
Signed-off-by: Martijn Coenen <maco@android.com>
---
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 = &none_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 = &none_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;
- }
-
if (size_changed)
loop_set_size(lo, validated_size);
--
2.26.2.303.gf8c07b1a785-goog
next prev parent reply other threads:[~2020-04-29 14:04 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-29 14:03 [PATCH v4 00/10] Add a new LOOP_CONFIGURE ioctl Martijn Coenen
2020-04-29 14:03 ` [PATCH v4 01/10] loop: Factor out loop size validation Martijn Coenen
2020-04-29 14:12 ` Ming Lei
2020-05-01 11:33 ` Martijn Coenen
2020-05-01 17:26 ` Christoph Hellwig
2020-04-29 14:03 ` [PATCH v4 02/10] loop: Factor out setting loop device size Martijn Coenen
2020-05-01 17:26 ` Christoph Hellwig
2020-04-29 14:03 ` [PATCH v4 03/10] loop: Switch to set_capacity_revalidate_and_notify() Martijn Coenen
2020-05-01 17:27 ` Christoph Hellwig
2020-04-29 14:03 ` [PATCH v4 04/10] loop: Refactor loop_set_status() size calculation Martijn Coenen
2020-05-01 17:30 ` Christoph Hellwig
2020-05-01 19:33 ` Martijn Coenen
2020-05-06 5:10 ` Christoph Hellwig
2020-05-06 6:03 ` Christoph Hellwig
2020-04-29 14:03 ` [PATCH v4 05/10] loop: Remove figure_loop_size() Martijn Coenen
2020-05-06 6:04 ` Christoph Hellwig
2020-04-29 14:03 ` Martijn Coenen [this message]
2020-05-06 6:05 ` [PATCH v4 06/10] loop: Factor out configuring loop from status Christoph Hellwig
2020-04-29 14:03 ` [PATCH v4 07/10] loop: Move loop_set_status_from_info() and friends up Martijn Coenen
2020-05-06 6:06 ` Christoph Hellwig
2020-04-29 14:03 ` [PATCH v4 08/10] loop: Rework lo_ioctl() __user argument casting Martijn Coenen
2020-05-06 6:07 ` Christoph Hellwig
2020-04-29 14:03 ` [PATCH v4 09/10] loop: Clean up LOOP_SET_STATUS lo_flags handling Martijn Coenen
2020-05-06 6:08 ` Christoph Hellwig
2020-04-29 14:03 ` [PATCH v4 10/10] loop: Add LOOP_CONFIGURE ioctl Martijn Coenen
2020-05-06 6:09 ` Christoph Hellwig
2020-05-06 9:55 ` Martijn Coenen
2020-05-06 9:44 ` Michael Kerrisk (man-pages)
2020-05-06 9:57 ` Martijn Coenen
2020-05-12 6:46 ` Martijn Coenen
2020-05-13 2:29 ` Jens Axboe
2020-05-13 2:30 ` Jens Axboe
2020-05-13 7:07 ` Martijn Coenen
2020-05-13 10:22 ` Christoph Hellwig
2020-05-13 13:49 ` Martijn Coenen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200429140341.13294-7-maco@android.com \
--to=maco@android.com \
--cc=Chaitanya.Kulkarni@wdc.com \
--cc=axboe@kernel.dk \
--cc=bvanassche@acm.org \
--cc=hch@lst.de \
--cc=jaegeuk@kernel.org \
--cc=kernel-team@android.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maco@google.com \
--cc=ming.lei@redhat.com \
--cc=narayan@google.com \
--cc=zezeozue@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).