Thu Oct 24 16:07:17 1996 Miles Bader * main.c (startup_children, runtime_children): New variables. (startup_parents, runtime_parents): Variables removed. (startup_argp, runtime_argp): Use new *_CHILDREN variables instead of corresponding *_PARENT ones. Thu Sep 19 18:02:40 1996 Miles Bader * Makefile (HURDLIBS): Add store. Wed Sep 18 15:30:00 1996 Miles Bader * inode.c (diskfs_S_file_get_storage_info): Narrow scope of RUN. * consts.c (diskfs_extra_version): New variable. * main.c (main): Remove CLASSES argument to store_parsed_open. Use STORE_PARAMS variable to get result from parsing STORE_ARGP. Don't force COMPAT_GNU on bootstrap filesystems (it's the default anyway). Mon Sep 16 13:27:38 1996 Miles Bader * Makefile (ufs.static ufs): Add ../libstore/libstore.a. * hyper.c (zeroblock): Change type to `void *'. (get_hypermetadata): Cast ZEROBLOCK when vm_{de,}allocating. * ufs.h (zeroblock): Change type to `void *'. * sizes.c (diskfs_truncate): Don't cast ZEROBLOCK to diskfs_node_rw. (block_extended, diskfs_grow): Do cast it to offer_data. * main.c (main): Don't set DISKFS_USE_MACH_DEVICE (which is no longer). * inode.c (diskfs_S_file_get_storage_info): Coalesce adjacent blocks when constructing RUNS. Set *PORTS_TYPE, not *STORAGE_PORT_TYPE. * inode.c (diskfs_S_file_getfh): Variable ERR removed. * sizes.c (indir_release): Use DISKFS_DISK_PAGER instead of DISK_PAGER. * ufs.h (sync_disk_blocks): Likewise. * pokeloc.c (sync_disk): Likewise. * main.c (diskfs_reload_global_state): Likewise. * pager.c (create_disk_pager, diskfs_shutdown_pager, diskfs_sync_everything): Likewise. * main.c , : New includes. * hyper.c, pager.c, inode.c : New include. (get_hypermetadata): Use %Zd for printfing size_t. (diskfs_set_hypermetadata): Return EIO for incomplete writes. Cast BUF when calling vm_deallocate. * dir.c (diskfs_direnter_hard): Initialize OLDSIZE to shut up gcc. Sat Sep 14 20:38:47 1996 Miles Bader * ufs.h (store, store_parsed, disk_image): New declarations. * pager.c (thread_function): Function removed. (create_disk_pager): Create PAGER_BUCKET. Use diskfs_start_disk_pager instead of disk_pager_setup. (disk_image): New variable. * main.c (store, store_parsed, diskfs_disk_name): New variables. (parse_opt): Propagate our input to the first child parser. (diskfs_append_args): New function. (diskfs_get_options): Function removed. (startup_parents): Use DISKFS_STORE_STARTUP_ARGP instead of DISKFS_STD_DEVICE_STARTUP_ARGP. * hyper.c (get_hypermetadata): Use DISKFS_DISK_NAME instead of DISKFS_DEVICE_ARG. * main.c (main): Likewise. * hyper.c (get_hypermetadata, diskfs_readonly_changed): Use fields in STORE instead of DISKFS_DEVICE_* variables. * inode.c (diskfs_S_file_get_storage_info): Likewise. * pager.c (pager_report_extent): Likewise. * main.c (main): Likewise. * pager.c (pager_read_page, pager_write_page, pager_unlock_page): Use store_{read,write} instead of diskfs_device_{read,write}_sync. * hyper.c (diskfs_set_hypermetadata): Likewise. * inode.c (diskfs_S_file_get_storage_info): Rewrite to use libstore functions (still has NDADDR block limit, though). Thu Sep 12 16:36:19 1996 Thomas Bushnell, n/BSG * Makefile (HURDLIBS): New variable. (ufs.static ufs): Depend on $(library_deps) instead of long list of libraries. Fri Sep 6 16:00:42 1996 Thomas Bushnell, n/BSG * consts.c: Include . (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 * 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 * 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 * 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 * hyper.c (diskfs_set_hypermetadata): Bother to return 0 at end of function. Wed Aug 7 13:00:30 1996 Thomas Bushnell, n/BSG * 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 * inode.c: Include . (struct ufs_fhandle): New type. (diskfs_S_fsys_getfile, diskfs_S_file_getfh): New functions. Tue Jul 23 15:58:28 1996 Miles Bader * inode.c (write_node, read_disknode): `struct timespec' now uses a field prefix of `tv_'. Sat Jul 6 16:14:10 1996 Miles Bader * main.c (ufs_version): Variable removed. Sat Jul 6 12:45:36 1996 Michael I. Bushnell, p/BSG * 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 * main.c: Include . (startup_parents, runtime_parents): Declare const. Tue Jun 25 14:02:02 1996 Miles Bader * main.c (diskfs_get_options): Include `--compat=' in options. Mon Jun 24 16:59:12 1996 Michael I. Bushnell, p/BSG * 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 * main.c (diskfs_get_options): New function. (options): Make const. Fri Jun 21 01:32:09 1996 Miles Bader * 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 * main.c (options): New variable. (parse_opt): New function. (main): Parse ufs-specific options too. : New include. Fri May 10 09:29:03 1996 Michael I. Bushnell, p/BSG * 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 * 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 * main.c (ufs_version): Upgrade to 0.0. Fri May 3 09:15:33 1996 Michael I. Bushnell, p/BSG * 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 * 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 * 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 * 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 * 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 * 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 (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 * 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 * 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 * inode.c (diskfs_cached_lookup): Intialize NP->cache_id *after* NP exists. Wed Apr 3 16:03:51 1996 Michael I. Bushnell, p/BSG * 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 * 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 * dir.c (diskfs_null_dirstat): New function. Fri Mar 22 23:43:53 1996 Miles Bader * inode.c (read_symlink_hook): Only set NP's atime if !readonly. Wed Mar 20 14:36:31 1996 Michael I. Bushnell, p/BSG * 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 * main.c (main): Pass new arg to argp_parse. Mon Mar 18 12:33:06 1996 Michael I. Bushnell, p/BSG * 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 * hyper.c (get_hypermetadata): Use diskfs_device_arg in unclean msgs. Wed Feb 21 05:57:12 1996 Roland McGrath * 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 * main.c (main): Check error return from diskfs_init_diskfs. Sat Jan 6 11:50:14 1996 Roland McGrath * ufs.h (diskpager, diskpagerport, disk_image): Variables removed. Include 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 * 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 * 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 * 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 * main.c (main): Add flags arg to diskfs_startup_diskfs call. Sat Nov 4 20:01:58 1995 Miles Bader * inode.c (diskfs_S_file_get_storage_info): Add FLAGS argument. Thu Oct 19 12:50:11 1995 Miles Bader * 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 * 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 * 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 * 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 * 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 * main.c (diskfs_init_completed): Function deleted (now in libdiskfs). (thread_cancel): Function deleted. Fri Oct 6 17:30:23 1995 Miles Bader * 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 * 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 * inode.c: Include . (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 * hyper.c (get_hypermetadata): Use %Zd format for result of sizeof. Tue Sep 19 13:41:46 1995 Miles Bader * Makefile (LDFLAGS): New variable. Wed Sep 13 12:30:23 1995 Michael I. Bushnell, p/BSG * 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 * 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 * Makefile (ufs): Depend on ../libshouldbeinlibc/libshouldbeinlibc.a. Fri Aug 25 17:14:09 1995 Michael I. Bushnell, p/BSG * 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 * Makefile (ufs): Add explicit dependencies. (HURDLIBS, LDFLAGS, REMHDRS): Removed. Rules associated with ../lib removed. Fri Jul 21 17:48:12 1995 Michael I Bushnell * 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 * 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 * Makefile: Removed dependencies that are now automatically generated. Mon Jun 26 20:17:42 1995 Michael I Bushnell * pager.c: Include . (diskfs_pager_users): New function. Thu Jun 22 11:41:04 1995 Michael I Bushnell * 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 * 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 * 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 * inode.c (diskfs_node_iterate): New function. (write_all_disknodes): Use it. Wed Jun 14 16:18:55 1995 Michael I Bushnell * inode.c (diskfs_get_translator): Conform to new memory usage semantic. Sat May 20 00:17:30 1995 Miles Bader * 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 * pager.c (pager_clear_user_data): Doc fix. Sat May 13 05:04:11 1995 Roland McGrath * Makefile (OBJS): Remove exec_server_image.o. (exec_server_image.o): Rule removed. Mon May 8 08:43:43 1995 Miles Bader * 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 * 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 * 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 * main.c (main): Don't abort if a std file descriptor is already open. Tue Apr 4 20:08:25 1995 Michael I Bushnell * 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 * 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 * consts.c (diskfs_synchronous): New variable. Fri Mar 17 14:31:04 1995 Michael I Bushnell * 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 * Makefile (OBJS): Remove reference to libc's devstream.o. Fri Nov 11 11:45:38 1994 Michael I Bushnell * 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 * 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 * main.c (main): Behave more reasonably if we can't open DEVNAME. Tue Nov 8 00:03:20 1994 Roland McGrath * 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 * 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 * 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 * 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 * 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 * 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 * alloc.c (diskfs_alloc_node): Abort if free inode has translator attached. Tue Oct 4 18:33:35 1994 Michael I Bushnell * pager.c (pager_unlock_page): Call diskfs_catch_exception. Tue Oct 4 00:16:04 1994 Michael I Bushnell * 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 * 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 * dir.h: Delete DT_* definitions; they are now in . * 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 * 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 * 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 * 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 * 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 * 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 [ 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 [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 * 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 * 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 * 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 * 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 * 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 * 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 * main.c (trans_parse_args): Fix and enable. Tue Sep 6 11:29:55 1994 Michael I Bushnell * inode.c (iget): Remove old assert test that checked for bad inode block allocations. Thu Sep 1 11:39:12 1994 Michael I Bushnell * tables.c: Don't include "ufs.h"; include . Then this file can be used unmodified by fsck. Tue Aug 30 13:36:37 1994 Michael I Bushnell * inode.c (diskfs_set_translator): ffs_blkfree doesn't have a return value. Mon Aug 29 12:49:17 1994 Michael I Bushnell * 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 * 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 * 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 * Makefile (LDFLAGS): New variable. Fri Aug 5 15:51:09 1994 Michael I Bushnell * 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 * Makefile: Rewritten in accord with new scheme. Wed Jul 20 13:28:38 1994 Michael I Bushnell * 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 . Removed defn of struct timespec; now in . 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 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 . 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 . 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 . 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 ; 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 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 . * 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.