Whamcloud - gitweb
LU-13493 llite: check if page truncated in ll_write_begin()
[fs/lustre-release.git] / lustre / llite / vvp_io.c
index 652940f..55e21fa 100644 (file)
@@ -648,13 +648,16 @@ static int vvp_io_setattr_lock(const struct lu_env *env,
                                const struct cl_io_slice *ios)
 {
        struct cl_io  *io  = ios->cis_io;
-       __u64 new_size;
+       __u64 lock_start = 0;
+       __u64 lock_end = OBD_OBJECT_EOF;
        __u32 enqflags = 0;
 
        if (cl_io_is_trunc(io)) {
-               new_size = io->u.ci_setattr.sa_attr.lvb_size;
-               if (new_size == 0)
+               if (io->u.ci_setattr.sa_attr.lvb_size == 0)
                        enqflags = CEF_DISCARD_DATA;
+       } else if (cl_io_is_fallocate(io)) {
+               lock_start = io->u.ci_setattr.sa_falloc_offset;
+               lock_end = lock_start + io->u.ci_setattr.sa_attr.lvb_size;
        } else {
                unsigned int valid = io->u.ci_setattr.sa_avalid;
 
@@ -668,12 +671,10 @@ static int vvp_io_setattr_lock(const struct lu_env *env,
                     io->u.ci_setattr.sa_attr.lvb_atime >=
                     io->u.ci_setattr.sa_attr.lvb_ctime))
                        return 0;
-
-               new_size = 0;
        }
 
        return vvp_io_one_lock(env, io, enqflags, CLM_WRITE,
-                              new_size, OBD_OBJECT_EOF);
+                              lock_start, lock_end);
 }
 
 static int vvp_do_vmtruncate(struct inode *inode, size_t size)
@@ -732,6 +733,9 @@ static int vvp_io_setattr_start(const struct lu_env *env,
                trunc_sem_down_write(&lli->lli_trunc_sem);
                inode_lock(inode);
                inode_dio_wait(inode);
+       } else if (cl_io_is_fallocate(io)) {
+               inode_lock(inode);
+               inode_dio_wait(inode);
        } else {
                inode_lock(inode);
        }
@@ -755,6 +759,8 @@ static void vvp_io_setattr_end(const struct lu_env *env,
                vvp_do_vmtruncate(inode, io->u.ci_setattr.sa_attr.lvb_size);
                inode_unlock(inode);
                trunc_sem_up_write(&lli->lli_trunc_sem);
+       } else if (cl_io_is_fallocate(io)) {
+               inode_unlock(inode);
        } else {
                inode_unlock(inode);
        }
@@ -986,7 +992,7 @@ void vvp_set_pagevec_dirty(struct pagevec *pvec)
                ClearPageReclaim(pvec->pages[i]);
 
        LASSERTF(page->mapping,
-                "mapping must be set. page %p, page->private (cl_page) %p",
+                "mapping must be set. page %p, page->private (cl_page) %p\n",
                 page, (void *) page->private);
 
        /* Rest of code derived from __set_page_dirty_nobuffers */