From owner-freebsd-hackers Tue Jan 23 06:04:04 1996 Return-Path: owner-hackers Received: (from root@localhost) by freefall.freebsd.org (8.7.3/8.7.3) id GAA19874 for hackers-outgoing; Tue, 23 Jan 1996 06:04:04 -0800 (PST) Received: from yokogawa.co.jp (yhqfm.yokogawa.co.jp [202.33.29.34]) by freefall.freebsd.org (8.7.3/8.7.3) with SMTP id GAA19849 for ; Tue, 23 Jan 1996 06:03:59 -0800 (PST) Received: from sjc.yokogawa.co.jp ([133.140.4.100]) by yokogawa.co.jp (8.6.9+2.4Wb3/3.3Wb4-firewall:08/09/94) with SMTP id XAA14863 for ; Tue, 23 Jan 1996 23:03:56 +0900 Received: from leia.pa.yokogawa.co.jp by sjc.yokogawa.co.jp (4.1/6.4J.6-YOKOGAWA-R/GW) id AA13781; Tue, 23 Jan 96 23:03:54 JST Received: from cabbage by leia.pa.yokogawa.co.jp (16.8/6.4J.6-YOKOGAWA/pa) id AA22969; Tue, 23 Jan 96 23:03:53 +0900 Received: by cabbage.pa.yokogawa.co.jp (16.6/3.3Wb) id AA28044; Tue, 23 Jan 96 23:04:54 +0900 Date: Tue, 23 Jan 96 23:04:54 +0900 From: Mihoko Tanaka Message-Id: <9601231404.AA28044@cabbage.pa.yokogawa.co.jp> To: freebsd-hackers@freebsd.org Subject: NFS trouble ? Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Sender: owner-hackers@freebsd.org Precedence: bulk Hello All, My friend is developping a program which seek a file and read it. Her program seeks a file with a wrong offset (i.e the offset size is larger than the file size). It occurs panic. When a file is on a local disk, nothing happens. But when a file is on NFS, it occurs panic everytime. She use FreeBSD-2.1.0R. I make a sample program for it. --------- cut cut cut ---------------------- cut cut cut ----------------- #include #include #include main(int argc, char **argv) { int fd; char buf[100]; off_t ret; extern int errno; if((fd = open(argv[1], O_RDONLY, 0644)) < 0) { perror("open fail"); exit(1); } printf("open is succeed!\n"); if ((ret = lseek(fd, 0x90000000, SEEK_SET)) < 0) { fprintf(stderr, "errno = %d, ret = 0x%x \n", errno, ret); perror("seek fail"); exit(1); } printf("seek is succeed! ret = 0x%x\n", ret); if (read(fd, buf, 100)<0) { perror("read fail"); exit(1); } printf("read is succeed!\n"); close(fd); } --------- cut cut cut ---------------------- cut cut cut ----------------- lseek(2) and read(2) are succeed, when a file is on a local disk. When a file is on NFS, then lseek(2) is succeed. read(2) occurs PANIC. the I/F of lseek(2) is the following : off_t lseek(int fd, off_t offset, int whence) off_t is defined in /usr/include/sys/types.h : typedef long long off_t then off_t offset = 0x90000000 > 0 I guess that lseek should return a error (EINVAL) when 'offset' is larger then the file size . What do you think ? How should I avoid this trouble ? Of course, I know that her program has a bug ! :-) (kgdb) bt #0 boot (howto=256) (../../i386/i386/machdep.c line 892) 892 dumppcb.pcb_ptd = rcr3(); #1 0xf0117e65 in panic (fmt=(char *) 0xf01a2212 "because you said to!") (../../kern/subr_prf.c line 124) #2 0xf01a2235 in diediedie () (../../i386/i386/machdep.c line 834) #3 0xf01014de in db_fncall (dummy1=1, dummy2=0, dummy3=-266292708, dummy4=(char *) 0xefbffbd4 "\304\016!\360d\307!\360") (../../ddb/db_command.c line 491) #4 0xf0101212 in db_command (last_cmdp=(struct command **) 0xf01f8af4, cmd_table=(struct command *) 0xf01f8954) (../../ddb/db_command.c line 281) #5 0xf0101391 in db_command_loop () (../../ddb/db_command.c line 419) #6 0xf0103e7c in db_trap (type=12, code=0) (../../ddb/db_trap.c line 72) #7 0xf019f3ce in kdb_trap (type=12, code=0, regs=(struct trapframe *) 0xefbffd28) (../../i386/i386/db_interface.c line 120) #8 0xf01aa31b in trap_fatal (frame=(struct trapframe *) 0xefbffd28) (../../i386 /i386/trap.c line 741) #9 0xf01a9e98 in trap_pfault (frame=(struct trapframe *) 0xefbffd28, usermode=0) (../../i386/i386/trap.c line 667) #10 0xf01a9ae7 in trap (frame={tf_es = 16, tf_ds = 16, tf_edi = -227674456, tf_esi = 0, tf_ebp = -272630384, tf_isp = -267213461, tf_ebx = -257278388, tf_edx = 2147483647, tf_ecx = -227674456, tf_eax = 0, tf_trapno = 12, tf_err = 0, tf_eip = -267213461, tf_cs = 8, tf_eflags = 66071, tf_esp = -227674456, tf_ss = -2147483648}) (../../i386/i386/trap.c line 307) #11 0xf019fc9d in exception:calltrap () #12 0xf012a56b in allocbuf (bp=(struct buf *) 0xf26df6a8, size=268441088) (../../kern/vfs_bio.c line 1052) #13 0xf012a19b in getblk (vp=(struct vnode *) 0xf173da00, blkno=491520, size=268441088, slpflag=0, slptimeo=0) (../../kern/vfs_bio.c line 910) #14 0xf014fdfe in nfs_getcacheblk (vp=(struct vnode *) 0xf173da00, bn=491520, size=268441088, p=(struct proc *) 0xf1682500) (../../nfs/nfs_bio.c line 602) #15 0xf014f106 in nfs_bioread (vp=(struct vnode *) 0xf173da00, uio=(struct uio * ) 0xefbfff2c, ioflag=0, cred=(struct ucred *) 0xf1521500) (../../nfs/nfs_bio.c line 240) #16 0xf01677f3 in nfs_read (ap=(struct vop_read_args *) 0xefbffee0) (../../nfs/nfs_vnops.c line 817) #17 0xf0132b4a in vn_read (fp=(struct file *) 0xf1780ec0, uio=(struct uio *) 0xefbfff2c, cred=(struct ucred *) 0xf1521500) (./vnode_if.h line 211) #18 0xf011918b in read (p=(struct proc *) 0xf1682500, uap=(struct read_args *) 0xefbfff94, retval=(int *) 0xefbfff8c) (../../kern/sys_generic.c line 112) #19 0xf01aa57f in syscall (frame={tf_es = 39, tf_ds = 39, tf_edi = 0, tf_esi = -272639016, tf_ebp = -272639052, tf_isp = -272629788, tf_ebx = -272639012, tf_edx = 134689284, tf_ecx = 134689284, tf_eax = 3, tf_trapno = 662, tf_err = 662, tf_eip = 134623909, tf_cs = 31, tf_eflags = 662, tf_esp = -272639172, tf_ss = 39}) (../../i386/i386/trap.c line 878) (kgdb) -- Mihoko Tanaka