summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorment <thement@ibawizard.net>2011-05-08 23:55:58 +0200
committerment <thement@ibawizard.net>2011-05-08 23:55:58 +0200
commit52c77e17cacef05e111c777404566a822254a92c (patch)
treeb85216863bf196afc3006ebcc450c48831110244 /sys/src
parent2330fdb5378da73a6506f4e814fb604ddad9f090 (diff)
usb/disk: fixed offsets in read(ctl), bug in offset calculation
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/cmd/usb/disk/disk.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/sys/src/cmd/usb/disk/disk.c b/sys/src/cmd/usb/disk/disk.c
index d99141318..abad3d66b 100644
--- a/sys/src/cmd/usb/disk/disk.c
+++ b/sys/src/cmd/usb/disk/disk.c
@@ -109,6 +109,24 @@ delpart(Umsc *lun, char *s)
}
void
+fixlength(Umsc *lun, vlong blocks)
+{
+ Part *part, *p;
+
+ part = lun->part;
+ part[Qdata].length = blocks;
+ for(p=&part[Qdata+1]; p < &part[Qmax]; p++){
+ if(p->inuse && p->offset + p->length > blocks){
+ if(p->offset > blocks){
+ p->offset =blocks;
+ p->length = 0;
+ }else
+ p->length = blocks - p->offset;
+ }
+ }
+}
+
+void
makeparts(Umsc *lun)
{
addpart(lun, "/", 0, 0, DMDIR | 0555);
@@ -143,7 +161,7 @@ ctlstring(Usbfs *fs)
for (p = &part[Qdata+1]; p < &part[Qmax]; p++)
if (p->inuse)
fmtprint(&fmt, "part %s %lld %lld\n",
- p->name, p->offset, p->length);
+ p->name, p->offset, p->offset + p->length);
return fmtstrflush(&fmt);
}
@@ -296,7 +314,7 @@ umscapacity(Umsc *lun)
}
lun->blocks++; /* SRcapacity returns LBA of last block */
lun->capacity = (vlong)lun->blocks * lun->lbsize;
- lun->part[Qdata].length = lun->blocks;
+ fixlength(lun, lun->blocks);
if(diskdebug)
fprint(2, "disk: logical block size %lud, # blocks %llud\n",
lun->lbsize, lun->blocks);
@@ -583,7 +601,6 @@ setup(Umsc *lun, Part *p, char *data, int count, vlong offset)
bno = offset >> lbshift; /* offset / lbsize */
nb = ((offset + count + lbsize - 1) >> lbshift) - bno;
- bno += p->offset; /* start of partition */
if(bno + nb > p->length) /* past end of partition? */
nb = p->length - bno;
@@ -593,6 +610,7 @@ setup(Umsc *lun, Part *p, char *data, int count, vlong offset)
if(bno >= p->length || nb == 0)
return 0;
+ bno += p->offset; /* start of partition */
lun->offset = bno;
lun->off = offset & lbmask; /* offset % lbsize */
if(lun->off == 0 && (count & lbmask) == 0)