Whamcloud - gitweb
LU-148 ll_readpage has to unlock vmpage by any means
[fs/lustre-release.git] / lustre / liblustre / rw.c
index 21d8e42..9d4d581 100644 (file)
@@ -26,7 +26,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
 #include <fcntl.h>
 #include <sys/uio.h>
 
-#include <sysio.h>
-#ifdef HAVE_XTIO_H
-#include <xtio.h>
-#endif
-#include <fs.h>
-#include <mount.h>
-#include <inode.h>
-#ifdef HAVE_FILE_H
-#include <file.h>
-#endif
-
-#undef LIST_HEAD
-
 #include "llite_lib.h"
 
 typedef ssize_t llu_file_piov_t(const struct iovec *iovec, int iovlen,
@@ -191,7 +178,7 @@ static int llu_glimpse_callback(struct ldlm_lock *lock, void *reqp)
         lvb = req_capsule_server_get(&req->rq_pill, &RMF_DLM_LVB);
         lvb->lvb_size = lli->lli_smd->lsm_oinfo[stripe]->loi_kms;
 
-        LDLM_DEBUG(lock, "i_size: %llu -> stripe number %u -> kms "LPU64,
+        LDLM_DEBUG(lock, "i_size: "LPU64" -> stripe number %u -> kms "LPU64,
                    (__u64)llu_i2stat(inode)->st_size, stripe,lvb->lvb_size);
  iput:
         I_RELE(inode);
@@ -214,7 +201,13 @@ int llu_merge_lvb(struct inode *inode)
         int rc;
         ENTRY;
 
+        lov_stripe_lock(lli->lli_smd);
         inode_init_lvb(inode, &lvb);
+        /* merge timestamps the most resently obtained from mds with
+           timestamps obtained from osts */
+        lvb.lvb_atime = lli->lli_lvb.lvb_atime;
+        lvb.lvb_mtime = lli->lli_lvb.lvb_mtime;
+        lvb.lvb_ctime = lli->lli_lvb.lvb_ctime;
         rc = obd_merge_lvb(sbi->ll_dt_exp, lli->lli_smd, &lvb, 0);
         st->st_size = lvb.lvb_size;
         st->st_blocks = lvb.lvb_blocks;
@@ -224,6 +217,7 @@ int llu_merge_lvb(struct inode *inode)
         st->st_mtime = lvb.lvb_mtime;
         st->st_atime = lvb.lvb_atime;
         st->st_ctime = lvb.lvb_ctime;
+        lov_stripe_unlock(lli->lli_smd);
 
         RETURN(rc);
 }
@@ -249,7 +243,7 @@ int llu_extent_lock(struct ll_file_data *fd, struct inode *inode,
             (sbi->ll_flags & LL_SBI_NOLCK) || mode == LCK_NL)
                 RETURN(0);
 
-        CDEBUG(D_DLMTRACE, "Locking inode %llu, start "LPU64" end "LPU64"\n",
+        CDEBUG(D_DLMTRACE, "Locking inode "LPU64", start "LPU64" end "LPU64"\n",
                (__u64)st->st_ino, policy->l_extent.start,
                policy->l_extent.end);
 
@@ -346,6 +340,7 @@ ssize_t llu_file_prwv(const struct iovec *iovec, int iovlen,
                 /* XXX this is not right: cio->cui_iov can be modified. */
                 cio->cui_iov = (struct iovec *)iovec;
                 cio->cui_nrsegs = iovlen;
+                cio->cui_tot_nrsegs = iovlen;
                 sio->sio_session = session;
                 err = cl_io_loop(env, io);
         } else {
@@ -366,7 +361,7 @@ struct llu_io_session *get_io_session(struct inode *ino, int ngroups, int cmd)
 {
         struct llu_io_session *session;
 
-        OBD_ALLOC(session, LLU_IO_SESSION_SIZE(ngroups));
+        OBD_ALLOC_PTR(session);
         if (!session)
                 return NULL;
 
@@ -379,17 +374,8 @@ struct llu_io_session *get_io_session(struct inode *ino, int ngroups, int cmd)
 
 static void put_io_session(struct llu_io_session *session)
 {
-        int i;
-
-        for (i = 0; i < session->lis_ngroups; i++) {
-                if (session->lis_groups[i]) {
-                        put_io_group(session->lis_groups[i]);
-                        session->lis_groups[i] = NULL;
-                }
-        }
-
         I_RELE(session->lis_inode);
-        OBD_FREE(session, LLU_IO_SESSION_SIZE(session->lis_max_groups));
+        OBD_FREE_PTR(session);
 }
 
 static int llu_file_rwx(struct inode *ino,
@@ -446,11 +432,10 @@ void llu_io_init(struct cl_io *io, struct inode *inode, int write)
                 io->u.ci_wr.wr_append = lli->lli_open_flags & O_APPEND;
         io->ci_obj  = llu_i2info(inode)->lli_clob;
 
-        if (lli->lli_open_flags & O_APPEND)
+        if ((lli->lli_open_flags & O_APPEND) && write)
                 io->ci_lockreq = CILR_MANDATORY;
         else
                 io->ci_lockreq = CILR_NEVER;
-
 }
 
 int llu_iop_read(struct inode *ino,
@@ -463,7 +448,7 @@ int llu_iop_read(struct inode *ino,
         int ret;
 
         /* BUG: 5972 */
-        st->st_atime = CURRENT_TIME;
+        st->st_atime = CFS_CURRENT_TIME;
 
         env = cl_env_get(&refcheck);
         if (IS_ERR(env))
@@ -487,7 +472,7 @@ int llu_iop_write(struct inode *ino,
         int refcheck;
         int ret;
 
-        st->st_mtime = st->st_ctime = CURRENT_TIME;
+        st->st_mtime = st->st_ctime = CFS_CURRENT_TIME;
 
         env = cl_env_get(&refcheck);
         if (IS_ERR(env))
@@ -504,8 +489,6 @@ int llu_iop_write(struct inode *ino,
 int llu_iop_iodone(struct ioctx *ioctx)
 {
         struct llu_io_session *session;
-        struct llu_io_group *group;
-        int i, rc = 0;
         struct lu_env *env;
         struct cl_io  *io;
         int refcheck;
@@ -524,22 +507,12 @@ int llu_iop_iodone(struct ioctx *ioctx)
         LASSERT(session);
         LASSERT(!IS_ERR(session));
 
-        for (i = 0; i < session->lis_ngroups; i++) {
-                group = session->lis_groups[i];
-                if (group) {
-                        if (!rc)
-                                rc = group->lig_rc;
-                        if (!rc)
-                                ioctx->ioctx_cc += group->lig_rwcount;
-                        put_io_group(group);
-                        session->lis_groups[i] = NULL;
-                }
-        }
-
-        if (rc) {
-                LASSERT(rc < 0);
+        if (session->lis_rc == 0) {
+                ioctx->ioctx_cc = session->lis_rwcount;
+        } else {
+                LASSERT(session->lis_rc < 0);
                 ioctx->ioctx_cc = -1;
-                ioctx->ioctx_errno = -rc;
+                ioctx->ioctx_errno = -session->lis_rc;
         }
 
         put_io_session(session);