summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/port/devsd.c20
-rw-r--r--sys/src/9/port/sdscsi.c3
2 files changed, 14 insertions, 9 deletions
diff --git a/sys/src/9/port/devsd.c b/sys/src/9/port/devsd.c
index 0c53b6e47..38b9a4548 100644
--- a/sys/src/9/port/devsd.c
+++ b/sys/src/9/port/devsd.c
@@ -847,9 +847,12 @@ sdbio(Chan* c, int write, char* a, long len, uvlong off)
b = (uchar*)a;
allocd = 0;
}else{
- b = sdmalloc(nb*unit->secsize);
- if(b == nil)
- error(Enomem);
+ while((b = sdmalloc(nb*unit->secsize)) == nil){
+ if(!waserror()){
+ tsleep(&up->sleep, return0, 0, 100);
+ poperror();
+ }
+ }
allocd = 1;
}
if(waserror()){
@@ -929,8 +932,12 @@ sdrio(SDreq* r, void* a, long n)
}
data = nil;
- if(n > 0 && (data = sdmalloc(n)) == nil)
- error(Enomem);
+ while(n > 0 && (data = sdmalloc(n)) == nil){
+ if(!waserror()){
+ tsleep(&up->sleep, return0, 0, 100);
+ poperror();
+ }
+ }
if(waserror()){
sdfree(data);
r->data = nil;
@@ -1484,8 +1491,7 @@ sdwrite(Chan* c, void* a, long n, vlong off)
}
if(n < 6 || n > sizeof(req->cmd))
error(Ebadarg);
- if((req = malloc(sizeof(SDreq))) == nil)
- error(Enomem);
+ req = smalloc(sizeof(SDreq));
req->unit = unit;
if(waserror()){
free(req);
diff --git a/sys/src/9/port/sdscsi.c b/sys/src/9/port/sdscsi.c
index defad953e..e6b53c0b8 100644
--- a/sys/src/9/port/sdscsi.c
+++ b/sys/src/9/port/sdscsi.c
@@ -384,8 +384,7 @@ scsibio(SDunit* unit, int lun, int write, void* data, long nb, uvlong bno)
SDreq *r;
long rlen;
- if((r = malloc(sizeof(SDreq))) == nil)
- error(Enomem);
+ r = smalloc(sizeof(SDreq));
r->unit = unit;
r->lun = lun;
again: