diff --git a/README.md b/README.md index 0647db44..20244bde 100644 --- a/README.md +++ b/README.md @@ -31,15 +31,9 @@ functionality hasn't been implemented. It's appropriate for early adopters and interested developers, not for production use. In that vein, expect significant incompatible changes to both the format -of network messages and persistent structures. To avoid mistakes the -implementation currently calculates a hash of the format and ioctl -header files in the source tree. The kernel module will refuse to mount -a volume created by userspace utilities with a mismatched hash, and it -will refuse to connect to a remote node with a mismatched hash. This -means having to unmount, mkfs, and remount everything across many -functional changes. Once the format is nailed down we'll wire up -forward and back compat machinery and remove this temporary safety -measure. +of network messages and persistent structures. Since the format hash-checking +has now been removed in preparation for release, if there is any doubt, mkfs +is strongly recommended. The current kernel module is developed against the RHEL/CentOS 7.x kernel to minimize the friction of developing and testing with partners' diff --git a/kmod/Makefile b/kmod/Makefile index ab69272c..58963acf 100644 --- a/kmod/Makefile +++ b/kmod/Makefile @@ -16,11 +16,7 @@ SCOUTFS_GIT_DESCRIBE := \ $(shell git describe --all --abbrev=6 --long 2>/dev/null || \ echo no-git) -SCOUTFS_FORMAT_HASH := \ - $(shell cat src/format.h src/ioctl.h | md5sum | cut -b1-16) - SCOUTFS_ARGS := SCOUTFS_GIT_DESCRIBE=$(SCOUTFS_GIT_DESCRIBE) \ - SCOUTFS_FORMAT_HASH=$(SCOUTFS_FORMAT_HASH) \ CONFIG_SCOUTFS_FS=m -C $(SK_KSRC) M=$(CURDIR)/src \ EXTRA_CFLAGS="-Werror" diff --git a/kmod/src/Makefile b/kmod/src/Makefile index bd50ec38..db5f5576 100644 --- a/kmod/src/Makefile +++ b/kmod/src/Makefile @@ -1,7 +1,6 @@ obj-$(CONFIG_SCOUTFS_FS) := scoutfs.o -CFLAGS_super.o = -DSCOUTFS_GIT_DESCRIBE=\"$(SCOUTFS_GIT_DESCRIBE)\" \ - -DSCOUTFS_FORMAT_HASH=0x$(SCOUTFS_FORMAT_HASH)LLU +CFLAGS_super.o = -DSCOUTFS_GIT_DESCRIBE=\"$(SCOUTFS_GIT_DESCRIBE)\" CFLAGS_scoutfs_trace.o = -I$(src) # define_trace.h double include diff --git a/kmod/src/client.c b/kmod/src/client.c index 305794ca..ffe06de8 100644 --- a/kmod/src/client.c +++ b/kmod/src/client.c @@ -282,10 +282,10 @@ static int client_greeting(struct super_block *sb, goto out; } - if (gr->format_hash != super->format_hash) { + if (gr->version != super->version) { scoutfs_warn(sb, "server sent format 0x%llx, client has 0x%llx", - le64_to_cpu(gr->format_hash), - le64_to_cpu(super->format_hash)); + le64_to_cpu(gr->version), + le64_to_cpu(super->version)); ret = -EINVAL; goto out; } @@ -394,7 +394,7 @@ static void scoutfs_client_connect_worker(struct work_struct *work) /* send a greeting to verify endpoints of each connection */ greet.fsid = super->hdr.fsid; - greet.format_hash = super->format_hash; + greet.version = super->version; greet.server_term = cpu_to_le64(client->server_term); greet.unmount_barrier = cpu_to_le64(client->greeting_umb); greet.rid = cpu_to_le64(sbi->rid); diff --git a/kmod/src/format.h b/kmod/src/format.h index 033552bf..93582637 100644 --- a/kmod/src/format.h +++ b/kmod/src/format.h @@ -1,6 +1,9 @@ #ifndef _SCOUTFS_FORMAT_H_ #define _SCOUTFS_FORMAT_H_ +#define SCOUTFS_INTEROP_VERSION 0ULL +#define SCOUTFS_INTEROP_VERSION_STR __stringify(0) + /* statfs(2) f_type */ #define SCOUTFS_SUPER_MAGIC 0x554f4353 /* "SCOU" */ @@ -596,7 +599,7 @@ struct scoutfs_quorum_block { struct scoutfs_super_block { struct scoutfs_block_header hdr; __le64 id; - __le64 format_hash; + __le64 version; __le64 flags; __u8 uuid[SCOUTFS_UUID_BYTES]; __le64 next_ino; @@ -759,7 +762,7 @@ enum scoutfs_dentry_type { */ struct scoutfs_net_greeting { __le64 fsid; - __le64 format_hash; + __le64 version; __le64 server_term; __le64 unmount_barrier; __le64 rid; diff --git a/kmod/src/server.c b/kmod/src/server.c index 57a7e8d5..958343a1 100644 --- a/kmod/src/server.c +++ b/kmod/src/server.c @@ -1141,10 +1141,10 @@ static int server_greeting(struct super_block *sb, goto send_err; } - if (gr->format_hash != super->format_hash) { + if (gr->version != super->version) { scoutfs_warn(sb, "client sent format 0x%llx, server has 0x%llx", - le64_to_cpu(gr->format_hash), - le64_to_cpu(super->format_hash)); + le64_to_cpu(gr->version), + le64_to_cpu(super->version)); ret = -EINVAL; goto send_err; } @@ -1173,7 +1173,7 @@ send_err: err = ret; greet.fsid = super->hdr.fsid; - greet.format_hash = super->format_hash; + greet.version = super->version; greet.server_term = cpu_to_le64(server->term); greet.unmount_barrier = umb; greet.rid = gr->rid; diff --git a/kmod/src/super.c b/kmod/src/super.c index 926531d6..a04150e1 100644 --- a/kmod/src/super.c +++ b/kmod/src/super.c @@ -352,10 +352,10 @@ static int scoutfs_read_super_from_bdev(struct super_block *sb, } - if (super->format_hash != cpu_to_le64(SCOUTFS_FORMAT_HASH)) { - scoutfs_err(sb, "super block has invalid format hash 0x%llx, expected 0x%llx", - le64_to_cpu(super->format_hash), - SCOUTFS_FORMAT_HASH); + if (super->version != cpu_to_le64(SCOUTFS_INTEROP_VERSION)) { + scoutfs_err(sb, "super block has invalid version %llu, expected %llu", + le64_to_cpu(super->version), + SCOUTFS_INTEROP_VERSION); ret = -EINVAL; goto out; } @@ -682,6 +682,10 @@ static int __init scoutfs_module_init(void) ".section .note.git_describe,\"a\"\n" ".string \""SCOUTFS_GIT_DESCRIBE"\\n\"\n" ".previous\n"); + __asm__ __volatile__ ( + ".section .note.scoutfs_interop_version,\"a\"\n" + ".string \""SCOUTFS_INTEROP_VERSION_STR"\\n\"\n" + ".previous\n"); scoutfs_init_counters(); @@ -714,3 +718,4 @@ module_exit(scoutfs_module_exit) MODULE_AUTHOR("Zach Brown "); MODULE_LICENSE("GPL"); MODULE_INFO(git_describe, SCOUTFS_GIT_DESCRIBE); +MODULE_INFO(scoutfs_interop_version, SCOUTFS_INTEROP_VERSION_STR); diff --git a/utils/Makefile b/utils/Makefile index 10eb66aa..e0f76142 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -1,23 +1,11 @@ # -# The userspace utils and kernel module share definitions of physical -# structures and ioctls. If we're in the repo we include the kmod -# headers directly, and hash them directly to calculate the format hash. -# # If we're creating a standalone tarball for distribution we copy the # headers out of the kmod dir into the tarball. And then when we're # building in that tarball we use the headers in src/ directly. # FMTIOC_H := format.h ioctl.h -FMTIOC_DIST := $(addprefix src/,$(FMTIOC_H)) FMTIOC_KMOD := $(addprefix ../kmod/src/,$(FMTIOC_H)) -ifneq ($(wildcard $(firstword $(FMTIOC_KMOD))),) -HASH_FILES := $(FMTIOC_KMOD) -else -HASH_FILES := $(FMTIOC_DIST) -endif -SCOUTFS_FORMAT_HASH := $(shell cat $(HASH_FILES) | md5sum | cut -b1-16) - CFLAGS := -Wall -O2 -Werror -D_FILE_OFFSET_BITS=64 -g -msse4.2 \ -fno-strict-aliasing \ -DSCOUTFS_FORMAT_HASH=0x$(SCOUTFS_FORMAT_HASH)LLU diff --git a/utils/src/mkfs.c b/utils/src/mkfs.c index 7d3b582b..f5306dd1 100644 --- a/utils/src/mkfs.c +++ b/utils/src/mkfs.c @@ -205,7 +205,7 @@ static int do_mkfs(struct mkfs_args *args) pseudo_random_bytes(&super->hdr.fsid, sizeof(super->hdr.fsid)); super->hdr.magic = cpu_to_le32(SCOUTFS_BLOCK_MAGIC_SUPER); super->hdr.seq = cpu_to_le64(1); - super->format_hash = cpu_to_le64(SCOUTFS_FORMAT_HASH); + super->version = cpu_to_le64(SCOUTFS_INTEROP_VERSION); uuid_generate(super->uuid); super->next_ino = cpu_to_le64(SCOUTFS_ROOT_INO + 1); super->next_trans_seq = cpu_to_le64(1); @@ -352,7 +352,7 @@ static int do_mkfs(struct mkfs_args *args) " meta device path: %s\n" " data device path: %s\n" " fsid: %llx\n" - " format hash: %llx\n" + " version: %llx\n" " uuid: %s\n" " 64KB metadata blocks: "SIZE_FMT"\n" " 4KB data blocks: "SIZE_FMT"\n" @@ -360,7 +360,7 @@ static int do_mkfs(struct mkfs_args *args) args->meta_device, args->data_device, le64_to_cpu(super->hdr.fsid), - le64_to_cpu(super->format_hash), + le64_to_cpu(super->version), uuid_str, SIZE_ARGS(le64_to_cpu(super->total_meta_blocks), SCOUTFS_BLOCK_LG_SIZE), diff --git a/utils/src/print.c b/utils/src/print.c index 968068a5..c2ba30a2 100644 --- a/utils/src/print.c +++ b/utils/src/print.c @@ -860,8 +860,8 @@ static void print_super_block(struct scoutfs_super_block *super, u64 blkno) printf("super blkno %llu\n", blkno); print_block_header(&super->hdr, SCOUTFS_BLOCK_SM_SIZE); - printf(" format_hash %llx uuid %s\n", - le64_to_cpu(super->format_hash), uuid_str); + printf(" version %llx uuid %s\n", + le64_to_cpu(super->version), uuid_str); printf(" flags: 0x%016llx\n", le64_to_cpu(super->flags)); server_addr = alloc_addr_str(&super->server_addr);