mpsimon@phoenix.Princeton.EDU (M. Patrick Simon) (02/15/90)
ST Minix hackers-- I am having problems patching the Minix 1.1 fs sources to get 1.5. I have documented the problem in the shell archive below (created on an Ultrix machine with the command: shar readme fstest.crc time.c.cdif write.c.cdif > filename). Any help would be appreciated. --Patrick Simon mpsimon@phoenix.princeton.edu 2-14-90 ------------------cut everything above and including this line----------- # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by phoenix!mpsimon on Wed Feb 14 13:31:37 EST 1990 # Contents: readme fstest.crc time.c.cdif write.c.cdif echo x - readme sed 's/^@//' > "readme" <<'@//E*O*F readme//' I am having some difficulties with patching the files in the fs source directory on the ST. It looks to me like some of the .cdif files are incorrect in fsshar1 and fsshar2, but I could have problems with patch, or some other problems. I have worked through steps 1-32 in upgrading ST Minix to 1.5.0, and have used many of the suggestions from the net to get through the problems encountered there, apparently with success. Step 33 isn't working right. The crc's that I have after patching from the fsshar1-2 distributions on top of the ST Minix 1.1 are included in the file fstest.crc, and they do not match for several files. (Search for "crc-error" to locate those files which do not match.) Also included are two of the .cdif files, modified by me to indicate where I think the first error is in each of these files (there are probably more). (Search for ERROR to locate the lines where I think errors are.) The errors in the .cdif files appear to be omission of text from the original files. Patch tossed out error messages for several files, including the ones I have here, but I was not able to redirect patch's output to a file to save those messages. Anyone on the net have any suggestions on how to proceed? --Patrick Simon mpsimon@phoenix.princeton.edu 2-14-90 @//E*O*F readme// chmod u=rw,g=,o= readme echo x - fstest.crc sed 's/^@//' > "fstest.crc" <<'@//E*O*F fstest.crc//' 19878 4197 at_makefile 46997 3007 buf.h 01929 11048 cache.c crc-error 12890 3093 const.h crc-error 41046 276 dev.h 21550 9093 device.c 09749 518 file.h 22121 3203 filedes.c 33856 1507 fproc.h 17961 861 fs.crc crc-irrelevant-difference 25637 635 fs.h 65024 3629 glo.h 40506 7646 inode.c crc-error 19687 1940 inode.h crc-error 61434 5196 link.c 08114 16494 main.c 02299 8610 misc.c crc-error 22925 6079 mount.c 14230 10462 open.c 44343 1617 param.h 51037 10720 path.c 46842 4266 pc_makefile 03416 8791 pipe.c 56875 5721 protect.c crc-error 00000 0 proto.h 10057 1442 putc.c 01285 14898 read.c 58485 3255 st_makefile 36899 5301 stadir.c crc-error 13682 8767 super.c crc-error 36161 2071 super.h 48421 3695 table.c 37254 2404 time.c crc-error 31979 705 type.h 08538 5279 utility.c 58403 7171 write.c crc-error @//E*O*F fstest.crc// chmod u=rw,g=,o= fstest.crc echo x - time.c.cdif sed 's/^@//' > "time.c.cdif" <<'@//E*O*F time.c.cdif//' *** ../../110/fs/time.c Mon Jan 8 09:08:06 1990 --- time.c Tue Jan 2 14:02:20 1990 *************** *** 7,22 **** * do_tims: perform the TIMES system call */ ! #include "../h/const.h" ! #include "../h/type.h" ! #include "../h/callnr.h" ! #include "../h/com.h" ! #include "../h/error.h" ! #include "const.h" ! #include "type.h" #include "file.h" #include "fproc.h" - #include "glo.h" #include "inode.h" #include "param.h" --- 7,17 ---- * do_tims: perform the TIMES system call */ ! #include "fs.h" ! #include <minix/callnr.h> ! #include <minix/com.h> #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" *************** *** 31,37 **** register struct inode *rip; register int r; - extern struct inode *eat_path(); /* Temporarily open the file. */ if (fetch_name(utime_file, utime_length, M1) != OK) return(err_code); --- 26,31 ---- <-- ERROR, shouldn't 6 lines of c code follow? *************** *** 40,45 **** --- 34,40 ---- /* Only the owner of a file or the super_user can change its time. */ r = OK; if (rip->i_uid != fp->fp_effuid && !super_user) r = EPERM; + if (read_only(rip) != OK) r = EROFS; /* not even su can touch if R/O */ if (r == OK) { rip->i_modtime = update_time; rip->i_dirt = DIRTY; *************** *** 58,65 **** { /* Perform the time(tp) system call. */ - extern real_time clock_time(); - reply_l1 = clock_time(); /* return time in seconds */ return(OK); } --- 53,58 ---- *************** *** 89,95 **** { /* Perform the times(buffer) system call. */ ! real_time t[4]; sys_times(who, t); reply_t1 = t[0]; --- 82,88 ---- { /* Perform the times(buffer) system call. */ ! time_t t[4]; sys_times(who, t); reply_t1 = t[0]; @//E*O*F time.c.cdif// chmod u=rw,g=,o= time.c.cdif echo x - write.c.cdif sed 's/^@//' > "write.c.cdif" <<'@//E*O*F write.c.cdif//' *** ../../110/fs/write.c Mon Jan 8 09:08:09 1990 --- write.c Tue Jan 2 14:02:22 1990 *************** *** 8,25 **** * new_block: acquire a new block */ ! #include "../h/const.h" ! #include "../h/type.h" ! #include "../h/error.h" ! #include "const.h" ! #include "type.h" #include "buf.h" #include "file.h" #include "fproc.h" - #include "glo.h" #include "inode.h" #include "super.h" /*===========================================================================* * do_write * *===========================================================================*/ --- 8,22 ---- * new_block: acquire a new block */ ! #include "fs.h" #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "super.h" + FORWARD int write_map(); + /*===========================================================================* * do_write * *===========================================================================*/ *************** *** 35,41 **** *===========================================================================*/ PRIVATE int write_map(rip, position, new_zone) register struct inode *rip; /* pointer to inode to be changed */ ! file_pos position; /* file address to be mapped */ zone_nr new_zone; /* zone # to be inserted */ { /* Write a new zone into an inode. */ --- 32,38 ---- *===========================================================================*/ PRIVATE int write_map(rip, position, new_zone) register struct inode *rip; /* pointer to inode to be changed */ ! off_t position; /* file address to be mapped */ zone_nr new_zone; /* zone # to be inserted */ { /* Write a new zone into an inode. */ *************** *** 47,56 **** struct buf *bp; int new_ind, new_dbl; - extern zone_nr alloc_zone(); - extern struct buf *get_block(); - extern real_time clock_time(); - rip->i_dirt = DIRTY; /* inode will be changed */ bp = NIL_BUF; scale = scale_factor(rip); /* for zone-block conversion */ --- 44,49 ---- <-- ERROR, shouldn't 6 lines of c code follow? *************** *** 58,64 **** /* Is 'position' to be found in the inode itself? */ if (zone < NR_DZONE_NUM) { ! rip->i_zone[zone] = new_zone; rip->i_modtime = clock_time(); return(OK); } --- 51,57 ---- /* Is 'position' to be found in the inode itself? */ if (zone < NR_DZONE_NUM) { ! rip->i_zone[(int) zone] = new_zone; rip->i_modtime = clock_time(); return(OK); } *************** *** 109,115 **** b = (block_nr) *zp << scale; bp = get_block(rip->i_dev, b, (new_ind ? NO_READ : NORMAL) ); if (new_ind) zero_block(bp); ! bp->b_ind[excess] = new_zone; rip->i_modtime = clock_time(); bp->b_dirt = DIRTY; put_block(bp, INDIRECT_BLOCK); --- 102,108 ---- b = (block_nr) *zp << scale; bp = get_block(rip->i_dev, b, (new_ind ? NO_READ : NORMAL) ); if (new_ind) zero_block(bp); ! bp->b_ind[(int) excess] = new_zone; rip->i_modtime = clock_time(); bp->b_dirt = DIRTY; put_block(bp, INDIRECT_BLOCK); *************** *** 120,128 **** /*===========================================================================* * clear_zone * *===========================================================================*/ ! PUBLIC clear_zone(rip, pos, flag) register struct inode *rip; /* inode to clear */ ! file_pos pos; /* points to block to clear */ int flag; /* 0 if called by read_write, 1 by new_block */ { /* Zero a zone, possibly starting in the middle. The parameter 'pos' gives --- 113,121 ---- /*===========================================================================* * clear_zone * *===========================================================================*/ ! PUBLIC void clear_zone(rip, pos, flag) register struct inode *rip; /* inode to clear */ ! off_t pos; /* points to block to clear */ int flag; /* 0 if called by read_write, 1 by new_block */ { /* Zero a zone, possibly starting in the middle. The parameter 'pos' gives *************** *** 132,142 **** register struct buf *bp; register block_nr b, blo, bhi; ! register file_pos next; register int scale; register zone_type zone_size; - extern struct buf *get_block(); - extern block_nr read_map(); /* If the block size and zone size are the same, clear_zone() not needed. */ if ( (scale = scale_factor(rip)) == 0) return; --- 125,133 ---- register struct buf *bp; register block_nr b, blo, bhi; ! register off_t next; register int scale; register zone_type zone_size; /* If the block size and zone size are the same, clear_zone() not needed. */ if ( (scale = scale_factor(rip)) == 0) return; *************** *** 165,171 **** *===========================================================================*/ PUBLIC struct buf *new_block(rip, position) register struct inode *rip; /* pointer to inode */ ! file_pos position; /* file pointer */ { /* Acquire a new block and return a pointer to it. Doing so may require * allocating a complete zone, and then returning the initial block. --- 156,162 ---- *===========================================================================*/ PUBLIC struct buf *new_block(rip, position) register struct inode *rip; /* pointer to inode */ ! off_t position; /* file pointer */ { /* Acquire a new block and return a pointer to it. Doing so may require * allocating a complete zone, and then returning the initial block. *************** *** 178,187 **** zone_type zone_size; int scale, r; struct super_block *sp; - extern struct buf *get_block(); - extern struct super_block *get_super(); - extern block_nr read_map(); - extern zone_nr alloc_zone(); /* Is another block available in the current zone? */ if ( (b = read_map(rip, position)) == NO_BLOCK) { --- 169,174 ---- *************** *** 216,222 **** /*===========================================================================* * zero_block * *===========================================================================*/ ! PUBLIC zero_block(bp) register struct buf *bp; /* pointer to buffer to zero */ { /* Zero a block. */ --- 203,209 ---- /*===========================================================================* * zero_block * *===========================================================================*/ ! PUBLIC void zero_block(bp) register struct buf *bp; /* pointer to buffer to zero */ { /* Zero a block. */ @//E*O*F write.c.cdif// chmod u=rw,g=,o= write.c.cdif exit 0