Whamcloud - gitweb
LU-14760 llite: restart clio for AIO if necessary 95/43995/6
authorLi Dongyang <dongyangli@ddn.com>
Mon, 14 Jun 2021 01:31:33 +0000 (11:31 +1000)
committerOleg Drokin <green@whamcloud.com>
Tue, 21 Mar 2023 23:12:32 +0000 (23:12 +0000)
If the clio needs to be restarted from where it left off,
do it for AIO as well, so we don't end up with short IO.
Limit thr number of retries to 1000, to avoid potential
issues if the loop is stuck forever.

Change-Id: Iccca31b032b01b940656864bfff22a821ff5061d
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/43995
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/llite/file.c

index e254b0b..3db2226 100644 (file)
@@ -1680,6 +1680,7 @@ ll_file_io_generic(const struct lu_env *env, struct vvp_io_args *args,
        ssize_t result = 0;
        int rc = 0;
        int rc2 = 0;
+       int retries = 1000;
        unsigned int retried = 0, dio_lock = 0;
        bool is_aio = false;
        bool is_parallel_dio = false;
@@ -1839,13 +1840,13 @@ out:
               file->f_path.dentry->d_name.name,
               iot, rc, result, io->ci_need_restart);
 
-       if ((rc == 0 || rc == -ENODATA || rc == -ENOLCK) &&
-           count > 0 && io->ci_need_restart) {
+       if ((!rc || rc == -ENODATA || rc == -ENOLCK || rc == -EIOCBQUEUED) &&
+           count > 0 && io->ci_need_restart && retries-- > 0) {
                CDEBUG(D_VFSTRACE,
-                      "%s: restart %s from %lld, count: %zu, ret: %zd, rc: %d\n",
+                      "%s: restart %s from ppos=%lld count=%zu retries=%u ret=%zd: rc = %d\n",
                       file_dentry(file)->d_name.name,
                       iot == CIT_READ ? "read" : "write",
-                      *ppos, count, result, rc);
+                      *ppos, count, retries, result, rc);
                /* preserve the tried count for FLR */
                retried = io->ci_ndelay_tried;
                dio_lock = io->ci_dio_lock;