aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2014-11-13 01:40:37 -0500
committerIlya Dryomov <idryomov@redhat.com>2014-12-17 12:09:52 -0500
commit715e4cd405cfd67bd058e410b3e599bab2072645 (patch)
tree20b4b1bf1fe86e7719f82c4804228e887592d832
parent864e9197f10c77053bbaf12932f5b200bb4ed3c5 (diff)
libceph: specify position of extent operation
allow specifying position of extent operation in multi-operations osd request. This is required for cephfs to convert inline data to normal data (compare xattr, then write object). Signed-off-by: Yan, Zheng <zyan@redhat.com> Reviewed-by: Ilya Dryomov <idryomov@redhat.com>
-rw-r--r--fs/ceph/addr.c9
-rw-r--r--fs/ceph/file.c8
-rw-r--r--include/linux/ceph/osd_client.h3
-rw-r--r--net/ceph/osd_client.c19
4 files changed, 19 insertions, 20 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 18c06bbaf136..f2c7aa878aa4 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -319,7 +319,7 @@ static int start_read(struct inode *inode, struct list_head *page_list, int max)
319 off, len); 319 off, len);
320 vino = ceph_vino(inode); 320 vino = ceph_vino(inode);
321 req = ceph_osdc_new_request(osdc, &ci->i_layout, vino, off, &len, 321 req = ceph_osdc_new_request(osdc, &ci->i_layout, vino, off, &len,
322 1, CEPH_OSD_OP_READ, 322 0, 1, CEPH_OSD_OP_READ,
323 CEPH_OSD_FLAG_READ, NULL, 323 CEPH_OSD_FLAG_READ, NULL,
324 ci->i_truncate_seq, ci->i_truncate_size, 324 ci->i_truncate_seq, ci->i_truncate_size,
325 false); 325 false);
@@ -750,7 +750,6 @@ retry:
750 last_snapc = snapc; 750 last_snapc = snapc;
751 751
752 while (!done && index <= end) { 752 while (!done && index <= end) {
753 int num_ops = do_sync ? 2 : 1;
754 unsigned i; 753 unsigned i;
755 int first; 754 int first;
756 pgoff_t next; 755 pgoff_t next;
@@ -850,7 +849,8 @@ get_more_pages:
850 len = wsize; 849 len = wsize;
851 req = ceph_osdc_new_request(&fsc->client->osdc, 850 req = ceph_osdc_new_request(&fsc->client->osdc,
852 &ci->i_layout, vino, 851 &ci->i_layout, vino,
853 offset, &len, num_ops, 852 offset, &len, 0,
853 do_sync ? 2 : 1,
854 CEPH_OSD_OP_WRITE, 854 CEPH_OSD_OP_WRITE,
855 CEPH_OSD_FLAG_WRITE | 855 CEPH_OSD_FLAG_WRITE |
856 CEPH_OSD_FLAG_ONDISK, 856 CEPH_OSD_FLAG_ONDISK,
@@ -862,6 +862,9 @@ get_more_pages:
862 break; 862 break;
863 } 863 }
864 864
865 if (do_sync)
866 osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
867
865 req->r_callback = writepages_finish; 868 req->r_callback = writepages_finish;
866 req->r_inode = inode; 869 req->r_inode = inode;
867 870
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index d7e0da8366e6..c03ac4c4bcd1 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -598,7 +598,7 @@ ceph_sync_direct_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos)
598 snapc = ci->i_snap_realm->cached_context; 598 snapc = ci->i_snap_realm->cached_context;
599 vino = ceph_vino(inode); 599 vino = ceph_vino(inode);
600 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout, 600 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
601 vino, pos, &len, 601 vino, pos, &len, 0,
602 2,/*include a 'startsync' command*/ 602 2,/*include a 'startsync' command*/
603 CEPH_OSD_OP_WRITE, flags, snapc, 603 CEPH_OSD_OP_WRITE, flags, snapc,
604 ci->i_truncate_seq, 604 ci->i_truncate_seq,
@@ -609,6 +609,8 @@ ceph_sync_direct_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos)
609 break; 609 break;
610 } 610 }
611 611
612 osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
613
612 n = iov_iter_get_pages_alloc(from, &pages, len, &start); 614 n = iov_iter_get_pages_alloc(from, &pages, len, &start);
613 if (unlikely(n < 0)) { 615 if (unlikely(n < 0)) {
614 ret = n; 616 ret = n;
@@ -713,7 +715,7 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos)
713 snapc = ci->i_snap_realm->cached_context; 715 snapc = ci->i_snap_realm->cached_context;
714 vino = ceph_vino(inode); 716 vino = ceph_vino(inode);
715 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout, 717 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
716 vino, pos, &len, 1, 718 vino, pos, &len, 0, 1,
717 CEPH_OSD_OP_WRITE, flags, snapc, 719 CEPH_OSD_OP_WRITE, flags, snapc,
718 ci->i_truncate_seq, 720 ci->i_truncate_seq,
719 ci->i_truncate_size, 721 ci->i_truncate_size,
@@ -1111,7 +1113,7 @@ static int ceph_zero_partial_object(struct inode *inode,
1111 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout, 1113 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
1112 ceph_vino(inode), 1114 ceph_vino(inode),
1113 offset, length, 1115 offset, length,
1114 1, op, 1116 0, 1, op,
1115 CEPH_OSD_FLAG_WRITE | 1117 CEPH_OSD_FLAG_WRITE |
1116 CEPH_OSD_FLAG_ONDISK, 1118 CEPH_OSD_FLAG_ONDISK,
1117 NULL, 0, 0, false); 1119 NULL, 0, 0, false);
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index bcf9c2180ea5..5d86416d35f2 100644
--- a/include/linux/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -328,7 +328,8 @@ extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *,
328 struct ceph_file_layout *layout, 328 struct ceph_file_layout *layout,
329 struct ceph_vino vino, 329 struct ceph_vino vino,
330 u64 offset, u64 *len, 330 u64 offset, u64 *len,
331 int num_ops, int opcode, int flags, 331 unsigned int which, int num_ops,
332 int opcode, int flags,
332 struct ceph_snap_context *snapc, 333 struct ceph_snap_context *snapc,
333 u32 truncate_seq, u64 truncate_size, 334 u32 truncate_seq, u64 truncate_size,
334 bool use_mempool); 335 bool use_mempool);
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index af1b3ee195e9..53299c7b0ca4 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -753,7 +753,8 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
753struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, 753struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
754 struct ceph_file_layout *layout, 754 struct ceph_file_layout *layout,
755 struct ceph_vino vino, 755 struct ceph_vino vino,
756 u64 off, u64 *plen, int num_ops, 756 u64 off, u64 *plen,
757 unsigned int which, int num_ops,
757 int opcode, int flags, 758 int opcode, int flags,
758 struct ceph_snap_context *snapc, 759 struct ceph_snap_context *snapc,
759 u32 truncate_seq, 760 u32 truncate_seq,
@@ -785,7 +786,7 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
785 } 786 }
786 787
787 if (opcode == CEPH_OSD_OP_CREATE || opcode == CEPH_OSD_OP_DELETE) { 788 if (opcode == CEPH_OSD_OP_CREATE || opcode == CEPH_OSD_OP_DELETE) {
788 osd_req_op_init(req, 0, opcode); 789 osd_req_op_init(req, which, opcode);
789 } else { 790 } else {
790 u32 object_size = le32_to_cpu(layout->fl_object_size); 791 u32 object_size = le32_to_cpu(layout->fl_object_size);
791 u32 object_base = off - objoff; 792 u32 object_base = off - objoff;
@@ -798,17 +799,9 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
798 truncate_size = object_size; 799 truncate_size = object_size;
799 } 800 }
800 } 801 }
801 802 osd_req_op_extent_init(req, which, opcode, objoff, objlen,
802 osd_req_op_extent_init(req, 0, opcode, objoff, objlen,
803 truncate_size, truncate_seq); 803 truncate_size, truncate_seq);
804 } 804 }
805 /*
806 * A second op in the ops array means the caller wants to
807 * also issue a include a 'startsync' command so that the
808 * osd will flush data quickly.
809 */
810 if (num_ops > 1)
811 osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
812 805
813 req->r_base_oloc.pool = ceph_file_layout_pg_pool(*layout); 806 req->r_base_oloc.pool = ceph_file_layout_pg_pool(*layout);
814 807
@@ -2675,7 +2668,7 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
2675 2668
2676 dout("readpages on ino %llx.%llx on %llu~%llu\n", vino.ino, 2669 dout("readpages on ino %llx.%llx on %llu~%llu\n", vino.ino,
2677 vino.snap, off, *plen); 2670 vino.snap, off, *plen);
2678 req = ceph_osdc_new_request(osdc, layout, vino, off, plen, 1, 2671 req = ceph_osdc_new_request(osdc, layout, vino, off, plen, 0, 1,
2679 CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ, 2672 CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ,
2680 NULL, truncate_seq, truncate_size, 2673 NULL, truncate_seq, truncate_size,
2681 false); 2674 false);
@@ -2718,7 +2711,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
2718 int page_align = off & ~PAGE_MASK; 2711 int page_align = off & ~PAGE_MASK;
2719 2712
2720 BUG_ON(vino.snap != CEPH_NOSNAP); /* snapshots aren't writeable */ 2713 BUG_ON(vino.snap != CEPH_NOSNAP); /* snapshots aren't writeable */
2721 req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 1, 2714 req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 0, 1,
2722 CEPH_OSD_OP_WRITE, 2715 CEPH_OSD_OP_WRITE,
2723 CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE, 2716 CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
2724 snapc, truncate_seq, truncate_size, 2717 snapc, truncate_seq, truncate_size,