};
#define COMPR_CHUNK_MIN_BITS 16
-#define COMPR_CHUNK_MAX_BITS 31
+/* 64 MiB - a compressed chunk can never be bigger than PTLRPC_MAX_BRW_SIZE
+ * (which isn't easily accessed here)
+ */
+#define COMPR_CHUNK_MAX_BITS 26 /* == PTLRPC_MAX_BRW_BITS */
#define COMPR_LEVEL_MAX 31
#define COMPR_MIN_PAGES (1UL << (COMPR_CHUNK_MIN_BITS - PAGE_SHIFT))
#if defined(__cplusplus)
}
/**
- * limit 2^log_bits to less than stripe_size and given stripe_size is already
- * a multiple fo 64KiB, stripe_size must be a multiple of chunk size.
+ * Limit 2^log_bits to less than stripe_size and maximum RPC size.
+ * Given that stripe_size is itself always a multiple fo 64KiB,
+ * stripe_size must also be an even multiple of some chunk_size.
*/
static inline void
lod_adjust_compr_chunk_size(__u16 *log_bits, __u32 stripe_size)
while ((1 << *log_bits) > stripe_size ||
stripe_size & ((1 << *log_bits) - 1))
(*log_bits)--;
+
+ BUILD_BUG_ON(COMPR_CHUNK_MAX_BITS > PTLRPC_MAX_BRW_BITS);
+ if (unlikely(*log_bits > COMPR_CHUNK_MAX_BITS))
+ *log_bits = COMPR_CHUNK_MAX_BITS;
}
void lod_fix_desc(struct lov_desc *desc);