tmpfs_vnops.c (236208) | tmpfs_vnops.c (236209) |
---|---|
1/* $NetBSD: tmpfs_vnops.c,v 1.39 2007/07/23 15:41:01 jmmv Exp $ */ 2 3/*- 4 * Copyright (c) 2005, 2006 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Julio M. Merino Vidal, developed as part of Google's Summer of Code --- 20 unchanged lines hidden (view full) --- 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33/* 34 * tmpfs vnode interface. 35 */ 36#include <sys/cdefs.h> | 1/* $NetBSD: tmpfs_vnops.c,v 1.39 2007/07/23 15:41:01 jmmv Exp $ */ 2 3/*- 4 * Copyright (c) 2005, 2006 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Julio M. Merino Vidal, developed as part of Google's Summer of Code --- 20 unchanged lines hidden (view full) --- 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33/* 34 * tmpfs vnode interface. 35 */ 36#include <sys/cdefs.h> |
37__FBSDID("$FreeBSD: stable/9/sys/fs/tmpfs/tmpfs_vnops.c 236208 2012-05-28 22:58:13Z alc $"); | 37__FBSDID("$FreeBSD: stable/9/sys/fs/tmpfs/tmpfs_vnops.c 236209 2012-05-28 23:31:48Z alc $"); |
38 39#include <sys/param.h> 40#include <sys/fcntl.h> 41#include <sys/lockf.h> 42#include <sys/namei.h> 43#include <sys/priv.h> 44#include <sys/proc.h> 45#include <sys/sched.h> --- 394 unchanged lines hidden (view full) --- 440} 441 442/* --------------------------------------------------------------------- */ 443static int 444tmpfs_nocacheread(vm_object_t tobj, vm_pindex_t idx, 445 vm_offset_t offset, size_t tlen, struct uio *uio) 446{ 447 vm_page_t m; | 38 39#include <sys/param.h> 40#include <sys/fcntl.h> 41#include <sys/lockf.h> 42#include <sys/namei.h> 43#include <sys/priv.h> 44#include <sys/proc.h> 45#include <sys/sched.h> --- 394 unchanged lines hidden (view full) --- 440} 441 442/* --------------------------------------------------------------------- */ 443static int 444tmpfs_nocacheread(vm_object_t tobj, vm_pindex_t idx, 445 vm_offset_t offset, size_t tlen, struct uio *uio) 446{ 447 vm_page_t m; |
448 int error; | 448 int error, rv; |
449 450 VM_OBJECT_LOCK(tobj); | 449 450 VM_OBJECT_LOCK(tobj); |
451 vm_object_pip_add(tobj, 1); | |
452 m = vm_page_grab(tobj, idx, VM_ALLOC_WIRED | 453 VM_ALLOC_NORMAL | VM_ALLOC_RETRY); 454 if (m->valid != VM_PAGE_BITS_ALL) { 455 if (vm_pager_has_page(tobj, idx, NULL, NULL)) { | 451 m = vm_page_grab(tobj, idx, VM_ALLOC_WIRED | 452 VM_ALLOC_NORMAL | VM_ALLOC_RETRY); 453 if (m->valid != VM_PAGE_BITS_ALL) { 454 if (vm_pager_has_page(tobj, idx, NULL, NULL)) { |
456 error = vm_pager_get_pages(tobj, &m, 1, 0); 457 if (error != 0) { 458 printf("tmpfs get pages from pager error [read]\n"); 459 goto out; | 455 rv = vm_pager_get_pages(tobj, &m, 1, 0); 456 if (rv != VM_PAGER_OK) { 457 vm_page_lock(m); 458 vm_page_free(m); 459 vm_page_unlock(m); 460 VM_OBJECT_UNLOCK(tobj); 461 return (EIO); |
460 } 461 } else 462 vm_page_zero_invalid(m, TRUE); 463 } 464 VM_OBJECT_UNLOCK(tobj); 465 error = uiomove_fromphys(&m, offset, tlen, uio); 466 VM_OBJECT_LOCK(tobj); | 462 } 463 } else 464 vm_page_zero_invalid(m, TRUE); 465 } 466 VM_OBJECT_UNLOCK(tobj); 467 error = uiomove_fromphys(&m, offset, tlen, uio); 468 VM_OBJECT_LOCK(tobj); |
467out: | |
468 vm_page_lock(m); 469 vm_page_unwire(m, TRUE); 470 vm_page_unlock(m); 471 vm_page_wakeup(m); | 469 vm_page_lock(m); 470 vm_page_unwire(m, TRUE); 471 vm_page_unlock(m); 472 vm_page_wakeup(m); |
472 vm_object_pip_subtract(tobj, 1); | |
473 VM_OBJECT_UNLOCK(tobj); 474 475 return (error); 476} 477 478static __inline int 479tmpfs_nocacheread_buf(vm_object_t tobj, vm_pindex_t idx, 480 vm_offset_t offset, size_t tlen, void *buf) --- 146 unchanged lines hidden (view full) --- 627static int 628tmpfs_mappedwrite(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio) 629{ 630 vm_pindex_t idx; 631 vm_page_t vpg, tpg; 632 vm_offset_t offset; 633 off_t addr; 634 size_t tlen; | 473 VM_OBJECT_UNLOCK(tobj); 474 475 return (error); 476} 477 478static __inline int 479tmpfs_nocacheread_buf(vm_object_t tobj, vm_pindex_t idx, 480 vm_offset_t offset, size_t tlen, void *buf) --- 146 unchanged lines hidden (view full) --- 627static int 628tmpfs_mappedwrite(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio) 629{ 630 vm_pindex_t idx; 631 vm_page_t vpg, tpg; 632 vm_offset_t offset; 633 off_t addr; 634 size_t tlen; |
635 int error; | 635 int error, rv; |
636 637 error = 0; 638 639 addr = uio->uio_offset; 640 idx = OFF_TO_IDX(addr); 641 offset = addr & PAGE_MASK; 642 tlen = MIN(PAGE_SIZE - offset, len); 643 --- 23 unchanged lines hidden (view full) --- 667 } else { 668 if (__predict_false(vobj->cache != NULL)) 669 vm_page_cache_free(vobj, idx, idx + 1); 670 VM_OBJECT_UNLOCK(vobj); 671 vpg = NULL; 672 } 673nocache: 674 VM_OBJECT_LOCK(tobj); | 636 637 error = 0; 638 639 addr = uio->uio_offset; 640 idx = OFF_TO_IDX(addr); 641 offset = addr & PAGE_MASK; 642 tlen = MIN(PAGE_SIZE - offset, len); 643 --- 23 unchanged lines hidden (view full) --- 667 } else { 668 if (__predict_false(vobj->cache != NULL)) 669 vm_page_cache_free(vobj, idx, idx + 1); 670 VM_OBJECT_UNLOCK(vobj); 671 vpg = NULL; 672 } 673nocache: 674 VM_OBJECT_LOCK(tobj); |
675 vm_object_pip_add(tobj, 1); | |
676 tpg = vm_page_grab(tobj, idx, VM_ALLOC_WIRED | 677 VM_ALLOC_NORMAL | VM_ALLOC_RETRY); 678 if (tpg->valid != VM_PAGE_BITS_ALL) { 679 if (vm_pager_has_page(tobj, idx, NULL, NULL)) { | 675 tpg = vm_page_grab(tobj, idx, VM_ALLOC_WIRED | 676 VM_ALLOC_NORMAL | VM_ALLOC_RETRY); 677 if (tpg->valid != VM_PAGE_BITS_ALL) { 678 if (vm_pager_has_page(tobj, idx, NULL, NULL)) { |
680 error = vm_pager_get_pages(tobj, &tpg, 1, 0); 681 if (error != 0) { 682 printf("tmpfs get pages from pager error [write]\n"); | 679 rv = vm_pager_get_pages(tobj, &tpg, 1, 0); 680 if (rv != VM_PAGER_OK) { 681 vm_page_lock(tpg); 682 vm_page_free(tpg); 683 vm_page_unlock(tpg); 684 error = EIO; |
683 goto out; 684 } 685 } else 686 vm_page_zero_invalid(tpg, TRUE); 687 } 688 VM_OBJECT_UNLOCK(tobj); 689 if (vpg == NULL) 690 error = uiomove_fromphys(&tpg, offset, tlen, uio); 691 else { 692 KASSERT(vpg->valid == VM_PAGE_BITS_ALL, ("parts of vpg invalid")); 693 pmap_copy_page(vpg, tpg); 694 } 695 VM_OBJECT_LOCK(tobj); | 685 goto out; 686 } 687 } else 688 vm_page_zero_invalid(tpg, TRUE); 689 } 690 VM_OBJECT_UNLOCK(tobj); 691 if (vpg == NULL) 692 error = uiomove_fromphys(&tpg, offset, tlen, uio); 693 else { 694 KASSERT(vpg->valid == VM_PAGE_BITS_ALL, ("parts of vpg invalid")); 695 pmap_copy_page(vpg, tpg); 696 } 697 VM_OBJECT_LOCK(tobj); |
696out: 697 if (vobj != NULL) 698 VM_OBJECT_LOCK(vobj); | |
699 if (error == 0) { 700 KASSERT(tpg->valid == VM_PAGE_BITS_ALL, 701 ("parts of tpg invalid")); 702 vm_page_dirty(tpg); 703 } 704 vm_page_lock(tpg); 705 vm_page_unwire(tpg, TRUE); 706 vm_page_unlock(tpg); 707 vm_page_wakeup(tpg); | 698 if (error == 0) { 699 KASSERT(tpg->valid == VM_PAGE_BITS_ALL, 700 ("parts of tpg invalid")); 701 vm_page_dirty(tpg); 702 } 703 vm_page_lock(tpg); 704 vm_page_unwire(tpg, TRUE); 705 vm_page_unlock(tpg); 706 vm_page_wakeup(tpg); |
708 if (vpg != NULL) | 707out: 708 VM_OBJECT_UNLOCK(tobj); 709 if (vpg != NULL) { 710 VM_OBJECT_LOCK(vobj); |
709 vm_page_wakeup(vpg); | 711 vm_page_wakeup(vpg); |
710 if (vobj != NULL) | |
711 VM_OBJECT_UNLOCK(vobj); | 712 VM_OBJECT_UNLOCK(vobj); |
712 vm_object_pip_subtract(tobj, 1); 713 VM_OBJECT_UNLOCK(tobj); | 713 } |
714 715 return (error); 716} 717 718static int 719tmpfs_write(struct vop_write_args *v) 720{ 721 struct vnode *vp = v->a_vp; --- 1063 unchanged lines hidden --- | 714 715 return (error); 716} 717 718static int 719tmpfs_write(struct vop_write_args *v) 720{ 721 struct vnode *vp = v->a_vp; --- 1063 unchanged lines hidden --- |