Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 27 Sep 1998 22:19:08 +0000 (GMT)
From:      Terry Lambert <tlambert@primenet.com>
To:        rvb@cs.cmu.edu (Robert V. Baron)
Cc:        current@FreeBSD.ORG
Subject:   Re: VM question
Message-ID:  <199809272219.PAA01759@usr05.primenet.com>
In-Reply-To: <yzsiuiamdln.fsf@sicily.odyssey.cs.cmu.edu> from "Robert V. Baron" at Sep 26, 98 11:36:04 pm

next in thread | previous in thread | raw e-mail | index | archive | help
> I have a file system (Coda) in FreeBSD -current that needs to be able
> to map/exec files.  There are a couple ways of doing this.  One way is
> to have coda_bmap() return an error which will then force,
> vnode_pager_generic_getpages() to call vnode_pager_input_old().  The
> latter function does a simple VOP_READ to get the data.  It looks like
> it pretty much does the right thing.  BUT it looks like it fails to
> set the m->valid flag in the page it just read.  (So later when
> exec_map_first_page checks for m->valid == 0; it's sad and the exec
> aborts.)  It looks like if you do the more complicated
> vnode_pager_generic_getpage() function, it will set valid.  On the
> otherhand, it looks like that vm_fault() which also calls
> vm_pager_get_pages() does its own setting of m->valid.  So my
> questions is:
> 	Should vnode_pager_input_old set m->valid and if not who
> 	should.


There are cases where the valid is being cleared when it ought
not to be, specifically, when clean_only is set.


Here is a patch from John Dyson which was never committed, for no
reason that I have been able to determine:

Someone, please, commit this.


					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.
----------------------------------------------------------------------------
*** vm_object.c	Wed Sep  9 01:39:04 1998
--- vm_object.c.new	Wed Sep  9 01:39:03 1998
***************
*** 1324,1330 ****
  			if (all || ((start <= p->pindex) && (p->pindex < end))) {
  				if (p->wire_count != 0) {
  					vm_page_protect(p, VM_PROT_NONE);
! 					p->valid = 0;
  					continue;
  				}
  
--- 1324,1331 ----
  			if (all || ((start <= p->pindex) && (p->pindex < end))) {
  				if (p->wire_count != 0) {
  					vm_page_protect(p, VM_PROT_NONE);
! 					if (!clean_only)
! 						p->valid = 0;
  					continue;
  				}
  
***************
*** 1352,1359 ****
  			if ((p = vm_page_lookup(object, start)) != 0) {
  
  				if (p->wire_count != 0) {
- 					p->valid = 0;
  					vm_page_protect(p, VM_PROT_NONE);
  					start += 1;
  					size -= 1;
  					continue;
--- 1353,1361 ----
  			if ((p = vm_page_lookup(object, start)) != 0) {
  
  				if (p->wire_count != 0) {
  					vm_page_protect(p, VM_PROT_NONE);
+ 					if (!clean_only)
+ 						p->valid = 0;
  					start += 1;
  					size -= 1;
  					continue;

----------------------------------------------------------------------------

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199809272219.PAA01759>