Commit 4f412172 authored by Linus Torvalds's avatar Linus Torvalds

Import 2.3.30pre6

parent 0c38a3e2
......@@ -156,12 +156,9 @@ S: Notre Dame, Indiana
S: USA
N: James Banks
E: james.banks@caldera.com
E: james@sovereign.org
D: TLAN network driver
S: Caldera, Inc.
S: 633 South 550 East
S: Provo, Utah 84606
S: USA
D: Logitech Busmouse driver
N: Krzysztof G. Baranowski
E: kgb@manjak.knm.org.pl
......
......@@ -4,7 +4,7 @@
Richard Gooch <rgooch@atnf.csiro.au>
23-APR-1999
5-JUL-1999
Conventions used in this document <section>
......@@ -41,10 +41,11 @@ mounted.
Opening a File <subsection>
--------------
The VFS implements the open(2) system call. The pathname argument is
used by the VFS to search through the directory entry cache (dentry
cache or "dcache"). This provides a very fast lookup mechanism to
translate a pathname (filename) into a specific dentry.
The VFS implements the open(2), stat(2), chmod(2) and similar system
calls. The pathname argument is used by the VFS to search through the
directory entry cache (dentry cache or "dcache"). This provides a very
fast lookup mechanism to translate a pathname (filename) into a
specific dentry.
An individual dentry usually has a pointer to an inode. Inodes are the
things that live on disc drives, and can be regular files (you know:
......@@ -53,7 +54,8 @@ beasts. Dentries live in RAM and are never saved to disc: they exist
only for performance. Inodes live on disc and are copied into memory
when required. Later any changes are written back to disc. The inode
that lives in RAM is a VFS inode, and it is this which the dentry
points to.
points to. A single inode can be pointed to by multiple dentries
(think about hardlinks).
The dcache is meant to be a view into your entire filespace. Unlike
Linus, most of us losers can't fit enough dentries into RAM to cover
......@@ -76,10 +78,10 @@ back to userspace.
Opening a file requires another operation: allocation of a file
structure (this is the kernel-side implementation of file
descriptors). The freshly allocated file structure is initialised with
a pointer to the dentry and a set of file operation member
functions. These are taken from the inode data. The open() file method
is then called so the specific filesystem implementation can do it's
work. You can see that this is another switch performed by the VFS.
a pointer to the dentry and a set of file operation member functions.
These are taken from the inode data. The open() file method is then
called so the specific filesystem implementation can do it's work. You
can see that this is another switch performed by the VFS.
The file structure is placed into the file descriptor table for the
process.
......@@ -92,6 +94,14 @@ function to do whatever is required.
For as long as the file is open, it keeps the dentry "open" (in use),
which in turn means that the VFS inode is still in use.
All VFS system calls (i.e. open(2), stat(2), read(2), write(2),
chmod(2) and so on) are called from a process context. You should
assume that these calls are made without any kernel locks being
held. This means that the processes may be executing the same piece of
filesystem or driver code at the same time, on different
processors. You should ensure that access to shared resources is
protected by appropriate locks.
Registering and Mounting a Filesystem <subsection>
-------------------------------------
......@@ -249,8 +259,11 @@ struct inode_operations {
int (*revalidate) (struct dentry *);
};
Again, all methods are called without any locks being held, unless
otherwise noted.
default_file_ops: this is a pointer to a "struct file_operations"
which describes how to manipulate open files
which describes how to open and then manipulate open files
create: called by the open(2) and creat(2) system calls. Only
required if you want to support regular files. The dentry you
......@@ -270,7 +283,7 @@ struct inode_operations {
If you wish to overload the dentry methods then you should
initialise the "d_dop" field in the dentry; this is a pointer
to a struct "dentry_operations".
This method is called with the directory semaphore held
This method is called with the directory inode semaphore held
link: called by the link(2) system call. Only required if you want
to support hard links. You will probably need to call
......@@ -327,17 +340,20 @@ struct file_operations {
int (*lock) (struct file *, int, struct file_lock *);
};
Again, all methods are called without any locks being held, unless
otherwise noted.
llseek: called when the VFS needs to move the file position index
read: called by the read(2) system call
read: called by read(2) and related system calls
write: called by the write(2) system call
write: called by write(2) and related system calls
readdir: called when the VFS needs to read the directory contents
poll: called by the VFS when a process wants to check if there is
activity on this file and (optionally) go to sleep until there
is activity
is activity. Called by the select(2) and poll(2) system calls
ioctl: called by the ioctl(2) system call
......@@ -380,7 +396,9 @@ struct dentry_operations <section>
This describes how a filesystem can overload the standard dentry
operations. Dentries and the dcache are the domain of the VFS and the
individual filesystem implementations. Device drivers have no business
here. As of kernel 2.1.99, the following members are defined:
here. These methods may be set to NULL, as they are either optional or
the VFS uses a default. As of kernel 2.1.99, the following members are
defined:
struct dentry_operations {
int (*d_revalidate)(struct dentry *);
......@@ -391,7 +409,10 @@ struct dentry_operations {
void (*d_iput)(struct dentry *, struct inode *);
};
d_revalidate: called when the VFS needs to revalidate a dentry
d_revalidate: called when the VFS needs to revalidate a dentry. This
is called whenever a name lookup finds a dentry in the
dcache. Most filesystems leave this as NULL, because all their
dentries in the dcache are valid
d_hash: called when the VFS adds a dentry to the hash table
......@@ -401,7 +422,7 @@ struct dentry_operations {
deleted. This means no-one is using the dentry, however it is
still valid and in the dcache
d_release: called when a dentry is deallocated
d_release: called when a dentry is really deallocated
d_iput: called when a dentry looses its inode (just prior to its
being deallocated). The default when this is NULL is that the
......
TLAN driver for Linux, version 1.0
README
Well, I'm back. The TLAN driver seems pretty stable, so I'm
declaring this cycle of development finished, and calling the
driver 1.0. I will, of course continue to work on improving
the driver, and work towards a 2.0 release.
I haven't had any time to do anything for a long time, and this isn't
likely to change. So there's a driver here for anyone looking to
carry forward a project :)
For those who are looking for help, I can't. I haven't looked at
a kernel since the early 2.0 series, so I won't know what's going on.
Your best chance at help would be joining the TLAN mailing list and
posting your question there.
You can join by sending "subscribe tlan" in the body of an email to
majordomo@vuser.vu.union.edu.
Thanks to those who have (and who will ;) put work in to keep the TLAN
driver working as the kernel moves on.
James
james@sovereign.org
TLAN driver for Linux, version 1.0
README
I. Supported Devices.
......
......@@ -422,12 +422,6 @@ M: langa2@kph.uni-mainz.de
W: http://www.uni-mainz.de/~langm000/linux.html
S: Maintained
IBM ServeRAID RAID DRIVER
P: Keith Mitchell
M: ipslinux@us.ibm.com
W: http://www.developer.ibm.com/welcome/netfinity/serveraid_beta.html
S: Supported
IBM ServeRAID RAID DRIVER
P: Keith Mitchell
M: ipslinux@us.ibm.com
......@@ -889,10 +883,8 @@ M: kgb@manjak.knm.org.pl
S: Maintained
TLAN NETWORK DRIVER
P: James Banks
M: james@sovereign.org
L: tlan@vuser.vu.union.edu
S: Maintained
S: Orphan
TOKEN-RING NETWORK DRIVER
P: Paul Norton
......
......@@ -24,7 +24,6 @@
* 2 USB ports
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/mm.h>
......
......@@ -76,7 +76,7 @@ static pmd_t * get_bad_pmd_table(void)
pmd_t v;
int i;
pmd_val(v) = _PAGE_TABLE + __pa(empty_bad_pte_table);
set_pmd(&v, __pmd(_PAGE_TABLE + __pa(empty_bad_pte_table)));
for (i = 0; i < PAGE_SIZE/sizeof(pmd_t); i++)
empty_bad_pmd_table[i] = v;
......@@ -103,13 +103,13 @@ static pte_t * get_bad_pte_table(void)
void __handle_bad_pmd(pmd_t *pmd)
{
pmd_ERROR(*pmd);
pmd_val(*pmd) = _PAGE_TABLE + __pa(get_bad_pte_table());
set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(get_bad_pte_table())));
}
void __handle_bad_pmd_kernel(pmd_t *pmd)
{
pmd_ERROR(*pmd);
pmd_val(*pmd) = _KERNPG_TABLE + __pa(get_bad_pte_table());
set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(get_bad_pte_table())));
}
pte_t *get_pte_kernel_slow(pmd_t *pmd, unsigned long offset)
......@@ -120,10 +120,10 @@ pte_t *get_pte_kernel_slow(pmd_t *pmd, unsigned long offset)
if (pmd_none(*pmd)) {
if (pte) {
clear_page(pte);
pmd_val(*pmd) = _KERNPG_TABLE + __pa(pte);
set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)));
return pte + offset;
}
pmd_val(*pmd) = _KERNPG_TABLE + __pa(get_bad_pte_table());
set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(get_bad_pte_table())));
return NULL;
}
free_page((unsigned long)pte);
......@@ -142,10 +142,10 @@ pte_t *get_pte_slow(pmd_t *pmd, unsigned long offset)
if (pmd_none(*pmd)) {
if (pte) {
clear_page((void *)pte);
pmd_val(*pmd) = _PAGE_TABLE + __pa(pte);
set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)));
return (pte_t *)pte + offset;
}
pmd_val(*pmd) = _PAGE_TABLE + __pa(get_bad_pte_table());
set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(get_bad_pte_table())));
return NULL;
}
free_page(pte);
......@@ -268,7 +268,7 @@ void set_fixmap (enum fixed_addresses idx, unsigned long phys)
printk("Invalid set_fixmap\n");
return;
}
set_pte_phys (address,phys);
set_pte_phys(address,phys);
}
static void __init fixrange_init (unsigned long start, unsigned long end, pgd_t *pgd_base)
......@@ -286,7 +286,7 @@ static void __init fixrange_init (unsigned long start, unsigned long end, pgd_t
#if CONFIG_X86_PAE
if (pgd_none(*pgd)) {
pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
pgd_val(*pgd) = __pa(pmd) + 0x1;
set_pgd(pgd, __pgd(__pa(pmd) + 0x1));
if (pmd != pmd_offset(pgd, start))
BUG();
}
......@@ -297,7 +297,7 @@ static void __init fixrange_init (unsigned long start, unsigned long end, pgd_t
for (; (j < PTRS_PER_PMD) && start; pmd++, j++) {
if (pmd_none(*pmd)) {
pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
pmd_val(*pmd) = _KERNPG_TABLE + __pa(pte);
set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)));
if (pte != pte_offset(pmd, 0))
BUG();
}
......@@ -326,7 +326,7 @@ static void __init pagetable_init(void)
vaddr = i*PGDIR_SIZE;
#if CONFIG_X86_PAE
pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
pgd_val(*pgd) = __pa(pmd) + 0x1;
set_pgd(pgd, __pgd(__pa(pmd) + 0x1));
#else
pmd = (pmd_t *)pgd;
#endif
......@@ -345,12 +345,12 @@ static void __init pagetable_init(void)
set_in_cr4(X86_CR4_PGE);
__pe += _PAGE_GLOBAL;
}
pmd_val(*pmd) = __pe;
set_pmd(pmd, __pmd(__pe));
continue;
}
pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
pmd_val(*pmd) = _KERNPG_TABLE + __pa(pte);
set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)));
if (pte != pte_offset(pmd, 0))
BUG();
......@@ -412,7 +412,7 @@ void __init zap_low_mappings (void)
#if CONFIG_X86_PAE
pgd_clear(swapper_pg_dir+i);
#else
pgd_val(swapper_pg_dir[i]) = 0;
set_pgd(swapper_pg_dir+i, __pgd(0));
#endif
flush_tlb_all();
}
......
......@@ -13,6 +13,7 @@
* Gadi Oxman <gadio@netvision.net.il>
*/
#define __NO_VERSION__
#include <linux/module.h>
#include <linux/types.h>
#include <linux/string.h>
......
......@@ -53,7 +53,7 @@ static struct pc110pad_params current_params;
static wait_queue_head_t queue;
static struct fasync_struct *asyncptr;
static int active=0; /* number of concurrent open()s */
static struct semaphore read_lock;
static struct semaphore reader_lock;
/*
* Utility to reset a timer to go off some time in the future.
......@@ -561,7 +561,7 @@ static ssize_t read_pad(struct file * file, char * buffer, size_t count, loff_t
{
int r;
down(&read_lock);
down(&reader_lock);
for(r=0; r<count; r++)
{
if(!read_byte_count)
......@@ -573,7 +573,7 @@ static ssize_t read_pad(struct file * file, char * buffer, size_t count, loff_t
}
read_byte_count = (read_byte_count+1)%3;
}
up(&read_lock);
up(&reader_lock);
return r;
}
......@@ -691,7 +691,7 @@ static void pc110pad_unload(void)
int init_module(void)
{
init_MUTEX(&read_lock);
init_MUTEX(&reader_lock);
return pc110pad_init();
}
......
......@@ -2,11 +2,11 @@
** hp100.c
** HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters
**
** $Id: hp100.c,v 1.58 1999/11/30 17:20:20 perex Exp perex $
** $Id: hp100.c,v 1.57 1998/04/10 16:27:23 perex Exp perex $
**
** Based on the HP100 driver written by Jaroslav Kysela <perex@jcu.cz>
** Extended for new busmaster capable chipsets by
** Siegfried "Frieder" Loeffler (dg1sek) <loeffler@cdi.fr>
** Siegfried "Frieder" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>
**
** Maintained by: Jaroslav Kysela <perex@jcu.cz>
**
......@@ -45,8 +45,6 @@
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** 1.57 -> 1.58
** - 'no connection found' message is time limited now
**
** 1.56 -> 1.57
** - updates for new PCI interface for 2.1 kernels
......@@ -1670,20 +1668,7 @@ static int hp100_start_xmit_bm( struct sk_buff *skb, struct net_device *dev )
hp100_stop_interface( dev );
if ( ( lp->lan_type = hp100_sense_lan( dev ) ) < 0 )
{
/* Added Mon Nov 1 06:13:19 1999 by Brian Moore
* (mooreb@iname.com) to prevent too much kernel IO
* in the case of not having a network connection
*/
{
int thistime = jiffies;
static int delaytime = 10*HZ;
static int lasttime = thistime - delaytime;
// We don't worry about rollover
if(thistime >= (lasttime + delaytime)) {
printk( "hp100: %s: no connection found - check wire\n", dev->name );
lasttime = thistime;
}
}
printk( "hp100: %s: no connection found - check wire\n", dev->name );
hp100_start_interface( dev ); /* 10Mb/s RX pkts maybe handled */
return -EIO;
}
......
......@@ -1640,7 +1640,7 @@ aic7xxx_setup(char *s)
}
}
__setup("aic7xxx=", aix7xxx_setup);
__setup("aic7xxx=", aic7xxx_setup);
/*+F*************************************************************************
* Function:
......
......@@ -28,6 +28,8 @@ if [ "$CONFIG_VISWS" = "y" ]; then
dep_tristate ' SGI Visual Workstation Sound' CONFIG_SOUND_VWSND $CONFIG_SOUND
fi
dep_tristate ' Trident 4DWave-DX/NX' CONFIG_SOUND_TRIDENT $CONFIG_SOUND
dep_tristate ' Support for Turtle Beach MultiSound Classic, Tahiti, Monterey' CONFIG_SOUND_MSNDCLAS $CONFIG_SOUND
if [ "$CONFIG_SOUND_MSNDCLAS" = "y" -o "$CONFIG_SOUND_MSNDCLAS" = "m" ]; then
if [ "$CONFIG_SOUND_MSNDCLAS" = "y" ]; then
......
......@@ -84,6 +84,7 @@ obj-$(CONFIG_SOUND_ES1370) += es1370.o
obj-$(CONFIG_SOUND_ES1371) += es1371.o
obj-$(CONFIG_SOUND_ESSSOLO1) += esssolo1.o
obj-$(CONFIG_SOUND_MAESTRO) += maestro.o
obj-$(CONFIG_SOUND_TRIDENT) += trident.o
# Declare multi-part drivers.
......
This diff is collapsed.
#ifndef __TRID4DWAVE_H
#define __TRID4DWAVE_H
/*
* audio@tridentmicro.com
* Fri Feb 19 15:55:28 MST 1999
* Definitions for Trident 4DWave DX/NX chips
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#ifndef PCI_VENDOR_ID_TRIDENT
#define PCI_VENDOR_ID_TRIDENT 0x1023
#endif
#ifndef PCI_DEVICE_ID_TRIDENT_4DWAVE_DX
#define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000
#endif
#ifndef PCI_DEVICE_ID_TRIDENT_4DWAVE_NX
#define PCI_DEVICE_ID_TRIDENT_4DWAVE_NX 0x2001
#endif
/*
* Direct registers
*/
#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif
#define TRID_REG( trident, x ) ( (trident) -> iobase + (x) )
#define CHANNEL_REGS 5
#define CHANNEL_START 0xe0 // The first bytes of the contiguous register space.
#define ID_4DWAVE_DX 0x2000
#define ID_4DWAVE_NX 0x2001
// Register definitions
// Global registers
// T2 legacy dma control registers.
#define LEGACY_DMAR0 0x00 // ADR0
#define LEGACY_DMAR4 0x04 // CNT0
#define LEGACY_DMAR11 0x0b // MOD
#define LEGACY_DMAR15 0x0f // MMR
#define T4D_START_A 0x80
#define T4D_STOP_A 0x84
#define T4D_DLY_A 0x88
#define T4D_SIGN_CSO_A 0x8c
#define T4D_CSPF_A 0x90
#define T4D_CEBC_A 0x94
#define T4D_AINT_A 0x98
#define T4D_AINTEN_A 0x9c
#define T4D_LFO_GC_CIR 0xa0
#define T4D_MUSICVOL_WAVEVOL 0xa8
#define T4D_SBDELTA_DELTA_R 0xac
#define T4D_MISCINT 0xb0
#define T4D_START_B 0xb4
#define T4D_STOP_B 0xb8
#define T4D_SBBL_SBCL 0xc0
#define T4D_SBCTRL_SBE2R_SBDD 0xc4
#define T4D_AINT_B 0xd8
#define T4D_AINTEN_B 0xdc
// MPU-401 UART
#define T4D_MPU401_BASE 0x20
#define T4D_MPUR0 0x20
#define T4D_MPUR1 0x21
#define T4D_MPUR2 0x22
#define T4D_MPUR3 0x23
// S/PDIF Registers
#define NX_SPCTRL_SPCSO 0x24
#define NX_SPLBA 0x28
#define NX_SPESO 0x2c
#define NX_SPCSTATUS 0x64
// Channel Registers
#define CH_DX_CSO_ALPHA_FMS 0xe0
#define CH_DX_ESO_DELTA 0xe8
#define CH_DX_FMC_RVOL_CVOL 0xec
#define CH_NX_DELTA_CSO 0xe0
#define CH_NX_DELTA_ESO 0xe8
#define CH_NX_ALPHA_FMS_FMC_RVOL_CVOL 0xec
#define CH_LBA 0xe4
#define CH_GVSEL_PAN_VOL_CTRL_EC 0xf0
// AC-97 Registers
#define DX_ACR0_AC97_W 0x40
#define DX_ACR1_AC97_R 0x44
#define DX_ACR2_AC97_COM_STAT 0x48
#define NX_ACR0_AC97_COM_STAT 0x40
#define NX_ACR1_AC97_W 0x44
#define NX_ACR2_AC97_R_PRIMARY 0x48
#define NX_ACR3_AC97_R_SECONDARY 0x4c
#define AC97_SIGMATEL_DAC2INVERT 0x6E
#define AC97_SIGMATEL_BIAS1 0x70
#define AC97_SIGMATEL_BIAS2 0x72
#define AC97_SIGMATEL_CIC1 0x76
#define AC97_SIGMATEL_CIC2 0x78
#endif /* __TRID4DWAVE_H */
......@@ -1449,6 +1449,8 @@ int block_write_range(struct dentry *dentry, struct page *page,
err = copy_from_user(kaddr+from, buf, to-from);
if (to < zeroto)
memset(kaddr+to, 0, zeroto-to);
else
zeroto = to;
if (err < 0)
goto out;
/*
......
......@@ -10,6 +10,6 @@ if [ "$CONFIG_NCPFS_OS2_NS" = "y" ]; then
bool ' Lowercase DOS filenames' CONFIG_NCPFS_SMALLDOS
fi
bool ' Allow mounting of volume subdirectories' CONFIG_NCPFS_MOUNT_SUBDIR
# bool ' NDS interserver authentication support' CONFIG_NCPFS_NDS_DOMAINS
bool ' NDS authentication support' CONFIG_NCPFS_NDS_DOMAINS
bool ' Use Native Language Support' CONFIG_NCPFS_NLS
bool ' Enable symbolic links and execute flags' CONFIG_NCPFS_EXTRAS
......@@ -487,7 +487,7 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
filp->f_pos = 2;
}
page = find_lock_page(&inode->i_data, 0);
page = grab_cache_page(&inode->i_data, 0);
if (!page)
goto read_really;
......@@ -516,7 +516,7 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
for (;;) {
if (ctl.ofs != 0) {
ctl.page = grab_cache_page(&inode->i_data, ctl.ofs);
ctl.page = find_lock_page(&inode->i_data, ctl.ofs);
if (!ctl.page)
goto invalid_cache;
ctl.cache = (union ncp_dir_cache *)
......@@ -661,7 +661,7 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir,
ctl.cache = NULL;
ctl.idx -= NCP_DIRCACHE_SIZE;
ctl.ofs += 1;
ctl.page = find_lock_page(&inode->i_data, ctl.ofs);
ctl.page = grab_cache_page(&inode->i_data, ctl.ofs);
if (ctl.page)
ctl.cache = (union ncp_dir_cache *)
kmap(ctl.page);
......
......@@ -364,8 +364,7 @@ int ncp_ioctl(struct inode *inode, struct file *filp,
#ifdef CONFIG_NCPFS_NDS_DOMAINS
case NCP_IOC_GETOBJECTNAME:
if ( (permission(inode, MAY_READ) != 0)
&& (current->uid != server->m.mounted_uid)) {
if (current->uid != server->m.mounted_uid) {
return -EACCES;
}
{
......@@ -396,8 +395,7 @@ int ncp_ioctl(struct inode *inode, struct file *filp,
return 0;
}
case NCP_IOC_SETOBJECTNAME:
if ( (permission(inode, MAY_WRITE) != 0)
&& (current->uid != server->m.mounted_uid)) {
if (current->uid != server->m.mounted_uid) {
return -EACCES;
}
{
......@@ -441,8 +439,7 @@ int ncp_ioctl(struct inode *inode, struct file *filp,
return 0;
}
case NCP_IOC_GETPRIVATEDATA:
if ( (permission(inode, MAY_READ) != 0)
&& (current->uid != server->m.mounted_uid)) {
if (current->uid != server->m.mounted_uid) {
return -EACCES;
}
{
......@@ -471,8 +468,7 @@ int ncp_ioctl(struct inode *inode, struct file *filp,
return 0;
}
case NCP_IOC_SETPRIVATEDATA:
if ( (permission(inode, MAY_WRITE) != 0)
&& (current->uid != server->m.mounted_uid)) {
if (current->uid != server->m.mounted_uid) {
return -EACCES;
}
{
......
......@@ -835,7 +835,7 @@ static int ntfs_statfs(struct super_block *sb, struct statfs *sf, int bufsize)
/* Number of files is limited by free space only, so we lie here */
fs.f_ffree=0;
mft=iget(sb,FILE_MFT);
fs.f_files=mft->i_size/vol->mft_recordsize;
fs.f_files=mft->i_size >> vol->mft_recordbits;
iput(mft);
/* should be read from volume */
......
......@@ -91,12 +91,13 @@ int ntfs_init_volume(ntfs_volume *vol,char *boot)
if(vol->mft_clusters_per_record<0 && vol->mft_clusters_per_record!=-10)
ntfs_error("Unexpected data #4 in boot block\n");
vol->clustersize=vol->blocksize*vol->clusterfactor;
if(vol->mft_clusters_per_record>0)
vol->mft_recordsize=
vol->clustersize*vol->mft_clusters_per_record;
vol->clustersize = vol->blocksize * vol->clusterfactor;
if (vol->mft_clusters_per_record > 0)
vol->mft_recordbits = vol->clustersize * vol->mft_clusters_per_record;
else
vol->mft_recordsize=1<<(-vol->mft_clusters_per_record);
vol->mft_recordbits = -vol->mft_clusters_per_record;
vol->mft_recordsize = 1 << vol->mft_recordbits;
vol->index_recordsize=vol->clustersize*vol->index_clusters_per_record;
/* FIXME: long long value */
vol->mft_cluster=NTFS_GETU64(boot+0x30);
......
......@@ -50,6 +50,9 @@ typedef struct { unsigned long pgprot; } pgprot_t;
#define pgd_val(x) ((x).pgd)
#define pgprot_val(x) ((x).pgprot)
#define __pte(x) ((pte_t) { (x) } )
#define __pmd(x) ((pmd_t) { (x) } )
#define __pgd(x) ((pgd_t) { (x) } )
#define __pgprot(x) ((pgprot_t) { (x) } )
#endif /* !__ASSEMBLY__ */
......
......@@ -54,7 +54,7 @@ extern inline pmd_t * pmd_alloc(pgd_t *pgd, unsigned long address)
page = get_pmd_slow();
if (page) {
if (pgd_none(*pgd)) {
pgd_val(*pgd) = 1 + __pa(page);
set_pgd(pgd, __pgd(1 + __pa(page)));
__flush_tlb();
return page + address;
} else
......
......@@ -107,7 +107,7 @@ extern inline pte_t * pte_alloc_kernel(pmd_t * pmd, unsigned long address)
if (!page)
return get_pte_kernel_slow(pmd, address);
pmd_val(*pmd) = _KERNPG_TABLE + __pa(page);
set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(page)));
return page + address;
}
if (pmd_bad(*pmd)) {
......@@ -132,7 +132,7 @@ extern inline pte_t * pte_alloc(pmd_t * pmd, unsigned long address)
if (!page)
return get_pte_slow(pmd, address);
pmd_val(*pmd) = _PAGE_TABLE + __pa(page);
set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(page)));
return (pte_t *)page + address;
}
fix:
......
......@@ -34,6 +34,19 @@ extern inline int pgd_bad(pgd_t pgd) { return 0; }
extern inline int pgd_present(pgd_t pgd) { return 1; }
#define pgd_clear(xp) do { } while (0)
/*
* Certain architectures need to do special things when PTEs
* within a page table are directly modified. Thus, the following
* hook is made available.
*/
#define set_pte(pteptr, pteval) (*(pteptr) = pteval)
/*
* (pmds are folded into pgds so this doesnt get actually called,
* but the define is needed for a generic inline function.)
*/
#define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
#define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)
#define pgd_page(pgd) \
((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
......
......@@ -35,11 +35,22 @@
/*
* Subtle, in PAE mode we cannot have zeroes in the top level
* page directory, the CPU enforces this.
* page directory, the CPU enforces this. (ie. the PGD entry
* always has to have the present bit set.) The CPU caches
* the 4 pgd entries internally, so there is no extra memory
* load on TLB miss, despite one more level of indirection.
*/
#define pgd_none(x) (pgd_val(x) == 1ULL)
extern inline int pgd_bad(pgd_t pgd) { return 0; }
extern inline int pgd_present(pgd_t pgd) { return !pgd_none(pgd); }
#define set_pte(pteptr,pteval) \
set_64bit((unsigned long long *)(pteptr),pte_val(pteval))
#define set_pmd(pmdptr,pmdval) \
set_64bit((unsigned long long *)(pmdptr),pmd_val(pmdval))
#define set_pgd(pgdptr,pgdval) \
set_64bit((unsigned long long *)(pgdptr),pgd_val(pgdval))
/*
* Pentium-II errata A13: in PAE mode we explicitly have to flush
* the TLB via cr3 if the top-level pgd is changed... This was one tough
......@@ -48,7 +59,7 @@ extern inline int pgd_present(pgd_t pgd) { return !pgd_none(pgd); }
*/
extern inline void __pgd_clear (pgd_t * pgd)
{
pgd_val(*pgd) = 1; // no zero allowed!
set_pgd(pgd, __pgd(1ULL));
}
extern inline void pgd_clear (pgd_t * pgd)
......
......@@ -52,13 +52,6 @@ __asm__ __volatile__("invlpg %0": :"m" (*(char *) addr))
#endif
#endif
/*
* Certain architectures need to do special things when PTEs
* within a page table are directly modified. Thus, the following
* hook is made available.
*/
#define set_pte(pteptr, pteval) ((*(pteptr)) = (pteval))
#define __beep() asm("movb $0x3,%al; outb %al,$0x61")
#define PMD_SIZE (1UL << PMD_SHIFT)
......@@ -166,13 +159,13 @@ extern void __handle_bad_pmd_kernel(pmd_t * pmd);
#define pte_none(x) (!pte_val(x))
#define pte_present(x) (pte_val(x) & (_PAGE_PRESENT | _PAGE_PROTNONE))
#define pte_clear(xp) do { pte_val(*(xp)) = 0; } while (0)
#define pte_clear(xp) do { set_pte(xp, __pte(0)); } while (0)
#define pte_pagenr(x) ((unsigned long)((pte_val(x) >> PAGE_SHIFT)))
#define pmd_none(x) (!pmd_val(x))
#define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT)
#define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0)
#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0)
#define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
/*
* Permanent address of a page. Obviously must never be
......@@ -193,16 +186,16 @@ extern inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
extern inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
extern inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
extern inline pte_t pte_rdprotect(pte_t pte) { pte_val(pte) &= ~_PAGE_USER; return pte; }
extern inline pte_t pte_exprotect(pte_t pte) { pte_val(pte) &= ~_PAGE_USER; return pte; }
extern inline pte_t pte_mkclean(pte_t pte) { pte_val(pte) &= ~_PAGE_DIRTY; return pte; }
extern inline pte_t pte_mkold(pte_t pte) { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
extern inline pte_t pte_wrprotect(pte_t pte) { pte_val(pte) &= ~_PAGE_RW; return pte; }
extern inline pte_t pte_mkread(pte_t pte) { pte_val(pte) |= _PAGE_USER; return pte; }
extern inline pte_t pte_mkexec(pte_t pte) { pte_val(pte) |= _PAGE_USER; return pte; }
extern inline pte_t pte_mkdirty(pte_t pte) { pte_val(pte) |= _PAGE_DIRTY; return pte; }
extern inline pte_t pte_mkyoung(pte_t pte) { pte_val(pte) |= _PAGE_ACCESSED; return pte; }
extern inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) |= _PAGE_RW; return pte; }
extern inline pte_t pte_rdprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; }
extern inline pte_t pte_exprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; }
extern inline pte_t pte_mkclean(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; }
extern inline pte_t pte_mkold(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; }
extern inline pte_t pte_wrprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_RW)); return pte; }
extern inline pte_t pte_mkread(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; }
extern inline pte_t pte_mkexec(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; }
extern inline pte_t pte_mkdirty(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; }
extern inline pte_t pte_mkyoung(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; }
extern inline pte_t pte_mkwrite(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW)); return pte; }
/*
* Conversion functions: convert a page and protection to a page entry,
......@@ -213,17 +206,17 @@ extern inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) |= _PAGE_RW; return pt
({ \
pte_t __pte; \
\
pte_val(__pte) = ((page)-mem_map)*(unsigned long long)PAGE_SIZE + \
pgprot_val(pgprot); \
set_pte(&__pte, __pte(((page)-mem_map) * \
(unsigned long long)PAGE_SIZE + pgprot_val(pgprot))); \
__pte; \
})
/* This takes a physical page address that is used by the remapping functions */
#define mk_pte_phys(physpage, pgprot) \
({ pte_t __pte; pte_val(__pte) = physpage + pgprot_val(pgprot); __pte; })
({ pte_t __pte; set_pte(&__pte, __pte(physpage + pgprot_val(pgprot))); __pte; })
extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
{ pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot); return pte; }
{ set_pte(&pte, __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot))); return pte; }
#define page_pte(page) page_pte_prot(page, __pgprot(0))
......
......@@ -122,12 +122,62 @@ static inline unsigned long get_limit(unsigned long segment)
#define nop() __asm__ __volatile__ ("nop")
#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
#define tas(ptr) (xchg((ptr),1))
struct __xchg_dummy { unsigned long a[100]; };
#define __xg(x) ((struct __xchg_dummy *)(x))
/*
* The semantics of XCHGCMP8B are a bit strange, this is why
* there is a loop and the loading of %%eax and %%edx has to
* be inside. This inlines well in most cases, the cached
* cost is around ~38 cycles. (in the future we might want
* to do an SIMD/3DNOW!/MMX/FPU 64-bit store here, but that
* might have an implicit FPU-save as a cost, so it's not
* clear which path to go.)
*/
extern inline void __set_64bit (unsigned long long * ptr,
unsigned int low, unsigned int high)
{
__asm__ __volatile__ (
"1: movl (%0), %%eax;
movl 4(%0), %%edx;
lock; cmpxchg8b (%0);
jnz 1b"
:: "D"(ptr),
"b"(low),
"c"(high)
:
"ax","dx","memory");
}
extern void inline __set_64bit_constant (unsigned long long *ptr,
unsigned long long value)
{
__set_64bit(ptr,(unsigned int)(value), (unsigned int)((value)>>32ULL));
}
#define ll_low(x) *(((unsigned int*)&(x))+0)
#define ll_high(x) *(((unsigned int*)&(x))+1)
extern void inline __set_64bit_var (unsigned long long *ptr,
unsigned long long value)
{
__set_64bit(ptr,ll_low(value), ll_high(value));
}
#define set_64bit(ptr,value) \
(__builtin_constant_p(value) ? \
__set_64bit_constant(ptr, value) : \
__set_64bit_var(ptr, value) )
#define _set_64bit(ptr,value) \
(__builtin_constant_p(value) ? \
__set_64bit(ptr, (unsigned int)(value), (unsigned int)((value)>>32ULL) ) : \
__set_64bit(ptr, ll_low(value), ll_high(value)) )
/*
* Note: no "lock" prefix even on SMP: xchg always implies lock anyway
* Note 2: xchg has side effect, so that attribute volatile is necessary,
......
#ifndef _PPC_PGALLOC_H
#define _PPC_PGALLOC_H
#include <linux/config.h>
#include <linux/threads.h>
#include <asm/processor.h>
......
......@@ -26,6 +26,7 @@ struct ntfs_sb_info{
int clusterfactor;
int clustersize;
int mft_recordsize;
int mft_recordbits;
int mft_clusters_per_record;
int index_recordsize;
int index_clusters_per_record;
......
......@@ -1323,8 +1323,9 @@ static int sprintf_wireless_stats(char *buffer, struct net_device *dev)
int size;
if(stats != (struct iw_statistics *) NULL)
{
size = sprintf(buffer,
"%6s: %02x %3d%c %3d%c %3d%c %5d %5d %5d\n",
"%6s: %04x %3d%c %3d%c %3d%c %6d %6d %6d\n",
dev->name,
stats->status,
stats->qual.qual,
......@@ -1336,6 +1337,8 @@ static int sprintf_wireless_stats(char *buffer, struct net_device *dev)
stats->discard.nwid,
stats->discard.code,
stats->discard.misc);
stats->qual.updated = 0;
}
else
size = 0;
......@@ -1357,8 +1360,9 @@ static int dev_get_wireless_info(char * buffer, char **start, off_t offset,
struct net_device * dev;
size = sprintf(buffer,
"Inter-|sta| Quality | Discarded packets\n"
" face |tus|link level noise| nwid crypt misc\n");
"Inter-| sta-| Quality | Discarded packets\n"
" face | tus | link level noise | nwid crypt misc\n"
);
pos+=size;
len+=size;
......
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