Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP
id AA409 ; Sun, 31 Jan 93 14:06:42 EST
Path: sserve!manuel.anu.edu.au!munnari.oz.au!yarra-glen.aaii.oz.au!msi.umn.edu!umn.edu!spool.mu.edu!howland.reston.ans.net!zaphod.mps.ohio-state.edu!cs.utexas.edu!sun-barr!sh.wide!wnoc-tyo-news!news.u-tokyo.ac.jp!yayoi!tansei1!mhiroshi
From: mhiroshi@tansei.cc.u-tokyo.ac.jp (H. Murakami)
Newsgroups: comp.unix.bsd,fj.os.386bsd
Subject: Problem with the low level I/O.
Message-ID: <4025@tansei1.tansei.cc.u-tokyo.ac.jp>
Date: 1 Feb 93 14:38:10 GMT
Sender: news@tansei.cc.u-tokyo.ac.jp
Followup-To: comp.unix.bsd
Organization: Hokkaido Univ. However I am subject to tansei for JUNET.
Lines: 113
I found, that the 386bsd0.1
The I/O function read()
cannot work with the large buffer size
for the raw device.
Instead it just returns the size it actually read,
The console message appeares saying that
"Out of range, cannot happen? Device not configured"
I have Sony workstation, it can read or write
to the disks or tapes with very large buffer
size I/O operation.
For example,
% tar cvfb /dev/rmt0 10000
I wonder, if this ("Device not configured" etc.)
is a bug or specification of POSIX.
Script started on Sun Jan 24 13:05:16 1993
%
% gcc -DNSECT=100 b.c
% a.out
Success.
%
% gcc -DNSECT=110 b.c
% a.out
Success.
%
% gcc -DNSECT=120 b.c
% a.out
Success.
%
% gcc -DNSECT=125 b.c
% a.out
Success.
%
% gcc -DNSECT=126 b.c
% a.out
Out of range, cannot happen? Device not configured
%
% gcc -DNSECT=127 b.c
% a.out
Out of range, cannot happen? Device not configured
%
% gcc -DNSECT=130 b.c
% a.out
Out of range, cannot happen? Device not configured
%
% cat b.c
/* Start of sample program. */
#define DEVICE "/dev/ras0c" /* SCSI Raw device to be tested. */
#include <stdio.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/times.h>
#define MAXSECT 500
#define NB (512*MAXSECT)
static char buf[NB];
main()
{
int d;
int rtn;
int size;
if ((d=open(DEVICE, O_RDONLY, 0444))<=0) {
fprintf(stderr, "Device open error.\n");
exit(1); }
size = 512 * NSECT;
if (size > NB) {
fprintf(stderr, "NSECT too large. size > NB.\n");
exit(2); }
rtn = read(d, buf, size);
if(rtn <=0) {
extern int errno;
perror("");
exit(3);
}
fprintf(stderr, "Success.\n");
close(d);
}
/* THE END. */
% exit
% exit
Script done on Sun Jan 24 13:06:21 1993
PS.
If I changed the #define DEVICE to the raw IDE drive like /dev/rwd0a,
the limit of NSECT with success goes up was observed, however,
if it is raised somevalue between 200 and 300, the system hangs up anyway.
Wmmm.... this trouble may be related to the hang up
when mallocing by many processes.
Does this bug relates to the limitation of the kernel must reside
below a mega bytes?
Hiroshi Murakami
mhiroshi@tansei.cc.u-tokyo.ac.jp
hiroshi@teine.chem2.hokudai.ac.jp