CEPH filesystem development
 help / color / mirror / Atom feed
* [PATCH 0/3] libceph, ceph: get rid of ack vs commit
@ 2017-02-23 20:59 Ilya Dryomov
  2017-02-23 20:59 ` [PATCH 1/3] ceph: remove special ack vs commit behavior Ilya Dryomov
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Ilya Dryomov @ 2017-02-23 20:59 UTC (permalink / raw)
  To: ceph-devel; +Cc: Sage Weil, Zheng Yan

Hello,

This is all straightforward and passes tests, but I'd greatly
appreciate an extra set of eyes on the fs/ceph bits.

Thanks,

                Ilya


Ilya Dryomov (3):
  ceph: remove special ack vs commit behavior
  libceph: get rid of ack vs commit
  libceph, rbd, ceph: WRITE | ONDISK -> WRITE

 drivers/block/rbd.c             |   6 +-
 fs/ceph/addr.c                  |  14 ++---
 fs/ceph/caps.c                  |   2 -
 fs/ceph/file.c                  | 101 ++-------------------------------
 fs/ceph/inode.c                 |   9 ---
 fs/ceph/super.c                 |   1 -
 fs/ceph/super.h                 |   4 +-
 include/linux/ceph/osd_client.h |   6 +-
 net/ceph/cls_lock_client.c      |  12 ++--
 net/ceph/osd_client.c           | 120 ++++++++++------------------------------
 10 files changed, 48 insertions(+), 227 deletions(-)

-- 
2.4.3


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/3] ceph: remove special ack vs commit behavior
  2017-02-23 20:59 [PATCH 0/3] libceph, ceph: get rid of ack vs commit Ilya Dryomov
@ 2017-02-23 20:59 ` Ilya Dryomov
  2017-02-23 23:00   ` Jeff Layton
  2017-02-23 20:59 ` [PATCH 2/3] libceph: get rid of ack vs commit Ilya Dryomov
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: Ilya Dryomov @ 2017-02-23 20:59 UTC (permalink / raw)
  To: ceph-devel; +Cc: Sage Weil, Zheng Yan

- ask for a commit reply instead of an ack reply in
  __ceph_pool_perm_get()
- don't ask for both ack and commit replies in ceph_sync_write()
- since just only one reply is requested now, i_unsafe_writes list
  will always be empty -- kill ceph_sync_write_wait() and go back to
  a standard ->evict_inode()

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
---
 fs/ceph/addr.c  |  2 +-
 fs/ceph/caps.c  |  2 --
 fs/ceph/file.c  | 88 +--------------------------------------------------------
 fs/ceph/inode.c |  9 ------
 fs/ceph/super.c |  1 -
 fs/ceph/super.h |  4 +--
 6 files changed, 3 insertions(+), 103 deletions(-)

diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 4547bbf80e4f..3f0474c55f05 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1872,7 +1872,7 @@ static int __ceph_pool_perm_get(struct ceph_inode_info *ci,
 		goto out_unlock;
 	}
 
-	wr_req->r_flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ACK;
+	wr_req->r_flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK;
 	osd_req_op_init(wr_req, 0, CEPH_OSD_OP_CREATE, CEPH_OSD_OP_FLAG_EXCL);
 	ceph_oloc_copy(&wr_req->r_base_oloc, &rd_req->r_base_oloc);
 	ceph_oid_copy(&wr_req->r_base_oid, &rd_req->r_base_oid);
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 3c2dfd72e5b2..cd966f276a8d 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -2091,8 +2091,6 @@ int ceph_fsync(struct file *file, loff_t start, loff_t end, int datasync)
 
 	dout("fsync %p%s\n", inode, datasync ? " datasync" : "");
 
-	ceph_sync_write_wait(inode);
-
 	ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
 	if (ret < 0)
 		goto out;
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index a91a4f1fc837..ae9f8999fc07 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -726,89 +726,6 @@ static void ceph_aio_retry_work(struct work_struct *work)
 	kfree(aio_work);
 }
 
-/*
- * Write commit request unsafe callback, called to tell us when a
- * request is unsafe (that is, in flight--has been handed to the
- * messenger to send to its target osd).  It is called again when
- * we've received a response message indicating the request is
- * "safe" (its CEPH_OSD_FLAG_ONDISK flag is set), or when a request
- * is completed early (and unsuccessfully) due to a timeout or
- * interrupt.
- *
- * This is used if we requested both an ACK and ONDISK commit reply
- * from the OSD.
- */
-static void ceph_sync_write_unsafe(struct ceph_osd_request *req, bool unsafe)
-{
-	struct ceph_inode_info *ci = ceph_inode(req->r_inode);
-
-	dout("%s %p tid %llu %ssafe\n", __func__, req, req->r_tid,
-		unsafe ? "un" : "");
-	if (unsafe) {
-		ceph_get_cap_refs(ci, CEPH_CAP_FILE_WR);
-		spin_lock(&ci->i_unsafe_lock);
-		list_add_tail(&req->r_unsafe_item,
-			      &ci->i_unsafe_writes);
-		spin_unlock(&ci->i_unsafe_lock);
-
-		complete_all(&req->r_completion);
-	} else {
-		spin_lock(&ci->i_unsafe_lock);
-		list_del_init(&req->r_unsafe_item);
-		spin_unlock(&ci->i_unsafe_lock);
-		ceph_put_cap_refs(ci, CEPH_CAP_FILE_WR);
-	}
-}
-
-/*
- * Wait on any unsafe replies for the given inode.  First wait on the
- * newest request, and make that the upper bound.  Then, if there are
- * more requests, keep waiting on the oldest as long as it is still older
- * than the original request.
- */
-void ceph_sync_write_wait(struct inode *inode)
-{
-	struct ceph_inode_info *ci = ceph_inode(inode);
-	struct list_head *head = &ci->i_unsafe_writes;
-	struct ceph_osd_request *req;
-	u64 last_tid;
-
-	if (!S_ISREG(inode->i_mode))
-		return;
-
-	spin_lock(&ci->i_unsafe_lock);
-	if (list_empty(head))
-		goto out;
-
-	/* set upper bound as _last_ entry in chain */
-
-	req = list_last_entry(head, struct ceph_osd_request,
-			      r_unsafe_item);
-	last_tid = req->r_tid;
-
-	do {
-		ceph_osdc_get_request(req);
-		spin_unlock(&ci->i_unsafe_lock);
-
-		dout("sync_write_wait on tid %llu (until %llu)\n",
-		     req->r_tid, last_tid);
-		wait_for_completion(&req->r_done_completion);
-		ceph_osdc_put_request(req);
-
-		spin_lock(&ci->i_unsafe_lock);
-		/*
-		 * from here on look at first entry in chain, since we
-		 * only want to wait for anything older than last_tid
-		 */
-		if (list_empty(head))
-			break;
-		req = list_first_entry(head, struct ceph_osd_request,
-				       r_unsafe_item);
-	} while (req->r_tid < last_tid);
-out:
-	spin_unlock(&ci->i_unsafe_lock);
-}
-
 static ssize_t
 ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
 		       struct ceph_snap_context *snapc,
@@ -1050,8 +967,7 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
 
 	flags = CEPH_OSD_FLAG_ORDERSNAP |
 		CEPH_OSD_FLAG_ONDISK |
-		CEPH_OSD_FLAG_WRITE |
-		CEPH_OSD_FLAG_ACK;
+		CEPH_OSD_FLAG_WRITE;
 
 	while ((len = iov_iter_count(from)) > 0) {
 		size_t left;
@@ -1097,8 +1013,6 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
 			goto out;
 		}
 
-		/* get a second commit callback */
-		req->r_unsafe_callback = ceph_sync_write_unsafe;
 		req->r_inode = inode;
 
 		osd_req_op_extent_osd_data_pages(req, 0, pages, len, 0,
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 68f46132b157..fd8f771f99b7 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -499,7 +499,6 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
 	ci->i_rdcache_gen = 0;
 	ci->i_rdcache_revoking = 0;
 
-	INIT_LIST_HEAD(&ci->i_unsafe_writes);
 	INIT_LIST_HEAD(&ci->i_unsafe_dirops);
 	INIT_LIST_HEAD(&ci->i_unsafe_iops);
 	spin_lock_init(&ci->i_unsafe_lock);
@@ -583,14 +582,6 @@ int ceph_drop_inode(struct inode *inode)
 	return 1;
 }
 
