diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/virtio_disk.c | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/kernel/virtio_disk.c b/kernel/virtio_disk.c index ae6c164..dfca2bc 100644 --- a/kernel/virtio_disk.c +++ b/kernel/virtio_disk.c @@ -212,6 +212,28 @@ alloc3_desc(int *idx)    return 0;  } +#ifdef LAB_LOCK +// +// check that there are at most NBUF distinct +// struct buf's, which the lock lab requires. +// +static struct buf *xbufs[NBUF]; +static void +checkbuf(struct buf *b) +{ +  for(int i = 0; i < NBUF; i++){ +    if(xbufs[i] == b){ +      return; +    } +    if(xbufs[i] == 0){ +      xbufs[i] = b; +      return; +    } +  } +  panic("more than NBUF bufs"); +} +#endif +  void  virtio_disk_rw(struct buf *b, int write)  { @@ -219,6 +241,10 @@ virtio_disk_rw(struct buf *b, int write)    acquire(&disk.vdisk_lock); +#ifdef LAB_LOCK +  checkbuf(b); +#endif +    // the spec's Section 5.2 says that legacy block operations use    // three descriptors: one for type/reserved/sector, one for the    // data, one for a 1-byte status result. | 
