aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ceph/osd_client.h10
-rw-r--r--net/ceph/osd_client.c47
2 files changed, 57 insertions, 0 deletions
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index 03aeb27fcc69..bcf9c2180ea5 100644
--- a/include/linux/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -87,6 +87,13 @@ struct ceph_osd_req_op {
87 struct ceph_osd_data osd_data; 87 struct ceph_osd_data osd_data;
88 } extent; 88 } extent;
89 struct { 89 struct {
90 __le32 name_len;
91 __le32 value_len;
92 __u8 cmp_op; /* CEPH_OSD_CMPXATTR_OP_* */
93 __u8 cmp_mode; /* CEPH_OSD_CMPXATTR_MODE_* */
94 struct ceph_osd_data osd_data;
95 } xattr;
96 struct {
90 const char *class_name; 97 const char *class_name;
91 const char *method_name; 98 const char *method_name;
92 struct ceph_osd_data request_info; 99 struct ceph_osd_data request_info;
@@ -295,6 +302,9 @@ extern void osd_req_op_cls_response_data_pages(struct ceph_osd_request *,
295extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req, 302extern void osd_req_op_cls_init(struct ceph_osd_request *osd_req,
296 unsigned int which, u16 opcode, 303 unsigned int which, u16 opcode,
297 const char *class, const char *method); 304 const char *class, const char *method);
305extern int osd_req_op_xattr_init(struct ceph_osd_request *osd_req, unsigned int which,
306 u16 opcode, const char *name, const void *value,
307 size_t size, u8 cmp_op, u8 cmp_mode);
298extern void osd_req_op_watch_init(struct ceph_osd_request *osd_req, 308extern void osd_req_op_watch_init(struct ceph_osd_request *osd_req,
299 unsigned int which, u16 opcode, 309 unsigned int which, u16 opcode,
300 u64 cookie, u64 version, int flag); 310 u64 cookie, u64 version, int flag);
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 1f6c4055adaf..2b0555b36e4d 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -292,6 +292,10 @@ static void osd_req_op_data_release(struct ceph_osd_request *osd_req,
292 ceph_osd_data_release(&op->cls.request_data); 292 ceph_osd_data_release(&op->cls.request_data);
293 ceph_osd_data_release(&op->cls.response_data); 293 ceph_osd_data_release(&op->cls.response_data);
294 break; 294 break;
295 case CEPH_OSD_OP_SETXATTR:
296 case CEPH_OSD_OP_CMPXATTR:
297 ceph_osd_data_release(&op->xattr.osd_data);
298 break;
295 default: 299 default:
296 break; 300 break;
297 } 301 }
@@ -545,6 +549,39 @@ void osd_req_op_cls_init(struct ceph_osd_request *osd_req, unsigned int which,
545} 549}
546EXPORT_SYMBOL(osd_req_op_cls_init); 550EXPORT_SYMBOL(osd_req_op_cls_init);
547 551
552int osd_req_op_xattr_init(struct ceph_osd_request *osd_req, unsigned int which,
553 u16 opcode, const char *name, const void *value,
554 size_t size, u8 cmp_op, u8 cmp_mode)
555{
556 struct ceph_osd_req_op *op = _osd_req_op_init(osd_req, which, opcode);
557 struct ceph_pagelist *pagelist;
558 size_t payload_len;
559
560 BUG_ON(opcode != CEPH_OSD_OP_SETXATTR && opcode != CEPH_OSD_OP_CMPXATTR);
561
562 pagelist = kmalloc(sizeof(*pagelist), GFP_NOFS);
563 if (!pagelist)
564 return -ENOMEM;
565
566 ceph_pagelist_init(pagelist);
567
568 payload_len = strlen(name);
569 op->xattr.name_len = payload_len;
570 ceph_pagelist_append(pagelist, name, payload_len);
571
572 op->xattr.value_len = size;
573 ceph_pagelist_append(pagelist, value, size);
574 payload_len += size;
575
576 op->xattr.cmp_op = cmp_op;
577 op->xattr.cmp_mode = cmp_mode;
578
579 ceph_osd_data_pagelist_init(&op->xattr.osd_data, pagelist);
580 op->payload_len = payload_len;
581 return 0;
582}
583EXPORT_SYMBOL(osd_req_op_xattr_init);
584
548void osd_req_op_watch_init(struct ceph_osd_request *osd_req, 585void osd_req_op_watch_init(struct ceph_osd_request *osd_req,
549 unsigned int which, u16 opcode, 586 unsigned int which, u16 opcode,
550 u64 cookie, u64 version, int flag) 587 u64 cookie, u64 version, int flag)
@@ -676,6 +713,16 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
676 dst->alloc_hint.expected_write_size = 713 dst->alloc_hint.expected_write_size =
677 cpu_to_le64(src->alloc_hint.expected_write_size); 714 cpu_to_le64(src->alloc_hint.expected_write_size);
678 break; 715 break;
716 case CEPH_OSD_OP_SETXATTR:
717 case CEPH_OSD_OP_CMPXATTR:
718 dst->xattr.name_len = cpu_to_le32(src->xattr.name_len);
719 dst->xattr.value_len = cpu_to_le32(src->xattr.value_len);
720 dst->xattr.cmp_op = src->xattr.cmp_op;
721 dst->xattr.cmp_mode = src->xattr.cmp_mode;
722 osd_data = &src->xattr.osd_data;
723 ceph_osdc_msg_data_add(req->r_request, osd_data);
724 request_data_len = osd_data->pagelist->length;
725 break;
679 default: 726 default:
680 pr_err("unsupported osd opcode %s\n", 727 pr_err("unsupported osd opcode %s\n",
681 ceph_osd_op_name(src->op)); 728 ceph_osd_op_name(src->op));