-void ceph_evict_inode(struct inode *inode)
-{
-	/* wait unsafe sync writes */
-	ceph_sync_write_wait(inode);
-	truncate_inode_pages_final(&inode->i_data);
-	clear_inode(inode);
-}
-
 static inline blkcnt_t calc_inode_blocks(u64 size)
 {
 	return (size + (1<<9) - 1) >> 9;
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index a0a0b6d02f89..0ec8d0114e57 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -757,7 +757,6 @@ static const struct super_operations ceph_super_ops = {
 	.destroy_inode	= ceph_destroy_inode,
 	.write_inode    = ceph_write_inode,
 	.drop_inode	= ceph_drop_inode,
-	.evict_inode	= ceph_evict_inode,
 	.sync_fs        = ceph_sync_fs,
 	.put_super	= ceph_put_super,
 	.show_options   = ceph_show_options,
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 950170136be9..e9410bcf4113 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -343,7 +343,6 @@ struct ceph_inode_info {
 	u32 i_rdcache_gen;      /* incremented each time we get FILE_CACHE. */
 	u32 i_rdcache_revoking; /* RDCACHE gen to async invalidate, if any */
 
-	struct list_head i_unsafe_writes; /* uncommitted sync writes */
 	struct list_head i_unsafe_dirops; /* uncommitted mds dir ops */
 	struct list_head i_unsafe_iops;   /* uncommitted mds inode ops */
 	spinlock_t i_unsafe_lock;
@@ -753,7 +752,6 @@ extern const struct inode_operations ceph_file_iops;
 extern struct inode *ceph_alloc_inode(struct super_block *sb);
 extern void ceph_destroy_inode(struct inode *inode);
 extern int ceph_drop_inode(struct inode *inode);
-extern void ceph_evict_inode(struct inode *inode);
 
 extern struct inode *ceph_get_inode(struct super_block *sb,
 				    struct ceph_vino vino);
@@ -933,7 +931,7 @@ extern int ceph_atomic_open(struct inode *dir, struct dentry *dentry,
 extern int ceph_release(struct inode *inode, struct file *filp);
 extern void ceph_fill_inline_data(struct inode *inode, struct page *locked_page,
 				  char *data, size_t len);
-extern void ceph_sync_write_wait(struct inode *inode);
+
 /* dir.c */
 extern const struct file_operations ceph_dir_fops;
 extern const struct file_operations ceph_snapdir_fops;
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/3] libceph: get rid of ack vs commit
  2017-02-23 20:59 [PATCH 0/3] libceph, ceph: get rid of ack vs commit Ilya Dryomov
  2017-02-23 20:59 ` [PATCH 1/3] ceph: remove special ack vs commit behavior Ilya Dryomov
@ 2017-02-23 20:59 ` Ilya Dryomov
  2017-02-23 21:43   ` Sage Weil
  2017-02-23 23:14   ` Jeff Layton
  2017-02-23 20:59 ` [PATCH 3/3] libceph, rbd, ceph: WRITE | ONDISK -> WRITE Ilya Dryomov
  2017-02-24 14:52 ` [PATCH 0/3] libceph, ceph: get rid of ack vs commit Sage Weil
  3 siblings, 2 replies; 11+ messages in thread
From: Ilya Dryomov @ 2017-02-23 20:59 UTC (permalink / raw)
  To: ceph-devel; +Cc: Sage Weil, Zheng Yan

- CEPH_OSD_FLAG_ACK shouldn't be set anymore, so assert on it
- remove support for handling ack replies (OSDs will send ack replies
  only if clients request them)
- drop the "do lingering callbacks under osd->lock" logic from
  handle_reply() -- lreq->lock is sufficient in all three cases

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
---
 include/linux/ceph/osd_client.h |   6 +--
 net/ceph/osd_client.c           | 113 +++++++++-------------------------------
 2 files changed, 27 insertions(+), 92 deletions(-)

diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index 03a6653d329a..f2ce9cd5ede6 100644
--- a/include/linux/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -22,7 +22,6 @@ struct ceph_osd_client;
  * completion callback for async writepages
  */
 typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *);
-typedef void (*ceph_osdc_unsafe_callback_t)(struct ceph_osd_request *, bool);
 
 #define CEPH_HOMELESS_OSD	-1
 
@@ -170,15 +169,12 @@ struct ceph_osd_request {
 	unsigned int		r_num_ops;
 
 	int               r_result;
-	bool              r_got_reply;
 
 	struct ceph_osd_client *r_osdc;
 	struct kref       r_kref;
 	bool              r_mempool;
-	struct completion r_completion;
-	struct completion r_done_completion;  /* fsync waiter */
+	struct completion r_completion;       /* fsync waiter */
 	ceph_osdc_callback_t r_callback;
-	ceph_osdc_unsafe_callback_t r_unsafe_callback;
 	struct list_head  r_unsafe_item;
 
 	struct inode *r_inode;         	      /* for use by callbacks */
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index ac4753421d0c..e1c6c2b4a295 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -460,7 +460,6 @@ static void request_init(struct ceph_osd_request *req)
 
 	kref_init(&req->r_kref);
 	init_completion(&req->r_completion);
-	init_completion(&req->r_done_completion);
 	RB_CLEAR_NODE(&req->r_node);
 	RB_CLEAR_NODE(&req->r_mc_node);
 	INIT_LIST_HEAD(&req->r_unsafe_item);
@@ -1637,7 +1636,7 @@ static void __submit_request(struct ceph_osd_request *req, bool wrlocked)
 	bool need_send = false;
 	bool promoted = false;
 
-	WARN_ON(req->r_tid || req->r_got_reply);
+	WARN_ON(req->r_tid);
 	dout("%s req %p wrlocked %d\n", __func__, req, wrlocked);
 
 again:
@@ -1705,17 +1704,10 @@ static void __submit_request(struct ceph_osd_request *req, bool wrlocked)
 
 static void account_request(struct ceph_osd_request *req)
 {
-	unsigned int mask = CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK;
+	WARN_ON(req->r_flags & CEPH_OSD_FLAG_ACK);
+	WARN_ON(!(req->r_flags & (CEPH_OSD_FLAG_READ | CEPH_OSD_FLAG_WRITE)));
 
-	if (req->r_flags & CEPH_OSD_FLAG_READ) {
-		WARN_ON(req->r_flags & mask);
-		req->r_flags |= CEPH_OSD_FLAG_ACK;
-	} else if (req->r_flags & CEPH_OSD_FLAG_WRITE)
-		WARN_ON(!(req->r_flags & mask));
-	else
-		WARN_ON(1);
-
-	WARN_ON(req->r_unsafe_callback && (req->r_flags & mask) != mask);
+	req->r_flags |= CEPH_OSD_FLAG_ONDISK;
 	atomic_inc(&req->r_osdc->num_requests);
 }
 
@@ -1750,15 +1742,15 @@ static void finish_request(struct ceph_osd_request *req)
 
 static void __complete_request(struct ceph_osd_request *req)
 {
-	if (req->r_callback)
+	if (req->r_callback) {
+		dout("%s req %p tid %llu cb %pf result %d\n", __func__, req,
+		     req->r_tid, req->r_callback, req->r_result);
 		req->r_callback(req);
-	else
-		complete_all(&req->r_completion);
+	}
 }
 
 /*
- * Note that this is open-coded in handle_reply(), which has to deal
- * with ack vs commit, dup acks, etc.
+ * This is open-coded in handle_reply().
  */
 static void complete_request(struct ceph_osd_request *req, int err)
 {
@@ -1767,7 +1759,7 @@ static void complete_request(struct ceph_osd_request *req, int err)
 	req->r_result = err;
 	finish_request(req);
 	__complete_request(req);
-	complete_all(&req->r_done_completion);
+	complete_all(&req->r_completion);
 	ceph_osdc_put_request(req);
 }
 
@@ -1793,7 +1785,7 @@ static void cancel_request(struct ceph_osd_request *req)
 
 	cancel_map_check(req);
 	finish_request(req);
-	complete_all(&req->r_done_completion);
+	complete_all(&req->r_completion);
 	ceph_osdc_put_request(req);
 }
 
@@ -2170,7 +2162,6 @@ static void linger_commit_cb(struct ceph_osd_request *req)
 	mutex_lock(&lreq->lock);
 	dout("%s lreq %p linger_id %llu result %d\n", __func__, lreq,
 	     lreq->linger_id, req->r_result);
-	WARN_ON(!__linger_registered(lreq));
 	linger_reg_commit_complete(lreq, req->r_result);
 	lreq->committed = true;
 
@@ -2786,31 +2777,8 @@ static int decode_MOSDOpReply(const struct ceph_msg *msg, struct MOSDOpReply *m)
 }
 
 /*
- * We are done with @req if
- *   - @m is a safe reply, or
- *   - @m is an unsafe reply and we didn't want a safe one
- */
-static bool done_request(const struct ceph_osd_request *req,
-			 const struct MOSDOpReply *m)
-{
-	return (m->result < 0 ||
-		(m->flags & CEPH_OSD_FLAG_ONDISK) ||
-		!(req->r_flags & CEPH_OSD_FLAG_ONDISK));
-}
-
-/*
- * handle osd op reply.  either call the callback if it is specified,
- * or do the completion to wake up the waiting thread.
- *
- * ->r_unsafe_callback is set?	yes			no
- *
- * first reply is OK (needed	r_cb/r_completion,	r_cb/r_completion,
- * any or needed/got safe)	r_done_completion	r_done_completion
- *
- * first reply is unsafe	r_unsafe_cb(true)	(nothing)
- *
- * when we get the safe reply	r_unsafe_cb(false),	r_cb/r_completion,
- *				r_done_completion	r_done_completion
+ * Handle MOSDOpReply.  Set ->r_result and call the callback if it is
+ * specified.
  */
 static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg)
 {
@@ -2819,7 +2787,6 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg)
 	struct MOSDOpReply m;
 	u64 tid = le64_to_cpu(msg->hdr.tid);
 	u32 data_len = 0;
-	bool already_acked;
 	int ret;
 	int i;
 
@@ -2898,50 +2865,22 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg)
 		       le32_to_cpu(msg->hdr.data_len), req->r_tid);
 		goto fail_request;
 	}
-	dout("%s req %p tid %llu acked %d result %d data_len %u\n", __func__,
-	     req, req->r_tid, req->r_got_reply, m.result, data_len);
-
-	already_acked = req->r_got_reply;
-	if (!already_acked) {
-		req->r_result = m.result ?: data_len;
-		req->r_replay_version = m.replay_version; /* struct */
-		req->r_got_reply = true;
-	} else if (!(m.flags & CEPH_OSD_FLAG_ONDISK)) {
-		dout("req %p tid %llu dup ack\n", req, req->r_tid);
-		goto out_unlock_session;
-	}
-
-	if (done_request(req, &m)) {
-		finish_request(req);
-		if (req->r_linger) {
-			WARN_ON(req->r_unsafe_callback);
-			dout("req %p tid %llu cb (locked)\n", req, req->r_tid);
-			__complete_request(req);
-		}
-	}
+	dout("%s req %p tid %llu result %d data_len %u\n", __func__,
+	     req, req->r_tid, m.result, data_len);
 
+	/*
+	 * Since we only ever request ONDISK, we should only ever get
+	 * one (type of) reply back.
+	 */
+	WARN_ON(!(m.flags & CEPH_OSD_FLAG_ONDISK));
+	req->r_result = m.result ?: data_len;
+	finish_request(req);
 	mutex_unlock(&osd->lock);
 	up_read(&osdc->lock);
 
-	if (done_request(req, &m)) {
-		if (already_acked && req->r_unsafe_callback) {
-			dout("req %p tid %llu safe-cb\n", req, req->r_tid);
-			req->r_unsafe_callback(req, false);
-		} else if (!req->r_linger) {
-			dout("req %p tid %llu cb\n", req, req->r_tid);
-			__complete_request(req);
-		}
-		complete_all(&req->r_done_completion);
-		ceph_osdc_put_request(req);
-	} else {
-		if (req->r_unsafe_callback) {
-			dout("req %p tid %llu unsafe-cb\n", req, req->r_tid);
-			req->r_unsafe_callback(req, true);
-		} else {
-			WARN_ON(1);
-		}
-	}
-
+	__complete_request(req);
+	complete_all(&req->r_completion);
+	ceph_osdc_put_request(req);
 	return;
 
 fail_request:
@@ -3541,7 +3480,7 @@ void ceph_osdc_sync(struct ceph_osd_client *osdc)
 			up_read(&osdc->lock);
 			dout("%s waiting on req %p tid %llu last_tid %llu\n",
 			     __func__, req, req->r_tid, last_tid);
-			wait_for_completion(&req->r_done_completion);
+			wait_for_completion(&req->r_completion);
 			ceph_osdc_put_request(req);
 			goto again;
 		}
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/3] libceph, rbd, ceph: WRITE | ONDISK -> WRITE
  2017-02-23 20:59 [PATCH 0/3] libceph, ceph: get rid of ack vs commit Ilya Dryomov
  2017-02-23 20:59 ` [PATCH 1/3] ceph: remove special ack vs commit behavior Ilya Dryomov
  2017-02-23 20:59 ` [PATCH 2/3] libceph: get rid of ack vs commit Ilya Dryomov
@ 2017-02-23 20:59 ` Ilya Dryomov
  2017-02-24  1:40   ` Jeff Layton
  2017-02-24 14:52 ` [PATCH 0/3] libceph, ceph: get rid of ack vs commit Sage Weil
  3 siblings, 1 reply; 11+ messages in thread
From: Ilya Dryomov @ 2017-02-23 20:59 UTC (permalink / raw)
  To: ceph-devel; +Cc: Sage Weil, Zheng Yan

CEPH_OSD_FLAG_ONDISK is set in account_request().

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
---
 drivers/block/rbd.c        |  6 ++----
 fs/ceph/addr.c             | 14 +++++---------
 fs/ceph/file.c             | 15 ++++-----------
 net/ceph/cls_lock_client.c | 12 ++++++------
 net/ceph/osd_client.c      |  9 ++++-----
 5 files changed, 21 insertions(+), 35 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 24e05b02d033..2acdb99cbabd 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1981,8 +1981,7 @@ static struct ceph_osd_request *rbd_osd_req_create(
 
 	return __rbd_osd_req_create(rbd_dev, snapc, num_ops,
 	    (op_type == OBJ_OP_WRITE || op_type == OBJ_OP_DISCARD) ?
-	    CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK : CEPH_OSD_FLAG_READ,
-	    obj_request);
+	    CEPH_OSD_FLAG_WRITE : CEPH_OSD_FLAG_READ, obj_request);
 }
 
 /*
@@ -2008,8 +2007,7 @@ rbd_osd_req_create_copyup(struct rbd_obj_request *obj_request)
 
 	return __rbd_osd_req_create(img_request->rbd_dev,
 				    img_request->snapc, num_osd_ops,
-				    CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
-				    obj_request);
+				    CEPH_OSD_FLAG_WRITE, obj_request);
 }
 
 static void rbd_osd_req_destroy(struct ceph_osd_request *osd_req)
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 3f0474c55f05..6ecb920602ed 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1018,8 +1018,7 @@ static int ceph_writepages_start(struct address_space *mapping,
 					&ci->i_layout, vino,
 					offset, &len, 0, num_ops,
 					CEPH_OSD_OP_WRITE,
-					CEPH_OSD_FLAG_WRITE |
-					CEPH_OSD_FLAG_ONDISK,
+					CEPH_OSD_FLAG_WRITE,
 					snapc, truncate_seq,
 					truncate_size, false);
 		if (IS_ERR(req)) {
@@ -1029,8 +1028,7 @@ static int ceph_writepages_start(struct address_space *mapping,
 						min(num_ops,
 						    CEPH_OSD_SLAB_OPS),
 						CEPH_OSD_OP_WRITE,
-						CEPH_OSD_FLAG_WRITE |
-						CEPH_OSD_FLAG_ONDISK,
+						CEPH_OSD_FLAG_WRITE,
 						snapc, truncate_seq,
 						truncate_size, true);
 			BUG_ON(IS_ERR(req));
@@ -1680,8 +1678,7 @@ int ceph_uninline_data(struct file *filp, struct page *locked_page)
 
 	req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
 				    ceph_vino(inode), 0, &len, 0, 1,
-				    CEPH_OSD_OP_CREATE,
-				    CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
+				    CEPH_OSD_OP_CREATE, CEPH_OSD_FLAG_WRITE,
 				    NULL, 0, 0, false);
 	if (IS_ERR(req)) {
 		err = PTR_ERR(req);
@@ -1698,8 +1695,7 @@ int ceph_uninline_data(struct file *filp, struct page *locked_page)
 
 	req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
 				    ceph_vino(inode), 0, &len, 1, 3,
-				    CEPH_OSD_OP_WRITE,
-				    CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
+				    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
 				    NULL, ci->i_truncate_seq,
 				    ci->i_truncate_size, false);
 	if (IS_ERR(req)) {
@@ -1872,7 +1868,7 @@ static int __ceph_pool_perm_get(struct ceph_inode_info *ci,
 		goto out_unlock;
 	}
 
-	wr_req->r_flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK;
+	wr_req->r_flags = CEPH_OSD_FLAG_WRITE;
 	osd_req_op_init(wr_req, 0, CEPH_OSD_OP_CREATE, CEPH_OSD_OP_FLAG_EXCL);
 	ceph_oloc_copy(&wr_req->r_base_oloc, &rd_req->r_base_oloc);
 	ceph_oid_copy(&wr_req->r_base_oid, &rd_req->r_base_oid);
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index ae9f8999fc07..5a7134ef13d3 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -690,9 +690,7 @@ static void ceph_aio_retry_work(struct work_struct *work)
 		goto out;
 	}
 
-	req->r_flags =	CEPH_OSD_FLAG_ORDERSNAP |
-			CEPH_OSD_FLAG_ONDISK |
-			CEPH_OSD_FLAG_WRITE;
+	req->r_flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
 	ceph_oloc_copy(&req->r_base_oloc, &orig_req->r_base_oloc);
 	ceph_oid_copy(&req->r_base_oid, &orig_req->r_base_oid);
 
@@ -764,9 +762,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
 		if (ret2 < 0)
 			dout("invalidate_inode_pages2_range returned %d\n", ret2);
 
-		flags = CEPH_OSD_FLAG_ORDERSNAP |
-			CEPH_OSD_FLAG_ONDISK |
-			CEPH_OSD_FLAG_WRITE;
+		flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
 	} else {
 		flags = CEPH_OSD_FLAG_READ;
 	}
@@ -965,9 +961,7 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
 	if (ret < 0)
 		dout("invalidate_inode_pages2_range returned %d\n", ret);
 
-	flags = CEPH_OSD_FLAG_ORDERSNAP |
-		CEPH_OSD_FLAG_ONDISK |
-		CEPH_OSD_FLAG_WRITE;
+	flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
 
 	while ((len = iov_iter_count(from)) > 0) {
 		size_t left;
@@ -1462,8 +1456,7 @@ static int ceph_zero_partial_object(struct inode *inode,
 					ceph_vino(inode),
 					offset, length,
 					0, 1, op,
-					CEPH_OSD_FLAG_WRITE |
-					CEPH_OSD_FLAG_ONDISK,
+					CEPH_OSD_FLAG_WRITE,
 					NULL, 0, 0, false);
 	if (IS_ERR(req)) {
 		ret = PTR_ERR(req);
diff --git a/net/ceph/cls_lock_client.c b/net/ceph/cls_lock_client.c
index f13a1ea87459..b9233b990399 100644
--- a/net/ceph/cls_lock_client.c
+++ b/net/ceph/cls_lock_client.c
@@ -69,8 +69,8 @@ int ceph_cls_lock(struct ceph_osd_client *osdc,
 	dout("%s lock_name %s type %d cookie %s tag %s desc %s flags 0x%x\n",
 	     __func__, lock_name, type, cookie, tag, desc, flags);
 	ret = ceph_osdc_call(osdc, oid, oloc, "lock", "lock",
-			     CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
-			     lock_op_page, lock_op_buf_size, NULL, NULL);
+			     CEPH_OSD_FLAG_WRITE, lock_op_page,
+			     lock_op_buf_size, NULL, NULL);
 
 	dout("%s: status %d\n", __func__, ret);
 	__free_page(lock_op_page);
@@ -117,8 +117,8 @@ int ceph_cls_unlock(struct ceph_osd_client *osdc,
 
 	dout("%s lock_name %s cookie %s\n", __func__, lock_name, cookie);
 	ret = ceph_osdc_call(osdc, oid, oloc, "lock", "unlock",
-			     CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
-			     unlock_op_page, unlock_op_buf_size, NULL, NULL);
+			     CEPH_OSD_FLAG_WRITE, unlock_op_page,
+			     unlock_op_buf_size, NULL, NULL);
 
 	dout("%s: status %d\n", __func__, ret);
 	__free_page(unlock_op_page);
@@ -170,8 +170,8 @@ int ceph_cls_break_lock(struct ceph_osd_client *osdc,
 	dout("%s lock_name %s cookie %s locker %s%llu\n", __func__, lock_name,
 	     cookie, ENTITY_NAME(*locker));
 	ret = ceph_osdc_call(osdc, oid, oloc, "lock", "break_lock",
-			     CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
-			     break_op_page, break_op_buf_size, NULL, NULL);
+			     CEPH_OSD_FLAG_WRITE, break_op_page,
+			     break_op_buf_size, NULL, NULL);
 
 	dout("%s: status %d\n", __func__, ret);
 	__free_page(break_op_page);
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index e1c6c2b4a295..5c0938ddddf6 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -1704,7 +1704,7 @@ static void __submit_request(struct ceph_osd_request *req, bool wrlocked)
 
 static void account_request(struct ceph_osd_request *req)
 {
-	WARN_ON(req->r_flags & CEPH_OSD_FLAG_ACK);
+	WARN_ON(req->r_flags & (CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK));
 	WARN_ON(!(req->r_flags & (CEPH_OSD_FLAG_READ | CEPH_OSD_FLAG_WRITE)));
 
 	req->r_flags |= CEPH_OSD_FLAG_ONDISK;
@@ -3539,7 +3539,7 @@ ceph_osdc_watch(struct ceph_osd_client *osdc,
 
 	ceph_oid_copy(&lreq->t.base_oid, oid);
 	ceph_oloc_copy(&lreq->t.base_oloc, oloc);
-	lreq->t.flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK;
+	lreq->t.flags = CEPH_OSD_FLAG_WRITE;
 	lreq->mtime = CURRENT_TIME;
 
 	lreq->reg_req = alloc_linger_request(lreq);
@@ -3597,7 +3597,7 @@ int ceph_osdc_unwatch(struct ceph_osd_client *osdc,
 
 	ceph_oid_copy(&req->r_base_oid, &lreq->t.base_oid);
 	ceph_oloc_copy(&req->r_base_oloc, &lreq->t.base_oloc);
-	req->r_flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK;
+	req->r_flags = CEPH_OSD_FLAG_WRITE;
 	req->r_mtime = CURRENT_TIME;
 	osd_req_op_watch_init(req, 0, lreq->linger_id,
 			      CEPH_OSD_WATCH_OP_UNWATCH);
@@ -4163,8 +4163,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
 	int page_align = off & ~PAGE_MASK;
 
 	req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 0, 1,
-				    CEPH_OSD_OP_WRITE,
-				    CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
+				    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
 				    snapc, truncate_seq, truncate_size,
 				    true);
 	if (IS_ERR(req))
-- 
2.4.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] libceph: get rid of ack vs commit
  2017-02-23 20:59 ` [PATCH 2/3] libceph: get rid of ack vs commit Ilya Dryomov
@ 2017-02-23 21:43   ` Sage Weil
  2017-02-23 22:18     ` Ilya Dryomov
  2017-02-23 23:14   ` Jeff Layton
  1 sibling, 1 reply; 11+ messages in thread
From: Sage Weil @ 2017-02-23 21:43 UTC (permalink / raw)
  To: Ilya Dryomov; +Cc: ceph-devel, Zheng Yan

On Thu, 23 Feb 2017, Ilya Dryomov wrote:
> - CEPH_OSD_FLAG_ACK shouldn't be set anymore, so assert on it

Conversely, FLAG_ONDISK should *always* be set.  We should probably assert 
that as well.

sage

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] libceph: get rid of ack vs commit
  2017-02-23 21:43   ` Sage Weil
