Please pull git390 'for-linus' branch
Subsystems (5)
Please pull from 'for-linus' branch of
git://git390.osdl.marist.edu/pub/scm/linux-2.6.git for-linus
to receive the following updates:
arch/s390/hypfs/inode.c | 33 ++++-- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/diag.c | 102 ++++++++++++++++ arch/s390/kernel/dis.c | 2 +- arch/s390/kernel/kprobes.c | 2 +- arch/s390/kernel/s390_ksyms.c | 1 - arch/s390/mm/cmm.c | 1 + arch/s390/mm/init.c | 17 --- drivers/s390/block/dasd_diag.c | 1 + drivers/s390/char/raw3270.c | 1 + drivers/s390/char/vmur.c | 250 ++++++++++++++++++++++++++-------------- drivers/s390/char/vmur.h | 1 + drivers/s390/cio/cmf.c | 10 +- drivers/s390/cio/device.c | 5 +- drivers/s390/cio/device_id.c | 48 +-------- drivers/s390/cio/qdio.c | 5 +- include/asm-s390/atomic.h | 26 ++++- include/asm-s390/cio.h | 15 --- include/asm-s390/diag.h | 39 ++++++ include/asm-s390/pgalloc.h | 2 - 20 files changed, 371 insertions(+), 192 deletions(-) create mode 100644 arch/s390/kernel/diag.c create mode 100644 include/asm-s390/diag.h
Christian Borntraeger (1):
[S390] disassembler: fix b2 opcodes like srst, bsg, and others
Cornelia Huck (2):
[S390] cio: dont forget to set last slot to NULL in ccw_uevent(). [S390] cio: change confusing message in cmf.
David Wilder (1):
[S390] kprobes: fix instruction length calculation
Heiko Carstens (1):
[S390] Change atomic_read/set to inline functions with barrier semantics.
Klaus D. Wacker (2):
[S390] qdio: fix EQBS handling on CCQ96
[S390] qdio: Refresh buffer states for IQDIO Asynchronous output queue
Michael Holzheu (3):
[S390] vmur: fix diag14 exceptions with addresses > 2GB. [S390] vmur: fix reference counting for vmur device structure [S390] hypfs: inode corruption due to missing locking
arch/s390/hypfs/inode.c +25 -8
@@ -60,17 +60,28 @@ static void hypfs_add_dentry(struct dentry *dentry) hypfs_last_dentry = dentry; } +static inline int hypfs_positive (struct dentry *dentry) +{ +return dentry->d_inode && !d_unhashed (dentry); +} +static void hypfs_remove (struct dentry *dentry) {struct dentry *parent; parent = dentry->d_parent; -if (S_ISDIR (dentry->d_inode->i_mode)) -simple_rmdir (parent->d_inode, dentry); -else -simple_unlink (parent->d_inode, dentry); +if (!parent || !parent->d_inode) +return ; +mutex_lock (&parent->d_inode->i_mutex); +if (hypfs_positive (dentry)) { +if (S_ISDIR (dentry->d_inode->i_mode)) +simple_rmdir (parent->d_inode, dentry); +else +simple_unlink (parent->d_inode, dentry); + }d_delete (dentry);dput (dentry); +mutex_unlock (&parent->d_inode->i_mutex); }static void hypfs_delete_tree (struct dentry *root)
@@ -315,6 +326,7 @@ static int hypfs_fill_super(struct super_block *sb, void *data, int silent) }hypfs_update_update (sb); sb->s_root = root_dentry; +printk (KERN_INFO "hypfs: Hypervisor filesystem mounted\n" );return 0 ; err_tree:
@@ -356,13 +368,17 @@ static struct dentry *hypfs_create_file(struct super_block *sb, qname.name = name; qname.len =strlen (name); qname.hash =full_name_hash (name, qname.len); +mutex_lock (&parent->d_inode->i_mutex); dentry =lookup_one_len (name, parent,strlen (name)); -if (IS_ERR (dentry)) -return ERR_PTR (-ENOMEM ); +if (IS_ERR (dentry)) { + dentry =ERR_PTR (-ENOMEM ); + goto fail; + } inode =hypfs_make_inode (sb, mode);if (!inode) {dput (dentry); -return ERR_PTR (-ENOMEM ); + dentry =ERR_PTR (-ENOMEM ); + goto fail; }if (mode &S_IFREG ) { inode->i_fop = &hypfs_file_ops;
@@ -379,6 +395,8 @@ static struct dentry *hypfs_create_file(struct super_block *sb, inode->i_private = data;d_instantiate (dentry, inode);dget (dentry); +fail: +mutex_unlock (&parent->d_inode->i_mutex);return dentry; }
@@ -391,7 +409,6 @@ struct dentry *hypfs_mkdir(struct super_block *sb, struct dentry *parent,if (IS_ERR (dentry))return dentry;hypfs_add_dentry (dentry); - parent->d_inode->i_nlink++;return dentry; }
arch/s390/kernel/Makefile +1 -1
@@ -6,7 +6,7 @@ EXTRA_AFLAGS := -traditional obj-y := bitmap.o traps.o time.o process.o base.o early.o \ setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ - semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o + semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o diag.o obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o)
arch/s390/kernel/diag.c new file +102 -0
102 lines not on this page · raw message
arch/s390/kernel/dis.c +1 -1
@@ -577,7 +577,7 @@ static struct insn opcode_b2[] = { { "esta", 0x4a, INSTR_RRE_RR }, { "lura", 0x4b, INSTR_RRE_RR }, { "tar", 0x4c, INSTR_RRE_AR }, - { "cpya", INSTR_RRE_AA }, + { "cpya", 0x4d, INSTR_RRE_AA }, { "sar", 0x4e, INSTR_RRE_AR }, { "ear", 0x4f, INSTR_RRE_RA }, { "csp", 0x50, INSTR_RRE_RR },
arch/s390/kernel/kprobes.c +1 -1
@@ -85,7 +85,7 @@ void __kprobes get_instruction_type(struct arch_specific_insn *ainsn) ainsn->reg = (*ainsn->insn &0xf0 ) >>4 ;/* save the instruction length (pop 5-5) in bytes */ -switch (*(__u8 *) (ainsn->insn) >>4 ) { +switch (*(__u8 *) (ainsn->insn) >>6 ) {case 0 : ainsn->ilen =2 ;break ;
arch/s390/kernel/s390_ksyms.c +0 -1
@@ -25,7 +25,6 @@ EXPORT_SYMBOL(_oi_bitmap);EXPORT_SYMBOL (_ni_bitmap);EXPORT_SYMBOL (_zb_findmap);EXPORT_SYMBOL (_sb_findmap); -EXPORT_SYMBOL (diag10);/* * semaphore ops
arch/s390/mm/cmm.c +1 -0
@@ -20,6 +20,7 @@#include <asm/pgalloc.h> #include <asm/uaccess.h> +#include <asm/diag.h> static char *sender ="VMRMSVM" ;module_param (sender, charp,0400 );
arch/s390/mm/init.c +0 -17
@@ -42,23 +42,6 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__((__aligned__(PAGE_SIZE))); char empty_zero_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE))); -void diag10 (unsigned long addr) -{ -if (addr >=0x7ff00000 ) -return ; - asmvolatile ( -#ifdef CONFIG_64BIT - " sam31\n" - " diag %0,%0,0x10\n" - "0: sam64\n" -#else - " diag %0,%0,0x10\n" - "0:\n" -#endif - EX_TABLE(0b,0b) - : : "a" (addr)); -} -void show_mem (void ) {int i, total =0 , reserved =0 ;
drivers/s390/block/dasd_diag.c +1 -0
@@ -24,6 +24,7 @@#include <asm/s390_ext.h> #include <asm/todclk.h> #include <asm/vtoc.h> +#include <asm/diag.h> #include "dasd_int.h" #include "dasd_diag.h"
drivers/s390/char/raw3270.c +1 -0
@@ -21,6 +21,7 @@#include <asm/ccwdev.h> #include <asm/cio.h> #include <asm/ebcdic.h> +#include <asm/diag.h> #include "raw3270.h"
drivers/s390/char/vmur.c +164 -86
400 lines not on this page · raw message
drivers/s390/char/vmur.h +1 -0
@@ -70,6 +70,7 @@ struct urdev {size_t reclen;/* Record length for *write* CCWs */ int class;/* VM device class */ int io_request_rc;/* return code from I/O request */ +atomic_t ref_count;/* reference counter */ };/*
drivers/s390/cio/cmf.c +3 -7
@@ -594,6 +594,9 @@ alloc_cmb (struct ccw_device *cdev)free_pages ((unsigned long )mem,get_order (size)); }else if (!mem) {/* no luck */ +printk (KERN_WARNING "cio: failed to allocate area " +"for measuring %d subchannels\n" , + cmb_area.num_channels); ret = -ENOMEM ; goto out; }else {
@@ -1279,13 +1282,6 @@ init_cmf(void)case CMF_BASIC : format_string ="basic" ; cmbops = &cmbops_basic; -if (cmb_area.num_channels >4096 || cmb_area.num_channels <1 ) { -printk (KERN_ERR "cio: Basic channel measurement " -"facility can only use 1 to 4096 devices\n" -KERN_ERR "when the cmf driver is built" -" as a loadable module\n" ); -return 1 ; - }break ;case CMF_EXTENDED : format_string ="extended" ;
drivers/s390/cio/device.c +4 -1
@@ -117,7 +117,10 @@ static int ccw_uevent(struct device *dev, char **envp, int num_envp,snprint_alias (modalias_buf,sizeof (modalias_buf), id,"" ); ret =add_uevent_var (envp, num_envp, &i, buffer, buffer_size, &len,"MODALIAS=%s" , modalias_buf); -return ret; +if (ret) +return ret; + envp[i] =NULL ; +return 0 ; }struct bus_type ccw_bus_type;
drivers/s390/cio/device_id.c +1 -47
63 lines not on this page · raw message
drivers/s390/cio/qdio.c +4 -1
@@ -195,6 +195,8 @@ qdio_do_eqbs(struct qdio_q *q, unsigned char *state, again: ccq =do_eqbs (irq->sch_token, state, q_no, start, cnt); rc =qdio_check_ccq (q, ccq); +if ((ccq ==96 ) && (tmp_cnt != *cnt)) + rc =0 ;if (rc ==1 ) {QDIO_DBF_TEXT5 (1 ,trace,"eqAGAIN" ); goto again;
@@ -740,7 +742,8 @@ qdio_get_outbound_buffer_frontier(struct qdio_q *q) first_not_to_check=f+qdio_min (atomic_read (&q->number_of_buffers_used), (QDIO_MAX_BUFFERS_PER_Q -1 )); -if ((!q->is_iqdio_q)&&(!q->hydra_gives_outbound_pcis)) +if (((!q->is_iqdio_q) && (!q->hydra_gives_outbound_pcis)) || + (q->queue_type ==QDIO_IQDIO_QFMT_ASYNCH ))SYNC_MEMORY ; check_next:
include/asm-s390/atomic.h +22 -4
@@ -67,8 +67,17 @@ typedef struct {#endif /* __GNUC__ */ -#define atomic_read (v) ((v)->counter) -#define atomic_set (v,i) (((v)->counter) = (i)) +static inline int atomic_read (const atomic_t *v) +{ +barrier (); +return v->counter; +} + +static inline void atomic_set (atomic_t *v,int i) +{ + v->counter = i; +barrier (); +}static __inline__int atomic_add_return (int i,atomic_t * v) {
@@ -182,8 +191,17 @@ typedef struct {#endif /* __GNUC__ */ -#define atomic64_read (v) ((v)->counter) -#define atomic64_set (v,i) (((v)->counter) = (i)) +static inline long long atomic64_read (const atomic64_t *v) +{ +barrier (); +return v->counter; +} + +static inline void atomic64_set (atomic64_t *v,long long i) +{ + v->counter = i; +barrier (); +}static __inline__long long atomic64_add_return (long long i,atomic64_t * v) {
include/asm-s390/cio.h +0 -15
@@ -258,19 +258,6 @@ struct ciw {/* Sick revalidation of device. */ #define CIO_REVALIDATE 0x0008 -struct diag210 { -__u16 vrdcdvno :16 ;/* device number (input) */ -__u16 vrdclen :16 ;/* data block length (input) */ -__u32 vrdcvcla :8 ;/* virtual device class (output) */ -__u32 vrdcvtyp :8 ;/* virtual device type (output) */ -__u32 vrdcvsta :8 ;/* virtual device status (output) */ -__u32 vrdcvfla :8 ;/* virtual device flags (output) */ -__u32 vrdcrccl :8 ;/* real device class (output) */ -__u32 vrdccrty :8 ;/* real device type (output) */ -__u32 vrdccrmd :8 ;/* real device model (output) */ -__u32 vrdccrft :8 ;/* real device feature (output) */ -} __attribute__ ((packed,aligned (4 ))); -struct ccw_dev_id {u8 ssid;u16 devno;
@@ -285,8 +272,6 @@ static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1,return 0 ; } -extern int diag210 (struct diag210 *addr); -extern void wait_cons_dev (void );extern void css_schedule_reprobe (void );
include/asm-s390/diag.h new file +39 -0
@@ -0,0 +1,39 @@ +/* +* s390 diagnose functions +* +* Copyright IBM Corp. 2007 +* Author(s): Michael Holzheu <[email protected]> +*/ + +#ifndef _ASM_S390_DIAG_H +#define _ASM_S390_DIAG_H + +/* +* Diagnose 10: Release pages +*/ +extern void diag10 (unsigned long addr); + +/* +* Diagnose 14: Input spool file manipulation +*/ +extern int diag14 (unsigned long rx,unsigned long ry1,unsigned long subcode); + +/* +* Diagnose 210: Get information about a virtual device +*/ +struct diag210 { +u16 vrdcdvno;/* device number (input) */ +u16 vrdclen;/* data block length (input) */ +u8 vrdcvcla;/* virtual device class (output) */ +u8 vrdcvtyp;/* virtual device type (output) */ +u8 vrdcvsta;/* virtual device status (output) */ +u8 vrdcvfla;/* virtual device flags (output) */ +u8 vrdcrccl;/* real device class (output) */ +u8 vrdccrty;/* real device type (output) */ +u8 vrdccrmd;/* real device model (output) */ +u8 vrdccrft;/* real device feature (output) */ +} __attribute__((packed,aligned (4 ))); + +extern int diag210 (struct diag210 *addr); + +#endif /* _ASM_S390_DIAG_H */
include/asm-s390/pgalloc.h +0 -2
@@ -19,8 +19,6 @@#define check_pgt_cache () do {} while (0) -extern void diag10 (unsigned long addr); -/* * Page allocation orders. */