struct buf {
  int flags;
  uint dev;
  uint sector;
  struct spinlock lock;
  struct sleeplock sleeplock;
  struct buf *prev; // LRU cache list
  struct buf *next;
  struct buf *qnext; // disk queue
  uchar data[512];
};
#define B_VALID 0x1  // buffer has been read from disk
#define B_DIRTY 0x2  // buffer needs to be written to disk

