summaryrefslogtreecommitdiff
path: root/ufs/ChangeLog
blob: 896297d403f1a682a51fc4e871f176fd80775309 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
Fri Sep  6 16:00:42 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* consts.c: Include <version.h>.
 	(diskfs_major_version, diskfs_minor_version, diskfs_edit_version):
	Deleted variables. 
	(diskfs_server_version): New variable.

Thu Aug 29 16:07:07 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* dir.c (diskfs_lookup_hard): When setting ds->stat to EXTEND, set
	ds->idx by looking at the size of the file.  (IDX itself is no
	longer at the end because of the change on Aug 16 1996.) 

Wed Aug 28 12:15:15 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* dir.c (dirscanblock): Size dirents correctly when mallocing it.
	(diskfs_direnter_hard): Be more careful when sizing or resizing
	dirents.  Correctly set to -1 all the new entries we create after
	realloc call.   

Fri Aug 16 18:51:31 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* ufs.h (struct disknode): New member `dir_idx'.
	* inode.c (diskfs_cached_lookup): Initialize DN->dir_idx.
	* dir.c (diskfs_lookup_hard): 	After successful dirscanblock,
	record index where we finished in DP->dn->dir_idx.  Start searches
	at that index.

Mon Aug 12 13:43:46 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* hyper.c (diskfs_set_hypermetadata): Bother to return 0 at end of
	function.

Wed Aug  7 13:00:30 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* inode.c (diskfs_set_statfs): Compute st->f_blocks correctly; set
	bsize to be fs_fsize, not fs_bsize.

	* hyper.c (diskfs_set_hypermetadata): Return an error as
	appropriate. 
	
	* inode.c (struct ufs_fhandle): Layout filehandle more like Unixy
	NFSD. 
 	(diskfs_S_file_getfh): Bother to clear unused parts of a
	file handle so that they always compare equal.

Tue Aug  6 12:19:38 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* inode.c: Include <fcntl.h>.
	(struct ufs_fhandle): New type.
	(diskfs_S_fsys_getfile, diskfs_S_file_getfh): New functions.

Tue Jul 23 15:58:28 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* inode.c (write_node, read_disknode): `struct timespec' now uses
	a field prefix of `tv_'.

Sat Jul  6 16:14:10 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (ufs_version): Variable removed.

Sat Jul  6 12:45:36 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* inode.c (read_disknode): Don't set allocsize based on st->size
 	for kludged symlinks.

	* sizes.c (diskfs_truncate): Call record_poke after truncating a
 	kludged symlink.

Wed Jul  3 13:27:04 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* main.c: Include <argz.h>.
	(startup_parents, runtime_parents): Declare const.

Tue Jun 25 14:02:02 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (diskfs_get_options): Include `--compat=' in options.

Mon Jun 24 16:59:12 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* dir.c (diskfs_lookup_hard): Use diskfs_check_readonly instead of
 	diskfs_readonly.
	(diskfs_dirempty): Likewise.

	* dir.c (diskfs_lookup_hard): Use diskfs_check_readonly instead of
	diskfs_readonly.
	(diskfs_dirempty): Likewise.
	* inode.c (diskfs_cached_lookup): Likewise.
	(read_symlink_hook): Likewise.
	* sizes.c (diskfs_truncate): Call diskfs_check_readonly.
	(diskfs_grow): Likewise.
	* hyper.c (diskfs_set_hypermetadata): If CLEAN is not set, make
	sure we clear the clean bit on disk.  Always call sync_disk (with
	appropriate WAIT).
	(diskfs_readonly_changed): Don't do set_hypermetadata here.
	(copy_sblock): Don't track clean state here.

	* pager.c (diskfs_shutdown_pager): Don't shutdown DISKPAGER ever,
 	just sync it instead.

Sat Jun 22 17:45:34 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (diskfs_get_options): New function.
	(options): Make const.

Fri Jun 21 01:32:09 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (parse_opt): Handle runtime invalid selection of 4.2 mode.
	Save select mode until we're done to correctly deal with external
	errors at runtime.
	(startup_parents, startup_argp, runtime_parents, runtime_argp):
	New variables.
	(main): Argp vars made global.
	(argp_parents): diskfs_device_startup_argp -->
	&diskfs_std_device_startup_argp.

Sat Jun 15 13:57:27 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (options): New variable.
	(parse_opt): New function.
	(main): Parse ufs-specific options too.
	<string.h>: New include.

Fri May 10 09:29:03 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* inode.c (diskfs_set_statfs): Fix one reference to old name of ST
 	member.

Thu May  9 11:54:13 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* Makefile (ufs.static ufs): s/ioserver/iohelp/g
	* ufs.h: ioserver.h -> iohelp.h.

	* inode.c (diskfs_set_statfs): Use and fill in new statfs
 	structure.

Mon May  6 14:23:54 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* main.c (ufs_version): Upgrade to 0.0.

Fri May  3 09:15:33 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* sizes.c (block_extended): Rewrite code that moves pages
	to be more efficient, and not deadlock too, using unlocked 
	pagein permission feature (read "hack").  Return value 
	now indicates whether we expect a sync.
	(diskfs_grow): If a call to block_extended returns nonzero,
	then sync the file before returning.
	* pager.c (diskfs_get_filemap): Initialize
	UPI->allow_unlocked_pagein and UPI->unlocked_pagein_length.
	(unlocked_pagein_lock): New variable.
	(find_address): New parameter `isread'; all callers changed.
	If ISREAD and we are in the unlocked pagein region, don't
	attempt to acquire NP->dn->allocptrlock.
	* ufs.h (struct user_pager_info): New members
 	`allow_unlocked_pagein' and `unlocked_pagein_length'.
	(unlocked_pagein_lock): New variable.

Thu May  2 10:56:10 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* sizes.c (offer_data): Offer pages at ADDR each time through the
 	loop, not the same page over and over.
	(block_extended): When moving data, sync in-core pager both before
	reading from disk and after providing data to kernel.
	(diskfs_grow): Always call block_extended or offer_data before
	adjusting block pointer.

Tue Apr 30 13:38:42 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* sizes.c (diskfs_grow): In last offer_data, don't offer a block
 	number as an address.

Fri Apr 26 15:35:53 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* Makefile (makemode): Now `servers'.
	(targets): Renamed from `target'; now include ufs.static.
	(ufs.static-LDFLAGS): Renamed from `LDFLAGS'.
	(ufs.static): Depend on same things as `ufs'.
	(include ../Makeconf): Must come before dependency information.

Wed Apr 24 14:05:48 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* dir.h (DIRECT_NAMLEN) [! LITTLE_ENDIAN]: Deal correctly with the
 	case where it was written on a little endian machine without the
 	extension.
	(DIRECT_NAMLEN) [LITTLE_ENDIAN]: Deal with case correctly where it
	was written without the extension on a big endian machine. 
	* dir.c (dirscanblock): Use read/write_disk_entry when reading or
 	writing fields from directory entries.  
	(diskfs_direnter_hard): Likewise.
	(diskfs_dirremove_hard): Likewise.
	(diskfs_dirrewrite_hard): Likewise.
	(diskfs_get_directs): Likewise.
	(diskfs_dirempty): Likewise.
	(count_dirents): Likewise.

Tue Apr 23 11:28:42 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* dir.c (diskfs_dirempty): node_update -> diskfs_node_update.

	* hyper.c (swab_sblock, swab_csums): New functions.
	(get_hypermetadata): If this is a swapped filesystem, set swab_disk.
	Also swap csum and sblock after reading them.
	(diskfs_set_hypermetadata): If swab_disk, swap the csums back before
	writing them.
	(copy_sblock): If swab_disk, swap the sblock before writing it.
	* ufs.h (swab_disk): New variable.
	(swab_short, swab_long, swab_long_long): New functions.
	(read_disk_entry, write_disk_entry): New macros.
	* alloc.c (ffs_realloccg): Use read/write_disk_entry when
 	reading/writing on-disk inode fields.  
	* bmap.c (fetch_indir_spec): Likewise.  
	* inode.c (read_disknode): Likewise.
	(write_node): Likewise.
	(diskfs_set_translator): Likewise.
	(diskfs_get_translator): Likewise.
	(diskfs_S_file_get_storage_info): Likewise.
	* sizes.c (diskfs_truncate): Likewise.
	(diskfs_grow): Likewise.
	* pager.c (pager_unlock_page): Likewise.
	* bmap.c (fetch_indir_spec): Use read/write_disk_entry when
	reading/writing on-disk indirect blocks.
	* sizes.c (diskfs_truncate): Likewise.
	(indir_release): Likewise.
	(diskfs_grow): Likewise.
	* pager.c (pager_unlock_page): Likewise.
	* alloc.c: Include <string.h>
	(ffs_blkpref): Use read_disk_entry when reading from BAP array. 
	(swab_cg, read_cg, release_cg): New functions.
	(ffs_fragextend, ffs_alloccg, ffs_nodealloccg, ffs_blkfree,
	diskfs_free_node): Use new cg access functions. 
	
Thu Apr 18 14:50:30 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* sizes.c (diskfs_grow): New variable `pagerpt'.
	(offer_zeroes, block_extended): New functions.
	(diskfs_grow): In initializing newly allocated data disk blocks with
	zeroes, use less aggressive offer_zeroes instead of immediate
 	synchronous writes.  After ffs_realloccg succeeds, use
 	block_extended to handle the magic.  Get rid of old poke calls.
	* alloc.c (ffs_realloccg): If we are allocating a new block, don't
	actually free the old one here.
	* sizes.c (diskfs_grow): New variable `pagerpt'.
	(offer_zeroes, block_extended): New functions.
	(diskfs_grow): In initializing newly allocated data disk blocks
	with zeroes, use less aggressive offer_zeroes instead of immediate
	synchronous writes.   After ffs_realloccg succeeds, use
	block_extended to handle the magic.  Get rid of old poke calls.

Tue Apr 16 15:20:07 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* dir.c (diskfs_lookup_hard): Set atime appropriately, and sync
	the new atime if we are running synchronously (!).
	(diskfs_dirempty): Likewise.
	(diskfs_direnter_hard): Set mtime appropriately.
	(diskfs_dirremove_hard): Likewise.
	(diskfs_dirrewrite_hard): Likewise.

	* inode.c (diskfs_write_disknode): Only do sync if WAIT is set.

Thu Apr  4 16:39:22 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* inode.c (diskfs_cached_lookup): Intialize NP->cache_id *after*
	NP exists.

Wed Apr  3 16:03:51 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* inode.c (diskfs_cached_lookup): Renamed from `iget'.  All
 	callers changed.  Initialize NP->cache_id.

Fri Mar 29 16:52:31 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* sizes.c (diskfs_truncate): Cast DI->di_shortlink to correct type
 	before adding a character count to it.

Mon Mar 25 13:08:10 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* dir.c (diskfs_null_dirstat): New function.

Fri Mar 22 23:43:53 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* inode.c (read_symlink_hook): Only set NP's atime if !readonly.

Wed Mar 20 14:36:31 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* dir.c (diskfs_lookup_hard): Don't do initial or final permission
	checking here. 
	* dir.c (diskfs_dirrewrite_hard): Renamed from diskfs_dirrewrite.
  	No longer call modification tracking routines.
	(diskfs_dirremove_hard): Renamed from diskfs_dirremove.  No longer call
	modification tracking routines.
	(diskfs_direnter_hard): Renamed from diskfs_direnter.  No longer call
	modification tracking routines.
	(diskfs_lookup_hard): Renamed from diskfs_lookup.

Mon Mar 18 19:50:41 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (main): Pass new arg to argp_parse.

Mon Mar 18 12:33:06 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* pager.c (diskfs_max_user_pager_prot) [add_pager_max_prot]: 
	(a == b) ? 1 : 0   ====>   (a == b).

Fri Feb 23 15:27:05 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>

	* hyper.c (get_hypermetadata): Use diskfs_device_arg in unclean msgs.

Wed Feb 21 05:57:12 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>

	* hyper.c: Implement proper handling of the filesystem `clean bit'.
	(ufs_clean): New variable.
	(get_hypermetadata): Set it from the fs_clean flag.  If not clean,
 	complain and force read-only.  Complain when ignoring COMPAT_BSD42.
	(diskfs_set_hypermetadata): Set the clean flag in the superblock
 	when CLEAN and fs was clean to start with.
	(copy_sblock): Remove bogus clean flag frobnication.

Fri Feb 16 17:05:36 1996  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (main): Check error return from diskfs_init_diskfs.

Sat Jan  6 11:50:14 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* ufs.h (diskpager, diskpagerport, disk_image): Variables removed.
	Include <hurd/diskfs-pager.h> instead.
	(sync_disk_blocks): Use `disk_pager' in place of `diskpager->p'.
	* pager.c (diskfs_shutdown_pager, diskfs_sync_everything): Use
	`disk_pager' in place of `diskpager->p'.
	(create_disk_pager): Rewritten using disk_pager_setup.
	* pokeloc.c (sync_disk): Use `disk_pager' in place of `diskpager->p'.
	* sizes.c (indir_release): Likewise.
	* main.c (diskfs_reload_global_state): Likewise.

Thu Jan  4 19:10:11 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (main): Don't map disk image here; create_disk_pager now
	does it.

	* hyper.c (get_hypermetadata, copy_sblock): Don't put
 	diskfs_catch_exception () inside assert, bonehead!  Use
 	assert_perror on a variable of its result.

Mon Jan  1 16:38:14 1996  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* pager.c (pager_unlock_page): When allocating block in direct
 	array, clear it synchronously just like we do when it goes in the
 	indirect array.

Thu Nov  9 14:01:30 1995  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* dir.c (struct dirstat): New member `nbytes'.
	(dirscanblock): If DS->type is COMPRESS, still look
	for TAKE/SHRINK possibilities.  Also, if it's COMPRESS,
	still look to see if the current block can be compressed
	with fewer byte copies.

Sun Nov  5 02:08:38 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (main): Add flags arg to diskfs_startup_diskfs call.

Sat Nov  4 20:01:58 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* inode.c (diskfs_S_file_get_storage_info): Add FLAGS argument.

Thu Oct 19 12:50:11 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* pager.c (diskfs_max_user_pager_prot): Return what we discovered,
	instead of 1.

	* dir.c (diskfs_lookup, diskfs_dirempty): Give diskfs_get_filemap
	a protection arg.
	* sizes.c (diskfs_truncate, diskfs_grow): Ditto.

	* hyper.c (diskfs_readonly_changed): Give the 2nd arg to
 	vm_protect an appropiate type.

	* pager.c (diskfs_max_user_pager_prot): Stop iterating early if poss.

Wed Oct 18 16:28:42 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* ufs.h (struct user_pager_info): Add max_prot field.
	* pager.c (diskfs_get_filemap): Add PROT parameter, & use it.
	(diskfs_pager_users): Split out block_caching & enable_caching.
	(block_caching, enable_caching): New function.
	(diskfs_max_user_pager_prot): New function.

	* main.c (main): Always include VM_PROT_WRITE in max prot.
	* hyper.c (diskfs_readonly_changed): Change the protection of
	DISK_IMAGE to reflect the new state.  Clear SBLOCK_DIRTY if readonly.

	* inode.c (read_disknode): Bother to set the allocsize field.

	* ufs.h (struct rwlock): Structure deleted.
	(rwlock_init, rwlock_reader_unlock, rwlock_reader_lock,
 	rwlock_writer_lock, rwlock_writer_unlock): Functions deleted.


Tue Oct 17 14:49:43 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* inode.c (diskfs_node_reload): New function.
	(iget): Move allocsize setting into read_disknode.
	* pager.c (flush_node_pager): New function.
	* ufs.h (zeroblock, sblock, csum): Declare extern.
	(flush_node_pager, flush_pokes): New declarations.
	* pokeloc.c (flush_pokes): New function.
	* hyper.c (diskfs_readonly_changed): New function.
	(get_hypermetadata): Move compat_mode futzing & disk size
	validation here from main.
	(zeroblock, sblock, csum): Define (were common).
	(get_hypermetadata): Only allocate SBLOCK if not already done.
	Deallocate any old ZEROBLOCK and CSUM storage.
	(diskfs_readonly_changed): New function.
	* main.c (main): Move stuff into get_hypermetadata.
	Writable init code moved to diskfs_readonly_changed.
	(diskfs_reload_global_state): New function.

Fri Oct 13 15:03:37 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (main): Use new handy diskfs routines and get rid of
	tons of junk.  Main should be almost all ufs-specific now.
	(USAGE, usage, SHORT_OPTS, long_opts, parse_opt, trans_parse_arg): RIP.
	(printf_lock): Initialize.

Thu Oct 12 18:48:04 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* pager.c (pager_unlock_page, pager_write_page, pager_read_page):
	Use diskfs_device_{read,write}_sync instead of dev_{read,write}_sync.
	* hyper.c (diskfs_set_hypermetadata): Ditto.
	* sizes.c (diskfs_grow): Ditto.
	* pager.c (pager_report_extent): Calculate the pager size.
	* ufs.h (dev_read_sync, dev_write_sync, dev_write, diskpagersize):
	Decls removed.

	* Makefile (SRCS): Remove devio.c.
	* ufs.h (ufs_device, ufs_device_name): Variables removed.
	* inode.c (diskfs_S_file_get_storage_info): Use DISKFS_DEVICE
	instead of UFS_DEVICE, and DISKFS_DEVICE_NAME instead of
	UFS_DEVICE_NAME.

Sat Oct  7 20:47:56 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* main.c (diskfs_init_completed): Function deleted (now in libdiskfs).
	(thread_cancel): Function deleted.

Fri Oct  6 17:30:23 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* inode.c (diskfs_S_file_get_storage_info): Change type of
 	ADDRESSES to off_t **, and add the BLOCK_SIZE parameter.

Wed Oct  4 17:21:33 1995  Miles Bader  <miles@gnu.ai.mit.edu>

	* inode.c (diskfs_set_statfs): fsys_stb_bsize -> fsys_stb_iosize.
  	fsys_stb_fsize -> fsys_stb_bsize.

	* main.c (parse_opt): Rearrange slightly.

Tue Sep 26 11:54:35 1995  Michael I. Bushnell, p/BSG  <mib@gnu.ai.mit.edu>

	* inode.c: Include <netinet/in.h>.
	(diskfs_S_file_get_storage_info): New function.
	* main.c (main): Delete var `devname'.  Use `ufs_device_name'
 	throughout instead.
	* ufs.h (ufs_device_name): New var.

