提交 7d671f3e 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6:
  [S390] update documentation for hvc_iucv kernel parameter.
  [S390] hvc_iucv: Special handling of IUCV HVC devices
  [S390] hvc_iucv: Refactor console and device initialization
  [S390] hvc_iucv: Update function documentation
  [S390] hvc_iucv: Limit rate of outgoing IUCV messages
  [S390] hvc_iucv: Change IUCV term id and use one device as default
  [S390] Use unsigned long long for u64 on 64bit.
  [S390] qdio: fix broken pointer in case of CONFIG_DEBUG_FS is disabled
  [S390] vdso: compile fix
  [S390] remove code for oldselect system call
  [S390] types: add/fix types.h include in header files
  [S390] dasd: add device attribute to disable blocking on lost paths
  [S390] dasd: send change uevents for dasd block devices
  [S390] tape block: fix dependencies
  [S390] asm-s390/posix_types.h: drop __USE_ALL usage
  [S390] gettimeofday.S: removed duplicated #includes
  [S390] ptrace: no extern declarations for userspace
...@@ -834,8 +834,8 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -834,8 +834,8 @@ and is between 256 and 4096 characters. It is defined in the file
hlt [BUGS=ARM,SH] hlt [BUGS=ARM,SH]
hvc_iucv= [S390] Number of z/VM IUCV Hypervisor console (HVC) hvc_iucv= [S390] Number of z/VM IUCV hypervisor console (HVC)
back-ends. Valid parameters: 0..8 terminal devices. Valid values: 0..8
i8042.debug [HW] Toggle i8042 debug mode i8042.debug [HW] Toggle i8042 debug mode
i8042.direct [HW] Put keyboard port into non-translated mode i8042.direct [HW] Put keyboard port into non-translated mode
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#define _ASM_S390_CHPID_H _ASM_S390_CHPID_H #define _ASM_S390_CHPID_H _ASM_S390_CHPID_H
#include <linux/string.h> #include <linux/string.h>
#include <asm/types.h> #include <linux/types.h>
#define __MAX_CHPID 255 #define __MAX_CHPID 255
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#ifndef _ASM_CHSC_H #ifndef _ASM_CHSC_H
#define _ASM_CHSC_H #define _ASM_CHSC_H
#include <linux/types.h>
#include <asm/chpid.h> #include <asm/chpid.h>
#include <asm/schid.h> #include <asm/schid.h>
......
#ifndef S390_CMB_H #ifndef S390_CMB_H
#define S390_CMB_H #define S390_CMB_H
#include <linux/types.h>
/** /**
* struct cmbdata - channel measurement block data for user space * struct cmbdata - channel measurement block data for user space
* @size: size of the stored data * @size: size of the stored data
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#ifndef DASD_H #ifndef DASD_H
#define DASD_H #define DASD_H
#include <linux/types.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
#define DASD_IOCTL_LETTER 'D' #define DASD_IOCTL_LETTER 'D'
...@@ -78,6 +79,7 @@ typedef struct dasd_information2_t { ...@@ -78,6 +79,7 @@ typedef struct dasd_information2_t {
#define DASD_FEATURE_USEDIAG 0x02 #define DASD_FEATURE_USEDIAG 0x02
#define DASD_FEATURE_INITIAL_ONLINE 0x04 #define DASD_FEATURE_INITIAL_ONLINE 0x04
#define DASD_FEATURE_ERPLOG 0x08 #define DASD_FEATURE_ERPLOG 0x08
#define DASD_FEATURE_FAILFAST 0x10
#define DASD_PARTN_BITS 2 #define DASD_PARTN_BITS 2
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* Author(s): Carsten Otte <cotte@de.ibm.com> * Author(s): Carsten Otte <cotte@de.ibm.com>
* Christian Borntraeger <borntraeger@de.ibm.com> * Christian Borntraeger <borntraeger@de.ibm.com>
*/ */
#include <asm/types.h> #include <linux/types.h>
/* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */ /* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */
struct kvm_pic_state { struct kvm_pic_state {
......
...@@ -68,11 +68,7 @@ typedef unsigned short __kernel_old_dev_t; ...@@ -68,11 +68,7 @@ typedef unsigned short __kernel_old_dev_t;
#endif /* __s390x__ */ #endif /* __s390x__ */
typedef struct { typedef struct {
#if defined(__KERNEL__) || defined(__USE_ALL)
int val[2]; int val[2];
#else /* !defined(__KERNEL__) && !defined(__USE_ALL)*/
int __val[2];
#endif /* !defined(__KERNEL__) && !defined(__USE_ALL)*/
} __kernel_fsid_t; } __kernel_fsid_t;
......
...@@ -272,12 +272,15 @@ typedef struct ...@@ -272,12 +272,15 @@ typedef struct
#define PSW_ASC_SECONDARY 0x0000800000000000UL #define PSW_ASC_SECONDARY 0x0000800000000000UL
#define PSW_ASC_HOME 0x0000C00000000000UL #define PSW_ASC_HOME 0x0000C00000000000UL
extern long psw_user32_bits;
#endif /* __s390x__ */ #endif /* __s390x__ */
#ifdef __KERNEL__
extern long psw_kernel_bits; extern long psw_kernel_bits;
extern long psw_user_bits; extern long psw_user_bits;
#ifdef CONFIG_64BIT
extern long psw_user32_bits;
#endif
#endif
/* This macro merges a NEW PSW mask specified by the user into /* This macro merges a NEW PSW mask specified by the user into
the currently active PSW mask CURRENT, modifying only those the currently active PSW mask CURRENT, modifying only those
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
*/ */
#ifndef __ASM_S390_QETH_IOCTL_H__ #ifndef __ASM_S390_QETH_IOCTL_H__
#define __ASM_S390_QETH_IOCTL_H__ #define __ASM_S390_QETH_IOCTL_H__
#include <linux/types.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
#define SIOC_QETH_ARP_SET_NO_ENTRIES (SIOCDEVPRIVATE) #define SIOC_QETH_ARP_SET_NO_ENTRIES (SIOCDEVPRIVATE)
......
#ifndef ASM_SCHID_H #ifndef ASM_SCHID_H
#define ASM_SCHID_H #define ASM_SCHID_H
#include <linux/types.h>
struct subchannel_id { struct subchannel_id {
__u32 cssid : 8; __u32 cssid : 8;
__u32 : 4; __u32 : 4;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
*/ */
#include <asm/types.h> #include <linux/types.h>
#ifndef __s390x__ #ifndef __s390x__
# define __SWAB_64_THRU_32__ # define __SWAB_64_THRU_32__
......
...@@ -9,11 +9,7 @@ ...@@ -9,11 +9,7 @@
#ifndef _S390_TYPES_H #ifndef _S390_TYPES_H
#define _S390_TYPES_H #define _S390_TYPES_H
#ifndef __s390x__ #include <asm-generic/int-ll64.h>
# include <asm-generic/int-ll64.h>
#else
# include <asm-generic/int-l64.h>
#endif
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
......
...@@ -54,7 +54,5 @@ long sys_sigreturn(void); ...@@ -54,7 +54,5 @@ long sys_sigreturn(void);
long sys_rt_sigreturn(void); long sys_rt_sigreturn(void);
long sys32_sigreturn(void); long sys32_sigreturn(void);
long sys32_rt_sigreturn(void); long sys32_rt_sigreturn(void);
long old_select(struct sel_arg_struct __user *arg);
long sys_ptrace(long request, long pid, long addr, long data);
#endif /* _ENTRY_H */ #endif /* _ENTRY_H */
...@@ -685,7 +685,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus) ...@@ -685,7 +685,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
if (MACHINE_HAS_IEEE) if (MACHINE_HAS_IEEE)
lowcore->extended_save_area_addr = (u32) save_area; lowcore->extended_save_area_addr = (u32) save_area;
#else #else
BUG_ON(vdso_alloc_per_cpu(smp_processor_id(), lowcore)); if (vdso_alloc_per_cpu(smp_processor_id(), lowcore))
BUG();
#endif #endif
set_prefix((u32)(unsigned long) lowcore); set_prefix((u32)(unsigned long) lowcore);
local_mcck_enable(); local_mcck_enable();
......
...@@ -103,25 +103,6 @@ asmlinkage long old_mmap(struct mmap_arg_struct __user *arg) ...@@ -103,25 +103,6 @@ asmlinkage long old_mmap(struct mmap_arg_struct __user *arg)
return error; return error;
} }
#ifndef CONFIG_64BIT
struct sel_arg_struct {
unsigned long n;
fd_set __user *inp, *outp, *exp;
struct timeval __user *tvp;
};
asmlinkage long old_select(struct sel_arg_struct __user *arg)
{
struct sel_arg_struct a;
if (copy_from_user(&a, arg, sizeof(a)))
return -EFAULT;
/* sys_select() does the appropriate kernel locking */
return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp);
}
#endif /* CONFIG_64BIT */
/* /*
* sys_ipc() is the de-multiplexer for the SysV IPC calls.. * sys_ipc() is the de-multiplexer for the SysV IPC calls..
* *
......
...@@ -322,7 +322,8 @@ static int __init vdso_init(void) ...@@ -322,7 +322,8 @@ static int __init vdso_init(void)
vdso64_pagelist[vdso64_pages - 1] = virt_to_page(vdso_data); vdso64_pagelist[vdso64_pages - 1] = virt_to_page(vdso_data);
vdso64_pagelist[vdso64_pages] = NULL; vdso64_pagelist[vdso64_pages] = NULL;
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
BUG_ON(vdso_alloc_per_cpu(0, S390_lowcore)); if (vdso_alloc_per_cpu(0, &S390_lowcore))
BUG();
#endif #endif
vdso_init_cr5(); vdso_init_cr5();
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
......
...@@ -9,10 +9,6 @@ ...@@ -9,10 +9,6 @@
* it under the terms of the GNU General Public License (version 2 only) * it under the terms of the GNU General Public License (version 2 only)
* as published by the Free Software Foundation. * as published by the Free Software Foundation.
*/ */
#include <asm/vdso.h>
#include <asm/asm-offsets.h>
#include <asm/unistd.h>
#include <asm/vdso.h> #include <asm/vdso.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/unistd.h> #include <asm/unistd.h>
......
...@@ -47,7 +47,7 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu) ...@@ -47,7 +47,7 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu)
vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL; vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL;
vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT; vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT;
vcpu->run->exit_reason = KVM_EXIT_S390_RESET; vcpu->run->exit_reason = KVM_EXIT_S390_RESET;
VCPU_EVENT(vcpu, 3, "requesting userspace resets %lx", VCPU_EVENT(vcpu, 3, "requesting userspace resets %llx",
vcpu->run->s390_reset_flags); vcpu->run->s390_reset_flags);
return -EREMOTE; return -EREMOTE;
} }
......
...@@ -160,7 +160,7 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu, ...@@ -160,7 +160,7 @@ static void __do_deliver_interrupt(struct kvm_vcpu *vcpu,
break; break;
case KVM_S390_INT_VIRTIO: case KVM_S390_INT_VIRTIO:
VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%lx", VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%llx",
inti->ext.ext_params, inti->ext.ext_params2); inti->ext.ext_params, inti->ext.ext_params2);
vcpu->stat.deliver_virtio_interrupt++; vcpu->stat.deliver_virtio_interrupt++;
rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2603); rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2603);
...@@ -360,7 +360,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu) ...@@ -360,7 +360,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)
vcpu->arch.ckc_timer.expires = jiffies + sltime; vcpu->arch.ckc_timer.expires = jiffies + sltime;
add_timer(&vcpu->arch.ckc_timer); add_timer(&vcpu->arch.ckc_timer);
VCPU_EVENT(vcpu, 5, "enabled wait timer:%lx jiffies", sltime); VCPU_EVENT(vcpu, 5, "enabled wait timer:%llx jiffies", sltime);
no_timer: no_timer:
spin_lock_bh(&vcpu->arch.local_int.float_int->lock); spin_lock_bh(&vcpu->arch.local_int.float_int->lock);
spin_lock_bh(&vcpu->arch.local_int.lock); spin_lock_bh(&vcpu->arch.local_int.lock);
...@@ -491,7 +491,7 @@ int kvm_s390_inject_vm(struct kvm *kvm, ...@@ -491,7 +491,7 @@ int kvm_s390_inject_vm(struct kvm *kvm,
switch (s390int->type) { switch (s390int->type) {
case KVM_S390_INT_VIRTIO: case KVM_S390_INT_VIRTIO:
VM_EVENT(kvm, 5, "inject: virtio parm:%x,parm64:%lx", VM_EVENT(kvm, 5, "inject: virtio parm:%x,parm64:%llx",
s390int->parm, s390int->parm64); s390int->parm, s390int->parm64);
inti->type = s390int->type; inti->type = s390int->type;
inti->ext.ext_params = s390int->parm; inti->ext.ext_params = s390int->parm;
......
...@@ -118,7 +118,7 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu) ...@@ -118,7 +118,7 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
goto out; goto out;
} }
VCPU_EVENT(vcpu, 5, "storing cpu address to %lx", useraddr); VCPU_EVENT(vcpu, 5, "storing cpu address to %llx", useraddr);
out: out:
return 0; return 0;
} }
......
此差异已折叠。
...@@ -336,6 +336,9 @@ static int ...@@ -336,6 +336,9 @@ static int
dasd_state_ready_to_online(struct dasd_device * device) dasd_state_ready_to_online(struct dasd_device * device)
{ {
int rc; int rc;
struct gendisk *disk;
struct disk_part_iter piter;
struct hd_struct *part;
if (device->discipline->ready_to_online) { if (device->discipline->ready_to_online) {
rc = device->discipline->ready_to_online(device); rc = device->discipline->ready_to_online(device);
...@@ -343,8 +346,14 @@ dasd_state_ready_to_online(struct dasd_device * device) ...@@ -343,8 +346,14 @@ dasd_state_ready_to_online(struct dasd_device * device)
return rc; return rc;
} }
device->state = DASD_STATE_ONLINE; device->state = DASD_STATE_ONLINE;
if (device->block) if (device->block) {
dasd_schedule_block_bh(device->block); dasd_schedule_block_bh(device->block);
disk = device->block->bdev->bd_disk;
disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0);
while ((part = disk_part_iter_next(&piter)))
kobject_uevent(&part_to_dev(part)->kobj, KOBJ_CHANGE);
disk_part_iter_exit(&piter);
}
return 0; return 0;
} }
...@@ -354,6 +363,9 @@ dasd_state_ready_to_online(struct dasd_device * device) ...@@ -354,6 +363,9 @@ dasd_state_ready_to_online(struct dasd_device * device)
static int dasd_state_online_to_ready(struct dasd_device *device) static int dasd_state_online_to_ready(struct dasd_device *device)
{ {
int rc; int rc;
struct gendisk *disk;
struct disk_part_iter piter;
struct hd_struct *part;
if (device->discipline->online_to_ready) { if (device->discipline->online_to_ready) {
rc = device->discipline->online_to_ready(device); rc = device->discipline->online_to_ready(device);
...@@ -361,6 +373,13 @@ static int dasd_state_online_to_ready(struct dasd_device *device) ...@@ -361,6 +373,13 @@ static int dasd_state_online_to_ready(struct dasd_device *device)
return rc; return rc;
} }
device->state = DASD_STATE_READY; device->state = DASD_STATE_READY;
if (device->block) {
disk = device->block->bdev->bd_disk;
disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0);
while ((part = disk_part_iter_next(&piter)))
kobject_uevent(&part_to_dev(part)->kobj, KOBJ_CHANGE);
disk_part_iter_exit(&piter);
}
return 0; return 0;
} }
......
...@@ -206,6 +206,8 @@ dasd_feature_list(char *str, char **endp) ...@@ -206,6 +206,8 @@ dasd_feature_list(char *str, char **endp)
features |= DASD_FEATURE_USEDIAG; features |= DASD_FEATURE_USEDIAG;
else if (len == 6 && !strncmp(str, "erplog", 6)) else if (len == 6 && !strncmp(str, "erplog", 6))
features |= DASD_FEATURE_ERPLOG; features |= DASD_FEATURE_ERPLOG;
else if (len == 8 && !strncmp(str, "failfast", 8))
features |= DASD_FEATURE_FAILFAST;
else { else {
MESSAGE(KERN_WARNING, MESSAGE(KERN_WARNING,
"unsupported feature: %*s, " "unsupported feature: %*s, "
...@@ -666,6 +668,51 @@ dasd_device_from_cdev(struct ccw_device *cdev) ...@@ -666,6 +668,51 @@ dasd_device_from_cdev(struct ccw_device *cdev)
* SECTION: files in sysfs * SECTION: files in sysfs
*/ */
/*
* failfast controls the behaviour, if no path is available
*/
static ssize_t dasd_ff_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct dasd_devmap *devmap;
int ff_flag;
devmap = dasd_find_busid(dev->bus_id);
if (!IS_ERR(devmap))
ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0;
else
ff_flag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_FAILFAST) != 0;
return snprintf(buf, PAGE_SIZE, ff_flag ? "1\n" : "0\n");
}
static ssize_t dasd_ff_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct dasd_devmap *devmap;
int val;
char *endp;
devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
if (IS_ERR(devmap))
return PTR_ERR(devmap);
val = simple_strtoul(buf, &endp, 0);
if (((endp + 1) < (buf + count)) || (val > 1))
return -EINVAL;
spin_lock(&dasd_devmap_lock);
if (val)
devmap->features |= DASD_FEATURE_FAILFAST;
else
devmap->features &= ~DASD_FEATURE_FAILFAST;
if (devmap->device)
devmap->device->features = devmap->features;
spin_unlock(&dasd_devmap_lock);
return count;
}
static DEVICE_ATTR(failfast, 0644, dasd_ff_show, dasd_ff_store);
/* /*
* readonly controls the readonly status of a dasd * readonly controls the readonly status of a dasd
*/ */
...@@ -1020,6 +1067,7 @@ static struct attribute * dasd_attrs[] = { ...@@ -1020,6 +1067,7 @@ static struct attribute * dasd_attrs[] = {
&dev_attr_use_diag.attr, &dev_attr_use_diag.attr,
&dev_attr_eer_enabled.attr, &dev_attr_eer_enabled.attr,
&dev_attr_erplog.attr, &dev_attr_erplog.attr,
&dev_attr_failfast.attr,
NULL, NULL,
}; };
......
...@@ -544,7 +544,8 @@ static struct dasd_ccw_req *dasd_diag_build_cp(struct dasd_device *memdev, ...@@ -544,7 +544,8 @@ static struct dasd_ccw_req *dasd_diag_build_cp(struct dasd_device *memdev,
} }
cqr->retries = DIAG_MAX_RETRIES; cqr->retries = DIAG_MAX_RETRIES;
cqr->buildclk = get_clock(); cqr->buildclk = get_clock();
if (blk_noretry_request(req)) if (blk_noretry_request(req) ||
block->base->features & DASD_FEATURE_FAILFAST)
set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
cqr->startdev = memdev; cqr->startdev = memdev;
cqr->memdev = memdev; cqr->memdev = memdev;
......
...@@ -1700,7 +1700,8 @@ static struct dasd_ccw_req *dasd_eckd_build_cp(struct dasd_device *startdev, ...@@ -1700,7 +1700,8 @@ static struct dasd_ccw_req *dasd_eckd_build_cp(struct dasd_device *startdev,
recid++; recid++;
} }
} }
if (blk_noretry_request(req)) if (blk_noretry_request(req) ||
block->base->features & DASD_FEATURE_FAILFAST)
set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
cqr->startdev = startdev; cqr->startdev = startdev;
cqr->memdev = startdev; cqr->memdev = startdev;
......
...@@ -355,7 +355,8 @@ static struct dasd_ccw_req *dasd_fba_build_cp(struct dasd_device * memdev, ...@@ -355,7 +355,8 @@ static struct dasd_ccw_req *dasd_fba_build_cp(struct dasd_device * memdev,
recid++; recid++;
} }
} }
if (blk_noretry_request(req)) if (blk_noretry_request(req) ||
block->base->features & DASD_FEATURE_FAILFAST)
set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
cqr->startdev = memdev; cqr->startdev = memdev;
cqr->memdev = memdev; cqr->memdev = memdev;
......
...@@ -100,7 +100,7 @@ comment "S/390 tape interface support" ...@@ -100,7 +100,7 @@ comment "S/390 tape interface support"
config S390_TAPE_BLOCK config S390_TAPE_BLOCK
bool "Support for tape block devices" bool "Support for tape block devices"
depends on S390_TAPE depends on S390_TAPE && BLOCK
help help
Select this option if you want to access your channel-attached tape Select this option if you want to access your channel-attached tape
devices using the block device interface. This interface is similar devices using the block device interface. This interface is similar
......
...@@ -169,6 +169,8 @@ static void setup_debugfs_entry(struct qdio_q *q, struct ccw_device *cdev) ...@@ -169,6 +169,8 @@ static void setup_debugfs_entry(struct qdio_q *q, struct ccw_device *cdev)
q->nr); q->nr);
debugfs_queues[i] = debugfs_create_file(name, S_IFREG | S_IRUGO | S_IWUSR, debugfs_queues[i] = debugfs_create_file(name, S_IFREG | S_IRUGO | S_IWUSR,
debugfs_root, q, &debugfs_fops); debugfs_root, q, &debugfs_fops);
if (IS_ERR(debugfs_queues[i]))
debugfs_queues[i] = NULL;
} }
void qdio_setup_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cdev) void qdio_setup_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cdev)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册