libceph: specify position of extent operation
authorYan, Zheng <zyan@redhat.com>
Thu, 13 Nov 2014 06:40:37 +0000 (14:40 +0800)
committerIlya Dryomov <idryomov@redhat.com>
Wed, 17 Dec 2014 17:09:52 +0000 (20:09 +0300)
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>
fs/ceph/addr.c
fs/ceph/file.c
include/linux/ceph/osd_client.h
net/ceph/osd_client.c

index 18c06bbaf1367ae1f1284b76e708007482b8cbf1..f2c7aa878aa42b068750e47c215b003b4b8a43fe 100644 (file)
@@ -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;
 
index d7e0da8366e6a6f4e454ae75e42bcfdb4a063f6e..c03ac4c4bcd102502ec1142bd25ffae0c70eae34 100644 (file)
@@ -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);
index bcf9c2180ea5e54b3cf72273c446e1864046ccfb..5d86416d35f2223da40fae9e9fd8e312d365026b 100644 (file)
@@ -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);
index af1b3ee195e99d7ec08120de72e07fb9d49cb11d..53299c7b0ca4a516ba48a7c886b8b9539bb29518 100644 (file)
@@ -753,7 +753,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,
@@ -785,7 +786,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;
@@ -798,17 +799,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);
 
@@ -2675,7 +2668,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);
@@ -2718,7 +2711,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,