0001
0002 #ifndef _XFS_CKSUM_H
0003 #define _XFS_CKSUM_H 1
0004
0005 #define XFS_CRC_SEED (~(uint32_t)0)
0006
0007
0008
0009
0010
0011
0012
0013 static inline uint32_t
0014 xfs_start_cksum_safe(char *buffer, size_t length, unsigned long cksum_offset)
0015 {
0016 uint32_t zero = 0;
0017 uint32_t crc;
0018
0019
0020 crc = crc32c(XFS_CRC_SEED, buffer, cksum_offset);
0021
0022
0023 crc = crc32c(crc, &zero, sizeof(__u32));
0024
0025
0026 return crc32c(crc, &buffer[cksum_offset + sizeof(__be32)],
0027 length - (cksum_offset + sizeof(__be32)));
0028 }
0029
0030
0031
0032
0033
0034 static inline uint32_t
0035 xfs_start_cksum_update(char *buffer, size_t length, unsigned long cksum_offset)
0036 {
0037
0038 *(__le32 *)(buffer + cksum_offset) = 0;
0039
0040
0041 return crc32c(XFS_CRC_SEED, buffer, length);
0042 }
0043
0044
0045
0046
0047
0048
0049
0050
0051 static inline __le32
0052 xfs_end_cksum(uint32_t crc)
0053 {
0054 return ~cpu_to_le32(crc);
0055 }
0056
0057
0058
0059
0060
0061
0062
0063 static inline void
0064 xfs_update_cksum(char *buffer, size_t length, unsigned long cksum_offset)
0065 {
0066 uint32_t crc = xfs_start_cksum_update(buffer, length, cksum_offset);
0067
0068 *(__le32 *)(buffer + cksum_offset) = xfs_end_cksum(crc);
0069 }
0070
0071
0072
0073
0074 static inline int
0075 xfs_verify_cksum(char *buffer, size_t length, unsigned long cksum_offset)
0076 {
0077 uint32_t crc = xfs_start_cksum_safe(buffer, length, cksum_offset);
0078
0079 return *(__le32 *)(buffer + cksum_offset) == xfs_end_cksum(crc);
0080 }
0081
0082 #endif