Whamcloud - gitweb
LU-4257 obdclass: Get rid of cl_env hash table
[fs/lustre-release.git] / lustre / llite / rw26.c
index b362532..d9482b2 100644 (file)
@@ -128,7 +128,6 @@ static void ll_invalidatepage(struct page *vmpage,
 static int ll_releasepage(struct page *vmpage, RELEASEPAGE_ARG_TYPE gfp_mask)
 {
        struct lu_env           *env;
-       void                    *cookie;
        struct cl_object        *obj;
        struct cl_page          *page;
        struct address_space    *mapping;
@@ -154,7 +153,6 @@ static int ll_releasepage(struct page *vmpage, RELEASEPAGE_ARG_TYPE gfp_mask)
        if (page == NULL)
                return 1;
 
-       cookie = cl_env_reenter();
        env = cl_env_percpu_get();
        LASSERT(!IS_ERR(env));
 
@@ -180,7 +178,6 @@ static int ll_releasepage(struct page *vmpage, RELEASEPAGE_ARG_TYPE gfp_mask)
        cl_page_put(env, page);
 
        cl_env_percpu_put(env);
-       cl_env_reexit(cookie);
        return result;
 }
 
@@ -355,14 +352,14 @@ ll_direct_IO(
             struct kiocb *iocb, struct iov_iter *iter,
             loff_t file_offset)
 {
-       struct lu_env *env;
+       struct ll_cl_context *lcc;
+       const struct lu_env *env;
        struct cl_io *io;
        struct file *file = iocb->ki_filp;
        struct inode *inode = file->f_mapping->host;
        ssize_t count = iov_iter_count(iter);
        ssize_t tot_bytes = 0, result = 0;
        size_t size = MAX_DIO_SIZE;
-       __u16 refcheck;
 
        /* FIXME: io smaller than PAGE_SIZE is broken on ia64 ??? */
        if ((file_offset & ~PAGE_MASK) || (count & ~PAGE_MASK))
@@ -378,9 +375,13 @@ ll_direct_IO(
        if (iov_iter_alignment(iter) & ~PAGE_MASK)
                return -EINVAL;
 
-       env = cl_env_get(&refcheck);
+       lcc = ll_cl_find(file);
+       if (lcc == NULL)
+               RETURN(-EIO);
+
+       env = lcc->lcc_env;
        LASSERT(!IS_ERR(env));
-       io = vvp_env_io(env)->vui_cl.cis_io;
+       io = lcc->lcc_io;
        LASSERT(io != NULL);
 
        /* 0. Need locking between buffered and direct access. and race with
@@ -448,7 +449,6 @@ out:
                vio->u.write.vui_written += tot_bytes;
        }
 
-       cl_env_put(env, &refcheck);
        return tot_bytes ? : result;
 }
 #else /* !HAVE_DIRECTIO_ITER && !HAVE_IOV_ITER_RW */
@@ -487,7 +487,8 @@ static ssize_t
 ll_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
             loff_t file_offset, unsigned long nr_segs)
 {
-       struct lu_env *env;
+       struct ll_cl_context *lcc;
+       const struct lu_env *env;
        struct cl_io *io;
        struct file *file = iocb->ki_filp;
        struct inode *inode = file->f_mapping->host;
@@ -495,7 +496,6 @@ ll_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
        ssize_t tot_bytes = 0, result = 0;
        unsigned long seg = 0;
        size_t size = MAX_DIO_SIZE;
-       __u16 refcheck;
        ENTRY;
 
         /* FIXME: io smaller than PAGE_SIZE is broken on ia64 ??? */
@@ -515,10 +515,14 @@ ll_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
                         RETURN(-EINVAL);
         }
 
-        env = cl_env_get(&refcheck);
-        LASSERT(!IS_ERR(env));
-       io = vvp_env_io(env)->vui_cl.cis_io;
-        LASSERT(io != NULL);
+       lcc = ll_cl_find(file);
+       if (lcc == NULL)
+               RETURN(-EIO);
+
+       env = lcc->lcc_env;
+       LASSERT(!IS_ERR(env));
+       io = lcc->lcc_io;
+       LASSERT(io != NULL);
 
         for (seg = 0; seg < nr_segs; seg++) {
                size_t iov_left = iov[seg].iov_len;
@@ -585,7 +589,6 @@ out:
                vio->u.write.vui_written += tot_bytes;
        }
 
-       cl_env_put(env, &refcheck);
        RETURN(tot_bytes ? tot_bytes : result);
 }
 #endif /* HAVE_DIRECTIO_ITER || HAVE_IOV_ITER_RW */