X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Fvvp_io.c;h=502ec4e1e3b1bfe2ca482c8ec159e47c9e27eec7;hp=7ab77609c5d8217648042cd8308f437d8eeb8d3a;hb=84a795f90412ee575703476728f1522c06de4a2c;hpb=5467a860213d454759bdfad91503691d6692b317 diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index 7ab7760..502ec4e 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -634,6 +634,14 @@ static int vvp_io_kernel_fault(struct vvp_fault_io *cfio) LL_CDEBUG_PAGE(D_PAGE, vmpage, "got addr %lu type %lx\n", cfio->nopage.ft_address, (long)cfio->nopage.ft_type); + lock_page(vmpage); + if (vmpage->mapping == NULL) { + CERROR("vmpage %lu@%p was truncated!\n", vmpage->index, vmpage); + unlock_page(vmpage); + page_cache_release(vmpage); + return -EFAULT; + } + cfio->ft_vmpage = vmpage; return 0; @@ -647,12 +655,7 @@ static int vvp_io_kernel_fault(struct vvp_fault_io *cfio) LL_CDEBUG_PAGE(D_PAGE, cfio->fault.ft_vmf->page, "got addr %p type NOPAGE\n", cfio->fault.ft_vmf->virtual_address); - /*XXX workaround to bug in CLIO - he deadlocked with - lock cancel if page locked */ - if (likely(cfio->fault.ft_flags & VM_FAULT_LOCKED)) { - unlock_page(cfio->fault.ft_vmf->page); - cfio->fault.ft_flags &= ~VM_FAULT_LOCKED; - } + LASSERT(cfio->fault.ft_flags & VM_FAULT_LOCKED); cfio->ft_vmpage = cfio->fault.ft_vmf->page; return 0; @@ -709,16 +712,11 @@ static int vvp_io_fault_start(const struct lu_env *env, 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); - unlock_page(cfio->ft_vmpage); - if (IS_ERR(page)) { - page_cache_release(cfio->ft_vmpage); - cfio->ft_vmpage = NULL; + if (IS_ERR(page)) return PTR_ERR(page); - } size = i_size_read(inode); last = cl_index(obj, size - 1);