+static inline __u32 init_checksum(cksum_type_t cksum_type)
+{
+ switch(cksum_type) {
+ case OBD_CKSUM_CRC32:
+ return ~0U;
+#ifdef HAVE_ADLER
+ case OBD_CKSUM_ADLER:
+ return 1U;
+#endif
+ default:
+ CERROR("Unknown checksum type (%x)!!!\n", cksum_type);
+ LBUG();
+ }
+ return 0;
+}
+
+static inline __u32 compute_checksum(__u32 cksum, unsigned char const *p,
+ size_t len, cksum_type_t cksum_type)
+{
+ switch(cksum_type) {
+ case OBD_CKSUM_CRC32:
+ return crc32_le(cksum, p, len);
+#ifdef HAVE_ADLER
+ case OBD_CKSUM_ADLER:
+ return zlib_adler32(cksum, p, len);
+#endif
+ default:
+ CERROR("Unknown checksum type (%x)!!!\n", cksum_type);
+ LBUG();
+ }
+ return 0;
+}
+
+static inline obd_flag cksum_type_pack(cksum_type_t cksum_type)
+{
+ switch(cksum_type) {
+ case OBD_CKSUM_CRC32:
+ return OBD_FL_CKSUM_CRC32;
+#ifdef HAVE_ADLER
+ case OBD_CKSUM_ADLER:
+ return OBD_FL_CKSUM_ADLER;
+#endif
+ default:
+ CWARN("unknown cksum type %x\n", cksum_type);
+ }
+ return OBD_FL_CKSUM_CRC32;
+}
+
+static inline cksum_type_t cksum_type_unpack(obd_flag o_flags)
+{
+ o_flags &= OBD_FL_CKSUM_ALL;
+ if ((o_flags - 1) & o_flags)
+ CWARN("several checksum types are set: %x\n", o_flags);
+ if (o_flags & OBD_FL_CKSUM_ADLER)
+#ifdef HAVE_ADLER
+ return OBD_CKSUM_ADLER;
+#else
+ CWARN("checksum type is set to adler32, but adler32 is not "
+ "supported (%x)\n", o_flags);
+#endif
+ return OBD_CKSUM_CRC32;
+}
+