Fri Sep 22 13:22:42 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* hyper.c (get_hypermetadata): Use %Zd format for result of sizeof.

Tue Sep 19 13:41:46 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>

	* Makefile (LDFLAGS): New variable.

Wed Sep 13 12:30:23 1995  Michael I. Bushnell, p/BSG  <mib@duality.gnu.ai.mit.edu>

	* dir.c (diskfs_lookup): Don't attempt to lock NP if NPP is not
 	set.  Don't even set NP if NPP is not set; use INUM as "lookup
 	succeeded flag" instead.  Lookups for REMOVE and RENAME now *must*
	set NPP.

Wed Sep  6 11:01:50 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>

	* pager.c (diskfs_pager_users): Ignore the disk pager when seeing
	if there are any active pagers.

Mon Aug 28 17:07:36 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Makefile (ufs): Depend on ../libshouldbeinlibc/libshouldbeinlibc.a.

Fri Aug 25 17:14:09 1995  Michael I. Bushnell, p/BSG  <mib@duality.gnu.ai.mit.edu>

	* sizes.c (diskfs_truncate): When freeing direct blocks mentioned
	in a single indirect block, or single indirect blocks mentioned in
	a double, only call the free routine (ffs_blkfree or
	indir_release, respectively) if the block is actually allocated.

Wed Aug 23 12:24:07 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>

	* Makefile (ufs): Add explicit dependencies.
	(HURDLIBS, LDFLAGS, REMHDRS): Removed.
	Rules associated with ../lib removed.

Fri Jul 21 17:48:12 1995  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* pager.c (diskfs_get_filemap): Drop initial reference created by
	pager_create.

	* pager.c (diskfs_get_filemap): Avoid race with simultaneous
	termination by looping until we win.
	(pager_clear_user_data): Only clear UPI->np->dn->fileinfo if it
	still points to us.

Mon Jul 17 14:35:25 1995  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* pager.c (thread_function): Don't have any global timeout here;
 	we don't use it anyhow.

Thu Jul  6 15:42:52 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* Makefile: Removed dependencies that are now automatically
 	generated.

Mon Jun 26 20:17:42 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* pager.c: Include <unistd.h>.
	(diskfs_pager_users): New function.

Thu Jun 22 11:41:04 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* pager.c (thread_function): Move thread_function to be non-local,
	of course, because it needs to live even after create_disk_pager
	returns.

	* main.c (thread_cancel): New function (HACK).

	* Makefile (HURDLIBS): Add libihash.

	* main.c (main): Have main thread exit when done instead of
	calling a diskfs function.

Wed Jun 21 12:20:01 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* ufs.h (user_pager_info): Removed members next and prevp.
	* pager.c (pager_clear_user_data): Don't maintain pager linked
	list.
	(diskfs_get_filemap): Don't maintain pager linked list.
	(pager_dropweak): New function.
	(pager_traverse): Delete function.
	(diskfs_shutdown_pager): Use ports_bucket_iterate instead of
	pager_traverse.
	(diskfs_sync_everything): Likewise.

	* pager.c (pager_bucket): New variable.
	(create_disk_pager): Provide pager_bucket in call to pager_create.
	(diskfs_get_filemap): Likewise.
	(diskfs_file_update): Use ports reference calls directly instead
	of pager wrappers.
	(drop_pager_softrefs): Likewise.
	(allow_pager_softrefs): Likewise.
	(pager_traverse): Likewise.
	(create_disk_pager): Initialize pager_bucket here and fork off
	service thread for pager ports.

	* sizes.c (diskfs_truncate): Likewise.

	* dir.c (diskfs_lookup): Provide initialization for BUFLEN.
	(diskfs_direnter): Move assignment out of if test.

Tue Jun 20 11:48:06 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* sizes.c (diskfs_grow): Provide initialization of POKE_OFF.
	* alloc.c (ffs_realloccg): Remove assignment from if tests.
	* sizes.c (diskfs_truncate): Likewise.
	* bmap.c (fetch_indir_spec): Likewise.

Mon Jun 19 21:17:21 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* inode.c (diskfs_node_iterate): New function.
	(write_all_disknodes): Use it.

Wed Jun 14 16:18:55 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* inode.c (diskfs_get_translator): Conform to new memory usage
        semantic.

Sat May 20 00:17:30 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>

	* main.c (trans_parse_args): Use options_parse &
	diskfs_standard_startup_options to parse our translator options.
	(usage): New function.
	(parse_opt): New function.

	* Makefile (CPPFLAGS): Add -I../lib, to get include lib include files,
	and $(CPPFLAGS-$(notdir $<)) to get file-specific cpp options.
	Add a vpath for %.c to ../lib, so we can use source files from there.

Mon May 15 13:14:48 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* pager.c (pager_clear_user_data): Doc fix.

Sat May 13 05:04:11 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Makefile (OBJS): Remove exec_server_image.o.
	(exec_server_image.o): Rule removed.

Mon May  8 08:43:43 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>

	* dir.c (diskfs_lookup): When looping back to try_again: because
	we're looking up "..", be sure and trash the mapping we made of
	the directory's pager -- otherwise the reference to the pager
	never gets dropped and we can never free the node.

	* dir.c (diskfs_lookup): ds->type was being compared to LOOKING, which
	value it can never have.  Compare ds->stat against LOOKING instead.

	* pager.c (pager_clear_user_data): Don't die when called on the
	disk pager.

	* inode.c (write_all_disknodes): Fix typo `alloc' --> `alloca'.

Tue May  2 11:59:09 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* pager.c (pager_clear_user_data): Acquire pagerlistlock around
	modifications to UPI->next/prevp list structure.

Fri Apr 28 19:02:05 1995  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* inode.c (write_all_disknodes): We have to really lock the nodes
	around the calls to diskfs_set_node_times and write_node; this in
	turn forces us to have real refereces.

Thu Apr 13 16:36:57 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>

	* main.c (main): Don't abort if a std file descriptor is already open.

Tue Apr  4 20:08:25 1995  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* inode.c (diskfs_set_translator): When freeing passive
	translator, account for blocks freed in NP->dn_stat.st_blocks.

Fri Mar 31 13:43:27 1995  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* sizes.c (diskfs_truncate): Don't acquire writer lock on
	NP->dn->allocptrlock until after forcing delayed copies through;
	otherwise the pageins will deadlock attempting to get a reader
	lock to service them.  This is safe, because we only need
	NP->allocsize here, and that can't change as long as we hold
	NP->lock.

Mon Mar 20 13:58:44 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* consts.c (diskfs_synchronous): New variable.

Fri Mar 17 14:31:04 1995  Michael I Bushnell  <mib@duality.gnu.ai.mit.edu>

	* alloc.c (ffs_clusteracct): Make static.
	(alloc_sync): New function.
	(ffs_alloc): Call alloc_sync.
	(ffs_realloccg): Likewise.
	(diskfs_alloc_node): Likewise.
	(ffs_blkfree): Likewise.
	(diskfs_free_node): Likewise.

