diff mbox

[03/12] libceph: specify position of extent operation

Message ID 1416211026-11524-4-git-send-email-zyan@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yan, Zheng Nov. 17, 2014, 7:56 a.m. UTC
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>
---
 fs/ceph/addr.c                  |  9 ++++++---
 fs/ceph/file.c                  |  8 +++++---
 include/linux/ceph/osd_client.h |  3 ++-
 net/ceph/osd_client.c           | 19 ++++++-------------
 4 files changed, 19 insertions(+), 20 deletions(-)

Comments

Ilya Dryomov Dec. 15, 2014, 1:08 p.m. UTC | #1
On Mon, Nov 17, 2014 at 10:56 AM, Yan, Zheng <zyan@redhat.com> wrote:
> 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>
> ---
>  fs/ceph/addr.c                  |  9 ++++++---
>  fs/ceph/file.c                  |  8 +++++---
>  include/linux/ceph/osd_client.h |  3 ++-
>  net/ceph/osd_client.c           | 19 ++++++-------------
>  4 files changed, 19 insertions(+), 20 deletions(-)
>
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index 18c06bb..f2c7aa8 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)
>              off, len);
>         vino = ceph_vino(inode);
>         req = ceph_osdc_new_request(osdc, &ci->i_layout, vino, off, &len,
> -                                   1, CEPH_OSD_OP_READ,
> +                                   0, 1, CEPH_OSD_OP_READ,
>                                     CEPH_OSD_FLAG_READ, NULL,
>                                     ci->i_truncate_seq, ci->i_truncate_size,
>                                     false);
> @@ -750,7 +750,6 @@ retry:
>         last_snapc = snapc;
>
>         while (!done && index <= end) {
> -               int num_ops = do_sync ? 2 : 1;
>                 unsigned i;
>                 int first;
>                 pgoff_t next;
> @@ -850,7 +849,8 @@ get_more_pages:
>                                 len = wsize;
>                                 req = ceph_osdc_new_request(&fsc->client->osdc,
>                                                         &ci->i_layout, vino,
> -                                                       offset, &len, num_ops,
> +                                                       offset, &len, 0,
> +                                                       do_sync ? 2 : 1,
>                                                         CEPH_OSD_OP_WRITE,
>                                                         CEPH_OSD_FLAG_WRITE |
>                                                         CEPH_OSD_FLAG_ONDISK,
> @@ -862,6 +862,9 @@ get_more_pages:
>                                         break;
>                                 }
>
> +                               if (do_sync)
> +                                       osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
> +
>                                 req->r_callback = writepages_finish;
>                                 req->r_inode = inode;
>
> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> index d7e0da8..c03ac4c 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)
>                 snapc = ci->i_snap_realm->cached_context;
>                 vino = ceph_vino(inode);
>                 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
> -                                           vino, pos, &len,
> +                                           vino, pos, &len, 0,
>                                             2,/*include a 'startsync' command*/
>                                             CEPH_OSD_OP_WRITE, flags, snapc,
>                                             ci->i_truncate_seq,
> @@ -609,6 +609,8 @@ ceph_sync_direct_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos)
>                         break;
>                 }
>
> +               osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
> +
>                 n = iov_iter_get_pages_alloc(from, &pages, len, &start);
>                 if (unlikely(n < 0)) {
>                         ret = n;
> @@ -713,7 +715,7 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos)
>                 snapc = ci->i_snap_realm->cached_context;
>                 vino = ceph_vino(inode);
>                 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
> -                                           vino, pos, &len, 1,
> +                                           vino, pos, &len, 0, 1,
>                                             CEPH_OSD_OP_WRITE, flags, snapc,
>                                             ci->i_truncate_seq,
>                                             ci->i_truncate_size,
> @@ -1111,7 +1113,7 @@ static int ceph_zero_partial_object(struct inode *inode,
>         req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
>                                         ceph_vino(inode),
>                                         offset, length,
> -                                       1, op,
> +                                       0, 1, op,
>                                         CEPH_OSD_FLAG_WRITE |
>                                         CEPH_OSD_FLAG_ONDISK,
>                                         NULL, 0, 0, false);
> diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
> index 1ad217b..d3b8edd 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 *,
>                                       struct ceph_file_layout *layout,
>                                       struct ceph_vino vino,
>                                       u64 offset, u64 *len,
> -                                     int num_ops, int opcode, int flags,
> +                                     unsigned int which, int num_ops,
> +                                     int opcode, int flags,
>                                       struct ceph_snap_context *snapc,
>                                       u32 truncate_seq, u64 truncate_size,
>                                       bool use_mempool);
> diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
> index b991fb6..cb86857 100644
> --- a/net/ceph/osd_client.c
> +++ b/net/ceph/osd_client.c
> @@ -744,7 +744,8 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
>  struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
>                                                struct ceph_file_layout *layout,
>                                                struct ceph_vino vino,
> -                                              u64 off, u64 *plen, int num_ops,
> +                                              u64 off, u64 *plen,
> +                                              unsigned int which, int num_ops,
>                                                int opcode, int flags,
>                                                struct ceph_snap_context *snapc,
>                                                u32 truncate_seq,
> @@ -776,7 +777,7 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
>         }
>
>         if (opcode == CEPH_OSD_OP_CREATE || opcode == CEPH_OSD_OP_DELETE) {
> -               osd_req_op_init(req, 0, opcode);
> +               osd_req_op_init(req, which, opcode);
>         } else {
>                 u32 object_size = le32_to_cpu(layout->fl_object_size);
>                 u32 object_base = off - objoff;
> @@ -789,17 +790,9 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
>                                         truncate_size = object_size;
>                         }
>                 }
> -
> -               osd_req_op_extent_init(req, 0, opcode, objoff, objlen,
> +               osd_req_op_extent_init(req, which, opcode, objoff, objlen,
>                                        truncate_size, truncate_seq);
>         }
> -       /*
> -        * A second op in the ops array means the caller wants to
> -        * also issue a include a 'startsync' command so that the
> -        * osd will flush data quickly.
> -        */
> -       if (num_ops > 1)
> -               osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
>
>         req->r_base_oloc.pool = ceph_file_layout_pg_pool(*layout);
>
> @@ -2666,7 +2659,7 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
>
>         dout("readpages on ino %llx.%llx on %llu~%llu\n", vino.ino,
>              vino.snap, off, *plen);
> -       req = ceph_osdc_new_request(osdc, layout, vino, off, plen, 1,
> +       req = ceph_osdc_new_request(osdc, layout, vino, off, plen, 0, 1,
>                                     CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ,
>                                     NULL, truncate_seq, truncate_size,
>                                     false);
> @@ -2709,7 +2702,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
>         int page_align = off & ~PAGE_MASK;
>
>         BUG_ON(vino.snap != CEPH_NOSNAP);       /* snapshots aren't writeable */
> -       req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 1,
> +       req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 0, 1,
>                                     CEPH_OSD_OP_WRITE,
>                                     CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
>                                     snapc, truncate_seq, truncate_size,

Reviewed-by: Ilya Dryomov <idryomov@redhat.com>

Thanks,

                Ilya
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 18c06bb..f2c7aa8 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)
 	     off, len);
 	vino = ceph_vino(inode);
 	req = ceph_osdc_new_request(osdc, &ci->i_layout, vino, off, &len,
-				    1, CEPH_OSD_OP_READ,
+				    0, 1, CEPH_OSD_OP_READ,
 				    CEPH_OSD_FLAG_READ, NULL,
 				    ci->i_truncate_seq, ci->i_truncate_size,
 				    false);
