Commit 254721ff authored by Linus Torvalds's avatar Linus Torvalds

Import 2.2.3

parent 777720de
......@@ -2080,7 +2080,7 @@ Auto-probe for parallel devices
CONFIG_PNP_PARPORT
Some IEEE-1284 conforming parallel-port devices can identify
themselves when requested. Say Y to enable this feature, or M to
compile it as a module (parport_ieee1284.o). If in doubt, say N.
compile it as a module (parport_probe.o). If in doubt, say N.
Enable loadable module support
CONFIG_MODULES
......@@ -2716,20 +2716,6 @@ CONFIG_TCP_NAGLE_OFF
enabled. Those programs that would benefit from disabling this
facility can do it on a per connection basis themselves.
IP: Drop source routed frames
CONFIG_IP_NOSR
Usually, the originator of an IP frame (packet) specifies only the
destination, and the hosts along the way do the routing, i.e. they
decide how to forward the frame. However, there is a feature of the
IP protocol that allows to specify the full route for a given frame
already at its origin. A frame with such a fully specified route is
called "source routed". The question now is whether we should honour
these route requests when such frames arrive, or if we should drop
all those frames instead. Honouring them can introduce security
problems (and is rarely a useful feature), and hence it is
recommended that you say Y here unless you really know what you're
doing.
IP: Allow large windows (not recommended if <16 MB of memory)
CONFIG_SKB_LARGE
On high speed, long distance networks the performance limit on
......@@ -4184,6 +4170,17 @@ CONFIG_SCSI_INITIO
say M here and read Documentation/modules.txt. The module will be
called initio.o
Initio 91XXU(W) SCSI support
CONFIG_SCSI_INITIO
This is support for the Initio 91XXU(W) SCSI host adapter.
Please read the SCSI-HOWTO, available via FTP (user: anonymous) at
ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
If you want to compile this as a module ( = code which can be
inserted in and removed from the running kernel whenever you want),
say M here and read Documentation/modules.txt. The module will be
called initio.o
PAS16 SCSI support
CONFIG_SCSI_PAS16
This is support for a SCSI host adapter. It is explained in section
......@@ -4197,6 +4194,17 @@ CONFIG_SCSI_PAS16
The module will be called pas16.o. If you want to compile it as a
module, say M here and read Documentation/modules.txt.
Initio INI-A100U2W SCSI support
CONFIG_SCSI_INIA100
This is support for the Initio INI-A100U2W SCSI host adapter.
Please read the SCSI-HOWTO, available via FTP (user: anonymous) at
ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO.
If you want to compile this as a module ( = code which can be
inserted in and removed from the running kernel whenever you want),
say M here and read Documentation/modules.txt. The module will be
called a100u2w.o
PCI2000 support
CONFIG_SCSI_PCI2000
This is support for the PCI2000I EIDE interface card which acts as a
......@@ -4389,6 +4397,23 @@ CONFIG_SCSI_NCR53C406A
say M here and read Documentation/modules.txt. The module will be
called NCR53c406.o.
Symbios Logic sym53c416 support
CONFIG_SCSI_SYM53C416
This is support for the sym53c416 SCSI host adapter. This is the
SCSI adapter that comes with some hp scanners. This driver requires that
the sym53c416 is configured first using some sort of pnp configuration
program (e.g. isapnp) or by a PnP aware BIOS. If you are using isapnp then
you need to compile it as a module and then load it using insmod after
isapnp has run. The parameters of the configured card(s) should be passed
to the driver. The format is:
insmod sym53c416 sym53c416=<base>,<irq> [sym53c416_1=<base>,<irq>]
There is support for up to four adapters. If you want to compile this
driver as a module ( = code which can be inserted in and removed from
the running kernel whenever you want), say M here and read
Documentation/modules.txt.
Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support
CONFIG_SCSI_DC390T
This driver supports PCI SCSI host adapters based on the Am53C974A
......@@ -8914,6 +8939,20 @@ CONFIG_SOUND_OSS
here (the module will be called sound.o) if you haven't found a
driver for your sound card above, then pick your driver from the
list below.
Persistent DMA buffers
CONFIG_SOUND_DMAP
Linux can often have problems allocating DMA buffers for ISA cards on
machines with more than 16MB of RAM. This is because ISA DMA buffers
must exist below the 16MB boundry and it is quite possible that we
can't find a large enough free block in this region after the machine
has been running for any amount of time. If you say Y here the DMA
buffers (64Kb) will be allocated at boot time and kept until the
shutdown. This option is only usefull if you say Y to OSS sound
modules. If you say M to OSS sound modules then you can just pass to
the sound.o module a "dmabuf=1" command-line argument.
Say Y unless you have 16MB or less RAM or a PCI sound card.
Support for Aztech Sound Galaxy (non-PnP) cards
CONFIG_SOUND_SGALAXY
......@@ -10493,6 +10532,44 @@ SF16FMI I/O port (0x284 or 0x384)
CONFIG_RADIO_SF16FMI_PORT
Enter the I/O port of your SF16FMI radio card.
Typhoon Radio
CONFIG_RADIO_TYPHOON
Choose Y here if you have one of these FM radio cards, and then fill
in the port address and the frequency used for muting below.
In order to control your radio card, you will need to use programs
that are compatible with the Video for Linux API. Information on
this API and pointers to "v4l" programs may be found on the WWW at
http://roadrunner.swansea.uk.linux.org/v4l.shtml; to browse the WWW,
you need to have access to a machine on the Internet that has a
program like lynx or netscape.
If you want to compile this driver as a module ( = code which can be
inserted in and removed from the running kernel whenever you want),
say M here and read Documentation/modules.txt. The module will be
called radio-typhoon.o
Support for /proc/radio-typhoon
CONFIG_RADIO_TYPHOON_PROC_FS
Say Y here if you want the typhoon radio card driver to write
status information (frequency, volume, muted, mute frequency,
base address) to /proc/radio-typhoon. The file can be viewed with
your favorite pager (i.e. use "more /proc/radio-typhoon" or "less
/proc/radio-typhoon" or simply "cat /proc/radio-typhoon").
Typhoon I/O port (0x316 or 0x336)
CONFIG_RADIO_TYPHOON_PORT
Enter the I/O port of your Typhoon or EcoRadio radio card.
Typhoon frequency set when muting the device (kHz)
CONFIG_RADIO_TYPHOON_MUTEFREQ
Enter the frequency used for muting the radio. The device is never
completely silent. If the volume is just turned down, you can still
hear silent voices and music. For that reason, the frequency of the
radio device is set to the frequency you can enter here whenever
the device is muted. There should be no local radio station at that
frequency.
Zoltrix Radio
CONFIG_RADIO_ZOLTRIX
Choose Y here if you have one of these FM radio cards, and then fill
......@@ -10738,24 +10815,10 @@ CONFIG_IRLAN
Documentation/modules.txt. IrLAN emulates an Ethernet and makes it
possible to put up a wireless LAN using infrared beams.
IrLAN Client Protocol
CONFIG_IRLAN_CLIENT
Say Y here if you want to build support for the IrLAN client
protocol. If you want to compile it as a module, say M here and read
Documentation/modules.txt. The IrLAN client protocol can be used to
talk with infrared access points like the HP NetbeamIR, or the ESI
JetEye NET. You can also connect to another Linux machine running
the IrLAN server protocol for ad-hoc networking!
IrLAN Server Protocol
CONFIG_IRLAN_SERVER
Say Y here if you want to build support for infrared LAN access. If
you want to compile it as a module, say M here and read
Documentation/modules.txt. The IrLAN server protocol makes it
possible to set up a wireless LAN with a machine running the IrLAN
client protocol. Notice that the IrLAN server protocol currently
only emulates an access point and does not implement the ad-hoc
specification of IrLAN, but this will not be noticeable by the user.
The IrLAN protocol can be used to talk with infrared access points
like the HP NetbeamIR, or the ESI JetEye NET. You can also connect
to another Linux machine running the IrLAN protocol for ac-hoc
networking!
IrOBEX Protocol
CONFIG_IROBEX
......@@ -10868,6 +10931,15 @@ CONFIG_TEKRAM_DONGLE
used by IrTTY. To activate support for Tekram dongles you will have
to insert "irattach -d tekram" in the /etc/irda/drivers script.
Greenwich GIrBIL dongle
CONFIG_GIRBIL_DONGLE
Say Y here if you want to build support for the Greenwich GIrBIL
dongle. If you want to compile it as a module, say M here and read
Documentation/modules.txt. The Greenwich dongle attaches to the
normal 9-pin serial port connector, and can currently only be used
by IrTTY. To activate support for Greenwich dongles you will have to
insert "irattach -d girbil" in the /etc/irda/drivers script.
VME (Motorola and BVM) support
CONFIG_VME
Say Y here if you want to build a kernel for a 680x0 based VME
......
......@@ -875,8 +875,8 @@ static void __init pcibios_fixup_io_addr(struct pci_dev *dev, int idx)
printk("PCI: Unassigned I/O space for %02x:%02x\n", bus, devfn);
return;
}
if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && idx < 4 ||
(dev->class >> 8) == PCI_CLASS_DISPLAY_VGA) {
if (((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && idx < 4) ||
(dev->class >> 8) == PCI_CLASS_DISPLAY_VGA) {
/*
* In case the BIOS didn't assign an address 0--3 to an IDE
* controller, we don't try to fix it as it means "use default
......
......@@ -543,70 +543,72 @@ static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, 0, "timer", NUL
* device.
*/
#define CALIBRATE_LATCH (5 * LATCH)
#define CALIBRATE_TIME (5 * 1000020/HZ)
__initfunc(static unsigned long calibrate_tsc(void))
{
unsigned long retval;
/* Set the Gate high, disable speaker */
outb((inb(0x61) & ~0x02) | 0x01, 0x61);
__asm__( /* set the Gate high, program CTC channel 2 for mode 0
* (interrupt on terminal count mode), binary count,
* load 5 * LATCH count, (LSB and MSB)
* to begin countdown, read the TSC and busy wait.
* BTW LATCH is calculated in timex.h from the HZ value
*/
/*
* Now let's take care of CTC channel 2
*
* Set the Gate high, program CTC channel 2 for mode 0,
* (interrupt on terminal count mode), binary count,
* load 5 * LATCH count, (LSB and MSB) to begin countdown.
*/
outb(0xb0, 0x43); /* binary, mode 0, LSB/MSB, Ch 2 */
outb(CALIBRATE_LATCH & 0xff, 0x42); /* LSB of count */
outb(CALIBRATE_LATCH >> 8, 0x42); /* MSB of count */
{
unsigned long startlow, starthigh;
unsigned long endlow, endhigh;
unsigned long count;
__asm__ __volatile__("rdtsc":"=a" (startlow),"=d" (starthigh));
count = 0;
do {
count++;
} while ((inb(0x61) & 0x20) == 0);
__asm__ __volatile__("rdtsc":"=a" (endlow),"=d" (endhigh));
last_tsc_low = endlow;
/* Error: ECTCNEVERSET */
if (count <= 1)
goto bad_ctc;
/* 64-bit subtract - gcc just messes up with long longs */
__asm__("subl %2,%0\n\t"
"sbbl %3,%1"
:"=a" (endlow), "=d" (endhigh)
:"g" (startlow), "g" (starthigh),
"0" (endlow), "1" (endhigh));
/* Error: ECPUTOOFAST */
if (endhigh)
goto bad_ctc;
/* Error: ECPUTOOSLOW */
if (endlow <= CALIBRATE_TIME)
goto bad_ctc;
__asm__("divl %2"
:"=a" (endlow), "=d" (endhigh)
:"r" (endlow), "0" (0), "1" (CALIBRATE_TIME));
return endlow;
}
/* Set the Gate high, disable speaker */
"inb $0x61, %%al\n\t" /* Read port */
"andb $0xfd, %%al\n\t" /* Turn off speaker Data */
"orb $0x01, %%al\n\t" /* Set Gate high */
"outb %%al, $0x61\n\t" /* Write port */
/* Now let's take care of CTC channel 2 */
"movb $0xb0, %%al\n\t" /* binary, mode 0, LSB/MSB, ch 2*/
"outb %%al, $0x43\n\t" /* Write to CTC command port */
"movl %1, %%eax\n\t"
"outb %%al, $0x42\n\t" /* LSB of count */
"shrl $8, %%eax\n\t"
"outb %%al, $0x42\n\t" /* MSB of count */
/* Read the TSC; counting has just started */
"rdtsc\n\t"
/* Move the value for safe-keeping. */
"movl %%eax, %%ebx\n\t"
"movl %%edx, %%ecx\n\t"
/* Busy wait. Only 50 ms wasted at boot time. */
"0: inb $0x61, %%al\n\t" /* Read Speaker Output Port */
"testb $0x20, %%al\n\t" /* Check CTC channel 2 output (bit 5) */
"jz 0b\n\t"
/* And read the TSC. 5 jiffies (50.00077ms) have elapsed. */
"rdtsc\n\t"
/* Great. So far so good. Store last TSC reading in
* last_tsc_low (only 32 lsb bits needed) */
"movl %%eax, last_tsc_low\n\t"
/* And now calculate the difference between the readings. */
"subl %%ebx, %%eax\n\t"
"sbbl %%ecx, %%edx\n\t" /* 64-bit subtract */
/* but probably edx = 0 at this point (see below). */
/* Now we have 5 * (TSC counts per jiffy) in eax. We want
* to calculate TSC->microsecond conversion factor. */
/* Note that edx (high 32-bits of difference) will now be
* zero iff CPU clock speed is less than 85 GHz. Moore's
* law says that this is likely to be true for the next
* 12 years or so. You will have to change this code to
* do a real 64-by-64 divide before that time's up. */
"movl %%eax, %%ecx\n\t"
"xorl %%eax, %%eax\n\t"
"movl %2, %%edx\n\t"
"divl %%ecx\n\t" /* eax= 2^32 / (1 * TSC counts per microsecond) */
/* Return eax for the use of fast_gettimeoffset */
"movl %%eax, %0\n\t"
: "=r" (retval)
: "r" (5 * LATCH), "r" (5 * 1000020/HZ)
: /* we clobber: */ "ax", "bx", "cx", "dx", "cc", "memory");
return retval;
/*
* The CTC wasn't reliable: we got a hit on the very first read,
* or the CPU was so fast/slow that the quotient wouldn't fit in
* 32 bits..
*/
bad_ctc:
return 0;
}
__initfunc(void time_init(void))
......@@ -642,23 +644,26 @@ __initfunc(void time_init(void))
dodgy_tsc();
if (boot_cpu_data.x86_capability & X86_FEATURE_TSC) {
unsigned long tsc_quotient = calibrate_tsc();
if (tsc_quotient) {
fast_gettimeoffset_quotient = tsc_quotient;
use_tsc = 1;
#ifndef do_gettimeoffset
do_gettimeoffset = do_fast_gettimeoffset;
do_gettimeoffset = do_fast_gettimeoffset;
#endif
do_get_fast_time = do_gettimeofday;
use_tsc = 1;
fast_gettimeoffset_quotient = calibrate_tsc();
/* report CPU clock rate in Hz.
* The formula is (10^6 * 2^32) / (2^32 * 1 / (clocks/us)) =
* clock/second. Our precision is about 100 ppm.
*/
{ unsigned long eax=0, edx=1000000;
__asm__("divl %2"
:"=a" (cpu_hz), "=d" (edx)
:"r" (fast_gettimeoffset_quotient),
"0" (eax), "1" (edx));
printk("Detected %ld Hz processor.\n", cpu_hz);
do_get_fast_time = do_gettimeofday;
/* report CPU clock rate in Hz.
* The formula is (10^6 * 2^32) / (2^32 * 1 / (clocks/us)) =
* clock/second. Our precision is about 100 ppm.
*/
{ unsigned long eax=0, edx=1000000;
__asm__("divl %2"
:"=a" (cpu_hz), "=d" (edx)
:"r" (tsc_quotient),
"0" (eax), "1" (edx));
printk("Detected %ld Hz processor.\n", cpu_hz);
}
}
}
......
......@@ -17,6 +17,7 @@
* 97-4-11 Making protocol independent of endianity etc.
* 97-9-13 Cosmetic changes
* 98-5-13 Attempt to make 64-bit-clean on 64-bit machines
* 99-1-11 Attempt to make 64-bit-clean on 32-bit machines <ankry@mif.pg.gda.pl>
*
* possible FIXME: make set_sock / set_blksize / set_size / do_it one syscall
* why not: would need verify_area and friends, would share yet another
......@@ -45,8 +46,9 @@
#define LO_MAGIC 0x68797548
static int nbd_blksizes[MAX_NBD];
static int nbd_blksize_bits[MAX_NBD];
static int nbd_sizes[MAX_NBD];
static int nbd_bytesizes[MAX_NBD];
static u64 nbd_bytesizes[MAX_NBD];
static struct nbd_device nbd_dev[MAX_NBD];
......@@ -149,7 +151,7 @@ void nbd_send_req(struct socket *sock, struct request *req)
DEBUG("NBD: sending control, ");
request.magic = htonl(NBD_REQUEST_MAGIC);
request.type = htonl(req->cmd);
request.from = cpu_to_be64( (u64) req->sector * (u64) 512);
request.from = cpu_to_be64( (u64) req->sector << 9);
request.len = htonl(req->current_nr_sectors << 9);
memcpy(request.handle, &req, sizeof(req));
......@@ -340,7 +342,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
struct nbd_device *lo;
int dev, error;
int dev, error, temp;
/* Anyone capable of this syscall can do *real bad* things */
......@@ -355,6 +357,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
lo = &nbd_dev[dev];
switch (cmd) {
case NBD_CLEAR_SOCK:
nbd_clear_que(lo);
if (lo->head || lo->tail) {
printk(KERN_ERR "nbd: Some requests are in progress -> can not turn off.\n");
return -EBUSY;
......@@ -380,14 +383,25 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
}
return error;
case NBD_SET_BLKSIZE:
if ((arg & 511) || (arg > PAGE_SIZE))
if ((arg & (arg-1)) || (arg < 512) || (arg > PAGE_SIZE))
return -EINVAL;
nbd_blksizes[dev] = arg;
nbd_sizes[dev] = arg/nbd_blksizes[dev];
temp = arg >> 9;
nbd_blksize_bits[dev] = 9;
while (temp > 1) {
nbd_blksize_bits[dev]++;
temp >>= 1;
}
nbd_sizes[dev] = nbd_bytesizes[dev] >> nbd_blksize_bits[dev];
nbd_bytesizes[dev] = nbd_sizes[dev] << nbd_blksize_bits[dev];
return 0;
case NBD_SET_SIZE:
nbd_bytesizes[dev] = arg;
nbd_sizes[dev] = arg/nbd_blksizes[dev];
nbd_sizes[dev] = arg >> nbd_blksize_bits[dev];
nbd_bytesizes[dev] = nbd_sizes[dev] << nbd_blksize_bits[dev];
return 0;
case NBD_SET_SIZE_BLOCKS:
nbd_sizes[dev] = arg;
nbd_bytesizes[dev] = arg << nbd_blksize_bits[dev];
return 0;
case NBD_DO_IT:
if (!lo->file)
......@@ -404,7 +418,7 @@ static int nbd_ioctl(struct inode *inode, struct file *file,
return 0;
#endif
case BLKGETSIZE:
return put_user(nbd_bytesizes[dev]/512, (long *) arg);
return put_user(nbd_bytesizes[dev] << 9, (long *) arg);
}
return -EINVAL;
}
......@@ -420,6 +434,7 @@ static int nbd_release(struct inode *inode, struct file *file)
if (dev >= MAX_NBD)
return -ENODEV;
fsync_dev(inode->i_rdev);
invalidate_buffers(inode->i_rdev);
lo = &nbd_dev[dev];
if (lo->refcnt <= 0)
printk(KERN_ALERT "nbd_release: refcount(%d) <= 0\n", lo->refcnt);
......@@ -478,8 +493,9 @@ int nbd_init(void)
nbd_dev[i].magic = LO_MAGIC;
nbd_dev[i].flags = 0;
nbd_blksizes[i] = 1024;
nbd_bytesizes[i] = 0x7fffffff;
nbd_sizes[i] = nbd_bytesizes[i]/nbd_blksizes[i];
nbd_blksize_bits[i] = 10;
nbd_bytesizes[i] = 0x7ffffc00; /* 2GB */
nbd_sizes[i] = nbd_bytesizes[i] >> nbd_blksize_bits[i];
}
return 0;
}
......
......@@ -1558,7 +1558,6 @@ static int bttv_open(struct video_device *dev, int flags)
static void bttv_close(struct video_device *dev)
{
struct bttv *btv=(struct bttv *)dev;
unsigned long f;
btv->user--;
audio(btv, AUDIO_INTERN);
......@@ -1580,6 +1579,7 @@ static void bttv_close(struct video_device *dev)
* which is more than sufficient to be sure.
*/
current->state = TASK_UNINTERRUPTIBLE;
schedule_timeout(HZ/10); /* Wait 1/10th of a second */
/*
......
......@@ -1317,10 +1317,19 @@ static int fbcon_switch(struct vc_data *conp)
struct fb_info *info = p->fb_info;
if (softback_top) {
int l = fbcon_softback_size / conp->vc_size_row;
if (softback_lines)
fbcon_set_origin(conp);
softback_top = softback_curr = softback_in = softback_buf;
softback_lines = 0;
if (l > 5)
softback_end = softback_buf + l * conp->vc_size_row;
else {
/* Smaller scrollback makes no sense, and 0 would screw
the operation totally */
softback_top = 0;
}
}
if (logo_shown >= 0) {
struct vc_data *conp2 = vc_cons[logo_shown].d;
......@@ -1620,9 +1629,6 @@ static inline int fbcon_set_font(int unit, struct console_font_op *op)
int h = op->height;
int size = h;
int i, k;
#ifndef CONFIG_FBCON_FONTWIDTH8_ONLY
int j;
#endif
u8 *new_data, *data = op->data, *p;
#ifdef CONFIG_FBCON_FONTWIDTH8_ONLY
......@@ -1878,7 +1884,6 @@ static int fbcon_scrolldelta(struct vc_data *conp, int lines)
q -= conp->vc_size_row;
scr_memcpyw((u16 *)q, (u16 *)p, conp->vc_size_row);
}
softback_lines -= i;
softback_in = p;
update_region(unit, conp->vc_origin, logo_lines * conp->vc_cols);
}
......
......@@ -1343,6 +1343,7 @@ static int process_unauthorized(int type, int pid)
{
struct task_struct *p;
uid_t euid=0; /* Save the euid keep the lock short */
int ok = 0;
read_lock(&tasklist_lock);
......@@ -1352,9 +1353,11 @@ static int process_unauthorized(int type, int pid)
*/
p = find_task_by_pid(pid);
if(p)
{
if (p) {
euid=p->euid;
ok = p->dumpable;
if(!cap_issubset(p->cap_permitted, current->cap_permitted))
ok=0;
if(!p->mm) /* Scooby scooby doo where are you ? */
p=NULL;
}
......@@ -1374,7 +1377,7 @@ static int process_unauthorized(int type, int pid)
case PROC_PID_CPU:
return 0;
}
if(capable(CAP_DAC_OVERRIDE) || current->fsuid == euid)
if(capable(CAP_DAC_OVERRIDE) || (current->fsuid == euid && ok))
return 0;
return 1;
}
......
......@@ -26,8 +26,8 @@ struct sock_filter /* Filter block */
struct sock_fprog /* Required for SO_ATTACH_FILTER. */
{
unsigned int len; /* Number of filter blocks */
struct sock_filter *filter;
unsigned short len; /* Number of filter blocks */
struct sock_filter *filter;
};
#ifdef __KERNEL__
......
......@@ -8,6 +8,7 @@
#define NBD_CLEAR_SOCK _IO( 0xab, 4 )
#define NBD_CLEAR_QUE _IO( 0xab, 5 )
#define NBD_PRINT_DEBUG _IO( 0xab, 6 )
#define NBD_SET_SIZE_BLOCKS _IO( 0xab, 7 )
#ifdef MAJOR_NR
......@@ -60,13 +61,21 @@ struct nbd_device {
#define NBD_REPLY_MAGIC 0x67446698
/* Do *not* use magics: 0x12560953 0x96744668. */
/*
* This is packet used for communication between client and
* server. All data are in network byte order.
*/
struct nbd_request {
u32 magic;
u32 type; /* == READ || == WRITE */
char handle[8];
u64 from;
u32 len;
};
}
#ifdef __GNUC__
__attribute__ ((packed))
#endif
;
struct nbd_reply {
u32 magic;
......
......@@ -607,7 +607,7 @@ int do_munmap(unsigned long addr, size_t len)
return -EINVAL;
if ((len = PAGE_ALIGN(len)) == 0)
return 0;
return -EINVAL;
/* Check if this memory area is ok - put it on the temporary
* list if so.. The checks here are pretty simple --
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment