diff options
Diffstat (limited to 'fs/xfs')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_file.c | 90 | 
1 files changed, 32 insertions, 58 deletions
| diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index f1ce4323f56e..3881622bcf08 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
| @@ -311,6 +311,31 @@ linvfs_fsync( | |||
| 311 | 311 | ||
| 312 | #define nextdp(dp) ((struct xfs_dirent *)((char *)(dp) + (dp)->d_reclen)) | 312 | #define nextdp(dp) ((struct xfs_dirent *)((char *)(dp) + (dp)->d_reclen)) | 
| 313 | 313 | ||
| 314 | #ifdef CONFIG_XFS_DMAPI | ||
| 315 | |||
| 316 | STATIC struct page * | ||
| 317 | linvfs_filemap_nopage( | ||
| 318 | struct vm_area_struct *area, | ||
| 319 | unsigned long address, | ||
| 320 | int *type) | ||
| 321 | { | ||
| 322 | struct inode *inode = area->vm_file->f_dentry->d_inode; | ||
| 323 | vnode_t *vp = LINVFS_GET_VP(inode); | ||
| 324 | xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); | ||
| 325 | int error; | ||
| 326 | |||
| 327 | ASSERT_ALWAYS(vp->v_vfsp->vfs_flag & VFS_DMI); | ||
| 328 | |||
| 329 | error = XFS_SEND_MMAP(mp, area, 0); | ||
| 330 | if (error) | ||
| 331 | return NULL; | ||
| 332 | |||
| 333 | return filemap_nopage(area, address, type); | ||
| 334 | } | ||
| 335 | |||
| 336 | #endif /* CONFIG_XFS_DMAPI */ | ||
| 337 | |||
| 338 | |||
| 314 | STATIC int | 339 | STATIC int | 
| 315 | linvfs_readdir( | 340 | linvfs_readdir( | 
| 316 | struct file *filp, | 341 | struct file *filp, | 
| @@ -390,14 +415,6 @@ done: | |||
| 390 | return -error; | 415 | return -error; | 
| 391 | } | 416 | } | 
| 392 | 417 | ||
| 393 | #ifdef CONFIG_XFS_DMAPI | ||
| 394 | STATIC void | ||
| 395 | linvfs_mmap_close( | ||
| 396 | struct vm_area_struct *vma) | ||
| 397 | { | ||
| 398 | xfs_dm_mm_put(vma); | ||
| 399 | } | ||
| 400 | #endif /* CONFIG_XFS_DMAPI */ | ||
| 401 | 418 | ||
| 402 | STATIC int | 419 | STATIC int | 
| 403 | linvfs_file_mmap( | 420 | linvfs_file_mmap( | 
| @@ -411,16 +428,11 @@ linvfs_file_mmap( | |||
| 411 | 428 | ||
| 412 | vma->vm_ops = &linvfs_file_vm_ops; | 429 | vma->vm_ops = &linvfs_file_vm_ops; | 
| 413 | 430 | ||
| 414 | if (vp->v_vfsp->vfs_flag & VFS_DMI) { | ||
| 415 | xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); | ||
| 416 | |||
| 417 | error = -XFS_SEND_MMAP(mp, vma, 0); | ||
| 418 | if (error) | ||
| 419 | return error; | ||
| 420 | #ifdef CONFIG_XFS_DMAPI | 431 | #ifdef CONFIG_XFS_DMAPI | 
| 432 | if (vp->v_vfsp->vfs_flag & VFS_DMI) { | ||
| 421 | vma->vm_ops = &linvfs_dmapi_file_vm_ops; | 433 | vma->vm_ops = &linvfs_dmapi_file_vm_ops; | 
| 422 | #endif | ||
| 423 | } | 434 | } | 
| 435 | #endif /* CONFIG_XFS_DMAPI */ | ||
| 424 | 436 | ||
| 425 | VOP_SETATTR(vp, &va, XFS_AT_UPDATIME, NULL, error); | 437 | VOP_SETATTR(vp, &va, XFS_AT_UPDATIME, NULL, error); | 
| 426 | if (!error) | 438 | if (!error) | 
| @@ -474,6 +486,7 @@ linvfs_ioctl_invis( | |||
| 474 | return error; | 486 | return error; | 
| 475 | } | 487 | } | 
| 476 | 488 | ||
| 489 | #ifdef CONFIG_XFS_DMAPI | ||
| 477 | #ifdef HAVE_VMOP_MPROTECT | 490 | #ifdef HAVE_VMOP_MPROTECT | 
| 478 | STATIC int | 491 | STATIC int | 
| 479 | linvfs_mprotect( | 492 | linvfs_mprotect( | 
| @@ -494,6 +507,7 @@ linvfs_mprotect( | |||
| 494 | return error; | 507 | return error; | 
| 495 | } | 508 | } | 
| 496 | #endif /* HAVE_VMOP_MPROTECT */ | 509 | #endif /* HAVE_VMOP_MPROTECT */ | 
| 510 | #endif /* CONFIG_XFS_DMAPI */ | ||
| 497 | 511 | ||
| 498 | #ifdef HAVE_FOP_OPEN_EXEC | 512 | #ifdef HAVE_FOP_OPEN_EXEC | 
| 499 | /* If the user is attempting to execute a file that is offline then | 513 | /* If the user is attempting to execute a file that is offline then | 
| @@ -528,49 +542,10 @@ open_exec_out: | |||
| 528 | } | 542 | } | 
| 529 | #endif /* HAVE_FOP_OPEN_EXEC */ | 543 | #endif /* HAVE_FOP_OPEN_EXEC */ | 
| 530 | 544 | ||
| 531 | /* | ||
| 532 | * Temporary workaround to the AIO direct IO write problem. | ||
| 533 | * This code can go and we can revert to do_sync_write once | ||
| 534 | * the writepage(s) rework is merged. | ||
| 535 | */ | ||
| 536 | STATIC ssize_t | ||
| 537 | linvfs_write( | ||
| 538 | struct file *filp, | ||
| 539 | const char __user *buf, | ||
| 540 | size_t len, | ||
| 541 | loff_t *ppos) | ||
| 542 | { | ||
| 543 | struct kiocb kiocb; | ||
| 544 | ssize_t ret; | ||
| 545 | |||
| 546 | init_sync_kiocb(&kiocb, filp); | ||
| 547 | kiocb.ki_pos = *ppos; | ||
| 548 | ret = __linvfs_write(&kiocb, buf, 0, len, kiocb.ki_pos); | ||
| 549 | *ppos = kiocb.ki_pos; | ||
| 550 | return ret; | ||
| 551 | } | ||
| 552 | STATIC ssize_t | ||
| 553 | linvfs_write_invis( | ||
| 554 | struct file *filp, | ||
| 555 | const char __user *buf, | ||
| 556 | size_t len, | ||
| 557 | loff_t *ppos) | ||
| 558 | { | ||
| 559 | struct kiocb kiocb; | ||
| 560 | ssize_t ret; | ||
| 561 | |||
| 562 | init_sync_kiocb(&kiocb, filp); | ||
| 563 | kiocb.ki_pos = *ppos; | ||
| 564 | ret = __linvfs_write(&kiocb, buf, IO_INVIS, len, kiocb.ki_pos); | ||
| 565 | *ppos = kiocb.ki_pos; | ||
| 566 | return ret; | ||
| 567 | } | ||
| 568 | |||
| 569 | |||
| 570 | struct file_operations linvfs_file_operations = { | 545 | struct file_operations linvfs_file_operations = { | 
| 571 | .llseek = generic_file_llseek, | 546 | .llseek = generic_file_llseek, | 
| 572 | .read = do_sync_read, | 547 | .read = do_sync_read, | 
| 573 | .write = linvfs_write, | 548 | .write = do_sync_write, | 
| 574 | .readv = linvfs_readv, | 549 | .readv = linvfs_readv, | 
| 575 | .writev = linvfs_writev, | 550 | .writev = linvfs_writev, | 
| 576 | .aio_read = linvfs_aio_read, | 551 | .aio_read = linvfs_aio_read, | 
| @@ -592,7 +567,7 @@ struct file_operations linvfs_file_operations = { | |||
| 592 | struct file_operations linvfs_invis_file_operations = { | 567 | struct file_operations linvfs_invis_file_operations = { | 
| 593 | .llseek = generic_file_llseek, | 568 | .llseek = generic_file_llseek, | 
| 594 | .read = do_sync_read, | 569 | .read = do_sync_read, | 
| 595 | .write = linvfs_write_invis, | 570 | .write = do_sync_write, | 
| 596 | .readv = linvfs_readv_invis, | 571 | .readv = linvfs_readv_invis, | 
| 597 | .writev = linvfs_writev_invis, | 572 | .writev = linvfs_writev_invis, | 
| 598 | .aio_read = linvfs_aio_read_invis, | 573 | .aio_read = linvfs_aio_read_invis, | 
| @@ -626,8 +601,7 @@ static struct vm_operations_struct linvfs_file_vm_ops = { | |||
| 626 | 601 | ||
| 627 | #ifdef CONFIG_XFS_DMAPI | 602 | #ifdef CONFIG_XFS_DMAPI | 
| 628 | static struct vm_operations_struct linvfs_dmapi_file_vm_ops = { | 603 | static struct vm_operations_struct linvfs_dmapi_file_vm_ops = { | 
| 629 | .close = linvfs_mmap_close, | 604 | .nopage = linvfs_filemap_nopage, | 
| 630 | .nopage = filemap_nopage, | ||
| 631 | .populate = filemap_populate, | 605 | .populate = filemap_populate, | 
| 632 | #ifdef HAVE_VMOP_MPROTECT | 606 | #ifdef HAVE_VMOP_MPROTECT | 
| 633 | .mprotect = linvfs_mprotect, | 607 | .mprotect = linvfs_mprotect, | 
