diff options
author | attilio <attilio@FreeBSD.org> | 2011-07-06 15:09:52 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2011-07-06 15:09:52 +0000 |
commit | 9be9b5e188ec8d9c095232dd57d4e6476726ee50 (patch) | |
tree | cd05d03e892ae87096e3fcb90fd6c62091f84469 | |
parent | 7893f5ef5d34ac7a7aef842558d61d6b921fa66e (diff) | |
download | FreeBSD-src-9be9b5e188ec8d9c095232dd57d4e6476726ee50.zip FreeBSD-src-9be9b5e188ec8d9c095232dd57d4e6476726ee50.tar.gz |
Handle a race between device_pager and devsw in a more graceful manner:
return an error code rather than panic the kernel.
Sponsored by: Sandvine Incorporated
Reviewed by: kib
Tested by: pho
MFC after: 2 weeks
-rw-r--r-- | sys/vm/device_pager.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index f2131dd..411482a 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -217,8 +217,10 @@ dev_pager_getpages(object, m, count, reqpage) memattr = object->memattr; VM_OBJECT_UNLOCK(object); csw = dev_refthread(dev, &ref); - if (csw == NULL) - panic("dev_pager_getpage: no cdevsw"); + if (csw == NULL) { + VM_OBJECT_LOCK(object); + return (VM_PAGER_FAIL); + } td = curthread; fpop = td->td_fpop; td->td_fpop = NULL; |