Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 482664dd authored by Martin Brandenburg's avatar Martin Brandenburg
Browse files

orangefs: add features op



This is a new userspace operation, which will be done if the client-core
version is greater than or equal to 2.9.6. This will provide a way to
implement optional features and to determine which features are
supported by the client-core. If the client-core version is older than
2.9.6, no optional features are supported and the op will not be done.

The intent is to allow protocol extensions without relying on the
client-core's current behavior of ignoring what it doesn't understand.

Signed-off-by: default avatarMartin Brandenburg <martin@omnibond.com>
parent f2ee3b75
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@

/* this file implements the /dev/pvfs2-req device node */

uint32_t userspace_version;
uint32_t orangefs_userspace_version;

static int open_access_count;

@@ -389,9 +389,9 @@ 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) {
	if (!orangefs_userspace_version) {
		orangefs_userspace_version = head.version;
	} else if (orangefs_userspace_version != head.version) {
		gossip_err("Error: userspace version changes\n");
		return -EPROTO;
	}
@@ -536,7 +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;
	orangefs_userspace_version = 0;
	mutex_unlock(&devreq_mutex);
	return 0;
}
+6 −0
Original line number Diff line number Diff line
@@ -101,6 +101,11 @@ struct orangefs_fs_key_response {
	char fs_key[FS_KEY_BUF_SIZE];
};

/* 2.9.6 */
struct orangefs_features_response {
	__u64 features;
};

struct orangefs_downcall_s {
	__s32 type;
	__s32 status;
@@ -122,6 +127,7 @@ struct orangefs_downcall_s {
		struct orangefs_param_response param;
		struct orangefs_perf_count_response perf_count;
		struct orangefs_fs_key_response fs_key;
		struct orangefs_features_response features;
	} resp;
};

+2 −0
Original line number Diff line number Diff line
@@ -97,6 +97,8 @@ char *get_opname_string(struct orangefs_kernel_op_s *new_op)
			return "OP_FSYNC";
		else if (type == ORANGEFS_VFS_OP_FSKEY)
			return "OP_FSKEY";
		else if (type == ORANGEFS_VFS_OP_FEATURES)
			return "OP_FEATURES";
	}
	return "OP_UNKNOWN?";
}
+4 −0
Original line number Diff line number Diff line
@@ -41,6 +41,10 @@
#define ORANGEFS_VFS_OP_FSYNC          0xFF00EE01
#define ORANGEFS_VFS_OP_FSKEY             0xFF00EE02
#define ORANGEFS_VFS_OP_READDIRPLUS       0xFF00EE03
#define ORANGEFS_VFS_OP_FEATURES	0xFF00EE05 /* 2.9.6 */

/* features is a 64-bit unsigned bitmask */
#define ORANGEFS_FEATURE_READAHEAD 1

/*
 * Misc constants. Please retain them as multiples of 8!
+3 −1
Original line number Diff line number Diff line
@@ -447,6 +447,8 @@ void purge_waiting_ops(void);
/*
 * defined in super.c
 */
extern uint64_t orangefs_features;

struct dentry *orangefs_mount(struct file_system_type *fst,
			   int flags,
			   const char *devname,
@@ -506,7 +508,7 @@ ssize_t orangefs_inode_read(struct inode *inode,
/*
 * defined in devorangefs-req.c
 */
extern uint32_t userspace_version;
extern uint32_t orangefs_userspace_version;

int orangefs_dev_init(void);
void orangefs_dev_cleanup(void);
Loading