Commit 8e3ef35e authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/davem/net-2.5

into home.osdl.org:/home/torvalds/v2.5/linux
parents f8012106 6d338bb2
...@@ -1300,7 +1300,6 @@ void __init print_IO_APIC(void) ...@@ -1300,7 +1300,6 @@ void __init print_IO_APIC(void)
reg_03.raw = io_apic_read(apic, 3); reg_03.raw = io_apic_read(apic, 3);
spin_unlock_irqrestore(&ioapic_lock, flags); spin_unlock_irqrestore(&ioapic_lock, flags);
printk("\n");
printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid); printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID);
......
...@@ -82,7 +82,7 @@ void die_if_kernel(char *str, struct pt_regs *fp, int nr) ...@@ -82,7 +82,7 @@ void die_if_kernel(char *str, struct pt_regs *fp, int nr)
printk("Process %s (pid: %d, stackpage=%08lx)\n", printk("Process %s (pid: %d, stackpage=%08lx)\n",
current->comm, current->pid, PAGE_SIZE+(unsigned long)current); current->comm, current->pid, PAGE_SIZE+(unsigned long)current);
show_stack((unsigned long *)fp); show_stack(NULL, (unsigned long *)fp);
do_exit(SIGSEGV); do_exit(SIGSEGV);
} }
...@@ -106,7 +106,7 @@ asmlinkage void buserr_c(struct frame *fp) ...@@ -106,7 +106,7 @@ asmlinkage void buserr_c(struct frame *fp)
int kstack_depth_to_print = 48; int kstack_depth_to_print = 48;
void show_stack(unsigned long *esp) void show_stack(struct task_struct *task, unsigned long *esp)
{ {
unsigned long *stack, *endstack, addr; unsigned long *stack, *endstack, addr;
extern char _start, _etext; extern char _start, _etext;
......
...@@ -96,6 +96,7 @@ _start: ...@@ -96,6 +96,7 @@ _start:
movec %d0, %CACR /* Enable cache */ movec %d0, %CACR /* Enable cache */
#ifdef CONFIG_ROMFS_FS
/* /*
* Move ROM filesystem above bss :-) * Move ROM filesystem above bss :-)
*/ */
...@@ -117,6 +118,12 @@ _copy_romfs: ...@@ -117,6 +118,12 @@ _copy_romfs:
cmp.l %a0, %a2 /* Check if at end */ cmp.l %a0, %a2 /* Check if at end */
bne _copy_romfs bne _copy_romfs
#else /* CONFIG_ROMFS_FS */
lea.l _ebss, %a1
move.l %a1, _ramstart
#endif /* CONFIG_ROMFS_FS */
/* /*
* Zero out the bss region. * Zero out the bss region.
*/ */
......
...@@ -116,6 +116,8 @@ _start: ...@@ -116,6 +116,8 @@ _start:
movec %d0, %CACR /* Enable cache */ movec %d0, %CACR /* Enable cache */
nop nop
#ifdef CONFIG_ROMFS_FS
#ifdef CONFIG_ROMFS_FROM_ROM #ifdef CONFIG_ROMFS_FROM_ROM
/* /*
* check for an in RAM romfs * check for an in RAM romfs
...@@ -160,6 +162,12 @@ _copy_romfs: ...@@ -160,6 +162,12 @@ _copy_romfs:
done_romfs: done_romfs:
#endif #endif
#else /* CONFIG_ROMFS_FS */
lea.l _ebss, %a1
move.l %a1, _ramstart
#endif /* CONFIG_ROMFS_FS */
/* /*
* Zero out the bss region. * Zero out the bss region.
*/ */
......
...@@ -1337,7 +1337,7 @@ static void bh_lru_install(struct buffer_head *bh) ...@@ -1337,7 +1337,7 @@ static void bh_lru_install(struct buffer_head *bh)
check_irqs_on(); check_irqs_on();
bh_lru_lock(); bh_lru_lock();
lru = &per_cpu(bh_lrus, smp_processor_id()); lru = &__get_cpu_var(bh_lrus);
if (lru->bhs[0] != bh) { if (lru->bhs[0] != bh) {
struct buffer_head *bhs[BH_LRU_SIZE]; struct buffer_head *bhs[BH_LRU_SIZE];
int in; int in;
...@@ -1381,7 +1381,7 @@ lookup_bh_lru(struct block_device *bdev, sector_t block, int size) ...@@ -1381,7 +1381,7 @@ lookup_bh_lru(struct block_device *bdev, sector_t block, int size)
check_irqs_on(); check_irqs_on();
bh_lru_lock(); bh_lru_lock();
lru = &per_cpu(bh_lrus, smp_processor_id()); lru = &__get_cpu_var(bh_lrus);
for (i = 0; i < BH_LRU_SIZE; i++) { for (i = 0; i < BH_LRU_SIZE; i++) {
struct buffer_head *bh = lru->bhs[i]; struct buffer_head *bh = lru->bhs[i];
...@@ -1474,15 +1474,14 @@ EXPORT_SYMBOL(__bread); ...@@ -1474,15 +1474,14 @@ EXPORT_SYMBOL(__bread);
*/ */
static void invalidate_bh_lru(void *arg) static void invalidate_bh_lru(void *arg)
{ {
const int cpu = get_cpu(); struct bh_lru *b = &get_cpu_var(bh_lrus);
struct bh_lru *b = &per_cpu(bh_lrus, cpu);
int i; int i;
for (i = 0; i < BH_LRU_SIZE; i++) { for (i = 0; i < BH_LRU_SIZE; i++) {
brelse(b->bhs[i]); brelse(b->bhs[i]);
b->bhs[i] = NULL; b->bhs[i] = NULL;
} }
put_cpu(); put_cpu_var(bh_lrus);
} }
static void invalidate_bh_lrus(void) static void invalidate_bh_lrus(void)
......
...@@ -1562,6 +1562,8 @@ static int loop_status(unsigned int fd, unsigned int cmd, unsigned long arg) ...@@ -1562,6 +1562,8 @@ static int loop_status(unsigned int fd, unsigned int cmd, unsigned long arg)
extern int tty_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg); extern int tty_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg);
#ifdef CONFIG_VT
static int vt_check(struct file *file) static int vt_check(struct file *file)
{ {
struct tty_struct *tty; struct tty_struct *tty;
...@@ -1693,6 +1695,8 @@ static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc3 ...@@ -1693,6 +1695,8 @@ static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc3
return 0; return 0;
} }
#endif /* CONFIG_VT */
static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg) static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg)
{ {
mm_segment_t old_fs = get_fs(); mm_segment_t old_fs = get_fs();
...@@ -2398,11 +2402,13 @@ HANDLE_IOCTL(LOOP_SET_STATUS, loop_status) ...@@ -2398,11 +2402,13 @@ HANDLE_IOCTL(LOOP_SET_STATUS, loop_status)
HANDLE_IOCTL(LOOP_GET_STATUS, loop_status) HANDLE_IOCTL(LOOP_GET_STATUS, loop_status)
#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int) #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout) HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
#ifdef CONFIG_VT
HANDLE_IOCTL(PIO_FONTX, do_fontx_ioctl) HANDLE_IOCTL(PIO_FONTX, do_fontx_ioctl)
HANDLE_IOCTL(GIO_FONTX, do_fontx_ioctl) HANDLE_IOCTL(GIO_FONTX, do_fontx_ioctl)
HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl) HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl)
HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl) HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl)
HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl) HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl)
#endif
HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl) HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl)
HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl) HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl)
HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl) HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl)
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include <linux/sunrpc/svcsock.h> #include <linux/sunrpc/svcsock.h>
#include <linux/lockd/lockd.h> #include <linux/lockd/lockd.h>
#include <linux/nfs.h> #include <linux/nfs.h>
#include <linux/suspend.h>
#define NLMDBG_FACILITY NLMDBG_SVC #define NLMDBG_FACILITY NLMDBG_SVC
#define LOCKD_BUFSIZE (1024 + NLMSVC_XDRSIZE) #define LOCKD_BUFSIZE (1024 + NLMSVC_XDRSIZE)
...@@ -122,8 +121,6 @@ lockd(struct svc_rqst *rqstp) ...@@ -122,8 +121,6 @@ lockd(struct svc_rqst *rqstp)
while ((nlmsvc_users || !signalled()) && nlmsvc_pid == current->pid) { while ((nlmsvc_users || !signalled()) && nlmsvc_pid == current->pid) {
long timeout = MAX_SCHEDULE_TIMEOUT; long timeout = MAX_SCHEDULE_TIMEOUT;
if (current->flags & PF_FREEZE)
refrigerator(PF_IOTHREAD);
if (signalled()) { if (signalled()) {
flush_signals(current); flush_signals(current);
if (nlmsvc_ops) { if (nlmsvc_ops) {
......
...@@ -195,8 +195,7 @@ int expkey_parse(struct cache_detail *cd, char *mesg, int mlen) ...@@ -195,8 +195,7 @@ int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
static int expkey_show(struct seq_file *m, static int expkey_show(struct seq_file *m,
struct cache_detail *cd, struct cache_detail *cd,
struct cache_head *h, struct cache_head *h)
char *pbuf)
{ {
struct svc_expkey *ek ; struct svc_expkey *ek ;
...@@ -437,8 +436,7 @@ static void exp_flags(struct seq_file *m, int flag, int fsid, uid_t anonu, uid_t ...@@ -437,8 +436,7 @@ static void exp_flags(struct seq_file *m, int flag, int fsid, uid_t anonu, uid_t
static int svc_export_show(struct seq_file *m, static int svc_export_show(struct seq_file *m,
struct cache_detail *cd, struct cache_detail *cd,
struct cache_head *h, struct cache_head *h)
char *pbuf)
{ {
struct svc_export *exp ; struct svc_export *exp ;
...@@ -1028,17 +1026,11 @@ static void exp_flags(struct seq_file *m, int flag, int fsid, uid_t anonu, uid_t ...@@ -1028,17 +1026,11 @@ static void exp_flags(struct seq_file *m, int flag, int fsid, uid_t anonu, uid_t
seq_printf(m, "%sanongid=%d", first++?",":"", anong); seq_printf(m, "%sanongid=%d", first++?",":"", anong);
} }
static inline void mangle(struct seq_file *m, const char *s)
{
seq_escape(m, s, " \t\n\\");
}
static int e_show(struct seq_file *m, void *p) static int e_show(struct seq_file *m, void *p)
{ {
struct cache_head *cp = p; struct cache_head *cp = p;
struct svc_export *exp = container_of(cp, struct svc_export, h); struct svc_export *exp = container_of(cp, struct svc_export, h);
svc_client *clp; svc_client *clp;
char *pbuf;
if (p == (void *)1) { if (p == (void *)1) {
seq_puts(m, "# Version 1.1\n"); seq_puts(m, "# Version 1.1\n");
...@@ -1051,17 +1043,7 @@ static int e_show(struct seq_file *m, void *p) ...@@ -1051,17 +1043,7 @@ static int e_show(struct seq_file *m, void *p)
if (cache_check(&svc_export_cache, &exp->h, NULL)) if (cache_check(&svc_export_cache, &exp->h, NULL))
return 0; return 0;
if (cache_put(&exp->h, &svc_export_cache)) BUG(); if (cache_put(&exp->h, &svc_export_cache)) BUG();
pbuf = m->private; return svc_export_show(m, &svc_export_cache, cp);
mangle(m, d_path(exp->ex_dentry, exp->ex_mnt,
pbuf, PAGE_SIZE));
seq_putc(m, '\t');
mangle(m, clp->name);
seq_putc(m, '(');
exp_flags(m, exp->ex_flags, exp->ex_fsid,
exp->ex_anon_uid, exp->ex_anon_gid);
seq_puts(m, ")\n");
return 0;
} }
struct seq_operations nfs_exports_op = { struct seq_operations nfs_exports_op = {
......
...@@ -55,12 +55,6 @@ ...@@ -55,12 +55,6 @@
#define NFSDDBG_FACILITY NFSDDBG_PROC #define NFSDDBG_FACILITY NFSDDBG_PROC
static inline int
nfsd4_close(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_close *close)
{
return nfs_ok;
}
/* Note: The organization of the OPEN code seems a little strange; it /* Note: The organization of the OPEN code seems a little strange; it
* has been superfluously split into three routines, one of which is named * has been superfluously split into three routines, one of which is named
* nfsd4_process_open2() even though there is no nfsd4_process_open1()! * nfsd4_process_open2() even though there is no nfsd4_process_open1()!
...@@ -140,10 +134,6 @@ nfsd4_open(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open ...@@ -140,10 +134,6 @@ nfsd4_open(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open
status = nfsd4_process_open2(rqstp, current_fh, open); status = nfsd4_process_open2(rqstp, current_fh, open);
if (status) if (status)
return status; return status;
/*
* To finish the open response, we just need to set the rflags.
*/
open->op_rflags = 0;
return 0; return 0;
} }
...@@ -356,14 +346,51 @@ nfsd4_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_loo ...@@ -356,14 +346,51 @@ nfsd4_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_loo
static inline int static inline int
nfsd4_read(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_read *read) nfsd4_read(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_read *read)
{ {
struct nfs4_stateid *stp;
int status;
/* no need to check permission - this will be done in nfsd_read() */ /* no need to check permission - this will be done in nfsd_read() */
if (read->rd_offset >= OFFSET_MAX) if (read->rd_offset >= OFFSET_MAX)
return nfserr_inval; return nfserr_inval;
nfsd4_lock_state();
status = nfs_ok;
/* For stateid -1, we don't check share reservations. */
if (ONE_STATEID(&read->rd_stateid)) {
dprintk("NFSD: nfsd4_read: -1 stateid...\n");
goto out;
}
/*
* For stateid 0, the client doesn't have to have the file open, but
* we still check for share reservation conflicts.
*/
if (ZERO_STATEID(&read->rd_stateid)) {
dprintk("NFSD: nfsd4_read: zero stateid...\n");
if ((status = nfs4_share_conflict(current_fh, NFS4_SHARE_DENY_READ))) {
dprintk("NFSD: nfsd4_read: conflicting share reservation!\n");
goto out;
}
status = nfs_ok;
goto out;
}
/* check stateid */
if ((status = nfs4_preprocess_stateid_op(current_fh, &read->rd_stateid,
CHECK_FH, &stp))) {
dprintk("NFSD: nfsd4_read: couldn't process stateid!\n");
goto out;
}
status = nfserr_openmode;
if (!(stp->st_share_access & NFS4_SHARE_ACCESS_READ)) {
dprintk("NFSD: nfsd4_read: file not opened for read!\n");
goto out;
}
status = nfs_ok;
out:
nfsd4_unlock_state();
read->rd_rqstp = rqstp; read->rd_rqstp = rqstp;
read->rd_fhp = current_fh; read->rd_fhp = current_fh;
return nfs_ok; return status;
} }
static inline int static inline int
...@@ -425,28 +452,85 @@ nfsd4_rename(struct svc_rqst *rqstp, struct svc_fh *current_fh, ...@@ -425,28 +452,85 @@ nfsd4_rename(struct svc_rqst *rqstp, struct svc_fh *current_fh,
static inline int static inline int
nfsd4_setattr(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_setattr *setattr) nfsd4_setattr(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_setattr *setattr)
{ {
return nfsd_setattr(rqstp, current_fh, &setattr->sa_iattr, 0, (time_t)0); struct nfs4_stateid *stp;
int status = nfs_ok;
if (setattr->sa_iattr.ia_valid & ATTR_SIZE) {
status = nfserr_bad_stateid;
if (ZERO_STATEID(&setattr->sa_stateid) || ONE_STATEID(&setattr->sa_stateid)) {
dprintk("NFSD: nfsd4_setattr: magic stateid!\n");
return status;
}
nfsd4_lock_state();
if ((status = nfs4_preprocess_stateid_op(current_fh,
&setattr->sa_stateid,
CHECK_FH, &stp))) {
dprintk("NFSD: nfsd4_setattr: couldn't process stateid!\n");
goto out;
}
status = nfserr_openmode;
if (!(stp->st_share_access & NFS4_SHARE_ACCESS_WRITE)) {
dprintk("NFSD: nfsd4_setattr: not opened for write!\n");
goto out;
}
nfsd4_unlock_state();
}
return (nfsd_setattr(rqstp, current_fh, &setattr->sa_iattr, 0, (time_t)0));
out:
nfsd4_unlock_state();
return status;
} }
static inline int static inline int
nfsd4_write(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_write *write) nfsd4_write(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_write *write)
{ {
struct nfs4_stateid *stp;
stateid_t *stateid = &write->wr_stateid;
u32 *p; u32 *p;
int status = nfs_ok;
/* no need to check permission - this will be done in nfsd_write() */ /* no need to check permission - this will be done in nfsd_write() */
if (write->wr_offset >= OFFSET_MAX) if (write->wr_offset >= OFFSET_MAX)
return nfserr_inval; return nfserr_inval;
nfsd4_lock_state();
if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) {
dprintk("NFSD: nfsd4_write: zero stateid...\n");
if ((status = nfs4_share_conflict(current_fh, NFS4_SHARE_DENY_WRITE))) {
dprintk("NFSD: nfsd4_write: conflicting share reservation!\n");
goto out;
}
goto zero_stateid;
}
if ((status = nfs4_preprocess_stateid_op(current_fh, stateid,
CHECK_FH, &stp))) {
dprintk("NFSD: nfsd4_write: couldn't process stateid!\n");
goto out;
}
status = nfserr_openmode;
if (!(stp->st_share_access & NFS4_SHARE_ACCESS_WRITE)) {
dprintk("NFSD: nfsd4_write: file not open for write!\n");
goto out;
}
zero_stateid:
nfsd4_unlock_state();
write->wr_bytes_written = write->wr_buflen; write->wr_bytes_written = write->wr_buflen;
write->wr_how_written = write->wr_stable_how; write->wr_how_written = write->wr_stable_how;
p = (u32 *)write->wr_verifier; p = (u32 *)write->wr_verifier;
*p++ = nfssvc_boot.tv_sec; *p++ = nfssvc_boot.tv_sec;
*p++ = nfssvc_boot.tv_usec; *p++ = nfssvc_boot.tv_usec;
return nfsd_write(rqstp, current_fh, write->wr_offset, return (nfsd_write(rqstp, current_fh, write->wr_offset,
write->wr_vec, write->wr_vlen, write->wr_buflen, write->wr_vec, write->wr_vlen, write->wr_buflen,
&write->wr_how_written); &write->wr_how_written));
out:
nfsd4_unlock_state();
return status;
} }
/* This routine never returns NFS_OK! If there are no other errors, it /* This routine never returns NFS_OK! If there are no other errors, it
...@@ -609,6 +693,12 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, ...@@ -609,6 +693,12 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
case OP_OPEN: case OP_OPEN:
op->status = nfsd4_open(rqstp, &current_fh, &op->u.open); op->status = nfsd4_open(rqstp, &current_fh, &op->u.open);
break; break;
case OP_OPEN_CONFIRM:
op->status = nfsd4_open_confirm(rqstp, &current_fh, &op->u.open_confirm);
break;
case OP_OPEN_DOWNGRADE:
op->status = nfsd4_open_downgrade(rqstp, &current_fh, &op->u.open_downgrade);
break;
case OP_PUTFH: case OP_PUTFH:
op->status = nfsd4_putfh(rqstp, &current_fh, &op->u.putfh); op->status = nfsd4_putfh(rqstp, &current_fh, &op->u.putfh);
break; break;
......
This diff is collapsed.
...@@ -659,6 +659,34 @@ nfsd4_decode_open(struct nfsd4_compoundargs *argp, struct nfsd4_open *open) ...@@ -659,6 +659,34 @@ nfsd4_decode_open(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
DECODE_TAIL; DECODE_TAIL;
} }
static int
nfsd4_decode_open_confirm(struct nfsd4_compoundargs *argp, struct nfsd4_open_confirm *open_conf)
{
DECODE_HEAD;
READ_BUF(4 + sizeof(stateid_t));
READ32(open_conf->oc_req_stateid.si_generation);
COPYMEM(&open_conf->oc_req_stateid.si_opaque, sizeof(stateid_opaque_t));
READ32(open_conf->oc_seqid);
DECODE_TAIL;
}
static int
nfsd4_decode_open_downgrade(struct nfsd4_compoundargs *argp, struct nfsd4_open_downgrade *open_down)
{
DECODE_HEAD;
READ_BUF(4 + sizeof(stateid_t));
READ32(open_down->od_stateid.si_generation);
COPYMEM(&open_down->od_stateid.si_opaque, sizeof(stateid_opaque_t));
READ32(open_down->od_seqid);
READ32(open_down->od_share_access);
READ32(open_down->od_share_deny);
DECODE_TAIL;
}
static int static int
nfsd4_decode_putfh(struct nfsd4_compoundargs *argp, struct nfsd4_putfh *putfh) nfsd4_decode_putfh(struct nfsd4_compoundargs *argp, struct nfsd4_putfh *putfh)
{ {
...@@ -953,6 +981,12 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) ...@@ -953,6 +981,12 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
case OP_OPEN: case OP_OPEN:
op->status = nfsd4_decode_open(argp, &op->u.open); op->status = nfsd4_decode_open(argp, &op->u.open);
break; break;
case OP_OPEN_CONFIRM:
op->status = nfsd4_decode_open_confirm(argp, &op->u.open_confirm);
break;
case OP_OPEN_DOWNGRADE:
op->status = nfsd4_decode_open_downgrade(argp, &op->u.open_downgrade);
break;
case OP_PUTFH: case OP_PUTFH:
op->status = nfsd4_decode_putfh(argp, &op->u.putfh); op->status = nfsd4_decode_putfh(argp, &op->u.putfh);
break; break;
...@@ -1057,6 +1091,21 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) ...@@ -1057,6 +1091,21 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
} while (0) } while (0)
#define ADJUST_ARGS() resp->p = p #define ADJUST_ARGS() resp->p = p
/*
* Routine for encoding the result of a
* "seqid-mutating" NFSv4 operation. This is
* where seqids are incremented
*/
#define ENCODE_SEQID_OP_TAIL(stateowner) \
BUG_ON(!stateowner); \
if (seqid_mutating_err(nfserr) && stateowner) { \
if (stateowner->so_confirmed) \
stateowner->so_seqid++; \
} \
return nfserr;
static u32 nfs4_ftypes[16] = { static u32 nfs4_ftypes[16] = {
NF4BAD, NF4FIFO, NF4CHR, NF4BAD, NF4BAD, NF4FIFO, NF4CHR, NF4BAD,
NF4DIR, NF4BAD, NF4BLK, NF4BAD, NF4DIR, NF4BAD, NF4BLK, NF4BAD,
...@@ -1701,6 +1750,36 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_open ...@@ -1701,6 +1750,36 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_open
} }
} }
static int
nfsd4_encode_open_confirm(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_open_confirm *oc)
{
ENCODE_HEAD;
if (!nfserr) {
RESERVE_SPACE(sizeof(stateid_t));
WRITE32(oc->oc_resp_stateid.si_generation);
WRITEMEM(&oc->oc_resp_stateid.si_opaque, sizeof(stateid_opaque_t));
ADJUST_ARGS();
}
ENCODE_SEQID_OP_TAIL(oc->oc_stateowner);
}
static int
nfsd4_encode_open_downgrade(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_open_downgrade *od)
{
ENCODE_HEAD;
if (!nfserr) {
RESERVE_SPACE(sizeof(stateid_t));
WRITE32(od->od_stateid.si_generation);
WRITEMEM(&od->od_stateid.si_opaque, sizeof(stateid_opaque_t));
ADJUST_ARGS();
}
ENCODE_SEQID_OP_TAIL(od->od_stateowner);
}
static int static int
nfsd4_encode_read(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_read *read) nfsd4_encode_read(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_read *read)
{ {
...@@ -2013,6 +2092,12 @@ nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op) ...@@ -2013,6 +2092,12 @@ nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
case OP_OPEN: case OP_OPEN:
nfsd4_encode_open(resp, op->status, &op->u.open); nfsd4_encode_open(resp, op->status, &op->u.open);
break; break;
case OP_OPEN_CONFIRM:
nfsd4_encode_open_confirm(resp, op->status, &op->u.open_confirm);
break;
case OP_OPEN_DOWNGRADE:
nfsd4_encode_open_downgrade(resp, op->status, &op->u.open_downgrade);
break;
case OP_PUTFH: case OP_PUTFH:
break; break;
case OP_PUTROOTFH: case OP_PUTROOTFH:
......
...@@ -175,32 +175,14 @@ static struct file_operations transaction_ops = { ...@@ -175,32 +175,14 @@ static struct file_operations transaction_ops = {
extern struct seq_operations nfs_exports_op; extern struct seq_operations nfs_exports_op;
static int exports_open(struct inode *inode, struct file *file) static int exports_open(struct inode *inode, struct file *file)
{ {
int res; return seq_open(file, &nfs_exports_op);
char *namebuf = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (namebuf == NULL)
return -ENOMEM;
res = seq_open(file, &nfs_exports_op);
if (res)
kfree(namebuf);
else
((struct seq_file *)file->private_data)->private = namebuf;
return res;
}
static int exports_release(struct inode *inode, struct file *file)
{
struct seq_file *m = (struct seq_file *)file->private_data;
kfree(m->private);
m->private = NULL;
return seq_release(inode, file);
} }
static struct file_operations exports_operations = { static struct file_operations exports_operations = {
.open = exports_open, .open = exports_open,
.read = seq_read, .read = seq_read,
.llseek = seq_lseek, .llseek = seq_lseek,
.release = exports_release, .release = seq_release,
}; };
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
......
...@@ -100,7 +100,18 @@ ...@@ -100,7 +100,18 @@
NFSERR_RECLAIM_CONFLICT = 10035,/* v4 */ NFSERR_RECLAIM_CONFLICT = 10035,/* v4 */
NFSERR_BAD_XDR = 10036, /* v4 */ NFSERR_BAD_XDR = 10036, /* v4 */
NFSERR_LOCKS_HELD = 10037, /* v4 */ NFSERR_LOCKS_HELD = 10037, /* v4 */
NFSERR_REPLAY_ME = 10038 /* v4 */ NFSERR_OPENMODE = 10038, /* v4 */
NFSERR_BADOWNER = 10039, /* v4 */
NFSERR_BADCHAR = 10040, /* v4 */
NFSERR_BADNAME = 10041, /* v4 */
NFSERR_BAD_RANGE = 10042, /* v4 */
NFSERR_LOCK_NOTSUPP = 10043, /* v4 */
NFSERR_OP_ILLEGAL = 10044, /* v4 */
NFSERR_DEADLOCK = 10045, /* v4 */
NFSERR_FILE_OPEN = 10046, /* v4 */
NFSERR_ADMIN_REVOKED = 10047, /* v4 */
NFSERR_CB_PATH_DOWN = 10048, /* v4 */
NFSERR_REPLAY_ME = 10049 /* v4 */
}; };
/* NFSv2 file types - beware, these are not the same in NFSv3 */ /* NFSv2 file types - beware, these are not the same in NFSv3 */
......
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
#define NFS4_SHARE_ACCESS_READ 0x0001 #define NFS4_SHARE_ACCESS_READ 0x0001
#define NFS4_SHARE_ACCESS_WRITE 0x0002 #define NFS4_SHARE_ACCESS_WRITE 0x0002
#define NFS4_SHARE_ACCESS_BOTH 0x0003 #define NFS4_SHARE_ACCESS_BOTH 0x0003
#define NFS4_SHARE_DENY_READ 0x0001
#define NFS4_SHARE_DENY_WRITE 0x0002
#define NFS4_SET_TO_SERVER_TIME 0 #define NFS4_SET_TO_SERVER_TIME 0
#define NFS4_SET_TO_CLIENT_TIME 1 #define NFS4_SET_TO_CLIENT_TIME 1
......
...@@ -189,6 +189,7 @@ void nfsd_lockd_shutdown(void); ...@@ -189,6 +189,7 @@ void nfsd_lockd_shutdown(void);
#define nfserr_not_same __constant_htonl(NFSERR_NOT_SAME) #define nfserr_not_same __constant_htonl(NFSERR_NOT_SAME)
#define nfserr_readdir_nospc __constant_htonl(NFSERR_READDIR_NOSPC) #define nfserr_readdir_nospc __constant_htonl(NFSERR_READDIR_NOSPC)
#define nfserr_bad_xdr __constant_htonl(NFSERR_BAD_XDR) #define nfserr_bad_xdr __constant_htonl(NFSERR_BAD_XDR)
#define nfserr_openmode __constant_htonl(NFSERR_OPENMODE)
/* error codes for internal use */ /* error codes for internal use */
/* if a request fails due to kmalloc failure, it gets dropped. /* if a request fails due to kmalloc failure, it gets dropped.
......
...@@ -59,6 +59,12 @@ typedef struct { ...@@ -59,6 +59,12 @@ typedef struct {
#define si_stateownerid si_opaque.so_stateownerid #define si_stateownerid si_opaque.so_stateownerid
#define si_fileid si_opaque.so_fileid #define si_fileid si_opaque.so_fileid
extern stateid_t zerostateid;
extern stateid_t onestateid;
#define ZERO_STATEID(stateid) (!memcmp((stateid), &zerostateid, sizeof(stateid_t)))
#define ONE_STATEID(stateid) (!memcmp((stateid), &onestateid, sizeof(stateid_t)))
/* /*
* struct nfs4_client - one per client. Clientids live here. * struct nfs4_client - one per client. Clientids live here.
* o Each nfs4_client is hashed by clientid. * o Each nfs4_client is hashed by clientid.
...@@ -83,16 +89,12 @@ struct nfs4_client { ...@@ -83,16 +89,12 @@ struct nfs4_client {
nfs4_verifier cl_confirm; /* generated by server */ nfs4_verifier cl_confirm; /* generated by server */
}; };
extern time_t nfs4_laundromat(void);
int nfsd4_renew(clientid_t *clid);
static inline void static inline void
update_stateid(stateid_t *stateid) update_stateid(stateid_t *stateid)
{ {
stateid->si_generation++; stateid->si_generation++;
} }
/* /*
* nfs4_stateowner can either be an open_owner, or (eventually) a lock_owner * nfs4_stateowner can either be an open_owner, or (eventually) a lock_owner
* *
...@@ -100,6 +102,7 @@ stateid->si_generation++; ...@@ -100,6 +102,7 @@ stateid->si_generation++;
* reverences when we release a stateowner. * reverences when we release a stateowner.
*/ */
struct nfs4_stateowner { struct nfs4_stateowner {
struct list_head so_idhash; /* hash by so_id */
struct list_head so_strhash; /* hash by op_name */ struct list_head so_strhash; /* hash by op_name */
struct list_head so_perclient; /* nfs4_client->cl_perclient */ struct list_head so_perclient; /* nfs4_client->cl_perclient */
struct list_head so_peropenstate; /* list: nfs4_stateid */ struct list_head so_peropenstate; /* list: nfs4_stateid */
...@@ -136,6 +139,7 @@ struct nfs4_file { ...@@ -136,6 +139,7 @@ struct nfs4_file {
*/ */
struct nfs4_stateid { struct nfs4_stateid {
struct list_head st_hash; /* openstateid_hashtbl[]*/
struct list_head st_perfile; /* file_hashtbl[]*/ struct list_head st_perfile; /* file_hashtbl[]*/
struct list_head st_peropenstate; /* nfs4_stateowner->so_peropenstate */ struct list_head st_peropenstate; /* nfs4_stateowner->so_peropenstate */
struct nfs4_stateowner * st_stateowner; struct nfs4_stateowner * st_stateowner;
...@@ -147,4 +151,22 @@ struct nfs4_stateid { ...@@ -147,4 +151,22 @@ struct nfs4_stateid {
unsigned int st_share_deny; unsigned int st_share_deny;
}; };
/* flags for preprocess_seqid_op() */
#define CHECK_FH 0x00000001
#define CONFIRM 0x00000002
#define seqid_mutating_err(err) \
(((err) != nfserr_stale_clientid) && \
((err) != nfserr_bad_seqid) && \
((err) != nfserr_stale_stateid) && \
((err) != nfserr_bad_stateid))
extern time_t nfs4_laundromat(void);
extern int nfsd4_renew(clientid_t *clid);
extern int nfs4_preprocess_stateid_op(struct svc_fh *current_fh,
stateid_t *stateid, int flags, struct nfs4_stateid **stpp);
extern int nfs4_share_conflict(struct svc_fh *current_fh,
unsigned int deny_type);
extern void nfsd4_lock_state(void);
extern void nfsd4_unlock_state(void);
#endif /* NFSD4_STATE_H */ #endif /* NFSD4_STATE_H */
...@@ -68,6 +68,7 @@ struct nfsd4_access { ...@@ -68,6 +68,7 @@ struct nfsd4_access {
struct nfsd4_close { struct nfsd4_close {
u32 cl_seqid; /* request */ u32 cl_seqid; /* request */
stateid_t cl_stateid; /* request+response */ stateid_t cl_stateid; /* request+response */
struct nfs4_stateowner * cl_stateowner; /* response */
}; };
struct nfsd4_commit { struct nfsd4_commit {
...@@ -147,6 +148,22 @@ struct nfsd4_open { ...@@ -147,6 +148,22 @@ struct nfsd4_open {
#define op_iattr u.iattr #define op_iattr u.iattr
#define op_verf u.verf #define op_verf u.verf
struct nfsd4_open_confirm {
stateid_t oc_req_stateid /* request */;
u32 oc_seqid /* request */;
stateid_t oc_resp_stateid /* response */;
struct nfs4_stateowner * oc_stateowner; /* response */
};
struct nfsd4_open_downgrade {
stateid_t od_stateid;
u32 od_seqid;
u32 od_share_access;
u32 od_share_deny;
struct nfs4_stateowner *od_stateowner;
};
struct nfsd4_read { struct nfsd4_read {
stateid_t rd_stateid; /* request */ stateid_t rd_stateid; /* request */
u64 rd_offset; /* request */ u64 rd_offset; /* request */
...@@ -252,6 +269,8 @@ struct nfsd4_op { ...@@ -252,6 +269,8 @@ struct nfsd4_op {
struct nfsd4_lookup lookup; struct nfsd4_lookup lookup;
struct nfsd4_verify nverify; struct nfsd4_verify nverify;
struct nfsd4_open open; struct nfsd4_open open;
struct nfsd4_open_confirm open_confirm;
struct nfsd4_open_downgrade open_downgrade;
struct nfsd4_putfh putfh; struct nfsd4_putfh putfh;
struct nfsd4_read read; struct nfsd4_read read;
struct nfsd4_readdir readdir; struct nfsd4_readdir readdir;
...@@ -315,16 +334,27 @@ set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp) ...@@ -315,16 +334,27 @@ set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp)
} }
int nfs4svc_encode_voidres(struct svc_rqst *, u32 *, void *); int nfs4svc_encode_voidres(struct svc_rqst *, u32 *, void *);
int nfs4svc_decode_compoundargs(struct svc_rqst *, u32 *, struct nfsd4_compoundargs *); int nfs4svc_decode_compoundargs(struct svc_rqst *, u32 *,
int nfs4svc_encode_compoundres(struct svc_rqst *, u32 *, struct nfsd4_compoundres *); struct nfsd4_compoundargs *);
int nfs4svc_encode_compoundres(struct svc_rqst *, u32 *,
struct nfsd4_compoundres *);
void nfsd4_encode_operation(struct nfsd4_compoundres *, struct nfsd4_op *); void nfsd4_encode_operation(struct nfsd4_compoundres *, struct nfsd4_op *);
int nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, int nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
struct dentry *dentry, u32 *buffer, int *countp, u32 *bmval); struct dentry *dentry, u32 *buffer, int *countp,
extern int nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_setclientid *setclid); u32 *bmval);
extern int nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confirm *setclientid_confirm); extern int nfsd4_setclientid(struct svc_rqst *rqstp,
struct nfsd4_setclientid *setclid);
extern int nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
struct nfsd4_setclientid_confirm *setclientid_confirm);
extern int nfsd4_process_open1(struct nfsd4_open *open); extern int nfsd4_process_open1(struct nfsd4_open *open);
extern int nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open); extern int nfsd4_process_open2(struct svc_rqst *rqstp,
struct svc_fh *current_fh, struct nfsd4_open *open);
extern int nfsd4_open_confirm(struct svc_rqst *rqstp,
struct svc_fh *current_fh, struct nfsd4_open_confirm *oc);
extern int nfsd4_close(struct svc_rqst *rqstp, struct svc_fh *current_fh,
struct nfsd4_close *close);
extern int nfsd4_open_downgrade(struct svc_rqst *rqstp,
struct svc_fh *current_fh, struct nfsd4_open_downgrade *od);
#endif #endif
/* /*
......
...@@ -80,8 +80,7 @@ struct cache_detail { ...@@ -80,8 +80,7 @@ struct cache_detail {
int (*cache_show)(struct seq_file *m, int (*cache_show)(struct seq_file *m,
struct cache_detail *cd, struct cache_detail *cd,
struct cache_head *h, struct cache_head *h);
char *pbuf);
/* fields below this comment are for internal use /* fields below this comment are for internal use
* and should not be touched by cache owners * and should not be touched by cache owners
......
...@@ -41,7 +41,7 @@ static void __unhash_process(struct task_struct *p) ...@@ -41,7 +41,7 @@ static void __unhash_process(struct task_struct *p)
detach_pid(p, PIDTYPE_PGID); detach_pid(p, PIDTYPE_PGID);
detach_pid(p, PIDTYPE_SID); detach_pid(p, PIDTYPE_SID);
if (p->pid) if (p->pid)
per_cpu(process_counts, smp_processor_id())--; __get_cpu_var(process_counts)--;
} }
REMOVE_LINKS(p); REMOVE_LINKS(p);
......
...@@ -1006,7 +1006,7 @@ struct task_struct *copy_process(unsigned long clone_flags, ...@@ -1006,7 +1006,7 @@ struct task_struct *copy_process(unsigned long clone_flags,
attach_pid(p, PIDTYPE_PGID, p->pgrp); attach_pid(p, PIDTYPE_PGID, p->pgrp);
attach_pid(p, PIDTYPE_SID, p->session); attach_pid(p, PIDTYPE_SID, p->session);
if (p->pid) if (p->pid)
per_cpu(process_counts, smp_processor_id())++; __get_cpu_var(process_counts)++;
} else } else
link_pid(p, p->pids + PIDTYPE_TGID, &p->group_leader->pids[PIDTYPE_TGID].pid); link_pid(p, p->pids + PIDTYPE_TGID, &p->group_leader->pids[PIDTYPE_TGID].pid);
......
...@@ -156,8 +156,7 @@ static void internal_add_timer(tvec_base_t *base, struct timer_list *timer) ...@@ -156,8 +156,7 @@ static void internal_add_timer(tvec_base_t *base, struct timer_list *timer)
*/ */
void add_timer(struct timer_list *timer) void add_timer(struct timer_list *timer)
{ {
int cpu = get_cpu(); tvec_base_t *base = &get_cpu_var(tvec_bases);
tvec_base_t *base = &per_cpu(tvec_bases, cpu);
unsigned long flags; unsigned long flags;
BUG_ON(timer_pending(timer) || !timer->function); BUG_ON(timer_pending(timer) || !timer->function);
...@@ -168,7 +167,7 @@ void add_timer(struct timer_list *timer) ...@@ -168,7 +167,7 @@ void add_timer(struct timer_list *timer)
internal_add_timer(base, timer); internal_add_timer(base, timer);
timer->base = base; timer->base = base;
spin_unlock_irqrestore(&base->lock, flags); spin_unlock_irqrestore(&base->lock, flags);
put_cpu(); put_cpu_var(tvec_bases);
} }
/*** /***
...@@ -231,7 +230,7 @@ int mod_timer(struct timer_list *timer, unsigned long expires) ...@@ -231,7 +230,7 @@ int mod_timer(struct timer_list *timer, unsigned long expires)
return 1; return 1;
spin_lock_irqsave(&timer->lock, flags); spin_lock_irqsave(&timer->lock, flags);
new_base = &per_cpu(tvec_bases, smp_processor_id()); new_base = &__get_cpu_var(tvec_bases);
repeat: repeat:
old_base = timer->base; old_base = timer->base;
...@@ -789,7 +788,7 @@ seqlock_t xtime_lock __cacheline_aligned_in_smp = SEQLOCK_UNLOCKED; ...@@ -789,7 +788,7 @@ seqlock_t xtime_lock __cacheline_aligned_in_smp = SEQLOCK_UNLOCKED;
*/ */
static void run_timer_softirq(struct softirq_action *h) static void run_timer_softirq(struct softirq_action *h)
{ {
tvec_base_t *base = &per_cpu(tvec_bases, smp_processor_id()); tvec_base_t *base = &__get_cpu_var(tvec_bases);
if (time_after_eq(jiffies, base->timer_jiffies)) if (time_after_eq(jiffies, base->timer_jiffies))
__run_timers(base); __run_timers(base);
......
...@@ -213,21 +213,19 @@ void balance_dirty_pages(struct address_space *mapping) ...@@ -213,21 +213,19 @@ void balance_dirty_pages(struct address_space *mapping)
void balance_dirty_pages_ratelimited(struct address_space *mapping) void balance_dirty_pages_ratelimited(struct address_space *mapping)
{ {
static DEFINE_PER_CPU(int, ratelimits) = 0; static DEFINE_PER_CPU(int, ratelimits) = 0;
int cpu;
long ratelimit; long ratelimit;
ratelimit = ratelimit_pages; ratelimit = ratelimit_pages;
if (dirty_exceeded) if (dirty_exceeded)
ratelimit = 8; ratelimit = 8;
cpu = get_cpu(); if (get_cpu_var(ratelimits)++ >= ratelimit) {
if (per_cpu(ratelimits, cpu)++ >= ratelimit) { __get_cpu_var(ratelimits) = 0;
per_cpu(ratelimits, cpu) = 0; put_cpu_var(ratelimits);
put_cpu();
balance_dirty_pages(mapping); balance_dirty_pages(mapping);
return; return;
} }
put_cpu(); put_cpu_var(ratelimits);
} }
/* /*
......
...@@ -477,16 +477,15 @@ DEFINE_PER_CPU(struct pte_chain *, local_pte_chain) = 0; ...@@ -477,16 +477,15 @@ DEFINE_PER_CPU(struct pte_chain *, local_pte_chain) = 0;
*/ */
void __pte_chain_free(struct pte_chain *pte_chain) void __pte_chain_free(struct pte_chain *pte_chain)
{ {
int cpu = get_cpu();
struct pte_chain **pte_chainp; struct pte_chain **pte_chainp;
pte_chainp = &get_cpu_var(local_pte_chain);
if (pte_chain->next_and_idx) if (pte_chain->next_and_idx)
pte_chain->next_and_idx = 0; pte_chain->next_and_idx = 0;
pte_chainp = &per_cpu(local_pte_chain, cpu);
if (*pte_chainp) if (*pte_chainp)
kmem_cache_free(pte_chain_cache, *pte_chainp); kmem_cache_free(pte_chain_cache, *pte_chainp);
*pte_chainp = pte_chain; *pte_chainp = pte_chain;
put_cpu(); put_cpu_var(local_pte_chain);
} }
/* /*
...@@ -501,21 +500,19 @@ void __pte_chain_free(struct pte_chain *pte_chain) ...@@ -501,21 +500,19 @@ void __pte_chain_free(struct pte_chain *pte_chain)
*/ */
struct pte_chain *pte_chain_alloc(int gfp_flags) struct pte_chain *pte_chain_alloc(int gfp_flags)
{ {
int cpu;
struct pte_chain *ret; struct pte_chain *ret;
struct pte_chain **pte_chainp; struct pte_chain **pte_chainp;
if (gfp_flags & __GFP_WAIT) if (gfp_flags & __GFP_WAIT)
might_sleep(); might_sleep();
cpu = get_cpu(); pte_chainp = &get_cpu_var(local_pte_chain);
pte_chainp = &per_cpu(local_pte_chain, cpu);
if (*pte_chainp) { if (*pte_chainp) {
ret = *pte_chainp; ret = *pte_chainp;
*pte_chainp = NULL; *pte_chainp = NULL;
put_cpu(); put_cpu_var(local_pte_chain);
} else { } else {
put_cpu(); put_cpu_var(local_pte_chain);
ret = kmem_cache_alloc(pte_chain_cache, gfp_flags); ret = kmem_cache_alloc(pte_chain_cache, gfp_flags);
} }
return ret; return ret;
......
...@@ -112,35 +112,34 @@ static DEFINE_PER_CPU(struct pagevec, lru_add_active_pvecs) = { 0, }; ...@@ -112,35 +112,34 @@ static DEFINE_PER_CPU(struct pagevec, lru_add_active_pvecs) = { 0, };
void lru_cache_add(struct page *page) void lru_cache_add(struct page *page)
{ {
struct pagevec *pvec = &per_cpu(lru_add_pvecs, get_cpu()); struct pagevec *pvec = &get_cpu_var(lru_add_pvecs);
page_cache_get(page); page_cache_get(page);
if (!pagevec_add(pvec, page)) if (!pagevec_add(pvec, page))
__pagevec_lru_add(pvec); __pagevec_lru_add(pvec);
put_cpu(); put_cpu_var(lru_add_pvecs);
} }
void lru_cache_add_active(struct page *page) void lru_cache_add_active(struct page *page)
{ {
struct pagevec *pvec = &per_cpu(lru_add_active_pvecs, get_cpu()); struct pagevec *pvec = &get_cpu_var(lru_add_active_pvecs);
page_cache_get(page); page_cache_get(page);
if (!pagevec_add(pvec, page)) if (!pagevec_add(pvec, page))
__pagevec_lru_add_active(pvec); __pagevec_lru_add_active(pvec);
put_cpu(); put_cpu_var(lru_add_active_pvecs);
} }
void lru_add_drain(void) void lru_add_drain(void)
{ {
int cpu = get_cpu(); struct pagevec *pvec = &get_cpu_var(lru_add_pvecs);
struct pagevec *pvec = &per_cpu(lru_add_pvecs, cpu);
if (pagevec_count(pvec)) if (pagevec_count(pvec))
__pagevec_lru_add(pvec); __pagevec_lru_add(pvec);
pvec = &per_cpu(lru_add_active_pvecs, cpu); pvec = &__get_cpu_var(lru_add_active_pvecs);
if (pagevec_count(pvec)) if (pagevec_count(pvec))
__pagevec_lru_add_active(pvec); __pagevec_lru_add_active(pvec);
put_cpu(); put_cpu_var(lru_add_pvecs);
} }
/* /*
......
...@@ -228,7 +228,7 @@ static struct icmp_control icmp_pointers[NR_ICMP_TYPES+1]; ...@@ -228,7 +228,7 @@ static struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];
* On SMP we have one ICMP socket per-cpu. * On SMP we have one ICMP socket per-cpu.
*/ */
static DEFINE_PER_CPU(struct socket *, __icmp_socket) = NULL; static DEFINE_PER_CPU(struct socket *, __icmp_socket) = NULL;
#define icmp_socket per_cpu(__icmp_socket, smp_processor_id()) #define icmp_socket __get_cpu_var(__icmp_socket)
static __inline__ void icmp_xmit_lock(void) static __inline__ void icmp_xmit_lock(void)
{ {
......
...@@ -1018,7 +1018,6 @@ int qword_get(char **bpp, char *dest, int bufsize) ...@@ -1018,7 +1018,6 @@ int qword_get(char **bpp, char *dest, int bufsize)
struct handle { struct handle {
struct cache_detail *cd; struct cache_detail *cd;
char *pbuf;
}; };
static void *c_start(struct seq_file *m, loff_t *pos) static void *c_start(struct seq_file *m, loff_t *pos)
...@@ -1087,10 +1086,9 @@ static int c_show(struct seq_file *m, void *p) ...@@ -1087,10 +1086,9 @@ static int c_show(struct seq_file *m, void *p)
{ {
struct cache_head *cp = p; struct cache_head *cp = p;
struct cache_detail *cd = ((struct handle*)m->private)->cd; struct cache_detail *cd = ((struct handle*)m->private)->cd;
char *pbuf = ((struct handle*)m->private)->pbuf;
if (p == (void *)1) if (p == (void *)1)
return cd->cache_show(m, cd, NULL, pbuf); return cd->cache_show(m, cd, NULL);
ifdebug(CACHE) ifdebug(CACHE)
seq_printf(m, "# expiry=%ld refcnt=%d\n", seq_printf(m, "# expiry=%ld refcnt=%d\n",
...@@ -1102,7 +1100,7 @@ static int c_show(struct seq_file *m, void *p) ...@@ -1102,7 +1100,7 @@ static int c_show(struct seq_file *m, void *p)
else else
cache_put(cp, cd); cache_put(cp, cd);
return cd->cache_show(m, cd, cp, pbuf); return cd->cache_show(m, cd, cp);
} }
struct seq_operations cache_content_op = { struct seq_operations cache_content_op = {
...@@ -1115,26 +1113,19 @@ struct seq_operations cache_content_op = { ...@@ -1115,26 +1113,19 @@ struct seq_operations cache_content_op = {
static int content_open(struct inode *inode, struct file *file) static int content_open(struct inode *inode, struct file *file)
{ {
int res; int res;
char *namebuf = kmalloc(PAGE_SIZE, GFP_KERNEL);
struct handle *han; struct handle *han;
struct cache_detail *cd = PDE(inode)->data; struct cache_detail *cd = PDE(inode)->data;
if (namebuf == NULL)
return -ENOMEM;
han = kmalloc(sizeof(*han), GFP_KERNEL); han = kmalloc(sizeof(*han), GFP_KERNEL);
if (han == NULL) { if (han == NULL)
kfree(namebuf);
return -ENOMEM; return -ENOMEM;
}
han->pbuf = namebuf;
han->cd = cd; han->cd = cd;
res = seq_open(file, &cache_content_op); res = seq_open(file, &cache_content_op);
if (res) { if (res)
kfree(namebuf);
kfree(han); kfree(han);
} else else
((struct seq_file *)file->private_data)->private = han; ((struct seq_file *)file->private_data)->private = han;
return res; return res;
...@@ -1143,7 +1134,6 @@ static int content_release(struct inode *inode, struct file *file) ...@@ -1143,7 +1134,6 @@ static int content_release(struct inode *inode, struct file *file)
{ {
struct seq_file *m = (struct seq_file *)file->private_data; struct seq_file *m = (struct seq_file *)file->private_data;
struct handle *han = m->private; struct handle *han = m->private;
kfree(han->pbuf);
kfree(han); kfree(han);
m->private = NULL; m->private = NULL;
return seq_release(inode, file); return seq_release(inode, file);
......
...@@ -215,8 +215,7 @@ static int ip_map_parse(struct cache_detail *cd, ...@@ -215,8 +215,7 @@ static int ip_map_parse(struct cache_detail *cd,
static int ip_map_show(struct seq_file *m, static int ip_map_show(struct seq_file *m,
struct cache_detail *cd, struct cache_detail *cd,
struct cache_head *h, struct cache_head *h)
char *pbuf)
{ {
struct ip_map *im; struct ip_map *im;
struct in_addr addr; struct in_addr addr;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/suspend.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/checksum.h> #include <net/checksum.h>
#include <net/ip.h> #include <net/ip.h>
...@@ -1190,6 +1191,9 @@ svc_recv(struct svc_serv *serv, struct svc_rqst *rqstp, long timeout) ...@@ -1190,6 +1191,9 @@ svc_recv(struct svc_serv *serv, struct svc_rqst *rqstp, long timeout)
schedule_timeout(timeout); schedule_timeout(timeout);
if (current->flags & PF_FREEZE)
refrigerator(PF_IOTHREAD);
spin_lock_bh(&serv->sv_lock); spin_lock_bh(&serv->sv_lock);
remove_wait_queue(&rqstp->rq_wait, &wait); remove_wait_queue(&rqstp->rq_wait, &wait);
......
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