Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6: [IA64] use generic compat_old_sys_readdir [IA64] pci_acpi_scan_root cleanup [IA64] Shrink shadow_flush_counts to a short array to save 8k of per_cpu area. [IA64] Remove sn2_defconfig.hifive-unleashed-5.1
commit
1fca254274
File diff suppressed because it is too large
Load Diff
|
@ -262,7 +262,7 @@ ia32_syscall_table:
|
||||||
data8 sys_uselib
|
data8 sys_uselib
|
||||||
data8 sys_swapon
|
data8 sys_swapon
|
||||||
data8 sys_reboot
|
data8 sys_reboot
|
||||||
data8 sys32_readdir
|
data8 compat_sys_old_readdir
|
||||||
data8 sys32_mmap /* 90 */
|
data8 sys32_mmap /* 90 */
|
||||||
data8 sys32_munmap
|
data8 sys32_munmap
|
||||||
data8 sys_truncate
|
data8 sys_truncate
|
||||||
|
|
|
@ -276,13 +276,6 @@ typedef struct compat_siginfo {
|
||||||
} _sifields;
|
} _sifields;
|
||||||
} compat_siginfo_t;
|
} compat_siginfo_t;
|
||||||
|
|
||||||
struct old_linux32_dirent {
|
|
||||||
u32 d_ino;
|
|
||||||
u32 d_offset;
|
|
||||||
u16 d_namlen;
|
|
||||||
char d_name[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IA-32 ELF specific definitions for IA-64.
|
* IA-32 ELF specific definitions for IA-64.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1210,138 +1210,6 @@ sys32_settimeofday (struct compat_timeval __user *tv, struct timezone __user *tz
|
||||||
return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
|
return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct getdents32_callback {
|
|
||||||
struct compat_dirent __user *current_dir;
|
|
||||||
struct compat_dirent __user *previous;
|
|
||||||
int count;
|
|
||||||
int error;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct readdir32_callback {
|
|
||||||
struct old_linux32_dirent __user * dirent;
|
|
||||||
int count;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
filldir32 (void *__buf, const char *name, int namlen, loff_t offset, u64 ino,
|
|
||||||
unsigned int d_type)
|
|
||||||
{
|
|
||||||
struct compat_dirent __user * dirent;
|
|
||||||
struct getdents32_callback * buf = (struct getdents32_callback *) __buf;
|
|
||||||
int reclen = ROUND_UP(offsetof(struct compat_dirent, d_name) + namlen + 1, 4);
|
|
||||||
u32 d_ino;
|
|
||||||
|
|
||||||
buf->error = -EINVAL; /* only used if we fail.. */
|
|
||||||
if (reclen > buf->count)
|
|
||||||
return -EINVAL;
|
|
||||||
d_ino = ino;
|
|
||||||
if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
|
|
||||||
return -EOVERFLOW;
|
|
||||||
buf->error = -EFAULT; /* only used if we fail.. */
|
|
||||||
dirent = buf->previous;
|
|
||||||
if (dirent)
|
|
||||||
if (put_user(offset, &dirent->d_off))
|
|
||||||
return -EFAULT;
|
|
||||||
dirent = buf->current_dir;
|
|
||||||
buf->previous = dirent;
|
|
||||||
if (put_user(d_ino, &dirent->d_ino)
|
|
||||||
|| put_user(reclen, &dirent->d_reclen)
|
|
||||||
|| copy_to_user(dirent->d_name, name, namlen)
|
|
||||||
|| put_user(0, dirent->d_name + namlen))
|
|
||||||
return -EFAULT;
|
|
||||||
dirent = (struct compat_dirent __user *) ((char __user *) dirent + reclen);
|
|
||||||
buf->current_dir = dirent;
|
|
||||||
buf->count -= reclen;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage long
|
|
||||||
sys32_getdents (unsigned int fd, struct compat_dirent __user *dirent, unsigned int count)
|
|
||||||
{
|
|
||||||
struct file * file;
|
|
||||||
struct compat_dirent __user * lastdirent;
|
|
||||||
struct getdents32_callback buf;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
error = -EFAULT;
|
|
||||||
if (!access_ok(VERIFY_WRITE, dirent, count))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
error = -EBADF;
|
|
||||||
file = fget(fd);
|
|
||||||
if (!file)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
buf.current_dir = dirent;
|
|
||||||
buf.previous = NULL;
|
|
||||||
buf.count = count;
|
|
||||||
buf.error = 0;
|
|
||||||
|
|
||||||
error = vfs_readdir(file, filldir32, &buf);
|
|
||||||
if (error < 0)
|
|
||||||
goto out_putf;
|
|
||||||
error = buf.error;
|
|
||||||
lastdirent = buf.previous;
|
|
||||||
if (lastdirent) {
|
|
||||||
if (put_user(file->f_pos, &lastdirent->d_off))
|
|
||||||
error = -EFAULT;
|
|
||||||
else
|
|
||||||
error = count - buf.count;
|
|
||||||
}
|
|
||||||
|
|
||||||
out_putf:
|
|
||||||
fput(file);
|
|
||||||
out:
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
fillonedir32 (void * __buf, const char * name, int namlen, loff_t offset, u64 ino,
|
|
||||||
unsigned int d_type)
|
|
||||||
{
|
|
||||||
struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
|
|
||||||
struct old_linux32_dirent __user * dirent;
|
|
||||||
u32 d_ino;
|
|
||||||
|
|
||||||
if (buf->count)
|
|
||||||
return -EINVAL;
|
|
||||||
d_ino = ino;
|
|
||||||
if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
|
|
||||||
return -EOVERFLOW;
|
|
||||||
buf->count++;
|
|
||||||
dirent = buf->dirent;
|
|
||||||
if (put_user(d_ino, &dirent->d_ino)
|
|
||||||
|| put_user(offset, &dirent->d_offset)
|
|
||||||
|| put_user(namlen, &dirent->d_namlen)
|
|
||||||
|| copy_to_user(dirent->d_name, name, namlen)
|
|
||||||
|| put_user(0, dirent->d_name + namlen))
|
|
||||||
return -EFAULT;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage long
|
|
||||||
sys32_readdir (unsigned int fd, void __user *dirent, unsigned int count)
|
|
||||||
{
|
|
||||||
int error;
|
|
||||||
struct file * file;
|
|
||||||
struct readdir32_callback buf;
|
|
||||||
|
|
||||||
error = -EBADF;
|
|
||||||
file = fget(fd);
|
|
||||||
if (!file)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
buf.count = 0;
|
|
||||||
buf.dirent = dirent;
|
|
||||||
|
|
||||||
error = vfs_readdir(file, fillonedir32, &buf);
|
|
||||||
if (error >= 0)
|
|
||||||
error = buf.count;
|
|
||||||
fput(file);
|
|
||||||
out:
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sel_arg_struct {
|
struct sel_arg_struct {
|
||||||
unsigned int n;
|
unsigned int n;
|
||||||
unsigned int inp;
|
unsigned int inp;
|
||||||
|
|
|
@ -58,7 +58,7 @@ static struct local_tlb_flush_counts {
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
} __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS];
|
} __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS];
|
||||||
|
|
||||||
static DEFINE_PER_CPU(unsigned int, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned;
|
static DEFINE_PER_CPU(unsigned short, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned;
|
||||||
|
|
||||||
#define IPI_CALL_FUNC 0
|
#define IPI_CALL_FUNC 0
|
||||||
#define IPI_CPU_STOP 1
|
#define IPI_CPU_STOP 1
|
||||||
|
@ -254,7 +254,7 @@ smp_local_flush_tlb(void)
|
||||||
void
|
void
|
||||||
smp_flush_tlb_cpumask(cpumask_t xcpumask)
|
smp_flush_tlb_cpumask(cpumask_t xcpumask)
|
||||||
{
|
{
|
||||||
unsigned int *counts = __ia64_per_cpu_var(shadow_flush_counts);
|
unsigned short *counts = __ia64_per_cpu_var(shadow_flush_counts);
|
||||||
cpumask_t cpumask = xcpumask;
|
cpumask_t cpumask = xcpumask;
|
||||||
int mycpu, cpu, flush_mycpu = 0;
|
int mycpu, cpu, flush_mycpu = 0;
|
||||||
|
|
||||||
|
@ -262,7 +262,7 @@ smp_flush_tlb_cpumask(cpumask_t xcpumask)
|
||||||
mycpu = smp_processor_id();
|
mycpu = smp_processor_id();
|
||||||
|
|
||||||
for_each_cpu_mask(cpu, cpumask)
|
for_each_cpu_mask(cpu, cpumask)
|
||||||
counts[cpu] = local_tlb_flush_counts[cpu].count;
|
counts[cpu] = local_tlb_flush_counts[cpu].count & 0xffff;
|
||||||
|
|
||||||
mb();
|
mb();
|
||||||
for_each_cpu_mask(cpu, cpumask) {
|
for_each_cpu_mask(cpu, cpumask) {
|
||||||
|
@ -276,7 +276,7 @@ smp_flush_tlb_cpumask(cpumask_t xcpumask)
|
||||||
smp_local_flush_tlb();
|
smp_local_flush_tlb();
|
||||||
|
|
||||||
for_each_cpu_mask(cpu, cpumask)
|
for_each_cpu_mask(cpu, cpumask)
|
||||||
while(counts[cpu] == local_tlb_flush_counts[cpu].count)
|
while(counts[cpu] == (local_tlb_flush_counts[cpu].count & 0xffff))
|
||||||
udelay(FLUSH_DELAY);
|
udelay(FLUSH_DELAY);
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
|
@ -324,7 +324,6 @@ pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl)
|
||||||
struct pci_bus * __devinit
|
struct pci_bus * __devinit
|
||||||
pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
|
pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
|
||||||
{
|
{
|
||||||
struct pci_root_info info;
|
|
||||||
struct pci_controller *controller;
|
struct pci_controller *controller;
|
||||||
unsigned int windows = 0;
|
unsigned int windows = 0;
|
||||||
struct pci_bus *pbus;
|
struct pci_bus *pbus;
|
||||||
|
@ -346,22 +345,24 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
|
||||||
acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
|
acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
|
||||||
&windows);
|
&windows);
|
||||||
if (windows) {
|
if (windows) {
|
||||||
|
struct pci_root_info info;
|
||||||
|
|
||||||
controller->window =
|
controller->window =
|
||||||
kmalloc_node(sizeof(*controller->window) * windows,
|
kmalloc_node(sizeof(*controller->window) * windows,
|
||||||
GFP_KERNEL, controller->node);
|
GFP_KERNEL, controller->node);
|
||||||
if (!controller->window)
|
if (!controller->window)
|
||||||
goto out2;
|
goto out2;
|
||||||
|
|
||||||
|
name = kmalloc(16, GFP_KERNEL);
|
||||||
|
if (!name)
|
||||||
|
goto out3;
|
||||||
|
|
||||||
|
sprintf(name, "PCI Bus %04x:%02x", domain, bus);
|
||||||
|
info.controller = controller;
|
||||||
|
info.name = name;
|
||||||
|
acpi_walk_resources(device->handle, METHOD_NAME__CRS,
|
||||||
|
add_window, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
name = kmalloc(16, GFP_KERNEL);
|
|
||||||
if (!name)
|
|
||||||
goto out3;
|
|
||||||
|
|
||||||
sprintf(name, "PCI Bus %04x:%02x", domain, bus);
|
|
||||||
info.controller = controller;
|
|
||||||
info.name = name;
|
|
||||||
acpi_walk_resources(device->handle, METHOD_NAME__CRS, add_window,
|
|
||||||
&info);
|
|
||||||
/*
|
/*
|
||||||
* See arch/x86/pci/acpi.c.
|
* See arch/x86/pci/acpi.c.
|
||||||
* The desired pci bus might already be scanned in a quirk. We
|
* The desired pci bus might already be scanned in a quirk. We
|
||||||
|
|
Loading…
Reference in New Issue