From: Marco Stornelli <marco.stornelli@xxxxxxxxx> There aren't sufficient sync points for a fs for xip operations. In particular for the mmap case. It can be not sufficient to lock/unlock to do some operation inside get_xip_mem callback. For xip_file_read it's really easy to write a fs specific wrapper, xip_file_write hold i_mutex so no problem. With this patch we can avoid concurrent truncate operation and xip mmap. Signed-off-by: Marco Stornelli <marco.stornelli@xxxxxxxxx> --- --- filemap_xip.c.orig 2011-09-10 17:16:56.000000000 +0200 +++ filemap_xip.c 2011-09-10 17:19:25.000000000 +0200 @@ -230,6 +230,7 @@ static int xip_file_fault(struct vm_area int error; /* XXX: are VM_FAULT_ codes OK? */ + mutex_lock(&inode->i_mutex); again: size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; if (vmf->pgoff >= size) @@ -239,8 +240,10 @@ again: &xip_mem, &xip_pfn); if (likely(!error)) goto found; - if (error != -ENODATA) + if (error != -ENODATA) { + mutex_unlock(&inode->i_mutex); return VM_FAULT_OOM; + } /* sparse block */ if ((vma->vm_flags & (VM_WRITE | VM_MAYWRITE)) && @@ -253,17 +256,22 @@ again: error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 1, &xip_mem, &xip_pfn); mutex_unlock(&xip_sparse_mutex); - if (error) + if (error) { + mutex_unlock(&inode->i_mutex); return VM_FAULT_SIGBUS; + } /* unmap sparse mappings at pgoff from all other vmas */ __xip_unmap(mapping, vmf->pgoff); found: err = vm_insert_mixed(vma, (unsigned long)vmf->virtual_address, xip_pfn); - if (err == -ENOMEM) + if (err == -ENOMEM) { + mutex_unlock(&inode->i_mutex); return VM_FAULT_OOM; + } BUG_ON(err); + mutex_unlock(&inode->i_mutex); return VM_FAULT_NOPAGE; } else { int err, ret = VM_FAULT_OOM; @@ -292,6 +300,7 @@ found: out: write_seqcount_end(&xip_sparse_seq); mutex_unlock(&xip_sparse_mutex); + mutex_unlock(&inode->i_mutex); return ret; } -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html