Hi Souptick, Thank you for the patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on v4.17-rc2 next-20180420] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Souptick-Joarder/fs-dax-Adding-new-return-type-vm_fault_t/20180423-102814 config: i386-randconfig-x006-201816 (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All errors (new ones prefixed by >>): fs/dax.c: In function 'dax_iomap_pte_fault': >> fs/dax.c:1265:10: error: implicit declaration of function 'vmf_insert_mixed_mkwrite'; did you mean 'vm_insert_mixed_mkwrite'? [-Werror=implicit-function-declaration] ret = vmf_insert_mixed_mkwrite(vma, vaddr, pfn); ^~~~~~~~~~~~~~~~~~~~~~~~ vm_insert_mixed_mkwrite cc1: some warnings being treated as errors vim +1265 fs/dax.c 1134 1135 static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp, 1136 int *iomap_errp, const struct iomap_ops *ops) 1137 { 1138 struct vm_area_struct *vma = vmf->vma; 1139 struct address_space *mapping = vma->vm_file->f_mapping; 1140 struct inode *inode = mapping->host; 1141 unsigned long vaddr = vmf->address; 1142 loff_t pos = (loff_t)vmf->pgoff << PAGE_SHIFT; 1143 struct iomap iomap = { 0 }; 1144 unsigned flags = IOMAP_FAULT; 1145 int error, major = 0; 1146 bool write = vmf->flags & FAULT_FLAG_WRITE; 1147 bool sync; 1148 vm_fault_t ret = 0; 1149 void *entry; 1150 pfn_t pfn; 1151 1152 trace_dax_pte_fault(inode, vmf, ret); 1153 /* 1154 * Check whether offset isn't beyond end of file now. Caller is supposed 1155 * to hold locks serializing us with truncate / punch hole so this is 1156 * a reliable test. 1157 */ 1158 if (pos >= i_size_read(inode)) { 1159 ret = VM_FAULT_SIGBUS; 1160 goto out; 1161 } 1162 1163 if (write && !vmf->cow_page) 1164 flags |= IOMAP_WRITE; 1165 1166 entry = grab_mapping_entry(mapping, vmf->pgoff, 0); 1167 if (IS_ERR(entry)) { 1168 ret = dax_fault_return(PTR_ERR(entry)); 1169 goto out; 1170 } 1171 1172 /* 1173 * It is possible, particularly with mixed reads & writes to private 1174 * mappings, that we have raced with a PMD fault that overlaps with 1175 * the PTE we need to set up. If so just return and the fault will be 1176 * retried. 1177 */ 1178 if (pmd_trans_huge(*vmf->pmd) || pmd_devmap(*vmf->pmd)) { 1179 ret = VM_FAULT_NOPAGE; 1180 goto unlock_entry; 1181 } 1182 1183 /* 1184 * Note that we don't bother to use iomap_apply here: DAX required 1185 * the file system block size to be equal the page size, which means 1186 * that we never have to deal with more than a single extent here. 1187 */ 1188 error = ops->iomap_begin(inode, pos, PAGE_SIZE, flags, &iomap); 1189 if (iomap_errp) 1190 *iomap_errp = error; 1191 if (error) { 1192 ret = dax_fault_return(error); 1193 goto unlock_entry; 1194 } 1195 if (WARN_ON_ONCE(iomap.offset + iomap.length < pos + PAGE_SIZE)) { 1196 error = -EIO; /* fs corruption? */ 1197 goto error_finish_iomap; 1198 } 1199 1200 if (vmf->cow_page) { 1201 sector_t sector = dax_iomap_sector(&iomap, pos); 1202 1203 switch (iomap.type) { 1204 case IOMAP_HOLE: 1205 case IOMAP_UNWRITTEN: 1206 clear_user_highpage(vmf->cow_page, vaddr); 1207 break; 1208 case IOMAP_MAPPED: 1209 error = copy_user_dax(iomap.bdev, iomap.dax_dev, 1210 sector, PAGE_SIZE, vmf->cow_page, vaddr); 1211 break; 1212 default: 1213 WARN_ON_ONCE(1); 1214 error = -EIO; 1215 break; 1216 } 1217 1218 if (error) 1219 goto error_finish_iomap; 1220 1221 __SetPageUptodate(vmf->cow_page); 1222 ret = finish_fault(vmf); 1223 if (!ret) 1224 ret = VM_FAULT_DONE_COW; 1225 goto finish_iomap; 1226 } 1227 1228 sync = dax_fault_is_synchronous(flags, vma, &iomap); 1229 1230 switch (iomap.type) { 1231 case IOMAP_MAPPED: 1232 if (iomap.flags & IOMAP_F_NEW) { 1233 count_vm_event(PGMAJFAULT); 1234 count_memcg_event_mm(vma->vm_mm, PGMAJFAULT); 1235 major = VM_FAULT_MAJOR; 1236 } 1237 error = dax_iomap_pfn(&iomap, pos, PAGE_SIZE, &pfn); 1238 if (error < 0) 1239 goto error_finish_iomap; 1240 1241 entry = dax_insert_mapping_entry(mapping, vmf, entry, pfn, 1242 0, write && !sync); 1243 if (IS_ERR(entry)) { 1244 error = PTR_ERR(entry); 1245 goto error_finish_iomap; 1246 } 1247 1248 /* 1249 * If we are doing synchronous page fault and inode needs fsync, 1250 * we can insert PTE into page tables only after that happens. 1251 * Skip insertion for now and return the pfn so that caller can 1252 * insert it after fsync is done. 1253 */ 1254 if (sync) { 1255 if (WARN_ON_ONCE(!pfnp)) { 1256 error = -EIO; 1257 goto error_finish_iomap; 1258 } 1259 *pfnp = pfn; 1260 ret = VM_FAULT_NEEDDSYNC | major; 1261 goto finish_iomap; 1262 } 1263 trace_dax_insert_mapping(inode, vmf, entry); 1264 if (write) > 1265 ret = vmf_insert_mixed_mkwrite(vma, vaddr, pfn); 1266 else 1267 ret = vmf_insert_mixed(vma, vaddr, pfn); 1268 1269 goto finish_iomap; 1270 case IOMAP_UNWRITTEN: 1271 case IOMAP_HOLE: 1272 if (!write) { 1273 ret = dax_load_hole(mapping, entry, vmf); 1274 goto finish_iomap; 1275 } 1276 /*FALLTHRU*/ 1277 default: 1278 WARN_ON_ONCE(1); 1279 error = -EIO; 1280 break; 1281 } 1282 1283 error_finish_iomap: 1284 ret = dax_fault_return(error) | major; 1285 finish_iomap: 1286 if (ops->iomap_end) { 1287 int copied = PAGE_SIZE; 1288 1289 if (ret & VM_FAULT_ERROR) 1290 copied = 0; 1291 /* 1292 * The fault is done by now and there's no way back (other 1293 * thread may be already happily using PTE we have installed). 1294 * Just ignore error from ->iomap_end since we cannot do much 1295 * with it. 1296 */ 1297 ops->iomap_end(inode, pos, PAGE_SIZE, copied, flags, &iomap); 1298 } 1299 unlock_entry: 1300 put_locked_mapping_entry(mapping, vmf->pgoff); 1301 out: 1302 trace_dax_pte_fault_done(inode, vmf, ret); 1303 return ret; 1304 } 1305 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation