Convert SG from nopage to fault.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: Douglas Gilbert <dougg@torque.net>
Cc: James Bottomley <James.Bottomley@steeleye.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Nick Piggin and committed by Linus Torvalds a13ff0bb c00f08d7

+11 -12
+11 -12
drivers/scsi/sg.c
··· 1160 1160 return (retval < 0) ? retval : 0; 1161 1161 } 1162 1162 1163 - static struct page * 1164 - sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) 1163 + static int 1164 + sg_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1165 1165 { 1166 1166 Sg_fd *sfp; 1167 - struct page *page = NOPAGE_SIGBUS; 1168 1167 unsigned long offset, len, sa; 1169 1168 Sg_scatter_hold *rsv_schp; 1170 1169 struct scatterlist *sg; 1171 1170 int k; 1172 1171 1173 1172 if ((NULL == vma) || (!(sfp = (Sg_fd *) vma->vm_private_data))) 1174 - return page; 1173 + return VM_FAULT_SIGBUS; 1175 1174 rsv_schp = &sfp->reserve; 1176 - offset = addr - vma->vm_start; 1175 + offset = vmf->pgoff << PAGE_SHIFT; 1177 1176 if (offset >= rsv_schp->bufflen) 1178 - return page; 1179 - SCSI_LOG_TIMEOUT(3, printk("sg_vma_nopage: offset=%lu, scatg=%d\n", 1177 + return VM_FAULT_SIGBUS; 1178 + SCSI_LOG_TIMEOUT(3, printk("sg_vma_fault: offset=%lu, scatg=%d\n", 1180 1179 offset, rsv_schp->k_use_sg)); 1181 1180 sg = rsv_schp->buffer; 1182 1181 sa = vma->vm_start; ··· 1184 1185 len = vma->vm_end - sa; 1185 1186 len = (len < sg->length) ? len : sg->length; 1186 1187 if (offset < len) { 1188 + struct page *page; 1187 1189 page = virt_to_page(page_address(sg_page(sg)) + offset); 1188 1190 get_page(page); /* increment page count */ 1189 - break; 1191 + vmf->page = page; 1192 + return 0; /* success */ 1190 1193 } 1191 1194 sa += len; 1192 1195 offset -= len; 1193 1196 } 1194 1197 1195 - if (type) 1196 - *type = VM_FAULT_MINOR; 1197 - return page; 1198 + return VM_FAULT_SIGBUS; 1198 1199 } 1199 1200 1200 1201 static struct vm_operations_struct sg_mmap_vm_ops = { 1201 - .nopage = sg_vma_nopage, 1202 + .fault = sg_vma_fault, 1202 1203 }; 1203 1204 1204 1205 static int