Sat Jan 28 14:59:26 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* Makefile (OBJS): Remove reference to libc's devstream.o.

Fri Nov 11 11:45:38 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* hyper.c (diskfs_set_hypermetadata): Always use dev_write_sync to
	avoid device_write bug that says you can't modify the buffer until
	device_write returns.  Also remember to deallocate BUF.

Thu Nov 10 13:27:09 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* main.c (main): Issue decent prompt.

	* hyper.c (diskfs_set_hypermetadata): Copy CSUM into a
	page-aligned page-sized buffer for disk write to avoid inane
	kernel bug.

Wed Nov  9 05:43:14 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* main.c (main): Behave more reasonably if we can't open DEVNAME.

Tue Nov  8 00:03:20 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* pager.c (pager_write_page): Use %p for printing PAGER.

	* ufs.h: Declare copy_sblock.

Wed Nov  2 16:06:10 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* hyper.c (copy_sblock): Don't copy csum here.
	(diskfs_set_hypermetadata): Write csum directly to disk here.

Thu Oct 27 20:58:08 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* dir.c (diskfs_lookup): diskfs_get_filemap returns a send right,
	so don't create an additional one here.
	(diskfs_dirempty): Likewise.
	* sizes.c (diskfs_truncate): Likewise.
	(diskfs_grow): Likewise.

Tue Oct 25 12:49:41 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* hyper.c (copy_sblock): Call record_poke for csum and superblock
	after modifying them.

	* pager.c (diskfs_shutdown_pager): Call copy_sblock.
	(diskfs_sync_everything): Likewise.

	* alloc.c (ffs_fragextend): Call record_poke for CG after
	modifying it.  Also set CSUM_DIRTY and SBLOCK_DIRTY.
	(ffs_alloccg): Likewise.
	(ffs_alloccgblk): Likewise.
	(ffs_nodealloccg): Likewise.
	(ffs_blkfree): Likewise.
	(diskfs_free_node): Likewise.

Fri Oct  7 01:32:56 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (diskfs_init_completed): Don't call _hurd_proc_init.
	(saved_argv): Variable removed.
	(main): Don't set saved_argv.  Pass ARGV to diskfs_start_bootstrap.

Wed Oct  5 22:18:46 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* inode.c (read_disknode): If we are the bootstrap filesystem,
	then getpid changes once proc starts up.  So only call getpid
	once, thus not allowing st_dev values to mysteriously change.

Wed Oct  5 12:56:53 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* alloc.c (diskfs_alloc_node): Abort if free inode has
	translator attached.

Tue Oct  4 18:33:35 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* pager.c (pager_unlock_page): Call diskfs_catch_exception.

Tue Oct  4 00:16:04 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* inode.c (diskfs_lost_hardrefs): Comment out body.
	* ufs.h (node2pagelock): New variable.
	* pager.c (node2pagelock): Initialize.
	(diskfs_get_filemap): Don't let node hold a reference to the pager.
	(pager_clear_user_data): Acquire node2pagelock and clear
	the node's reference to the pager.
	(diskfs_file_update): Hold node2pagelock for reference
	of NP->dn->fileinfo.
	(drop_pager_softrefs): Likewise.
	(allow_pager_softrefs): Likewise.
	(diskfs_get_filemap): Likewise.
	* sizes.c (diskfs_truncate): Likewise.

	* Makefile (SRCS): Added pokeloc.c.

Mon Oct  3 15:03:38 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* sizes.c (diskfs_truncate): Rewritten.

	* bmap.c (fetch_indir_spec): Initialize OFFSET values to -2,
	meaning that the entry is not needed.  If LBN is negative,
	then don't set values for the data block.

	* inode.c (write_node): Call record_poke after writing
	dinode.
	(create_symlink_hook): Likewise.
	(diskfs_set_translator): Likewise.
	* pager.c (pager_unlock_page): Likewise.
	* sizes.c (diskfs_truncate): Likewise.
	* pager.c (pager_unlock_page): Call record_poke after writing
	indirect block.
	* sizes.c (diskfs_grow): Likewise.
	(diskfs_grow): Likewise.
	* pager.c (diskfs_sync_everything) [sync_one]: If this is the
	disk pager, call sync_disk instead.
	* pokeloc.c: New file.

Fri Sep 30 11:25:36 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* dir.h: Delete DT_* definitions; they are now in <dirent.h>.
	* dir.c (diskfs_get_directs): Set USERP->d_type as DT_UNKNOWN.
	When the bugs in the type fields are fixed (dealing with
	multiple links and mode changes) then this can actually return
	the value.

Thu Sep 29 17:16:58 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (main): Test getpid()>0 to decide we are a normal
	translator instead of the boot fs.  Fetch bootstrap port after
	possibly calling diskfs_parse_bootargs, not before.

Tue Sep 27 15:24:58 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* sizes.c (diskfs_grow) [computation of newallocsize]: Last block
	number is one less than the total number of blocks.

Tue Sep 27 11:58:44 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* bmap.c (fetch_indir_spec): Single indirect block pointer is
	in the INDIR_SINGLE slot, not the INDIR_DOUBLE slot.

Mon Sep 26 20:47:30 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* Makefile (SRCS): Added bmap.c.

	* main.c (main): Don't call pager_init.

	* inode.c (diskfs_get_translator): Repair to read translator
	correctly.

	* sizes.c (diskfs_grow): Compute block numbers in a more clean
	(and confidently correct) fashion.
	(diskfs_truncate): Set NP->allocsize from a properly rounded
	value.

Mon Sep 26 12:50:38 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* inode.c (diskfs_lost_hardrefs): "Know" that a pager starts
	with a portinfo; we don't actually have access to the pager
	struct here.