@ 2017-02-23 22:18     ` Ilya Dryomov
  0 siblings, 0 replies; 11+ messages in thread
From: Ilya Dryomov @ 2017-02-23 22:18 UTC (permalink / raw)
  To: Sage Weil; +Cc: Ceph Development, Zheng Yan

On Thu, Feb 23, 2017 at 10:43 PM, Sage Weil <sage@newdream.net> wrote:
> On Thu, 23 Feb 2017, Ilya Dryomov wrote:
>> - CEPH_OSD_FLAG_ACK shouldn't be set anymore, so assert on it
>
> Conversely, FLAG_ONDISK should *always* be set.  We should probably assert
> that as well.

That's asserted in handle_reply().  Also in the next patch I assert
that neither is set and then set ONDISK in submit_request().

Thanks,

                Ilya

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] ceph: remove special ack vs commit behavior
  2017-02-23 20:59 ` [PATCH 1/3] ceph: remove special ack vs commit behavior Ilya Dryomov
@ 2017-02-23 23:00   ` Jeff Layton
  0 siblings, 0 replies; 11+ messages in thread
From: Jeff Layton @ 2017-02-23 23:00 UTC (permalink / raw)
  To: Ilya Dryomov, ceph-devel; +Cc: Sage Weil, Zheng Yan

On Thu, 2017-02-23 at 21:59 +0100, Ilya Dryomov wrote:
> - ask for a commit reply instead of an ack reply in
>   __ceph_pool_perm_get()
> - don't ask for both ack and commit replies in ceph_sync_write()
> - since just only one reply is requested now, i_unsafe_writes list
>   will always be empty -- kill ceph_sync_write_wait() and go back to
>   a standard ->evict_inode()
> 
> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
> ---
>  fs/ceph/addr.c  |  2 +-
>  fs/ceph/caps.c  |  2 --
>  fs/ceph/file.c  | 88 +--------------------------------------------------------
>  fs/ceph/inode.c |  9 ------
>  fs/ceph/super.c |  1 -
>  fs/ceph/super.h |  4 +--
>  6 files changed, 3 insertions(+), 103 deletions(-)
> 

Love that diffstat!

Reviewed-by: Jeff Layton <jlayton@redhat.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] libceph: get rid of ack vs commit
  2017-02-23 20:59 ` [PATCH 2/3] libceph: get rid of ack vs commit Ilya Dryomov
  2017-02-23 21:43   ` Sage Weil
@ 2017-02-23 23:14   ` Jeff Layton
  2017-02-24 11:19     ` Ilya Dryomov
  1 sibling, 1 reply; 11+ messages in thread
From: Jeff Layton @ 2017-02-23 23:14 UTC (permalink / raw)
  To: Ilya Dryomov, ceph-devel; +Cc: Sage Weil, Zheng Yan

On Thu, 2017-02-23 at 21:59 +0100, Ilya Dryomov wrote:
> - CEPH_OSD_FLAG_ACK shouldn't be set anymore, so assert on it
> - remove support for handling ack replies (OSDs will send ack replies
>   only if clients request them)
> - drop the "do lingering callbacks under osd->lock" logic from
>   handle_reply() -- lreq->lock is sufficient in all three cases
> 
> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
> ---
>  include/linux/ceph/osd_client.h |   6 +--
>  net/ceph/osd_client.c           | 113 +++++++++-------------------------------
>  2 files changed, 27 insertions(+), 92 deletions(-)
> 
> diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
> index 03a6653d329a..f2ce9cd5ede6 100644
> --- a/include/linux/ceph/osd_client.h
> +++ b/include/linux/ceph/osd_client.h
> @@ -22,7 +22,6 @@ struct ceph_osd_client;
>   * completion callback for async writepages
>   */
>  typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *);
> -typedef void (*ceph_osdc_unsafe_callback_t)(struct ceph_osd_request *, bool);
>  
>  #define CEPH_HOMELESS_OSD	-1
>  
> @@ -170,15 +169,12 @@ struct ceph_osd_request {
>  	unsigned int		r_num_ops;
>  
>  	int               r_result;
> -	bool              r_got_reply;
>  
>  	struct ceph_osd_client *r_osdc;
>  	struct kref       r_kref;
>  	bool              r_mempool;
> -	struct completion r_completion;
> -	struct completion r_done_completion;  /* fsync waiter */
> +	struct completion r_completion;       /* fsync waiter */

Minor nit: surely we also wait on that for things other than fsync?

>  	ceph_osdc_callback_t r_callback;
> -	ceph_osdc_unsafe_callback_t r_unsafe_callback;
>  	struct list_head  r_unsafe_item;
>  
>  	struct inode *r_inode;         	      /* for use by callbacks */
> diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
> index ac4753421d0c..e1c6c2b4a295 100644
> --- a/net/ceph/osd_client.c
> +++ b/net/ceph/osd_client.c
> @@ -460,7 +460,6 @@ static void request_init(struct ceph_osd_request *req)
>  
>  	kref_init(&req->r_kref);
>  	init_completion(&req->r_completion);
> -	init_completion(&req->r_done_completion);
>  	RB_CLEAR_NODE(&req->r_node);
>  	RB_CLEAR_NODE(&req->r_mc_node);
>  	INIT_LIST_HEAD(&req->r_unsafe_item);
> @@ -1637,7 +1636,7 @@ static void __submit_request(struct ceph_osd_request *req, bool wrlocked)
>  	bool need_send = false;
>  	bool promoted = false;
>  
> -	WARN_ON(req->r_tid || req->r_got_reply);
> +	WARN_ON(req->r_tid);
>  	dout("%s req %p wrlocked %d\n", __func__, req, wrlocked);
>  
>  again:
> @@ -1705,17 +1704,10 @@ static void __submit_request(struct ceph_osd_request *req, bool wrlocked)
>  
>  static void account_request(struct ceph_osd_request *req)
>  {
> -	unsigned int mask = CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK;
> +	WARN_ON(req->r_flags & CEPH_OSD_FLAG_ACK);
> +	WARN_ON(!(req->r_flags & (CEPH_OSD_FLAG_READ | CEPH_OSD_FLAG_WRITE)));

nit: Those should probably be WARN_ON_ONCE. This gets called fairly
frequently, and one stack trace is probably enough to point out the
problem.

>  
> -	if (req->r_flags & CEPH_OSD_FLAG_READ) {
> -		WARN_ON(req->r_flags & mask);
> -		req->r_flags |= CEPH_OSD_FLAG_ACK;
> -	} else if (req->r_flags & CEPH_OSD_FLAG_WRITE)
> -		WARN_ON(!(req->r_flags & mask));
> -	else
> -		WARN_ON(1);
> -
> -	WARN_ON(req->r_unsafe_callback && (req->r_flags & mask) != mask);
> +	req->r_flags |= CEPH_OSD_FLAG_ONDISK;
>  	atomic_inc(&req->r_osdc->num_requests);
>  }
>  
> @@ -1750,15 +1742,15 @@ static void finish_request(struct ceph_osd_request *req)
>  
>  static void __complete_request(struct ceph_osd_request *req)
>  {
> -	if (req->r_callback)
> +	if (req->r_callback) {
> +		dout("%s req %p tid %llu cb %pf result %d\n", __func__, req,
> +		     req->r_tid, req->r_callback, req->r_result);
>  		req->r_callback(req);
> -	else
> -		complete_all(&req->r_completion);
> +	}
>  }
>  
>  /*
> - * Note that this is open-coded in handle_reply(), which has to deal
> - * with ack vs commit, dup acks, etc.
> + * This is open-coded in handle_reply().
>   */
>  static void complete_request(struct ceph_osd_request *req, int err)
>  {
> @@ -1767,7 +1759,7 @@ static void complete_request(struct ceph_osd_request *req, int err)
>  	req->r_result = err;
>  	finish_request(req);
>  	__complete_request(req);
> -	complete_all(&req->r_done_completion);
> +	complete_all(&req->r_completion);
>  	ceph_osdc_put_request(req);
>  }
>  
> @@ -1793,7 +1785,7 @@ static void cancel_request(struct ceph_osd_request *req)
>  
>  	cancel_map_check(req);
>  	finish_request(req);
> -	complete_all(&req->r_done_completion);
> +	complete_all(&req->r_completion);
>  	ceph_osdc_put_request(req);
>  }
>  
> @@ -2170,7 +2162,6 @@ static void linger_commit_cb(struct ceph_osd_request *req)
>  	mutex_lock(&lreq->lock);
>  	dout("%s lreq %p linger_id %llu result %d\n", __func__, lreq,
>  	     lreq->linger_id, req->r_result);
> -	WARN_ON(!__linger_registered(lreq));
>  	linger_reg_commit_complete(lreq, req->r_result);
>  	lreq->committed = true;
>  
> @@ -2786,31 +2777,8 @@ static int decode_MOSDOpReply(const struct ceph_msg *msg, struct MOSDOpReply *m)
>  }
>  
>  /*
> - * We are done with @req if
> - *   - @m is a safe reply, or
> - *   - @m is an unsafe reply and we didn't want a safe one
> - */
> -static bool done_request(const struct ceph_osd_request *req,
> -			 const struct MOSDOpReply *m)
> -{
> -	return (m->result < 0 ||
> -		(m->flags & CEPH_OSD_FLAG_ONDISK) ||
> -		!(req->r_flags & CEPH_OSD_FLAG_ONDISK));
> -}
> -
> -/*
> - * handle osd op reply.  either call the callback if it is specified,
> - * or do the completion to wake up the waiting thread.
> - *
> - * ->r_unsafe_callback is set?	yes			no
> - *
> - * first reply is OK (needed	r_cb/r_completion,	r_cb/r_completion,
> - * any or needed/got safe)	r_done_completion	r_done_completion
> - *
> - * first reply is unsafe	r_unsafe_cb(true)	(nothing)
> - *
> - * when we get the safe reply	r_unsafe_cb(false),	r_cb/r_completion,
> - *				r_done_completion	r_done_completion
> + * Handle MOSDOpReply.  Set ->r_result and call the callback if it is
> + * specified.
>   */
>  static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg)
>  {
> @@ -2819,7 +2787,6 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg)
>  	struct MOSDOpReply m;
>  	u64 tid = le64_to_cpu(msg->hdr.tid);
>  	u32 data_len = 0;
> -	bool already_acked;
>  	int ret;
>  	int i;
>  
> @@ -2898,50 +2865,22 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg)
>  		       le32_to_cpu(msg->hdr.data_len), req->r_tid);
>  		goto fail_request;
>  	}
> -	dout("%s req %p tid %llu acked %d result %d data_len %u\n", __func__,
> -	     req, req->r_tid, req->r_got_reply, m.result, data_len);
> -
> -	already_acked = req->r_got_reply;
> -	if (!already_acked) {
> -		req->r_result = m.result ?: data_len;
> -		req->r_replay_version = m.replay_version; /* struct */
> -		req->r_got_reply = true;
> -	} else if (!(m.flags & CEPH_OSD_FLAG_ONDISK)) {
> -		dout("req %p tid %llu dup ack\n", req, req->r_tid);
> -		goto out_unlock_session;
> -	}
> -
> -	if (done_request(req, &m)) {
> -		finish_request(req);
> -		if (req->r_linger) {
> -			WARN_ON(req->r_unsafe_callback);
> -			dout("req %p tid %llu cb (locked)\n", req, req->r_tid);
> -			__complete_request(req);
> -		}
> -	}
> +	dout("%s req %p tid %llu result %d data_len %u\n", __func__,
> +	     req, req->r_tid, m.result, data_len);
>  
> +	/*
> +	 * Since we only ever request ONDISK, we should only ever get
> +	 * one (type of) reply back.
> +	 */
> +	WARN_ON(!(m.flags & CEPH_OSD_FLAG_ONDISK));

Again, maybe a WARN_ON_ONCE here too.

> +	req->r_result = m.result ?: data_len;
> +	finish_request(req);
>  	mutex_unlock(&osd->lock);
>  	up_read(&osdc->lock);
>  
> -	if (done_request(req, &m)) {
> -		if (already_acked && req->r_unsafe_callback) {
> -			dout("req %p tid %llu safe-cb\n", req, req->r_tid);
> -			req->r_unsafe_callback(req, false);
> -		} else if (!req->r_linger) {
> -			dout("req %p tid %llu cb\n", req, req->r_tid);
> -			__complete_request(req);
> -		}
> -		complete_all(&req->r_done_completion);
> -		ceph_osdc_put_request(req);
> -	} else {
> -		if (req->r_unsafe_callback) {
> -			dout("req %p tid %llu unsafe-cb\n", req, req->r_tid);
> -			req->r_unsafe_callback(req, true);
> -		} else {
> -			WARN_ON(1);
> -		}
> -	}
> -
> +	__complete_request(req);
> +	complete_all(&req->r_completion);
> +	ceph_osdc_put_request(req);
>  	return;
>  
>  fail_request:
> @@ -3541,7 +3480,7 @@ void ceph_osdc_sync(struct ceph_osd_client *osdc)
>  			up_read(&osdc->lock);
>  			dout("%s waiting on req %p tid %llu last_tid %llu\n",
>  			     __func__, req, req->r_tid, last_tid);
> -			wait_for_completion(&req->r_done_completion);
> +			wait_for_completion(&req->r_completion);
>  			ceph_osdc_put_request(req);
>  			goto again;
>  		}

Other than that minor stuff, this looks like a nice cleanup.

Reviewed-by: Jeff Layton <jlayton@redhat.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/3] libceph, rbd, ceph: WRITE | ONDISK -> WRITE
  2017-02-23 20:59 ` [PATCH 3/3] libceph, rbd, ceph: WRITE | ONDISK -> WRITE Ilya Dryomov
