Whamcloud - gitweb
LU-122 Revert the patch on bug 21122 and come up with a new fix
[fs/lustre-release.git] / lustre / llite / vvp_io.c
index 2034759..4d217c9 100644 (file)
@@ -181,7 +181,7 @@ static int vvp_mmap_locks(const struct lu_env *env,
                         descr->cld_enq_flags = flags;
                         result = cl_io_lock_alloc_add(env, io, descr);
 
-                        CDEBUG(D_VFSTRACE, "lock: %i: [%lu, %lu]\n",
+                        CDEBUG(D_VFSTRACE, "lock: %d: [%lu, %lu]\n",
                                descr->cld_mode, descr->cld_start,
                                descr->cld_end);
 
@@ -306,10 +306,11 @@ static int vvp_io_setattr_lock(const struct lu_env *env,
                 if (new_size == 0)
                         enqflags = CEF_DISCARD_DATA;
         } else {
-                LASSERT((io->u.ci_setattr.sa_attr.lvb_mtime <
-                         io->u.ci_setattr.sa_attr.lvb_ctime) ||
-                        (io->u.ci_setattr.sa_attr.lvb_atime <
-                         io->u.ci_setattr.sa_attr.lvb_ctime));
+                if ((io->u.ci_setattr.sa_attr.lvb_mtime >=
+                     io->u.ci_setattr.sa_attr.lvb_ctime) ||
+                    (io->u.ci_setattr.sa_attr.lvb_atime >=
+                     io->u.ci_setattr.sa_attr.lvb_ctime))
+                        return 0;
                 new_size = 0;
         }
         cio->u.setattr.cui_local_lock = SETATTR_EXTENT_LOCK;
@@ -704,14 +705,19 @@ static int vvp_io_fault_start(const struct lu_env *env,
         if (result != 0)
                 return result;
 
-        /* must return locked page */
+        /* must return unlocked page */
         kernel_result = vvp_io_kernel_fault(cfio);
         if (kernel_result != 0)
                 return kernel_result;
+
         /* Temporarily lock vmpage to keep cl_page_find() happy. */
         lock_page(cfio->ft_vmpage);
-        page = cl_page_find(env, obj, fio->ft_index, cfio->ft_vmpage,
-                            CPT_CACHEABLE);
+        /* Though we have already held a cl_lock upon this page, but
+         * it still can be truncated locally. */
+        page = ERR_PTR(-EFAULT);
+        if (likely(cfio->ft_vmpage->mapping != NULL))
+                page = cl_page_find(env, obj, fio->ft_index, cfio->ft_vmpage,
+                                    CPT_CACHEABLE);
         unlock_page(cfio->ft_vmpage);
         if (IS_ERR(page)) {
                 page_cache_release(cfio->ft_vmpage);
@@ -773,7 +779,7 @@ static int vvp_io_read_page(const struct lu_env *env,
         /* Sanity check whether the page is protected by a lock. */
         rc = cl_page_is_under_lock(env, io, page);
         if (rc != -EBUSY) {
-                CL_PAGE_HEADER(D_WARNING, env, page, "%s: %i\n",
+                CL_PAGE_HEADER(D_WARNING, env, page, "%s: %d\n",
                                rc == -ENODATA ? "without a lock" :
                                "match failed", rc);
                 if (rc != -ENODATA)
@@ -991,8 +997,9 @@ static int vvp_io_commit_write(const struct lu_env *env,
         if (result == 0) {
                 if (size > i_size_read(inode)) {
                         cl_isize_write_nolock(inode, size);
-                        CDEBUG(D_VFSTRACE, DFID" updating i_size "LPU64"\n",
-                               PFID(lu_object_fid(&obj->co_lu)), size);
+                        CDEBUG(D_VFSTRACE, DFID" updating i_size %lu\n",
+                               PFID(lu_object_fid(&obj->co_lu)),
+                               (unsigned long)size);
                 }
                 cl_page_export(env, pg, 1);
         } else {