mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 09:12:07 +00:00
libceph: add CEPH_OSD_OP_ASSERT_VER support
...and record the user_version in the reply in a new field in ceph_osd_request, so we can populate the assert_ver appropriately. Shuffle the fields a bit too so that the new field fits in an existing hole on x86_64. Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Xiubo Li <xiubli@redhat.com> Reviewed-and-tested-by: Luís Henriques <lhenriques@suse.de> Reviewed-by: Milind Changire <mchangir@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
77cdb7e17e
commit
69dd3b3930
@ -198,6 +198,9 @@ struct ceph_osd_req_op {
|
||||
u32 src_fadvise_flags;
|
||||
struct ceph_osd_data osd_data;
|
||||
} copy_from;
|
||||
struct {
|
||||
u64 ver;
|
||||
} assert_ver;
|
||||
};
|
||||
};
|
||||
|
||||
@ -252,6 +255,7 @@ struct ceph_osd_request {
|
||||
struct ceph_osd_client *r_osdc;
|
||||
struct kref r_kref;
|
||||
bool r_mempool;
|
||||
bool r_linger; /* don't resend on failure */
|
||||
struct completion r_completion; /* private to osd_client.c */
|
||||
ceph_osdc_callback_t r_callback;
|
||||
|
||||
@ -264,9 +268,9 @@ struct ceph_osd_request {
|
||||
struct ceph_snap_context *r_snapc; /* for writes */
|
||||
struct timespec64 r_mtime; /* ditto */
|
||||
u64 r_data_offset; /* ditto */
|
||||
bool r_linger; /* don't resend on failure */
|
||||
|
||||
/* internal */
|
||||
u64 r_version; /* data version sent in reply */
|
||||
unsigned long r_stamp; /* jiffies, send or check time */
|
||||
unsigned long r_start_stamp; /* jiffies */
|
||||
ktime_t r_start_latency; /* ktime_t */
|
||||
|
@ -523,6 +523,10 @@ struct ceph_osd_op {
|
||||
struct {
|
||||
__le64 cookie;
|
||||
} __attribute__ ((packed)) notify;
|
||||
struct {
|
||||
__le64 unused;
|
||||
__le64 ver;
|
||||
} __attribute__ ((packed)) assert_ver;
|
||||
struct {
|
||||
__le64 offset, length;
|
||||
__le64 src_offset;
|
||||
|
@ -1048,6 +1048,10 @@ static u32 osd_req_encode_op(struct ceph_osd_op *dst,
|
||||
dst->copy_from.src_fadvise_flags =
|
||||
cpu_to_le32(src->copy_from.src_fadvise_flags);
|
||||
break;
|
||||
case CEPH_OSD_OP_ASSERT_VER:
|
||||
dst->assert_ver.unused = cpu_to_le64(0);
|
||||
dst->assert_ver.ver = cpu_to_le64(src->assert_ver.ver);
|
||||
break;
|
||||
default:
|
||||
pr_err("unsupported osd opcode %s\n",
|
||||
ceph_osd_op_name(src->op));
|
||||
@ -3859,6 +3863,7 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg)
|
||||
* one (type of) reply back.
|
||||
*/
|
||||
WARN_ON(!(m.flags & CEPH_OSD_FLAG_ONDISK));
|
||||
req->r_version = m.user_version;
|
||||
req->r_result = m.result ?: data_len;
|
||||
finish_request(req);
|
||||
mutex_unlock(&osd->lock);
|
||||
|
Loading…
Reference in New Issue
Block a user