Deleted Added
full compact
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 ---