All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boaz Harrosh <bharrosh@panasas.com>
To: open-osd <osd-dev@open-osd.org>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>
Subject: Re: [osd-dev] [PATCH 2/3] exofs: Move all operations to an io_engine
Date: Mon, 16 Nov 2009 20:00:17 +0200	[thread overview]
Message-ID: <4B019331.8030003@panasas.com> (raw)
In-Reply-To: <4AF9A0D2.4040204@panasas.com>

On 11/10/2009 07:20 PM, Boaz Harrosh wrote:
> 
> In anticipation for multi-device operations, we separate osd operations
> into an abstract I/O API. Currently only one device is used but later
> when adding more devices, we will drive all devices in parallel according
> to a "data_map" that describes how data is arranged on multiple devices.
> The file system level operates, like before, as if there is one object
> (inode-number) and an i_size. The io engine will split this to the same
> object-number but on multiple device.
> 
> At first we introduce Mirror (raid 1) layout. But at the final outcome
> we intend to fully implement the pNFS-Objects data-map, including
> raid 0,4,5,6 over mirrored devices, over multiple device-groups. And
> more. See: http://tools.ietf.org/html/draft-ietf-nfsv4-pnfs-obj-12
> 
> * Define an io_state based API for accessing osd storage devices
>   in an abstract way.
>   Usage:
> 	First a caller allocates an io state with:
> 		exofs_get_io_state(struct exofs_sb_info *sbi,
> 				   struct exofs_io_state** ios);
> 
> 	Then calles one of:
> 		exofs_sbi_create(struct exofs_io_state *ios);
> 		exofs_sbi_remove(struct exofs_io_state *ios);
> 		exofs_sbi_write(struct exofs_io_state *ios);
> 		exofs_sbi_read(struct exofs_io_state *ios);
> 		exofs_oi_truncate(struct exofs_i_info *oi, u64 new_len);
> 
> 	And when done
> 		exofs_put_io_state(struct exofs_io_state *ios);
> 
> * Convert all source files to use this new API
> * Convert from bio_alloc to bio_kmalloc
> * In io engine we make use of the now fixed osd_req_decode_sense
> 
> There are no functional changes or on disk additions after this patch.
> 
> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>

Putting my mailing-list-reader hat produced some "What was that good for?"

Below is the diff of the new posts from the old ones. (New as replay to originals)

---
git diff --stat -p -M -R afb8f9c089c07711104bb26e224440415ba3d324 -- fs/exofs/
 fs/exofs/inode.c |   14 ++++++--
 fs/exofs/ios.c   |   93 +++++++++++++----------------------------------------
 2 files changed, 33 insertions(+), 74 deletions(-)

diff --git b/fs/exofs/inode.c a/fs/exofs/inode.c
index f3f287a..698a863 100644
--- b/fs/exofs/inode.c
+++ a/fs/exofs/inode.c
@@ -444,7 +444,7 @@ static int exofs_readpage(struct file *file, struct page *page)
 	return _readpage(page, false);
 }
 
-/* Callback for osd_write. All writes are asynchronouse */
+/* Callback for osd_write. All writes are asynchronous */
 static void writepages_done(struct exofs_io_state *ios, void *p)
 {
 	struct page_collect *pcol = p;
@@ -1029,9 +1029,15 @@ static void create_done(struct exofs_io_state *ios, void *p)
 	if (unlikely(ret)) {
 		EXOFS_ERR("object=0x%llx creation faild in pid=0x%llx",
 			  _LLU(exofs_oi_objno(oi)), _LLU(sbi->s_pid));
-		make_bad_inode(inode);
-	} else
-		set_obj_created(oi);
+		/*TODO: When FS is corrupted creation can fail, object already
+		 * exist. Get rid of this asynchronous creation, if exist
+		 * increment the obj counter and try the next object. Until we
+		 * succeed. All these dangling objects will be made into lost
+		 * files by chkfs.exofs
+		 */
+	}
+
+	set_obj_created(oi);
 
 	atomic_dec(&inode->i_count);
 	wake_up(&oi->i_wq);
diff --git b/fs/exofs/ios.c a/fs/exofs/ios.c
index 369c364..14b2600 100644
--- b/fs/exofs/ios.c
+++ a/fs/exofs/ios.c
@@ -125,8 +125,15 @@ static void _done_io(struct osd_request *or, void *p)
 
 static int exofs_io_execute(struct exofs_io_state *ios)
 {
+	DECLARE_COMPLETION_ONSTACK(wait);
+	bool sync = (ios->done == NULL);
 	int i, ret;
 
+	if (sync) {
+		ios->done = _sync_done;
+		ios->private = &wait;
+	}
+
 	for (i = 0; i < ios->numdevs; i++) {
 		struct osd_request *or = ios->per_dev[i].or;
 		if (unlikely(!or))
@@ -140,6 +147,8 @@ static int exofs_io_execute(struct exofs_io_state *ios)
 		}
 	}
 
+	kref_init(&ios->kref);
+
 	for (i = 0; i < ios->numdevs; i++) {
 		struct osd_request *or = ios->per_dev[i].or;
 		if (unlikely(!or))
@@ -150,7 +159,13 @@ static int exofs_io_execute(struct exofs_io_state *ios)
 	}
 
 	kref_put(&ios->kref, _last_io);
-	return 0;
+	ret = 0;
+
+	if (sync) {
+		wait_for_completion(&wait);
+		ret = exofs_check_io(ios, NULL);
+	}
+	return ret;
 }
 
 int exofs_check_io(struct exofs_io_state *ios, u64 *resid)
@@ -192,16 +207,7 @@ int exofs_check_io(struct exofs_io_state *ios, u64 *resid)
 
 int exofs_sbi_create(struct exofs_io_state *ios)
 {
-	DECLARE_COMPLETION_ONSTACK(wait);
-	bool sync = (ios->done == NULL);
-	int i, ret = 0;
-
-	if (sync) {
-		ios->done = _sync_done;
-		ios->private = &wait;
-	}
-
-	kref_init(&ios->kref);
+	int i, ret;
 
 	for (i = 0; i < ios->sbi->s_numdevs; i++) {
 		struct osd_request *or;
@@ -217,12 +223,7 @@ int exofs_sbi_create(struct exofs_io_state *ios)
 
 		osd_req_create_object(or, &ios->obj);
 	}
-
 	ret = exofs_io_execute(ios);
-	if (sync && likely(!ret)) {
-		wait_for_completion(&wait);
-/*		ret = exofs_check_io(ios);*/
-	}
 
 out:
 	return ret;
@@ -230,16 +231,7 @@ out:
 
 int exofs_sbi_remove(struct exofs_io_state *ios)
 {
-	DECLARE_COMPLETION_ONSTACK(wait);
-	bool sync = (ios->done == NULL);
-	int i, ret = 0;
-
-	if (sync) {
-		ios->done = _sync_done;
-		ios->private = &wait;
-	}
-
-	kref_init(&ios->kref);
+	int i, ret;
 
 	for (i = 0; i < ios->sbi->s_numdevs; i++) {
 		struct osd_request *or;
@@ -256,10 +248,6 @@ int exofs_sbi_remove(struct exofs_io_state *ios)
 		osd_req_remove_object(or, &ios->obj);
 	}
 	ret = exofs_io_execute(ios);
-	if (sync && likely(!ret)) {
-		wait_for_completion(&wait);
-/*		ret = exofs_check_io(ios);*/
-	}
 
 out:
 	return ret;
@@ -267,16 +255,7 @@ out:
 
 int exofs_sbi_write(struct exofs_io_state *ios)
 {
-	DECLARE_COMPLETION_ONSTACK(wait);
-	bool sync = (ios->done == NULL);
-	int i, ret = 0;
-
-	if (sync) {
-		ios->done = _sync_done;
-		ios->private = &wait;
-	}
-
-	kref_init(&ios->kref);
+	int i, ret;
 
 	for (i = 0; i < ios->sbi->s_numdevs; i++) {
 		struct osd_request *or;
@@ -296,8 +275,10 @@ int exofs_sbi_write(struct exofs_io_state *ios)
 			if (i != 0) {
 				bio = bio_kmalloc(GFP_KERNEL,
 						  ios->bio->bi_max_vecs);
-				if (!bio)
+				if (unlikely(!bio)) {
+					ret = -ENOMEM;
 					goto out;
+				}
 
 				__bio_clone(bio, ios->bio);
 				bio->bi_bdev = NULL;
@@ -328,10 +309,6 @@ int exofs_sbi_write(struct exofs_io_state *ios)
 						  ios->in_attr_len);
 	}
 	ret = exofs_io_execute(ios);
-	if (sync && likely(!ret)) {
-		wait_for_completion(&wait);
-		ret = exofs_check_io(ios, NULL);
-	}
 
 out:
 	return ret;
@@ -339,16 +316,7 @@ out:
 
 int exofs_sbi_read(struct exofs_io_state *ios)
 {
-	DECLARE_COMPLETION_ONSTACK(wait);
-	bool sync = (ios->done == NULL);
-	int i, ret = 0;
-
-	if (sync) {
-		ios->done = _sync_done;
-		ios->private = &wait;
-	}
-
-	kref_init(&ios->kref);
+	int i, ret;
 
 	for (i = 0; i < 1; i++) {
 		struct osd_request *or;
@@ -385,10 +353,6 @@ int exofs_sbi_read(struct exofs_io_state *ios)
 						  ios->in_attr_len);
 	}
 	ret = exofs_io_execute(ios);
-	if (sync && likely(!ret)) {
-		wait_for_completion(&wait);
-		ret = exofs_check_io(ios, NULL);
-	}
 
 out:
 	return ret;
@@ -417,7 +381,6 @@ int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr)
 
 int exofs_oi_truncate(struct exofs_i_info *oi, u64 size)
 {
-	DECLARE_COMPLETION_ONSTACK(wait);
 	struct exofs_sb_info *sbi = oi->vfs_inode.i_sb->s_fs_info;
 	struct exofs_io_state *ios;
 	struct osd_attr attr;
@@ -434,11 +397,6 @@ int exofs_oi_truncate(struct exofs_i_info *oi, u64 size)
 	attr = g_attr_logical_length;
 	attr.val_ptr = &newsize;
 
-	ios->done = _sync_done;
-	ios->private = &wait;
-
-	kref_init(&ios->kref);
-
 	for (i = 0; i < sbi->s_numdevs; i++) {
 		struct osd_request *or;
 
@@ -455,11 +413,6 @@ int exofs_oi_truncate(struct exofs_i_info *oi, u64 size)
 		osd_req_add_set_attr_list(or, &attr, 1);
 	}
 	ret = exofs_io_execute(ios);
-	if (unlikely(ret))
-		goto out;
-
-	wait_for_completion(&wait);
-	ret = exofs_check_io(ios, NULL);
 
 out:
 	exofs_put_io_state(ios);




  reply	other threads:[~2009-11-16 18:15 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-10 17:12 [PATCHSET 0/3] exofs: Multi-device mirror support Boaz Harrosh
2009-11-10 17:16 ` [PATCH 1/3] exofs: move osd.c to ios.c Boaz Harrosh
2009-11-10 17:20 ` [PATCH 2/3] exofs: Move all operations to an io_engine Boaz Harrosh
2009-11-16 18:00   ` Boaz Harrosh [this message]
2009-11-16 18:12   ` [PATCH 2/3 version 2] " Boaz Harrosh
2009-11-10 17:27 ` [PATCH 3/3] exofs: Multi-device mirror support Boaz Harrosh
2009-11-16 18:13   ` [PATCH 3/3 version 2] " Boaz Harrosh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B019331.8030003@panasas.com \
    --to=bharrosh@panasas.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=osd-dev@open-osd.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.