Fri Sep 23 14:21:55 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	[ Continuing yesterday's changes. ]
	* ufs.h (struct dirty_indir): New type.
	(struct disknode): New member `dirty'.
	* inode.c (iget): Initialize DN->dirty.
	* bmap.c (mark_indir_dirty): New function.
	* pager.c (pager_unlock_page): Call mark_indir_dirty before
	writing into indirect blocks.
	(diskfs_file_update): Sync indirect blocks here.
	(pager_traverse): Simplify; do FILE_DATA and diskpager.
	(pager_init): Removed function.
	(create_disk_pager): New function.
	* sizes.c: Completely rewritten.
	* main.c (main): Spawn first thread sooner so we can
	map and look at the disk image.
	* hyper.c (get_hypermetadata): Moved firewall asserts
	here from pager_init.

Thu Sep 22 11:28:46 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	[This long series of changes deletes the DINODE, CG, SINDIR,
	and DINDIR pagers and adds a new pager type DISK.]
	* ufs.h (struct disknode) Removed DINLOCK, SINLOCK, and
        SININFO members.  New member ALLOCPTRLOCK renamed from DATALOCK.
	Removed SINLOC, DINLOC, SINLOCLEN, and DINLOCLEN.
	(struct user_pager_info) [enum pager_type]: Removed types
	DINODE, CG, SINDIR and DINDIR; added type DISK.
	(dinpager, dinodepager, cgpager): Deleted vars.
	(diskpager): New var.
	(dinmaplock, sinmaplock, pagernplock): Deleted vars.
	(sblock_dirty, csum_dirty, cgs, dinodes): Deleted vars.
	(fsaddr): New macro.
	(dino, indir_block, cg_locate): New inline functions.
	(sync_disk_blocks, sync_dinode): New inline functions.
	(struct iblock_spec): New type.
	* pager.c (dinport, dinodeport, cgport, sinlist): Deleted vars.
	(filepagerlist): Renamed from filelist.
	(pagernplock): Deleted variable.
	(find_address): Removed switch; support only DISK and FILE_DATA.
	(pager_report_extent): Likewise.
	(pager_unlock_page): Removed switch.  Return without comment for
	DISK; allocate indirect blocks as necessary right here for
	FILE_DATA.
	(sin_map, sin_remap, sin_unmap, din_map, din_unmap): Deleted
	functions.
	(indir_alloc, sync_dinode): Deleted functions.
	(enqueue_pager, dequeue_pager): Deleted functions.
	(diskfs_file_update): No longer lock pagernplock; nothing
	to do with sininfo.
	(drop_pager_softrefs): Likewise.
	(allow_pager_softrefs): Likewise.
	(diskfs_get_filemap): Put pager on filepagerlist right here
	instead of through pager_enqueue.
	(pager_clear_user_data): Likewise, mutatis mutandis.
	* main.c (main): Call create_disk_pager and then map the
	entire disk into disk_image.
	* hyper.c (get_hypermetadata): Use bcopy instead of dev_read_sync.
	(diskfs_set_hypermetadata): NOP out function.
	(copy_sblock): New function, substance of code is from old
	diskfs_set_hypermetadata.
	* inode.c (iget): Don't initialize deleted disknode fields.
	(diskfs_node_norefs): Don't verify that deleted disknode
	fields are not set.
	(read_disknode): Get dinode from DINO, not DINODES array.
	(write_node): Likewise.
	(create_symlink_hook): Likewise.
	(read_symlink_hook): Likewise.
	(diskfs_set_translator): Likewise.
	(diskfs_get_translator): Likewise.
	(diskfs_node_translated): Likewise.
	* alloc.c (ffs_realloccg): Likewise.
	(ffs_fragextend): Use cg_locate instead of cgs array.
	(ffs_alloccg): Likewise.
	(ffs_nodealloccg): Likewise.
	(ffs_blkfree): Likewise.
	(diskfs_free_node): Likewise.
	* inode.c (diskfs_set_translator): Use bcopy and sync_disk_blocks
	instead of dev_write_sync.
	(diskfs_get_translator): Likewise, mutatis mutandis.
	(read_disknode): Initialize NP->istranslated.
	(diskfs_set_translator): Set/clear NP->istranslated as appropriate.
	(diskfs_node_translated): Removed function.
	* bmap.c: New file.

	[This improves the RWLOCK mechanism and makes it more
	orthogonal.  It should probably be moved into a library.]
	* ufs.h (struct rwlock): Added MASTER and WAKEUP members.
	(struct disknode): Removed RWLOCK_MASTER and RWLOCK_WAKEUP
	fields.
	(rwlock_reader_lock): Ommitted arg DN; use new MASTER and WAKEUP
	members inside LOCK instead.
	(rwlock_writer_lock): Likewise.
	(rwlock_reader_unlock): Likewise.
	(rwlock_init): Initialize new MASTER and WAKEUP fields.
	* inode.c (iget): Don't deal with RWLOCK_MASTER and RWLOCK_WAKEUP.
	* pager.c (find_address): Deleted arg DNP.  Only pass one
	arg to rwlock functions.
	(pager_read_page): Deleted var DN; only pass one arg to rwlock
	functions.
	(pager_write_page): Likewise.

Wed Sep 21 00:26:25 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* pager.c (allow_pager_softrefs): Unlock PAGERNPLOCK when
	we're done with it.
	(sin_map): Hold PAGERNPLOCK all the way until we're done
	with the sininfo pointer.
	(pagernplock): No longer static.
	* ufs.h (pagernplock): Declare here.

	* sizes.c (diskfs_grow): Don't call diskfs_file_update here.
	This was done to prevent too much dirty data from accumulating
	and then overwhelming the pager later.  But that's really the
	pager's responsibility.

	* ufs.h (struct disknode): New members `dinloclen' and `sinloclen'.
	* inode.c (iget): Initialize DN->dinloclen and DN->sinloclen.
	(diskfs_node_norefs): Verify that DN->dinloclen and DN->sinloclen
	are both zero.
	* pager.c (find_address) [SINDIR]: Verify that reference is
	within bounds of NP->dn->dinloc.
	(pager_unlock_page) [SINDIR]: Likewise.
	(din_map): Set NP->dn->dinloclen.
	(din_unmap): Clear NP->dn->dinloclen.
	(find_address) [FILE_DATA]: Verify that reference is within
	bounds of NP->dn->sinloc.
	(pager_unlock_page) [FILE_DATE]: Likewise.
	(sin_map): Set NP->dn->sinloclen.
	(sin_remap): Reset NP->dn->sinloclen.
	(sin_unmap): Clean NP->dn->sinloclen.

	* pager.c (pager_write_page): Flush stdout after printf.
	(pager_unlock_page) [FILE_DATA]: Likewise.

	* sizes.c (diskfs_truncate): In all references to sinloc and
	dinloc arrays, verify that references are within allocated bounds.
	(diskfs_grow): Likewise.
	(sindir_drop): Likewise.

	* pager.c: Create new mapping with extent NEWSIZE, not SIZE (which
	was the old size of the mapping).

Tue Sep 20 15:51:35 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* pager.c (pager_report_extent) [SINDIR]: Remove erroneous extra
	division by block size.
	(sin_remap): Likewise.

Mon Sep 19 17:34:11 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* inode.c (create_symlink_hook): Write assert test correctly.

	* dir.c (diskfs_direnter) [EXTEND]: Reference file size only
	*once*; don't rely on the behavior if diskfs_grow vis a vis
	file size.

Fri Sep 16 10:29:42 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* dir.c (dirscanblock): Compute offset correctly for mangled
	entry notice.

	* dir.c (diskfs_direnter) [EXTEND]: Reference file size only
	once before calling diskfs_grow in case diskfs_grow actually
	increases the size.

	* inode.c (diskfs_set_statfs): Set fsid from getpid.
	(read_disknode): Likewise.

	* dir.h (struct directory_entry): Renamed from struct direct.
	* dir.c: All uses of struct direct changed to use
	struct directory_entry.
	(diskfs_get_directs): New var `userp'.  Copy from *ENTRYP into
	it (set at DATAP) more cleanly.

Mon Sep 12 11:30:48 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* hyper.c (diskfs_set_hypermetadata): Don't frob clean and dirty
	bits if we are readonly.

Sat Sep 10 11:41:06 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* main.c (main): When started up as a passive translator,
	open fds 0, 1, and 2 on /dev/console for debugging messages.
	Call diskfs_init_diskfs with no args; after warp_root, call
	diskfs_startup_diskfs on BOOTSTRAP.  Compare BOOTSTRAP to
	MACH_PORT_NULL instead of zero.

Fri Sep  9 13:02:33 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* main.c (trans_parse_args): Fix and enable.

Tue Sep  6 11:29:55 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* inode.c (iget): Remove old assert test that checked for bad
	inode block allocations.

Thu Sep  1 11:39:12 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* tables.c: Don't include "ufs.h"; include <sys/types.h>.  Then
	this file can be used unmodified by fsck.

Tue Aug 30 13:36:37 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* inode.c (diskfs_set_translator): ffs_blkfree doesn't have
	a return value.

Mon Aug 29 12:49:17 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* inode.c (diskfs_set_translator): If NAMELEN is zero, then
	make the node have no translator.

Fri Aug 26 12:28:20 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* inode.c (read_disknode): 4.4 fsck sometimes sets the author
	field to -1 to mean "ignore old uid location"; take that to mean
	"author == uid".
	(diskfs_set_translator): If we are allocating a new block for
	the translator, then account for it in st_blocks.

Thu Aug 18 12:41:12 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* Makefile (HURDLIBS): Use short version.

	* alloc.c (diskfs_alloc_node): Bother to set *NPP before
	returning.

Tue Aug 16 10:48:04 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* Makefile (LDFLAGS): New variable.

Fri Aug  5 15:51:09 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>

	* dir.c (diskfs_direnter) [EXTEND]: Crash if the entry won't
	fit in the new block.
	(diskfs_lookup): Return ENAMETOOLONG if the name is bigger than
	MAXNAMLEN.

	* dir.c (diskfs_get_directs): Set USERD->d_reclen correctly.

Fri Jul 22 15:12:35 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* Makefile: Rewritten in accord with new scheme.

Wed Jul 20 13:28:38 1994  Michael I Bushnell  <mib@geech.gnu.ai.mit.edu>

	* main.c (main): Don't set diskfs_dotdot_file.

Tue Jul 19 21:51:54 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* ufs.h: Removed defns of u_quad_t, quad_t; now in <sys/types.h>.
	Removed defn of struct timespec; now in <sys/time.h>.

Tue Jul 19 12:47:31 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* main.c (main): Deleted var `diskfs_dotdot_file'.
	(trans_parse_args): Don't set diskfs_dotdot_file; don't expect
	dotdot from fsys_getroot.

	* Makefile (LDFLAGS): Moved to rule for `ufs' and commented out.
	(ufs): Don't use variable $(link) anymore.

Mon Jul 18 14:55:17 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* dir.c (diskfs_get_directs): Return data to user in old format.
	Add new code for new format, maintaining compatibility correctly,
	but comment it out until the library is ready.

	* hyper.c (diskfs_set_hypermetadata): If we presumed to
	set new values of fs_maxfilesize, fs_qbmask, and fs_qfmask,
	then restore the originals before writing out the superblock.

	* pager.c (diskfs_get_filemap): Test should be S_ISLNK, not
	S_ISSOCK.

	* hyper.c (get_hypermetadata): Set new constants in filesystems
	which don't have them yet.
	(get_hypermetadata): Cast MAXSYMLINKLEN to long to avoid
	converting sblock->fs_maxsymlinklen into an unsigned.

	* subr.c (scanc, skipc): New functions.
	(ffs_setblock): Use assert instead of panic.

	* inode.c (read_disknode): Set old stat structure until the header
	file gets changed.

Fri Jul 15 12:07:15 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* sizes.c: Include <string.h> for bzero.
	* fs.h (blksize): Comment out dblksize macro.  In blksize
	macro, use NP->allocsize instead of IP->i_size.

	* dinode.h (INDIR_SINGLE, INDIR_DOUBLE, INDIR_TRIPLE): New macros.

	* inode.c (read_disknode, write_node): Use new stat and dinode
	fields for times.

	* ufs.h: Change `nextgennumber' to be `u_long' instead of int.
	Change prototypes of some alloc.c functions.
	* alloc.c (ffs_alloc): Declare to return error_t.
	(ffs_realloccg): Likewise.
	(ffs_hashalloc, ffs_alloccg, ffs_fragextend, ffs_alloccg,
	ffs_dirpref, ffs_nodealloccg, ffs_allccgblk, ffs_mapsearch,
	ffs_clusteracct): Provide forward declarations.
	(ffs_realloccg): Use printf instead of log.
	Make BPREF volatile for setjmp safety.
	(diskfs_alloc_node): Use diskfs global variable instead of TIME.
	(ffs_nodealloccg): Likewise.
	(ffs_blkfree): Likewise.
	(diskfs_free_node): Likewise.
	(ffs_blkfree, ffs_clusteracct): Declare as void.
	(ffs_alloccg, ffs_nodealloccg): Declare as u_long.

	* ufs.h: Change prototypes of some subr.c functions.
	* subr.c (ffs_isblock): Use assert instead of panic.
	(ffs_clrblock): Likewise.

	* hyper.c: Include "dinode.h".

	* dinode.h (LINK_MAX): New macro, from BSD sys/sys/syslimits.h.
	* fs.h (MAXBSIZE, MAXFRAG): New macros, from BSD sys/sys/param.h.

	* hyper.c (get_hypermetadata): Provide first arg in call to
	fsbtodb.
	(diskfs_set_hypermetadata): Likewise.
	* inode.c (diskfs_set_translator): Likewise.
	(diskfs_get_translator): Likewise.
	* pager.c (find_address): Likewise.
	(indir_alloc): Likewise.
	* inode.c (iget): Provide first arg in call to lblkno.
	* sizes.c (diskfs_truncate): Likewise.
	* pager.c (find_address): Likewise.
	* sizes.c (diskfs_grow): Likewise.
	* inode.c (iget): Provide first arg in call to fragroundup.
	* sizes.c (diskfs_trucate): Likewise.
	* sizes.c (diskfs_grow): Likewise.
	* inode.c (iget): Provide first arg in call to blkroundup.
	* pager.c (pager_unlock_page): Likewise.
	* sizes.c (diskfs_truncate): Likewise.
	* sizes.c (diskfs_grow): Likewise.
	* pager.c (find_address): Provide first arg in call to cgtod.
	* pager.c (find_address): Provide first arg in call to cgimin.
	* pager.c (find_address): Provide first arg in call to blktofrags.
	* pager.c (find_address): Provide first arg in call to blkoff.
	* sizes.c (diskfs_truncate): Likewise.
	* sizes.c (diskfs_grow): Likewise.
	* sizes.c (diskfs_truncate): Provide first arg in call to blksize.
	* sizes.c (diskfs_grow): Likewise.
	* sizes.c (diskfs_truncate): Provide first arg in call to numfrags.

	* ufs.h: Added temporary declarations of `u_quad_t', `quad_t', and
	`struct timespec'.

	* pager.c (diskfs_get_filemap): Make sure that this is
	a kind of node that can be validly read.

	* inode.c (create_symlink_hook): Renamed from symlink_hook.
	(read_symlink_hook): New function.
	(diskfs_read_symlink_hook): Initialize.

Thu Jul 14 12:23:45 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* alloc.c: New from 4.4 BSD; BSD version `8.8  2/21/94'.
	Remove old includes; include "ufs.h", "fs.h", "dinode.h",
	and <stdio.h>.  Replace panics with asserts and comment out
	uprintfs.  Use prototypes throughout.  Replace calls
	to ffs_fserr with printf.
	(alloclock): New variable.
	(ffs_alloc): Variable struct inode *IP is now struct node *NP;
	refer to it appropriately.  Initialize FS to sblock.
	Lock alloclock around actual allocation steps.  Reverse order
	of BNP and CRED arguments; declare CRED as a protid and use
	accordingly.  Permit CRED to be null.
	(ffs_realloccg): Variable struct inode *IP is now struct node *NP;
	refer to it accordingly.  Comment out U*x buffer management code.
	Lock alloclock around actual allocation steps.  Initialize FS
	from sblock.  Declare CRED as a protid and use it accordingly.
	Change BUF arg to PBN (physical block number); return new block
	there.
	(ffs_reallocblks): Comment out.
	(diskfs_alloc_node): Renamed from ialloc. Initialize FS from
	sblock.  Use calling sequence from <hurd/diskfs.h>.  Acquire
	alloclock aroud actual allocation steps.  Deleted vars
	`pip', `pvp' (use dir instead).  Use iget instead of VFS_VGET.
	Var struct inode *IP now struct node *NP.  Lock gennumberlock
	around frobbing of nextgennumber.
	(ffs_blkpref): Arg struct inode *ip is now struct node *np;
	refer to it accordingly.  Initialize FS to sblock.  Lock
	alloclock during actual work.  Use csum instead of fs_cs macro.
	(ffs_hashalloc): Arg struct inode *IP is now struct node *NP;
	use it accordingly.  Initialize FS from sblock.
	(ffs_fragextend): Arg struct inode *IP is now struct node *NP;
	use it accordingly.  Initialize FS from sblock.  Initialize
	CGP from cgs array; don't use bread.  Comment out calls to brelse
	and bdwrite.  Set CGP->time from diskfs global var.  Use csum
	instead of fs_cs macro.
	(ffs_alloccg): Arg struct inode *IP is now struct node *NP.
	Initialize FS from sblock.  Initialize CGP from cgs array;
	don't use bread.  Comment out calls to brelse and bdwrite.
	Set CGP->time from diskfs global var.  Use csum instead of
	fs_cs macro.
	(ffs_nodealloccg): Arg struct inode *IP is now struct node *NP.
	Initialize FS from sblock.  Initialize CGP from cgs array;
	don't use bread.  Comment out calls to brelse and bdwrite.  Use
	csum instead of fs_cs macro.
	(ffs_blkfree): Arg struct inode *IP is now struct node *NP.
	Initialize FS from sblock.  Initialize CGP from cgs array;
	don't use bread.  Comment out calls to brelse and bdwrite.  Use
	csum instead of fs_cs macro.
	(diskfs_free_node): Renamed from ffs_vfree.  Use calling
	sequence from <hurd/diskfs.h>.  Initialize FS from sblock.
	Deleted vars pip,pvp (use NP instead).  Initialize CGP from
	cgs array; don't use bread.  Comment out calls to brelse and
	bdwrite.  Use csum instead of fs_cs macro.
	(ffs_fserr): Commented out.
	(ffs_dirpref): Use csum instead of fs_cs macro.

	* ufs.h (ffs_alloc): Renamed from alloc; all callers changed.
	(ffs_blkfree): New arg NP; renamed from blkfree; all callers changed.
	(ffs_blkpref): Renamed from blkpref; all callers changed.
	(ffs_realloocg): Rename from realloccg; all callers changed.

	* fs.h: New from 4.4 BSD; BSD version `8.7  4/19/94'.
	(fs_cs): Don't use fs_csp; use global csum instead.

	* subr.c: New from 4.4 BSD; BSD version `8.2  9/21/93'.
	Remove old includes.  Include "ufs.h" and "fs.h".
	(ffs_blkatoff, ffs_checkoverlap): Comment out.

	* tables.c: New from 4.4 BSD; BSD version `8.1  6/11/93'.
	Don't include <param.h>; do include "ufs.h" and "fs.h".

	* dinode.h: New from 4.4 BSD; BSD version `8.3  1/21/94'.
	Remove oldids/inum union; replace with author.
	Renamed di_mode to be di_model; allocated di_modeh from spare.
	Allocate di_trans from spare.
	(di_inumber): Remove macro.
	* inode.c (read_disknode): Fetch uid and gid from new (long)
	fields in dinode unless we are the old inode format, in which
	case fetch them from the old fields.
	(write_node): Only set new uid and gid fields if we are not
	COMPAT_BSD4.  Set old fields if the superblock says to.
	(symlink_hook): New function.
	(diskfs_create_symlink_hook): Initialize.
	* sizes.c (diskfs_truncate): Deal with truncation of short
	symlink properly.

	* dir.h: New from 4.4 BSD; BSD version `8.2  1/21/94'.
	Substitute our version of DIRSIZ which uses the namelen.
	Comment out declarations of struct dirtemplate and struct
	odirtemplate.
	(DIRECT_TYPE, DIRECT_NAMLEN): New macros.
	* ufs.h (direct_symlink_extension): New variable.
	* hyper.c (get_hypermetadata): Set direct_symlink_extension.
	* dir.c (dirscanblock): Use DIRECT_NAMLEN instead of d_namlen.
	(diskfs_direnter): Likewise.
	(diskfs_dirempty): Likewise.
	(diskfs_get_directs): Likewise.
	(diskfs_direnter): Set d_type field of new slot if
	direct_symlink_extension is set.
	(diskfs_dirrewrite): Likewise.

	* ufs.h (compat_mode): New variable.
	* main.c (main): Set compat_mode to zero if we are the bootstrap
	filesystem.
	* inode.c (diskfs_set_translator): Return error if compat_mode
	is set.
	(write_node): Don't set GNU dinode field extensions unless
	compat_mode is COMPAT_GNU.

Mon Jul 11 18:14:26 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* dir.c (diskfs_get_directs): When copying entries into DATAP,
	set the d_reclen parameter of the copy to the minimum length
	(because that's all we use) rather than the size that it had
	in the directory itself.

Wed Jul  6 14:41:48 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* dir.c (dirscanblock): In main loop, initialize PREVOFF
	to zero, not BLOCKADDR.  Otherwise, the wrong value is
	stored into DS->prevoff and then diskfs_dirremove crashes.

Tue Jul  5 14:07:38 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* dinode.h: Include <endian.h> before test of BYTE_ORDER.

	* Makefile (TAGSLIBS): New variable.

Tue Jun 21 13:45:04 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* dir.c (diskfs_direnter): Update dirents of DP, not NP.

Mon Jun 20 16:43:48 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* dir.c (diskfs_direnter) [case SHRINK]: NEW should be set to
	OLDNEEDED past DS->entry, not to the start of the next entry.

	* dir.c (diskfs_direnter) [case EXTEND]: Cast in assignment
	to NEW needs proper scope.

	* inode.c (diskfs_node_norefs): Free dirents list of structure
	being deallocated.  Also add assert checks to make sure other
	state is already clean.

Thu Jun 16 11:38:17 1994  Michael I Bushnell  (mib@geech.gnu.ai.mit.edu)

	* dir.c (diskfs_dirempty): Map directory contents ourselves
	instead of using diskfs_node_rdwr.
	(struct dirstat): New structure to cache mapping between
	lookup and commit operation and avoid use of diskfs_node_rdwr.
	(diskfs_lookup): Map directory ourselves.  Keep mapping in
	DS if DS is nonzero and we might use it in direnter, dirremove,
	or dirrewrite.  Deallocate mapped buffer if we return some
	error (other than ENOENT), or if DS is zero, or if there is
	no possible commit operation to follow.  When setting DS->stat
	to EXTEND, do it the new way.
	(dirscanblock): Changed BLKOFF to be virtual address of mapped
	block and renamed it BLKADDR.  New arg IDX.  Use mapped block
	instead of calling diskfs_node_rdwr.  Set DS according to the new
	rules.
	(diskfs_direnter): Interpret new dirstat format.
	(diskfs_dirremove): Likewise.
	(diskfs_dirrewrite): Likewise.
	(diskfs_drop_dirstat): Deallocate cached mapping here.

	* dir.c (dirscanblock): When we find the node for type CREATE,
	invalidate DS by setting type to LOOKUP, not LOOKING.

	* dir.c (diskfs_direnter, diskfs_dirremove, diskfs_dirrewrite):
	Call diskfs_notice_dirchange when appropriate.

	* dir.c (diskfs_get_directs): Deal properly with case where
	BUFSIZ==0 and where NENTRIES==-1.

Wed Jun 15 16:40:12 1994  Michael I Bushnell  (mib@geech.gnu.ai.mit.edu)

	* main.c (main): Check device sector size and media size
	on startup.

Tue Jun 14 14:41:17 1994  Michael I Bushnell  (mib@geech.gnu.ai.mit.edu)

	* ufs.h (struct disknode) [dirents]: New member.
	* inode.c (iget): Initialize DN->dirents.
	* dir.c (diskfs_direnter, diskfs_dirremove): Keep track
	of dirents member.
	(dirscanblock): New var `nentries'; use it to count the
	number of directory entries in this block and set it if
	we end up scanning the entire block.
	(count_dirents): New function.
	(diskfs_get_directs): New function.

Mon Jun 13 13:50:00 1994  Michael I Bushnell  (mib@geech.gnu.ai.mit.edu)

	* ufs.h (sinmaplock, dinmaplock): New global vars.
	* inode.c (inode_init): Initialize sinmaplock and dinmaplock.
	* pager.c (find_address, pager_unlock_page): Protect use
	if dinloc array with dinmaplock.
	(din_map, din_unmap): Doc fix.
	(find_address, pager_unlock_page): Protect use of sinloc array
	with sinmaplock.
	(sin_map, sin_remap, sin_unmap): Doc fix.
	(pager_clear_user_data): Acquire sinmaplock and dinmaplock
	instead of NP->dn->datalock and NP->dn->sinlock respectively.

	* sizes.c (diskfs_truncate, diskfs_grow): Protect use of sinloc
	and sindir mapping functions with sinmaplock.
	(sindir_drop): Protect use of dinloc and dindir mapping functions
	with dinmaplock.

	* ufs.h (struct rwlock): New type.
	(struct disknode) [dinlock, sinlock, datalock]: Use read-write lock.
	Change comments so that these don't lock dinloc and sinloc anymore.
	[rwlock_master, rwlock_wakeup]: New members.
	(rwlock_reader_lock, rwlock_writer_lock, rwlock_reader_unlock,
	rwlock_writer_unlock, rwlock_init): New functions.
	* inode.c (iget): Initialize DN->rwlock_master and
	DN->rwlock_wakeup.  Change initialization of DN->dinlock,
	DN->sinlock, and DN->datalock to use rwlock_init.
	* pager.c (find_address): Lock NP->dn->dinlock, NP->dn->sinlock,
	and NP->dn->datalock with rwlock_reader_lock.  Change type of
	parameter NPLOCK to be a read-write lock.  New parm DNP.  Callers
	changed.
	(pager_read_page, pager_write_page): Change type of NPLOCK to be
	read-write lock; call rwlock_reader_unlock instead of
	mutex_unlock.  New variable DN.
	(pager_unlock_page): Use rwlock_writer_lock to lock
	NP->dn->dinlock, NP->dn->sinlock, and NP->dn->datalock.
	* sizes.c (diskfs_truncate, diskfs_grow): Change locks of DATALOCK
	field to use rwlock_writer_{un,}lock.
	(sindir_drop): Ditto for SINLOCK field.
	(dindir_drop): Ditto for DINLOCK field.

Mon Jun  6 19:23:26 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* sizes.c (diskfs_grow): After realloccg, zero new data (which I'm
	not sure is really necessary, but until I figure it out, this is
	safest).  Also poke old data (the latter only if the block has
	moved)--otherwise the kernel won't know to page it out to the new
	location.
	(poke_pages): When poking, be careful not to actually change the data.
	LEN should be end - start, not start - end.

Fri Jun  3 12:37:27 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* inode.c (iget): When we find the node in the table, acquire the
	mutex *after* incrementing NP->references and unlocking
	diskfs_node_refcnt_lock; otherwise we can deadlock against
	diskfs_nput.

Thu Jun  2 12:16:09 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* ufs.h (sblock_dirty, csum_dirty, alloclock): New global variables.
	* alloc.c (alloclock): Remove static keyword..
	* alloc.c (realloccg): Set sblock_dirty after changing sblock.
	(blkpref): Likewise.
	(fragextend): Likewise.
	(alloccg): Likewise.
	(alloccgblk): Likewise.
	(ialloccg): Likewise.
	(blkfree): Likewise.
	(diskfs_free_node): Likewise.
	* hyper.c (diskfs_set_hypermetadata): Likewise.
	* alloc.c (fragextend): Set csum_dirty after changi csum.
	(alloccg): Likewise.
	(alloccgblk): Likewise.
	(ialloccg): Likewise.
	(blkfree): Likewise.
	(diskfs_free_node): Likewise.
	* hyper.c (diskfs_set_hypermetadata): Acquire alloclock while
	writing hypermetadata.  Only write csum and sblock if
	csum_dirty or sblock_dirty, respectively, is set, and then
	clear it after starting the write.

	* main.c (main): Likewise.

	* sizes.c (diskfs_truncate): Don't turn off caching; the new
	light reference system takes care of this.
	* pager.c (diskfs_get_filemap): No longer necessary to turn
	on caching here, because truncate no longer turns it off.

	* inode.c (diskfs_lost_hardrefs, diskfs_new_hardrefs): New functions.
	* pager.c (drop_pager_softrefs, allow_pager_softrefs): New functions.
	(sin_map): Use diskfs_nref_light, not diskfs_nref.
	(diskfs_get_filemap): Use diskfs_nref_light, not diskfs_nref.
	(pager_clear_user_data): Use diskfs_nrele_light, not diskfs_nrele.
	* ufs.h (drop_pager_softrefs, allow_pager_softrefs): New
	declarations.

Wed Jun  1 13:35:11 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* sizes.c (diskfs_truncate): After calling sin_unmap, turn
	off caching on the sininfo pager so that it gets freed promptly
	(there's generally no value in keeping it around because there
	is no live fileinfo pager).
	* pager.c (diskfs_get_filemap): Make sure we turn caching back on
	here, however, if we start using the file pager.

	* pager.c (sin_map): When np->dn->sininfo is set, we have
	to insert a valid send right after fetching the receive name.

	* pager.c (sin_unmap, din_unmap): New functions.
	(pager_clear_user_data): Call sin_unmap and din_unmap
	instead of doing it right here.

	* sizes.c (diskfs_truncate): Call sin_unmap instead of
	doing it right here.
	(sindir_drop): Call din_unmap instead of doing it right
	here.  Also, call it always, not just when wo do dindir_drop.

	* sizes.c (diskfs_grow): After alloc into sindir area,
	unmap it if we don't have an active data pager.
	* ufs.h (sin_unmap, din_unmap): New declarations.

	* sizes.c (diskfs_grow): In computing OSIZE in the realloc
	case of lbn < NDADDR, deal correctly with the case where
	np->allocsize is already an integral number of blocks.

	* sizes.c (diskfs_grow): Compute SIZE correctly.

	* alloc.c (alloc, realloccg, blkfree): When checking validity
	of size arguments, also make sure the size isn't zero.

	* alloc.c (diskfs_alloc_node): Lock ALLOCLOCK before checking
	sblock->fs_cstotal.cs_nifree.

Tue May 31 18:47:42 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)

	* ufs.h (DONT_CACHE_MEMORY_OBJECTS): Define it.

	* dir.c (diskfs_direnter: case TAKE): Assert that OLD->d_reclen >=
	NEEDED, not that it is strictly >.