@@ -750,7 +750,6 @@  retry:
 	last_snapc = snapc;
 
 	while (!done && index <= end) {
-		int num_ops = do_sync ? 2 : 1;
 		unsigned i;
 		int first;
 		pgoff_t next;
@@ -850,7 +849,8 @@  get_more_pages:
 				len = wsize;
 				req = ceph_osdc_new_request(&fsc->client->osdc,
 							&ci->i_layout, vino,
-							offset, &len, num_ops,
+							offset, &len, 0,
+							do_sync ? 2 : 1,
 							CEPH_OSD_OP_WRITE,
 							CEPH_OSD_FLAG_WRITE |
 							CEPH_OSD_FLAG_ONDISK,
@@ -862,6 +862,9 @@  get_more_pages:
 					break;
 				}
 
+				if (do_sync)
+					osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
+
 				req->r_callback = writepages_finish;
 				req->r_inode = inode;
 
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index d7e0da8..c03ac4c 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)
 		snapc = ci->i_snap_realm->cached_context;
 		vino = ceph_vino(inode);
 		req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
-					    vino, pos, &len,
+					    vino, pos, &len, 0,
 					    2,/*include a 'startsync' command*/
 					    CEPH_OSD_OP_WRITE, flags, snapc,
 					    ci->i_truncate_seq,
