fworm.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "all.h"
  2. #define FDEV(d) ((d)->fw.fw)
  3. enum { DEBUG = 0 };
  4. Devsize
  5. fwormsize(Device *d)
  6. {
  7. Devsize l;
  8. l = devsize(FDEV(d));
  9. l -= l/(BUFSIZE*8) + 1;
  10. return l;
  11. }
  12. void
  13. fwormream(Device *d)
  14. {
  15. Iobuf *p;
  16. Device *fdev;
  17. Off a, b;
  18. print("fworm ream\n");
  19. devinit(d);
  20. fdev = FDEV(d);
  21. a = fwormsize(d);
  22. b = devsize(fdev);
  23. print("\tfwsize = %lld\n", (Wideoff)a);
  24. print("\tbwsize = %lld\n", (Wideoff)b-a);
  25. for(; a < b; a++) {
  26. p = getbuf(fdev, a, Bmod|Bres);
  27. if(!p)
  28. panic("fworm: init");
  29. memset(p->iobuf, 0, RBUFSIZE);
  30. settag(p, Tvirgo, a);
  31. putbuf(p);
  32. }
  33. }
  34. void
  35. fworminit(Device *d)
  36. {
  37. print("fworm init\n");
  38. devinit(FDEV(d));
  39. }
  40. int
  41. fwormread(Device *d, Off b, void *c)
  42. {
  43. Iobuf *p;
  44. Device *fdev;
  45. Devsize l;
  46. if(DEBUG)
  47. print("fworm read %lld\n", (Wideoff)b);
  48. fdev = FDEV(d);
  49. l = devsize(fdev);
  50. l -= l/(BUFSIZE*8) + 1;
  51. if(b >= l)
  52. panic("fworm: rbounds %lld", (Wideoff)b);
  53. l += b/(BUFSIZE*8);
  54. p = getbuf(fdev, l, Brd|Bres);
  55. if(!p || checktag(p, Tvirgo, l))
  56. panic("fworm: checktag %lld", (Wideoff)l);
  57. l = b % (BUFSIZE*8);
  58. if(!(p->iobuf[l/8] & (1<<(l%8)))) {
  59. putbuf(p);
  60. print("fworm: read %lld\n", (Wideoff)b);
  61. return 1;
  62. }
  63. putbuf(p);
  64. return devread(fdev, b, c);
  65. }
  66. int
  67. fwormwrite(Device *d, Off b, void *c)
  68. {
  69. Iobuf *p;
  70. Device *fdev;
  71. Devsize l;
  72. if(DEBUG)
  73. print("fworm write %lld\n", (Wideoff)b);
  74. fdev = FDEV(d);
  75. l = devsize(fdev);
  76. l -= l/(BUFSIZE*8) + 1;
  77. if(b >= l)
  78. panic("fworm: wbounds %lld", (Wideoff)b);
  79. l += b/(BUFSIZE*8);
  80. p = getbuf(fdev, l, Brd|Bmod|Bres);
  81. if(!p || checktag(p, Tvirgo, l))
  82. panic("fworm: checktag %lld", (Wideoff)l);
  83. l = b % (BUFSIZE*8);
  84. if((p->iobuf[l/8] & (1<<(l%8)))) {
  85. putbuf(p);
  86. print("fworm: write %lld\n", (Wideoff)b);
  87. return 1;
  88. }
  89. p->iobuf[l/8] |= 1<<(l%8);
  90. putbuf(p);
  91. return devwrite(fdev, b, c);
  92. }