@ 2017-02-24  1:40   ` Jeff Layton
  0 siblings, 0 replies; 11+ messages in thread
From: Jeff Layton @ 2017-02-24  1:40 UTC (permalink / raw)
  To: Ilya Dryomov, ceph-devel; +Cc: Sage Weil, Zheng Yan

On Thu, 2017-02-23 at 21:59 +0100, Ilya Dryomov wrote:
> CEPH_OSD_FLAG_ONDISK is set in account_request().
> 
> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
> ---
>  drivers/block/rbd.c        |  6 ++----
>  fs/ceph/addr.c             | 14 +++++---------
>  fs/ceph/file.c             | 15 ++++-----------
>  net/ceph/cls_lock_client.c | 12 ++++++------
>  net/ceph/osd_client.c      |  9 ++++-----
>  5 files changed, 21 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index 24e05b02d033..2acdb99cbabd 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -1981,8 +1981,7 @@ static struct ceph_osd_request *rbd_osd_req_create(
>  
>  	return __rbd_osd_req_create(rbd_dev, snapc, num_ops,
>  	    (op_type == OBJ_OP_WRITE || op_type == OBJ_OP_DISCARD) ?
> -	    CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK : CEPH_OSD_FLAG_READ,
> -	    obj_request);
> +	    CEPH_OSD_FLAG_WRITE : CEPH_OSD_FLAG_READ, obj_request);
>  }
>  
>  /*
> @@ -2008,8 +2007,7 @@ rbd_osd_req_create_copyup(struct rbd_obj_request *obj_request)
>  
>  	return __rbd_osd_req_create(img_request->rbd_dev,
>  				    img_request->snapc, num_osd_ops,
> -				    CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
> -				    obj_request);
> +				    CEPH_OSD_FLAG_WRITE, obj_request);
>  }
>  
>  static void rbd_osd_req_destroy(struct ceph_osd_request *osd_req)
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index 3f0474c55f05..6ecb920602ed 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -1018,8 +1018,7 @@ static int ceph_writepages_start(struct address_space *mapping,
>  					&ci->i_layout, vino,
>  					offset, &len, 0, num_ops,
>  					CEPH_OSD_OP_WRITE,
> -					CEPH_OSD_FLAG_WRITE |
> -					CEPH_OSD_FLAG_ONDISK,
> +					CEPH_OSD_FLAG_WRITE,
>  					snapc, truncate_seq,
>  					truncate_size, false);
>  		if (IS_ERR(req)) {
> @@ -1029,8 +1028,7 @@ static int ceph_writepages_start(struct address_space *mapping,
>  						min(num_ops,
>  						    CEPH_OSD_SLAB_OPS),
>  						CEPH_OSD_OP_WRITE,
> -						CEPH_OSD_FLAG_WRITE |
> -						CEPH_OSD_FLAG_ONDISK,
> +						CEPH_OSD_FLAG_WRITE,
>  						snapc, truncate_seq,
>  						truncate_size, true);
>  			BUG_ON(IS_ERR(req));
> @@ -1680,8 +1678,7 @@ int ceph_uninline_data(struct file *filp, struct page *locked_page)
>  
>  	req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
>  				    ceph_vino(inode), 0, &len, 0, 1,
> -				    CEPH_OSD_OP_CREATE,
> -				    CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
> +				    CEPH_OSD_OP_CREATE, CEPH_OSD_FLAG_WRITE,
>  				    NULL, 0, 0, false);
>  	if (IS_ERR(req)) {
>  		err = PTR_ERR(req);
> @@ -1698,8 +1695,7 @@ int ceph_uninline_data(struct file *filp, struct page *locked_page)
>  
>  	req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
>  				    ceph_vino(inode), 0, &len, 1, 3,
> -				    CEPH_OSD_OP_WRITE,
> -				    CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
> +				    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
>  				    NULL, ci->i_truncate_seq,
>  				    ci->i_truncate_size, false);
>  	if (IS_ERR(req)) {
> @@ -1872,7 +1868,7 @@ static int __ceph_pool_perm_get(struct ceph_inode_info *ci,
>  		goto out_unlock;
>  	}
>  
> -	wr_req->r_flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK;
> +	wr_req->r_flags = CEPH_OSD_FLAG_WRITE;
>  	osd_req_op_init(wr_req, 0, CEPH_OSD_OP_CREATE, CEPH_OSD_OP_FLAG_EXCL);
>  	ceph_oloc_copy(&wr_req->r_base_oloc, &rd_req->r_base_oloc);
>  	ceph_oid_copy(&wr_req->r_base_oid, &rd_req->r_base_oid);
> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> index ae9f8999fc07..5a7134ef13d3 100644
> --- a/fs/ceph/file.c
> +++ b/fs/ceph/file.c
> @@ -690,9 +690,7 @@ static void ceph_aio_retry_work(struct work_struct *work)
>  		goto out;
>  	}
>  
> -	req->r_flags =	CEPH_OSD_FLAG_ORDERSNAP |
> -			CEPH_OSD_FLAG_ONDISK |
> -			CEPH_OSD_FLAG_WRITE;
> +	req->r_flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
>  	ceph_oloc_copy(&req->r_base_oloc, &orig_req->r_base_oloc);
>  	ceph_oid_copy(&req->r_base_oid, &orig_req->r_base_oid);
>  
> @@ -764,9 +762,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
>  		if (ret2 < 0)
>  			dout("invalidate_inode_pages2_range returned %d\n", ret2);
>  
> -		flags = CEPH_OSD_FLAG_ORDERSNAP |
> -			CEPH_OSD_FLAG_ONDISK |
> -			CEPH_OSD_FLAG_WRITE;
> +		flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
>  	} else {
>  		flags = CEPH_OSD_FLAG_READ;
>  	}
> @@ -965,9 +961,7 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
>  	if (ret < 0)
>  		dout("invalidate_inode_pages2_range returned %d\n", ret);
>  
> -	flags = CEPH_OSD_FLAG_ORDERSNAP |
> -		CEPH_OSD_FLAG_ONDISK |
> -		CEPH_OSD_FLAG_WRITE;
> +	flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE;
>  
>  	while ((len = iov_iter_count(from)) > 0) {
>  		size_t left;
> @@ -1462,8 +1456,7 @@ static int ceph_zero_partial_object(struct inode *inode,
>  					ceph_vino(inode),
>  					offset, length,
>  					0, 1, op,
> -					CEPH_OSD_FLAG_WRITE |
> -					CEPH_OSD_FLAG_ONDISK,
> +					CEPH_OSD_FLAG_WRITE,
>  					NULL, 0, 0, false);
>  	if (IS_ERR(req)) {
>  		ret = PTR_ERR(req);
> diff --git a/net/ceph/cls_lock_client.c b/net/ceph/cls_lock_client.c
> index f13a1ea87459..b9233b990399 100644
> --- a/net/ceph/cls_lock_client.c
> +++ b/net/ceph/cls_lock_client.c
> @@ -69,8 +69,8 @@ int ceph_cls_lock(struct ceph_osd_client *osdc,
>  	dout("%s lock_name %s type %d cookie %s tag %s desc %s flags 0x%x\n",
>  	     __func__, lock_name, type, cookie, tag, desc, flags);
>  	ret = ceph_osdc_call(osdc, oid, oloc, "lock", "lock",
> -			     CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
> -			     lock_op_page, lock_op_buf_size, NULL, NULL);
> +			     CEPH_OSD_FLAG_WRITE, lock_op_page,
> +			     lock_op_buf_size, NULL, NULL);
>  
>  	dout("%s: status %d\n", __func__, ret);
>  	__free_page(lock_op_page);
> @@ -117,8 +117,8 @@ int ceph_cls_unlock(struct ceph_osd_client *osdc,
>  
>  	dout("%s lock_name %s cookie %s\n", __func__, lock_name, cookie);
>  	ret = ceph_osdc_call(osdc, oid, oloc, "lock", "unlock",
> -			     CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
> -			     unlock_op_page, unlock_op_buf_size, NULL, NULL);
> +			     CEPH_OSD_FLAG_WRITE, unlock_op_page,
> +			     unlock_op_buf_size, NULL, NULL);
>  
>  	dout("%s: status %d\n", __func__, ret);
>  	__free_page(unlock_op_page);
> @@ -170,8 +170,8 @@ int ceph_cls_break_lock(struct ceph_osd_client *osdc,
>  	dout("%s lock_name %s cookie %s locker %s%llu\n", __func__, lock_name,
>  	     cookie, ENTITY_NAME(*locker));
>  	ret = ceph_osdc_call(osdc, oid, oloc, "lock", "break_lock",
> -			     CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK,
> -			     break_op_page, break_op_buf_size, NULL, NULL);
> +			     CEPH_OSD_FLAG_WRITE, break_op_page,
> +			     break_op_buf_size, NULL, NULL);
>  
>  	dout("%s: status %d\n", __func__, ret);
>  	__free_page(break_op_page);
> diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
> index e1c6c2b4a295..5c0938ddddf6 100644
> --- a/net/ceph/osd_client.c
> +++ b/net/ceph/osd_client.c
> @@ -1704,7 +1704,7 @@ static void __submit_request(struct ceph_osd_request *req, bool wrlocked)
>  
>  static void account_request(struct ceph_osd_request *req)
>  {
> -	WARN_ON(req->r_flags & CEPH_OSD_FLAG_ACK);
> +	WARN_ON(req->r_flags & (CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK));
>  	WARN_ON(!(req->r_flags & (CEPH_OSD_FLAG_READ | CEPH_OSD_FLAG_WRITE)));
>  
>  	req->r_flags |= CEPH_OSD_FLAG_ONDISK;
> @@ -3539,7 +3539,7 @@ ceph_osdc_watch(struct ceph_osd_client *osdc,
>  
>  	ceph_oid_copy(&lreq->t.base_oid, oid);
>  	ceph_oloc_copy(&lreq->t.base_oloc, oloc);
> -	lreq->t.flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK;
> +	lreq->t.flags = CEPH_OSD_FLAG_WRITE;
>  	lreq->mtime = CURRENT_TIME;
>  
>  	lreq->reg_req = alloc_linger_request(lreq);
> @@ -3597,7 +3597,7 @@ int ceph_osdc_unwatch(struct ceph_osd_client *osdc,
>  
>  	ceph_oid_copy(&req->r_base_oid, &lreq->t.base_oid);
>  	ceph_oloc_copy(&req->r_base_oloc, &lreq->t.base_oloc);
> -	req->r_flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK;
> +	req->r_flags = CEPH_OSD_FLAG_WRITE;
>  	req->r_mtime = CURRENT_TIME;
>  	osd_req_op_watch_init(req, 0, lreq->linger_id,
>  			      CEPH_OSD_WATCH_OP_UNWATCH);
> @@ -4163,8 +4163,7 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
>  	int page_align = off & ~PAGE_MASK;
>  
>  	req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 0, 1,
> -				    CEPH_OSD_OP_WRITE,
> -				    CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
> +				    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE,
>  				    snapc, truncate_seq, truncate_size,
>  				    true);
>  	if (IS_ERR(req))

Looks good.

Reviewed-by: Jeff Layton <jlayton@redhat.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] libceph: get rid of ack vs commit
  2017-02-23 23:14   ` Jeff Layton
