|
@@ -553,7 +553,12 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
|
|
if (!buffer_size_valid(&bh) || bh.b_size < PMD_SIZE)
|
|
|
goto fallback;
|
|
|
|
|
|
- /* Guard against a race with truncate */
|
|
|
+ /*
|
|
|
+ * If a truncate happened while we were allocating blocks, we may
|
|
|
+ * leave blocks allocated to the file that are beyond EOF. We can't
|
|
|
+ * take i_mutex here, so just leave them hanging; they'll be freed
|
|
|
+ * when the file is deleted.
|
|
|
+ */
|
|
|
size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
|
|
if (pgoff >= size) {
|
|
|
result = VM_FAULT_SIGBUS;
|