Tue May 31 11:10:28 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* sizes.c (diskfs_grow): Call diskfs_node_update (but don't wait)
	after successful completion to prevent old data from hanging around
	too long and getting flushed all at once from the kernel.

	* sizes.c (diskfs_grow): Change SIZE to be the size of the last
	block allocated.  Delete variable NSIZE; use SIZE instead.

Fri May 27 13:15:26 1994  Michael I Bushnell  (mib@geech.gnu.ai.mit.edu)

	* sizes.c (diskfs_truncate): Set NP->dn_stat_dirty after each
	modification of NP->dn_stat.

	* sizes.c (diskfs_truncate): Compute new value of NP->allocsize
	correctly.

	* inode.c (iget): Set NP->allocsize to be the *actual* allocsize.

Thu May 26 11:51:45 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* sizes.c (diskfs_truncate): In blkfree loop of blocks past
	NDADDR, subtract NDADDR from idx to index correctly into
	sinloc array.  Start this loop with idx not less than NDADDR.
	(diskfs_truncate): If olastblock == NDADDR, then we also
	need to truncate blocks (one) mapped by single indirect blocks.
	(diskfs_truncate): New variable `first2free'.  Use in place
	of older losing calculations involving lastblock.
	(sindir_drop): Rename parameters to be FIRST and LAST.  Change
	interpretation of FIRST by one to correspond with changed call
	in diskfs_truncate.

	* pager.c (sin_remap): When computing NEWSIZE, round up to
	a page boundary, thus mimicing the SINDIR computation in
	pager_report_extent properly.

	* pager.c (pager_unlock_page) [case SINDIR; vblkno == 0]: Read
	from ....di_ib[INDIR_SINGLE] rather than invalid data before
	NP->dn->dinloc.

	* alloc.c (alloc) [nospace]: Unlock alloclock.
	(realloccg): Unlock alloclock before jumping to nospace.
	(blkpref) [!(lbn < NDADDR)]: Unlock alloclock before returning
	success.

	* sizes.c (diskfs_grow): When allocing a block past NDADDR, the
	tbl arg to blkpref is the table of direct block pointers
	NP->dn->sinloc, not the table of indirect block pointers
	...->di_ib.

	* sizes.c (diskfs_grow): When writing into the SINDIR area, call
	sin_map instead of sin_remap if the sindir isn't already mapped.
	Also set np->allocsize *before* calling sin_map, but *after*
	calling sin_remap, to meet the requirements of those separate
	routines.

	* sizes.c (diskfs_grow): If END isn't bigger than NP->allocsize,
	then don't try and do anything.  In computation of LBN and the
	first use of NB, round up to block boundary correctly.  Don't
	attempt to realloc an old block if the size is 0 (in which case
	NB is -1 and unsigned comparison rules might foul things up).

Mon May 23 13:18:33 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* Makefile (ufs): Give -n in the proper order to rsh.

	* main.c: Include <hurd/startup.h>.

	* ufs.h (DONT_CACHE_MEMORY_OBJECTS): New compilation flag.
	* pager.c (pager_report_attributes): Deleted function.
	(MAY_CACHE): New macro; more useful form for using
	DONT_CACHE_MEMORY_OBJECTS.
	(sin_map, pager_init, diskfs_get_filemap): Provide new
	args in calls to pager_create.
	* sizes.c (MAY_CACHE): New macro; more useful form for
	using DONT_CACHE_MEMORY_OBJECTS.
	(diskfs_truncate): Use MAY_CACHE in calls to pager_change_attributes.

Fri May 20 18:52:41 1994  Michael I Bushnell  (mib@geech.gnu.ai.mit.edu)

	* sizes.c (diskfs_truncate): Force any delayed copies of the
	vanishing region to be taken immediately before stopping, and
	prevent any new delayed copies from being made until we are done
	manipulating things.
	(poke_pages): New function.
	* pager.c (pager_report_attributes): New function.

Wed May 18 15:51:40 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* alloc.c (alloc, realloccg, diskfs_alloc_node, alloccgblk,
	blkfree, diskfs_free_node, mapsearch): Added helpful strings to
	asserts.
	(realloccg): Split up assert.

Tue May 17 13:26:22 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* main.c (main): Delete unused variable PROC.

Mon May 16 15:32:07 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)

	* alloc.c (realloccg): When fragextend succeeds, bother to set
	*PBN.

	* sizes.c (diskfs_grow): In fragment growth case, NSIZE should
	not be the amount to hold SIZE (SIZE is the amount the file is
	growing by), but rather the old size of the fragment plus the
	SIZE.

	* dir.c (diskfs_direnter case COMPRESS): Rewrite loop to deal
	properly with the case where from and to overlap.

Mon May  9 16:51:44 1994  Michael I Bushnell  (mib@geech.gnu.ai.mit.edu)

	* main.c (ufs_version): New variable.
	(save_argv): New variable.
	(main): Set save_argv.
	(diskfs_init_completed): New function.

Thu May  5 19:06:54 1994  Michael I Bushnell  (mib@geech.gnu.ai.mit.edu)

	* Makefile (exec_server_image.o): Use -n when calling rsh.

Thu May  5 07:39:38 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

	* Makefile ($(OBJS)): Use $(includedir) instead of $(headers) in deps.