@ 2017-02-24 11:19     ` Ilya Dryomov
  0 siblings, 0 replies; 11+ messages in thread
From: Ilya Dryomov @ 2017-02-24 11:19 UTC (permalink / raw)
  To: Jeff Layton; +Cc: Ceph Development, Sage Weil, Zheng Yan

On Fri, Feb 24, 2017 at 12:14 AM, Jeff Layton <jlayton@redhat.com> wrote:
> On Thu, 2017-02-23 at 21:59 +0100, Ilya Dryomov wrote:
>> - CEPH_OSD_FLAG_ACK shouldn't be set anymore, so assert on it
>> - remove support for handling ack replies (OSDs will send ack replies
>>   only if clients request them)
>> - drop the "do lingering callbacks under osd->lock" logic from
>>   handle_reply() -- lreq->lock is sufficient in all three cases
>>
>> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
>> ---
>>  include/linux/ceph/osd_client.h |   6 +--
>>  net/ceph/osd_client.c           | 113 +++++++++-------------------------------
>>  2 files changed, 27 insertions(+), 92 deletions(-)
>>
>> diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
>> index 03a6653d329a..f2ce9cd5ede6 100644
>> --- a/include/linux/ceph/osd_client.h
>> +++ b/include/linux/ceph/osd_client.h
>> @@ -22,7 +22,6 @@ struct ceph_osd_client;
>>   * completion callback for async writepages
>>   */
>>  typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *);
>> -typedef void (*ceph_osdc_unsafe_callback_t)(struct ceph_osd_request *, bool);
>>
>>  #define CEPH_HOMELESS_OSD    -1
>>
>> @@ -170,15 +169,12 @@ struct ceph_osd_request {
>>       unsigned int            r_num_ops;
>>
>>       int               r_result;
>> -     bool              r_got_reply;
>>
>>       struct ceph_osd_client *r_osdc;
>>       struct kref       r_kref;
>>       bool              r_mempool;
>> -     struct completion r_completion;
>> -     struct completion r_done_completion;  /* fsync waiter */
>> +     struct completion r_completion;       /* fsync waiter */
>
> Minor nit: surely we also wait on that for things other than fsync?

Of course, ceph_osdc_wait_request() waits on it.  I left the comment in
to stress that r_completion is now also used for syncfs.

The difference between r_completion and r_done_completion was that you
were allowed to complete r_completion whenever, while r_done_completion
was used for syncfs, private to osd_client.c.

It's basically meant to convey that you shouldn't mess with it.  I can
change it to "private to osd_client.c" or so, if that's better.

>
>>       ceph_osdc_callback_t r_callback;
>> -     ceph_osdc_unsafe_callback_t r_unsafe_callback;
>>       struct list_head  r_unsafe_item;
>>
>>       struct inode *r_inode;                /* for use by callbacks */
>> diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
>> index ac4753421d0c..e1c6c2b4a295 100644
>> --- a/net/ceph/osd_client.c
>> +++ b/net/ceph/osd_client.c
>> @@ -460,7 +460,6 @@ static void request_init(struct ceph_osd_request *req)
>>
>>       kref_init(&req->r_kref);
>>       init_completion(&req->r_completion);
>> -     init_completion(&req->r_done_completion);
>>       RB_CLEAR_NODE(&req->r_node);
>>       RB_CLEAR_NODE(&req->r_mc_node);
>>       INIT_LIST_HEAD(&req->r_unsafe_item);
>> @@ -1637,7 +1636,7 @@ static void __submit_request(struct ceph_osd_request *req, bool wrlocked)
>>       bool need_send = false;
>>       bool promoted = false;
>>
>> -     WARN_ON(req->r_tid || req->r_got_reply);
>> +     WARN_ON(req->r_tid);
>>       dout("%s req %p wrlocked %d\n", __func__, req, wrlocked);
>>
>>  again:
>> @@ -1705,17 +1704,10 @@ static void __submit_request(struct ceph_osd_request *req, bool wrlocked)
>>
>>  static void account_request(struct ceph_osd_request *req)
>>  {
>> -     unsigned int mask = CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK;
>> +     WARN_ON(req->r_flags & CEPH_OSD_FLAG_ACK);
>> +     WARN_ON(!(req->r_flags & (CEPH_OSD_FLAG_READ | CEPH_OSD_FLAG_WRITE)));
>
> nit: Those should probably be WARN_ON_ONCE. This gets called fairly
> frequently, and one stack trace is probably enough to point out the
> problem.

I usually use WARN_ONs to make sure they are noticed.  We are slowly
transitioning from BUG_ONs -- baby steps... ;)

Thanks,

                Ilya

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/3] libceph, ceph: get rid of ack vs commit
  2017-02-23 20:59 [PATCH 0/3] libceph, ceph: get rid of ack vs commit Ilya Dryomov
                   ` (2 preceding siblings ...)
  2017-02-23 20:59 ` [PATCH 3/3] libceph, rbd, ceph: WRITE | ONDISK -> WRITE Ilya Dryomov
@ 2017-02-24 14:52 ` Sage Weil
  3 siblings, 0 replies; 11+ messages in thread
From: Sage Weil @ 2017-02-24 14:52 UTC (permalink / raw)
  To: Ilya Dryomov; +Cc: ceph-devel, Zheng Yan

On Thu, 23 Feb 2017, Ilya Dryomov wrote:
> Hello,
> 
> This is all straightforward and passes tests, but I'd greatly
> appreciate an extra set of eyes on the fs/ceph bits.
> 
> Thanks,
> 
>                 Ilya
> 
> 
> Ilya Dryomov (3):
>   ceph: remove special ack vs commit behavior
>   libceph: get rid of ack vs commit
>   libceph, rbd, ceph: WRITE | ONDISK -> WRITE
> 
>  drivers/block/rbd.c             |   6 +-
>  fs/ceph/addr.c                  |  14 ++---
>  fs/ceph/caps.c                  |   2 -
>  fs/ceph/file.c                  | 101 ++-------------------------------
>  fs/ceph/inode.c                 |   9 ---
>  fs/ceph/super.c                 |   1 -
>  fs/ceph/super.h                 |   4 +-
>  include/linux/ceph/osd_client.h |   6 +-
>  net/ceph/cls_lock_client.c      |  12 ++--
>  net/ceph/osd_client.c           | 120 ++++++++++------------------------------
>  10 files changed, 48 insertions(+), 227 deletions(-)

Reviewed-by: Sage Weil <sage@redhat.com>

...with the minor nit that the r_completion comment could be clarified!

sage

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-02-24 14:52 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-23 20:59 [PATCH 0/3] libceph, ceph: get rid of ack vs commit Ilya Dryomov
2017-02-23 20:59 ` [PATCH 1/3] ceph: remove special ack vs commit behavior Ilya Dryomov
2017-02-23 23:00   ` Jeff Layton
2017-02-23 20:59 ` [PATCH 2/3] libceph: get rid of ack vs commit Ilya Dryomov
2017-02-23 21:43   ` Sage Weil
2017-02-23 22:18     ` Ilya Dryomov
2017-02-23 23:14   ` Jeff Layton
2017-02-24 11:19     ` Ilya Dryomov
2017-02-23 20:59 ` [PATCH 3/3] libceph, rbd, ceph: WRITE | ONDISK -> WRITE Ilya Dryomov
2017-02-24  1:40   ` Jeff Layton
2017-02-24 14:52 ` [PATCH 0/3] libceph, ceph: get rid of ack vs commit Sage Weil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox