Whamcloud - gitweb
b=18721
[fs/lustre-release.git] / lustre / liblustre / llite_cl.c
index e3c340e..2557dbc 100644 (file)
@@ -414,6 +414,7 @@ static int slp_lock_enqueue(const struct lu_env *env,
 }
 
 static const struct cl_lock_operations slp_lock_ops = {
+        .clo_delete    = ccc_lock_delete,
         .clo_fini      = ccc_lock_fini,
         .clo_enqueue   = slp_lock_enqueue,
         .clo_wait      = ccc_lock_wait,
@@ -428,9 +429,10 @@ static const struct cl_lock_operations slp_lock_ops = {
  */
 
 static int slp_io_rw_lock(const struct lu_env *env,
-                             const struct cl_io_slice *ios)
+                          const struct cl_io_slice *ios)
 {
-        struct cl_io *io = ios->cis_io;
+        struct ccc_io *cio = ccc_env_io(env);
+        struct cl_io *io   = ios->cis_io;
         loff_t start;
         loff_t end;
 
@@ -441,6 +443,9 @@ static int slp_io_rw_lock(const struct lu_env *env,
                 start = io->u.ci_wr.wr.crw_pos;
                 end   = start + io->u.ci_wr.wr.crw_count - 1;
         }
+
+        ccc_io_update_iov(env, cio, io);
+
         /*
          * This acquires real DLM lock only in O_APPEND case, because of
          * the io->ci_lockreq setting in llu_io_init().
@@ -580,10 +585,10 @@ static int llu_queue_pio(const struct lu_env *env, struct cl_io *io,
         /* printk("Inited anchor with %d pages\n", npages); */
 
         if (rc == 0) {
-                rc = cl_io_submit_rw(env, io,
-                                     io->ci_type == CIT_READ ? CRT_READ :
-                                                               CRT_WRITE,
-                                     queue);
+                enum cl_req_type crt;
+
+                crt = io->ci_type == CIT_READ ? CRT_READ : CRT_WRITE;
+                rc = cl_io_submit_rw(env, io, crt, queue, CRP_NORMAL);
                 if (rc == 0) {
                         /* If some pages weren't sent for any reason, count
                          * then as completed, to avoid infinite wait. */
@@ -647,6 +652,7 @@ static int slp_io_start(const struct lu_env *env, const struct cl_io_slice *ios)
         struct llu_inode_info *lli = llu_i2info(inode);
         struct llu_io_session *session = cl2slp_io(env, ios)->sio_session;
         int write = io->ci_type == CIT_WRITE;
+        int exceed = 0;
 
         CLOBINVRNT(env, obj, ccc_object_invariant(obj));
 
@@ -668,8 +674,8 @@ static int slp_io_start(const struct lu_env *env, const struct cl_io_slice *ios)
         if (IS_ERR(iogroup))
                 RETURN(PTR_ERR(iogroup));
 
-        err = ccc_prep_size(env, obj, io, pos + cnt - 1, 0);
-        if (err != 0)
+        err = ccc_prep_size(env, obj, io, pos, cnt, 0, &exceed);
+        if (err != 0 || (write == 0 && exceed != 0))
                 GOTO(out, err);
 
         CDEBUG(D_INODE,
@@ -724,9 +730,12 @@ static int slp_io_start(const struct lu_env *env, const struct cl_io_slice *ios)
         }
         LASSERT(cnt == 0 || io->ci_type == CIT_READ); /* libsysio should guarantee this */
 
-        session->lis_groups[session->lis_ngroups++] = iogroup;
+        if (!iogroup->lig_rc)
+                session->lis_rwcount += iogroup->lig_rwcount;
+        else if (!session->lis_rc)
+                session->lis_rc = iogroup->lig_rc;
+        err = 0;
 
-        return 0;
 out:
         put_io_group(iogroup);
         return err;
@@ -738,13 +747,15 @@ static const struct cl_io_operations ccc_io_ops = {
                         .cio_fini      = ccc_io_fini,
                         .cio_lock      = slp_io_rw_lock,
                         .cio_start     = slp_io_start,
-                        .cio_end       = ccc_io_end
+                        .cio_end       = ccc_io_end,
+                        .cio_advance   = ccc_io_advance
                 },
                 [CIT_WRITE] = {
                         .cio_fini      = ccc_io_fini,
                         .cio_lock      = slp_io_rw_lock,
                         .cio_start     = slp_io_start,
-                        .cio_end       = ccc_io_end
+                        .cio_end       = ccc_io_end,
+                        .cio_advance   = ccc_io_advance
                 },
                 [CIT_TRUNC] = {
                         .cio_fini       = ccc_io_fini,