X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fllite_mmap.c;h=3a0c07744053bcb2038102003e119b9a2849fa01;hb=2b829430008ff1996bdf186d5f87b4cca785fe8b;hp=0115b6cf6beee843f9fbbcecb752c7fc5ae55728;hpb=f5fb215365791507ec98796ea624abeafa31901c;p=fs%2Flustre-release.git diff --git a/lustre/llite/llite_mmap.c b/lustre/llite/llite_mmap.c index 0115b6c..3a0c077 100644 --- a/lustre/llite/llite_mmap.c +++ b/lustre/llite/llite_mmap.c @@ -34,9 +34,6 @@ * Lustre is a trademark of Sun Microsystems, Inc. */ -#ifndef AUTOCONF_INCLUDED -#include -#endif #include #include #include @@ -44,7 +41,6 @@ #include #include #include -#include #include #include @@ -176,38 +172,51 @@ struct cl_io *ll_fault_io_init(struct vm_area_struct *vma, static int ll_page_mkwrite0(struct vm_area_struct *vma, struct page *vmpage, bool *retry) { - struct lu_env *env; - struct cl_io *io; - struct vvp_io *vio; - struct cl_env_nest nest; - int result; + struct lu_env *env; + struct cl_io *io; + struct vvp_io *vio; + struct cl_env_nest nest; + int result; cfs_sigset_t set; - ENTRY; + struct inode *inode; + struct ll_inode_info *lli; + ENTRY; - LASSERT(vmpage != NULL); + LASSERT(vmpage != NULL); - io = ll_fault_io_init(vma, &env, &nest, vmpage->index, NULL); - if (IS_ERR(io)) - GOTO(out, result = PTR_ERR(io)); + io = ll_fault_io_init(vma, &env, &nest, vmpage->index, NULL); + if (IS_ERR(io)) + GOTO(out, result = PTR_ERR(io)); - result = io->ci_result; - if (result < 0) - GOTO(out, result); + result = io->ci_result; + if (result < 0) + GOTO(out, result); - /* Don't enqueue new locks for page_mkwrite(). - * If the lock has been cancelled then page must have been - * truncated, in that case, kernel will handle it. - */ - io->ci_lockreq = CILR_PEEK; - io->u.ci_fault.ft_mkwrite = 1; - io->u.ci_fault.ft_writable = 1; + /* Don't enqueue new locks for page_mkwrite(). + * If the lock has been cancelled then page must have been + * truncated, in that case, kernel will handle it. + */ + io->ci_lockreq = CILR_PEEK; + io->u.ci_fault.ft_mkwrite = 1; + io->u.ci_fault.ft_writable = 1; - vio = vvp_env_io(env); - vio->u.fault.ft_vma = vma; - vio->u.fault.ft_vmpage = vmpage; + vio = vvp_env_io(env); + vio->u.fault.ft_vma = vma; + vio->u.fault.ft_vmpage = vmpage; set = cfs_block_sigsinv(sigmask(SIGKILL) | sigmask(SIGTERM)); + + /* we grab lli_trunc_sem to exclude truncate case. + * Otherwise, we could add dirty pages into osc cache + * while truncate is on-going. */ + inode = ccc_object_inode(io->ci_obj); + lli = ll_i2info(inode); + cfs_down_read(&lli->lli_trunc_sem); + result = cl_io_loop(env, io); + + cfs_up_read(&lli->lli_trunc_sem); + cfs_restore_sigs(set); if (result == -ENODATA) /* peek failed, no lock caching. */ @@ -602,15 +611,18 @@ int ll_teardown_mmaps(struct address_space *mapping, __u64 first, __u64 last) static struct vm_operations_struct ll_file_vm_ops = { #ifndef HAVE_VM_OP_FAULT - .nopage = ll_nopage, - .populate = ll_populate, - + .nopage = ll_nopage, + .populate = ll_populate, +#else + .fault = ll_fault, +#endif +#ifndef HAVE_PGMKWRITE_COMPACT + .page_mkwrite = ll_page_mkwrite, #else - .fault = ll_fault, + ._pmkw.page_mkwrite = ll_page_mkwrite, #endif - .page_mkwrite = ll_page_mkwrite, - .open = ll_vm_open, - .close = ll_vm_close, + .open = ll_vm_open, + .close = ll_vm_close, }; int ll_file_mmap(struct file *file, struct vm_area_struct * vma)