orangefs: record userspace version for feature compatbility
authorMartin Brandenburg <martin@omnibond.com>
Tue, 9 Aug 2016 19:59:26 +0000 (15:59 -0400)
committerMartin Brandenburg <martin@omnibond.com>
Tue, 9 Aug 2016 20:25:51 +0000 (16:25 -0400)
The client reports its version to the kernel on startup. We already test
that it is above the minimum version. Now we record it in a global
variable so code elsewhere can consult it before making a request the
client may not understand.

Signed-off-by: Martin Brandenburg <martin@omnibond.com>
fs/orangefs/devorangefs-req.c
fs/orangefs/orangefs-kernel.h

index a287a66d94e35189c2f7e226570e76d6e24f5925..7c40e653e526ca8d20165822c627c57ef6415c5c 100644 (file)
@@ -17,6 +17,8 @@
 
 /* this file implements the /dev/pvfs2-req device node */
 
+uint32_t userspace_version;
+
 static int open_access_count;
 
 #define DUMP_DEVICE_ERROR()                                                   \
@@ -387,6 +389,13 @@ static ssize_t orangefs_devreq_write_iter(struct kiocb *iocb,
                return -EPROTO;
        }
 
+       if (!userspace_version) {
+               userspace_version = head.version;
+       } else if (userspace_version != head.version) {
+               gossip_err("Error: userspace version changes\n");
+               return -EPROTO;
+       }
+
        /* remove the op from the in progress hash table */
        op = orangefs_devreq_remove_op(head.tag);
        if (!op) {
@@ -527,6 +536,7 @@ static int orangefs_devreq_release(struct inode *inode, struct file *file)
        gossip_debug(GOSSIP_DEV_DEBUG,
                     "pvfs2-client-core: device close complete\n");
        open_access_count = 0;
+       userspace_version = 0;
        mutex_unlock(&devreq_mutex);
        return 0;
 }
index 633c07a6e3d80530b585c957edc6d5eeae70d042..ff3566a8388f4c54a1ce45752aebdeeaac9ffded 100644 (file)
@@ -506,6 +506,8 @@ ssize_t orangefs_inode_read(struct inode *inode,
 /*
  * defined in devorangefs-req.c
  */
+extern uint32_t userspace_version;
+
 int orangefs_dev_init(void);
 void orangefs_dev_cleanup(void);
 int is_daemon_in_service(void);