@@ -609,6 +609,8 @@  ceph_sync_direct_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos)
 			break;
 		}
 
+		osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
+
 		n = iov_iter_get_pages_alloc(from, &pages, len, &start);
 		if (unlikely(n < 0)) {
 			ret = n;
@@ -713,7 +715,7 @@  ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos)
 		snapc = ci->i_snap_realm->cached_context;
 		vino = ceph_vino(inode);
 		req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
-					    vino, pos, &len, 1,
+					    vino, pos, &len, 0, 1,
 					    CEPH_OSD_OP_WRITE, flags, snapc,
 					    ci->i_truncate_seq,
 					    ci->i_truncate_size,
@@ -1111,7 +1113,7 @@  static int ceph_zero_partial_object(struct inode *inode,
 	req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
 					ceph_vino(inode),
 					offset, length,
-					1, op,
+					0, 1, op,
 					CEPH_OSD_FLAG_WRITE |
 					CEPH_OSD_FLAG_ONDISK,
 					NULL, 0, 0, false);
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index 1ad217b..d3b8edd 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 *,
 				      struct ceph_file_layout *layout,
 				      struct ceph_vino vino,
 				      u64 offset, u64 *len,
-				      int num_ops, int opcode, int flags,
+				      unsigned int which, int num_ops,
+				      int opcode, int flags,
 				      struct ceph_snap_context *snapc,
 				      u32 truncate_seq, u64 truncate_size,
 				      bool use_mempool);
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index b991fb6..cb86857 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -744,7 +744,8 @@  static u64 osd_req_encode_op(struct ceph_osd_request *req,
 struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
 					       struct ceph_file_layout *layout,
 					       struct ceph_vino vino,
-					       u64 off, u64 *plen, int num_ops,
+					       u64 off, u64 *plen,
+					       unsigned int which, int num_ops,
 					       int opcode, int flags,
 					       struct ceph_snap_context *snapc,
 					       u32 truncate_seq,
@@ -776,7 +777,7 @@  struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
 	}
 
 	if (opcode == CEPH_OSD_OP_CREATE || opcode == CEPH_OSD_OP_DELETE) {
-		osd_req_op_init(req, 0, opcode);
+		osd_req_op_init(req, which, opcode);
 	} else {
 		u32 object_size = le32_to_cpu(layout->fl_object_size);
 		u32 object_base = off - objoff;
@@ -789,17 +790,9 @@  struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
 					truncate_size = object_size;
 			}
 		}
-
-		osd_req_op_extent_init(req, 0, opcode, objoff, objlen,
+		osd_req_op_extent_init(req, which, opcode, objoff, objlen,
 				       truncate_size, truncate_seq);
 	}
-	/*
-	 * A second op in the ops array means the caller wants to
-	 * also issue a include a 'startsync' command so that the
-	 * osd will flush data quickly.
-	 */
-	if (num_ops > 1)
-		osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC);
 
 	req->r_base_oloc.pool = ceph_file_layout_pg_pool(*layout);
 
@@ -2666,7 +2659,7 @@  int ceph_osdc_readpages(struct ceph_osd_client *osdc,
 
 	dout("readpages on ino %llx.%llx on %llu~%llu\n", vino.ino,
 	     vino.snap, off, *plen);
-	req = ceph_osdc_new_request(osdc, layout, vino, off, plen, 1,
+	req = ceph_osdc_new_request(osdc, layout, vino, off, plen, 0, 1,
 				    CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ,
 				    NULL, truncate_seq, truncate_size,
 				    false);
@@ -2709,7 +2702,7 @@  int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
 	int page_align = off & ~PAGE_MASK;
 
 	BUG_ON(vino.snap != CEPH_NOSNAP);	/* snapshots aren't writeable */
-	req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 1,
+	req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 0, 1,
 				    CEPH_OSD_OP_WRITE,
 				    CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
 				    snapc, truncate_seq, truncate_size,