summaryrefslogtreecommitdiff
path: root/super-intel.c
diff options
context:
space:
mode:
authorRoman Sobanski <roman.sobanski@intel.com>2018-04-25 11:25:06 +0200
committerDimitri John Ledkov <xnox@ubuntu.com>2018-05-15 12:10:33 +0100
commitd1c489f6ac587671ac1ae264972e6dd69e21cd5f (patch)
tree9556976dba7c0187d29c951950fc7a0080095750 /super-intel.c
parent5dae98c7073316e4495bc3b8a0e06aaf6b98a123 (diff)
[PATCH 8/9] Prevent create IMSM volume with size smaller than 1M or chunk
Block creation of the imsm volume when given size is smaller than 1M and print appropriate message. Commit b53bfba6119d3f6f56eb9e10e5a59da6901af159 (imsm: use rounded size for metadata initialization) introduces issue with rounding volume sizes smaller than 1M to 0. There is an inconsistency when size smaller than 1M was given depends of what we give as target device: 1) When block devices was given created volume has maximum available size. 2) When container symlink was given created volume has size 0. Additionally it causes below call trace: [69587.891556] WARNING: CPU: 28 PID: 22485 at ../drivers/md/md.c:7582 md_seq_show+0x764/0x770 [md_mod] [69588.066405] Call Trace: [69588.066409] seq_read+0x336/0x430 [69588.066411] proc_reg_read+0x40/0x70 [69588.066412] __vfs_read+0x26/0x140 [69588.066414] vfs_read+0x89/0x130 [69588.066415] SyS_read+0x42/0x90 [69588.066417] do_syscall_64+0x74/0x140 [69588.066419] entry_SYSCALL_64_after_hwframe+0x3d/0xa2 Signed-off-by: Roman Sobanski <roman.sobanski@intel.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com> Gbp-Pq: Name 0008-Prevent-create-IMSM-volume-with-size-smaller-than-1M.patch
Diffstat (limited to 'super-intel.c')
-rw-r--r--super-intel.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/super-intel.c b/super-intel.c
index c55c85f..520abf5 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -7358,6 +7358,16 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
verbose);
}
+ if (size && ((size < 1024) || (*chunk != UnSet &&
+ size < (unsigned long long) *chunk))) {
+ pr_err("Given size must be greater than 1M and chunk size.\n");
+ /* Depends on algorithm in Create.c :
+ * if container was given (dev == NULL) return -1,
+ * if block device was given ( dev != NULL) return 0.
+ */
+ return dev ? -1 : 0;
+ }
+
if (!dev) {
if (st->sb) {
struct intel_super *super = st->sb;