Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1494674 > unrolled thread

[PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO

Started byJames Simmons <jsimmons@infradead.org>
First post2016-10-03 04:40 +0200
Last post2016-10-12 08:10 +0200
Articles 4 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO James Simmons <jsimmons@infradead.org> - 2016-10-03 04:40 +0200
    Re: [PATCH 32/41] staging: lustre: llite: restart short read/write  for normal IO Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2016-10-09 16:20 +0200
      Re: [PATCH 32/41] staging: lustre: llite: restart short read/write  for normal IO James Simmons <jsimmons@infradead.org> - 2016-10-12 01:30 +0200
        Re: [PATCH 32/41] staging: lustre: llite: restart short read/write  for normal IO Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2016-10-12 08:10 +0200

#1494674 — [PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO

FromJames Simmons <jsimmons@infradead.org>
Date2016-10-03 04:40 +0200
Subject[PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO
Message-ID<so1kC-6Cz-55@gated-at.bofh.it>
From: Bobi Jam <bobijam.xu@intel.com>

If normal IO got short read/write, we'd restart the IO from where
we've accomplished until we meet EOF or error happens.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6389
Reviewed-on: http://review.whamcloud.com/14123
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
---
 drivers/staging/lustre/lnet/libcfs/fail.c          |    1 +
 .../staging/lustre/lustre/include/obd_support.h    |    2 +
 drivers/staging/lustre/lustre/llite/file.c         |   41 ++++++++++++--------
 drivers/staging/lustre/lustre/llite/vvp_io.c       |   19 ++++++++-
 4 files changed, 45 insertions(+), 18 deletions(-)

diff --git a/drivers/staging/lustre/lnet/libcfs/fail.c b/drivers/staging/lustre/lnet/libcfs/fail.c
index e4b1a0a..3a9c8dd 100644
--- a/drivers/staging/lustre/lnet/libcfs/fail.c
+++ b/drivers/staging/lustre/lnet/libcfs/fail.c
@@ -113,6 +113,7 @@ int __cfs_fail_check_set(__u32 id, __u32 value, int set)
 		break;
 	case CFS_FAIL_LOC_RESET:
 		cfs_fail_loc = value;
+		atomic_set(&cfs_fail_count, 0);
 		break;
 	default:
 		LASSERTF(0, "called with bad set %u\n", set);
diff --git a/drivers/staging/lustre/lustre/include/obd_support.h b/drivers/staging/lustre/lustre/include/obd_support.h
index 1233c34..7f3f8cd 100644
--- a/drivers/staging/lustre/lustre/include/obd_support.h
+++ b/drivers/staging/lustre/lustre/include/obd_support.h
@@ -458,6 +458,8 @@ extern char obd_jobid_var[];
 #define OBD_FAIL_LOV_INIT			    0x1403
 #define OBD_FAIL_GLIMPSE_DELAY			    0x1404
 #define OBD_FAIL_LLITE_XATTR_ENOMEM		    0x1405
+#define OBD_FAIL_MAKE_LOVEA_HOLE		    0x1406
+#define OBD_FAIL_LLITE_LOST_LAYOUT		    0x1407
 #define OBD_FAIL_GETATTR_DELAY			    0x1409
 
 #define OBD_FAIL_FID_INDIR	0x1501
diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c
index 94caf4f..9bf50bf 100644
--- a/drivers/staging/lustre/lustre/llite/file.c
+++ b/drivers/staging/lustre/lustre/llite/file.c
@@ -972,9 +972,11 @@ ll_file_io_generic(const struct lu_env *env, struct vvp_io_args *args,
 {
 	struct ll_inode_info *lli = ll_i2info(file_inode(file));
 	struct ll_file_data  *fd  = LUSTRE_FPRIVATE(file);
+	struct vvp_io *vio = vvp_env_io(env);
 	struct range_lock range;
 	struct cl_io	 *io;
-	ssize_t	       result;
+	ssize_t result = 0;
+	int rc = 0;
 
 	CDEBUG(D_VFSTRACE, "file: %s, type: %d ppos: %llu, count: %zu\n",
 	       file->f_path.dentry->d_name.name, iot, *ppos, count);
@@ -1010,9 +1012,8 @@ restart:
 				CDEBUG(D_VFSTRACE, "Range lock [%llu, %llu]\n",
 				       range.rl_node.in_extent.start,
 				       range.rl_node.in_extent.end);
-				result = range_lock(&lli->lli_write_tree,
-						    &range);
-				if (result < 0)
+				rc = range_lock(&lli->lli_write_tree, &range);
+				if (rc < 0)
 					goto out;
 
 				range_locked = true;
@@ -1028,7 +1029,7 @@ restart:
 			LBUG();
 		}
 		ll_cl_add(file, env, io);
-		result = cl_io_loop(env, io);
+		rc = cl_io_loop(env, io);
 		ll_cl_remove(file, env);
 		if (args->via_io_subtype == IO_NORMAL)
 			up_read(&lli->lli_trunc_sem);
@@ -1040,24 +1041,26 @@ restart:
 		}
 	} else {
 		/* cl_io_rw_init() handled IO */
-		result = io->ci_result;
+		rc = io->ci_result;
 	}
 
 	if (io->ci_nob > 0) {
 		result = io->ci_nob;
+		count -= io->ci_nob;
 		*ppos = io->u.ci_wr.wr.crw_pos;
+
+		/* prepare IO restart */
+		if (count > 0 && args->via_io_subtype == IO_NORMAL)
+			args->u.normal.via_iter = vio->vui_iter;
 	}
-	goto out;
 out:
 	cl_io_fini(env, io);
-	/* If any bit been read/written (result != 0), we just return
-	 * short read/write instead of restart io.
-	 */
-	if ((result == 0 || result == -ENODATA) && io->ci_need_restart) {
-		CDEBUG(D_VFSTRACE, "Restart %s on %pD from %lld, count:%zu\n",
+
+	if ((!rc || rc == -ENODATA) && count > 0 && io->ci_need_restart) {
+		CDEBUG(D_VFSTRACE, "%s: restart %s from %lld, count:%zu, result: %zd\n",
+		       file_dentry(file)->d_name.name,
 		       iot == CIT_READ ? "read" : "write",
-		       file, *ppos, count);
-		LASSERTF(io->ci_nob == 0, "%zd\n", io->ci_nob);
+		       *ppos, count, result);
 		goto restart;
 	}
 
@@ -1070,13 +1073,19 @@ out:
 			ll_stats_ops_tally(ll_i2sbi(file_inode(file)),
 					   LPROC_LL_WRITE_BYTES, result);
 			fd->fd_write_failed = false;
-		} else if (result != -ERESTARTSYS) {
+		} else if (!result && !rc) {
+			rc = io->ci_result;
+			if (rc < 0)
+				fd->fd_write_failed = true;
+			else
+				fd->fd_write_failed = false;
+		} else if (rc != -ERESTARTSYS) {
 			fd->fd_write_failed = true;
 		}
 	}
 	CDEBUG(D_VFSTRACE, "iot: %d, result: %zd\n", iot, result);
 
-	return result;
+	return result > 0 ? result : rc;
 }
 
 static ssize_t ll_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
diff --git a/drivers/staging/lustre/lustre/llite/vvp_io.c b/drivers/staging/lustre/lustre/llite/vvp_io.c
index 8f1964f..5f93db8 100644
--- a/drivers/staging/lustre/lustre/llite/vvp_io.c
+++ b/drivers/staging/lustre/lustre/llite/vvp_io.c
@@ -84,9 +84,10 @@ static bool can_populate_pages(const struct lu_env *env, struct cl_io *io,
 		/* don't need lock here to check lli_layout_gen as we have held
 		 * extent lock and GROUP lock has to hold to swap layout
 		 */
-		if (ll_layout_version_get(lli) != vio->vui_layout_gen) {
+		if (ll_layout_version_get(lli) != vio->vui_layout_gen ||
+		    OBD_FAIL_CHECK_RESET(OBD_FAIL_LLITE_LOST_LAYOUT, 0)) {
 			io->ci_need_restart = 1;
-			/* this will return application a short read/write */
+			/* this will cause a short read/write */
 			io->ci_continue = 0;
 			rc = false;
 		}
@@ -960,6 +961,20 @@ static int vvp_io_write_start(const struct lu_env *env,
 
 	CDEBUG(D_VFSTRACE, "write: [%lli, %lli)\n", pos, pos + (long long)cnt);
 
+	/*
+	 * The maximum Lustre file size is variable, based on the OST maximum
+	 * object size and number of stripes.  This needs another check in
+	 * addition to the VFS checks earlier.
+	 */
+	if (pos + cnt > ll_file_maxbytes(inode)) {
+		CDEBUG(D_INODE,
+		       "%s: file " DFID " offset %llu > maxbytes %llu\n",
+		       ll_get_fsname(inode->i_sb, NULL, 0),
+		       PFID(ll_inode2fid(inode)), pos + cnt,
+		       ll_file_maxbytes(inode));
+		return -EFBIG;
+	}
+
 	if (!vio->vui_iter) {
 		/* from a temp io in ll_cl_init(). */
 		result = 0;
-- 
1.7.1

[toc] | [next] | [standalone]


#1497907 — Re: [PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO

FromGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Date2016-10-09 16:20 +0200
SubjectRe: [PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO
Message-ID<sqn7j-5hX-19@gated-at.bofh.it>
In reply to#1494674
On Sun, Oct 02, 2016 at 10:28:28PM -0400, James Simmons wrote:
> From: Bobi Jam <bobijam.xu@intel.com>
> 
> If normal IO got short read/write, we'd restart the IO from where
> we've accomplished until we meet EOF or error happens.
> 
> Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
> Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
> Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6389
> Reviewed-on: http://review.whamcloud.com/14123
> Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
> Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
> Signed-off-by: James Simmons <jsimmons@infradead.org>
> ---
>  drivers/staging/lustre/lnet/libcfs/fail.c          |    1 +
>  .../staging/lustre/lustre/include/obd_support.h    |    2 +
>  drivers/staging/lustre/lustre/llite/file.c         |   41 ++++++++++++--------
>  drivers/staging/lustre/lustre/llite/vvp_io.c       |   19 ++++++++-
>  4 files changed, 45 insertions(+), 18 deletions(-)

Due to other changes in the filesystem tree, this patch no longer
applies :(

Can you rebase it and resend?

thanks,

greg k-h

[toc] | [prev] | [next] | [standalone]


#1499290 — Re: [PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO

FromJames Simmons <jsimmons@infradead.org>
Date2016-10-12 01:30 +0200
SubjectRe: [PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO
Message-ID<sreEF-4Dp-7@gated-at.bofh.it>
In reply to#1497907
> On Sun, Oct 02, 2016 at 10:28:28PM -0400, James Simmons wrote:
> > From: Bobi Jam <bobijam.xu@intel.com>
> > 
> > If normal IO got short read/write, we'd restart the IO from where
> > we've accomplished until we meet EOF or error happens.
> > 
> > Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
> > Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
> > Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6389
> > Reviewed-on: http://review.whamcloud.com/14123
> > Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
> > Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
> > Signed-off-by: James Simmons <jsimmons@infradead.org>
> > ---
> >  drivers/staging/lustre/lnet/libcfs/fail.c          |    1 +
> >  .../staging/lustre/lustre/include/obd_support.h    |    2 +
> >  drivers/staging/lustre/lustre/llite/file.c         |   41 ++++++++++++--------
> >  drivers/staging/lustre/lustre/llite/vvp_io.c       |   19 ++++++++-
> >  4 files changed, 45 insertions(+), 18 deletions(-)
> 
> Due to other changes in the filesystem tree, this patch no longer
> applies :(
> 
> Can you rebase it and resend?

How long will you be accepting patches to merge for? If its going
to be a few weeks like to just include the missing two patches with
the next batch.

Another issue I need to look at is the IB changes. That's going to
require some heavy surgery to the ko2iblnd driver so its going to
take time for me to port this to the new RDMA RW api. That will
need to be push to linus so ko2iblnd can work with the 4.9 tree
if that is okay with you.

[toc] | [prev] | [next] | [standalone]


#1499360 — Re: [PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO

FromGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Date2016-10-12 08:10 +0200
SubjectRe: [PATCH 32/41] staging: lustre: llite: restart short read/write for normal IO
Message-ID<srkTL-ql-5@gated-at.bofh.it>
In reply to#1499290
On Wed, Oct 12, 2016 at 12:22:35AM +0100, James Simmons wrote:
> 
> > On Sun, Oct 02, 2016 at 10:28:28PM -0400, James Simmons wrote:
> > > From: Bobi Jam <bobijam.xu@intel.com>
> > > 
> > > If normal IO got short read/write, we'd restart the IO from where
> > > we've accomplished until we meet EOF or error happens.
> > > 
> > > Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
> > > Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
> > > Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6389
> > > Reviewed-on: http://review.whamcloud.com/14123
> > > Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
> > > Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
> > > Signed-off-by: James Simmons <jsimmons@infradead.org>
> > > ---
> > >  drivers/staging/lustre/lnet/libcfs/fail.c          |    1 +
> > >  .../staging/lustre/lustre/include/obd_support.h    |    2 +
> > >  drivers/staging/lustre/lustre/llite/file.c         |   41 ++++++++++++--------
> > >  drivers/staging/lustre/lustre/llite/vvp_io.c       |   19 ++++++++-
> > >  4 files changed, 45 insertions(+), 18 deletions(-)
> > 
> > Due to other changes in the filesystem tree, this patch no longer
> > applies :(
> > 
> > Can you rebase it and resend?
> 
> How long will you be accepting patches to merge for? If its going
> to be a few weeks like to just include the missing two patches with
> the next batch.

I don't understand the question.  I always accept patches, no need to
not send them, I'll queue them up to the proper branches as needed.  So
what do you mean here?

> Another issue I need to look at is the IB changes. That's going to
> require some heavy surgery to the ko2iblnd driver so its going to
> take time for me to port this to the new RDMA RW api. That will
> need to be push to linus so ko2iblnd can work with the 4.9 tree
> if that is okay with you.

Sure, send the patches, but maybe it is a 4.10 thing if it's too much
work?

thanks,

greg k-h

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web