diff options
58 files changed, 523 insertions, 204 deletions
diff --git a/Documentation/credentials.txt b/Documentation/credentials.txt index a2db35287003..995baf379c07 100644 --- a/Documentation/credentials.txt +++ b/Documentation/credentials.txt | |||
| @@ -417,6 +417,9 @@ reference on them using: | |||
| 417 | This does all the RCU magic inside of it. The caller must call put_cred() on | 417 | This does all the RCU magic inside of it. The caller must call put_cred() on |
| 418 | the credentials so obtained when they're finished with. | 418 | the credentials so obtained when they're finished with. |
| 419 | 419 | ||
| 420 | [*] Note: The result of __task_cred() should not be passed directly to | ||
| 421 | get_cred() as this may race with commit_cred(). | ||
| 422 | |||
| 420 | There are a couple of convenience functions to access bits of another task's | 423 | There are a couple of convenience functions to access bits of another task's |
| 421 | credentials, hiding the RCU magic from the caller: | 424 | credentials, hiding the RCU magic from the caller: |
| 422 | 425 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index db3d0f5061f9..02f75fccac20 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -6243,6 +6243,8 @@ F: drivers/mmc/host/wbsd.* | |||
| 6243 | 6243 | ||
| 6244 | WATCHDOG DEVICE DRIVERS | 6244 | WATCHDOG DEVICE DRIVERS |
| 6245 | M: Wim Van Sebroeck <wim@iguana.be> | 6245 | M: Wim Van Sebroeck <wim@iguana.be> |
| 6246 | L: linux-watchdog@vger.kernel.org | ||
| 6247 | W: http://www.linux-watchdog.org/ | ||
| 6246 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog.git | 6248 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/wim/linux-2.6-watchdog.git |
| 6247 | S: Maintained | 6249 | S: Maintained |
| 6248 | F: Documentation/watchdog/ | 6250 | F: Documentation/watchdog/ |
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 2ec3095ffb7b..b280efb1fa12 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/mtd/partitions.h> | 25 | #include <linux/mtd/partitions.h> |
| 26 | #include <linux/mtd/physmap.h> | 26 | #include <linux/mtd/physmap.h> |
| 27 | #include <linux/regulator/machine.h> | 27 | #include <linux/regulator/machine.h> |
| 28 | #include <linux/regulator/tps6507x.h> | ||
| 28 | #include <linux/mfd/tps6507x.h> | 29 | #include <linux/mfd/tps6507x.h> |
| 29 | #include <linux/input/tps6507x-ts.h> | 30 | #include <linux/input/tps6507x-ts.h> |
| 30 | 31 | ||
| @@ -469,6 +470,11 @@ struct regulator_consumer_supply tps65070_ldo2_consumers[] = { | |||
| 469 | }, | 470 | }, |
| 470 | }; | 471 | }; |
| 471 | 472 | ||
| 473 | /* We take advantage of the fact that both defdcdc{2,3} are tied high */ | ||
| 474 | static struct tps6507x_reg_platform_data tps6507x_platform_data = { | ||
| 475 | .defdcdc_default = true, | ||
| 476 | }; | ||
| 477 | |||
| 472 | struct regulator_init_data tps65070_regulator_data[] = { | 478 | struct regulator_init_data tps65070_regulator_data[] = { |
| 473 | /* dcdc1 */ | 479 | /* dcdc1 */ |
| 474 | { | 480 | { |
| @@ -494,6 +500,7 @@ struct regulator_init_data tps65070_regulator_data[] = { | |||
| 494 | }, | 500 | }, |
| 495 | .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc2_consumers), | 501 | .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc2_consumers), |
| 496 | .consumer_supplies = tps65070_dcdc2_consumers, | 502 | .consumer_supplies = tps65070_dcdc2_consumers, |
| 503 | .driver_data = &tps6507x_platform_data, | ||
| 497 | }, | 504 | }, |
| 498 | 505 | ||
| 499 | /* dcdc3 */ | 506 | /* dcdc3 */ |
| @@ -507,6 +514,7 @@ struct regulator_init_data tps65070_regulator_data[] = { | |||
| 507 | }, | 514 | }, |
| 508 | .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc3_consumers), | 515 | .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc3_consumers), |
| 509 | .consumer_supplies = tps65070_dcdc3_consumers, | 516 | .consumer_supplies = tps65070_dcdc3_consumers, |
| 517 | .driver_data = &tps6507x_platform_data, | ||
| 510 | }, | 518 | }, |
| 511 | 519 | ||
| 512 | /* ldo1 */ | 520 | /* ldo1 */ |
diff --git a/arch/powerpc/kernel/perf_event_fsl_emb.c b/arch/powerpc/kernel/perf_event_fsl_emb.c index 369872f6cf78..babcceecd2ea 100644 --- a/arch/powerpc/kernel/perf_event_fsl_emb.c +++ b/arch/powerpc/kernel/perf_event_fsl_emb.c | |||
| @@ -566,9 +566,9 @@ static void record_and_restart(struct perf_event *event, unsigned long val, | |||
| 566 | * Finally record data if requested. | 566 | * Finally record data if requested. |
| 567 | */ | 567 | */ |
| 568 | if (record) { | 568 | if (record) { |
| 569 | struct perf_sample_data data = { | 569 | struct perf_sample_data data; |
| 570 | .period = event->hw.last_period, | 570 | |
| 571 | }; | 571 | perf_sample_data_init(&data, 0); |
| 572 | 572 | ||
| 573 | if (perf_event_overflow(event, nmi, &data, regs)) { | 573 | if (perf_event_overflow(event, nmi, &data, regs)) { |
| 574 | /* | 574 | /* |
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index 4f4af75b9482..01ab17ae2ae7 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c | |||
| @@ -572,7 +572,6 @@ static int __kgdb_notify(struct die_args *args, unsigned long cmd) | |||
| 572 | return NOTIFY_STOP; | 572 | return NOTIFY_STOP; |
| 573 | } | 573 | } |
| 574 | 574 | ||
| 575 | #ifdef CONFIG_KGDB_LOW_LEVEL_TRAP | ||
| 576 | int kgdb_ll_trap(int cmd, const char *str, | 575 | int kgdb_ll_trap(int cmd, const char *str, |
| 577 | struct pt_regs *regs, long err, int trap, int sig) | 576 | struct pt_regs *regs, long err, int trap, int sig) |
| 578 | { | 577 | { |
| @@ -590,7 +589,6 @@ int kgdb_ll_trap(int cmd, const char *str, | |||
| 590 | 589 | ||
| 591 | return __kgdb_notify(&args, cmd); | 590 | return __kgdb_notify(&args, cmd); |
| 592 | } | 591 | } |
| 593 | #endif /* CONFIG_KGDB_LOW_LEVEL_TRAP */ | ||
| 594 | 592 | ||
| 595 | static int | 593 | static int |
| 596 | kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr) | 594 | kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr) |
| @@ -625,6 +623,12 @@ int kgdb_arch_init(void) | |||
| 625 | return register_die_notifier(&kgdb_notifier); | 623 | return register_die_notifier(&kgdb_notifier); |
| 626 | } | 624 | } |
| 627 | 625 | ||
| 626 | static void kgdb_hw_overflow_handler(struct perf_event *event, int nmi, | ||
| 627 | struct perf_sample_data *data, struct pt_regs *regs) | ||
| 628 | { | ||
| 629 | kgdb_ll_trap(DIE_DEBUG, "debug", regs, 0, 0, SIGTRAP); | ||
| 630 | } | ||
| 631 | |||
| 628 | void kgdb_arch_late(void) | 632 | void kgdb_arch_late(void) |
| 629 | { | 633 | { |
| 630 | int i, cpu; | 634 | int i, cpu; |
| @@ -655,6 +659,7 @@ void kgdb_arch_late(void) | |||
| 655 | for_each_online_cpu(cpu) { | 659 | for_each_online_cpu(cpu) { |
| 656 | pevent = per_cpu_ptr(breakinfo[i].pev, cpu); | 660 | pevent = per_cpu_ptr(breakinfo[i].pev, cpu); |
| 657 | pevent[0]->hw.sample_period = 1; | 661 | pevent[0]->hw.sample_period = 1; |
| 662 | pevent[0]->overflow_handler = kgdb_hw_overflow_handler; | ||
| 658 | if (pevent[0]->destroy != NULL) { | 663 | if (pevent[0]->destroy != NULL) { |
| 659 | pevent[0]->destroy = NULL; | 664 | pevent[0]->destroy = NULL; |
| 660 | release_bp_slot(*pevent); | 665 | release_bp_slot(*pevent); |
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index f39b00a46eda..1052340e6802 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c | |||
| @@ -336,6 +336,7 @@ static struct of_device_id mpc85xx_pci_err_of_match[] = { | |||
| 336 | }, | 336 | }, |
| 337 | {}, | 337 | {}, |
| 338 | }; | 338 | }; |
| 339 | MODULE_DEVICE_TABLE(of, mpc85xx_pci_err_of_match); | ||
| 339 | 340 | ||
| 340 | static struct of_platform_driver mpc85xx_pci_err_driver = { | 341 | static struct of_platform_driver mpc85xx_pci_err_driver = { |
| 341 | .probe = mpc85xx_pci_err_probe, | 342 | .probe = mpc85xx_pci_err_probe, |
| @@ -650,6 +651,7 @@ static struct of_device_id mpc85xx_l2_err_of_match[] = { | |||
| 650 | { .compatible = "fsl,p2020-l2-cache-controller", }, | 651 | { .compatible = "fsl,p2020-l2-cache-controller", }, |
| 651 | {}, | 652 | {}, |
| 652 | }; | 653 | }; |
| 654 | MODULE_DEVICE_TABLE(of, mpc85xx_l2_err_of_match); | ||
| 653 | 655 | ||
| 654 | static struct of_platform_driver mpc85xx_l2_err_driver = { | 656 | static struct of_platform_driver mpc85xx_l2_err_driver = { |
| 655 | .probe = mpc85xx_l2_err_probe, | 657 | .probe = mpc85xx_l2_err_probe, |
| @@ -1126,6 +1128,7 @@ static struct of_device_id mpc85xx_mc_err_of_match[] = { | |||
| 1126 | { .compatible = "fsl,p2020-memory-controller", }, | 1128 | { .compatible = "fsl,p2020-memory-controller", }, |
| 1127 | {}, | 1129 | {}, |
| 1128 | }; | 1130 | }; |
| 1131 | MODULE_DEVICE_TABLE(of, mpc85xx_mc_err_of_match); | ||
| 1129 | 1132 | ||
| 1130 | static struct of_platform_driver mpc85xx_mc_err_driver = { | 1133 | static struct of_platform_driver mpc85xx_mc_err_driver = { |
| 1131 | .probe = mpc85xx_mc_err_probe, | 1134 | .probe = mpc85xx_mc_err_probe, |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 3ca36542e338..4e51fe3c1fc4 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
| @@ -893,10 +893,12 @@ EXPORT_SYMBOL_GPL(gpio_sysfs_set_active_low); | |||
| 893 | void gpio_unexport(unsigned gpio) | 893 | void gpio_unexport(unsigned gpio) |
| 894 | { | 894 | { |
| 895 | struct gpio_desc *desc; | 895 | struct gpio_desc *desc; |
| 896 | int status = -EINVAL; | 896 | int status = 0; |
| 897 | 897 | ||
| 898 | if (!gpio_is_valid(gpio)) | 898 | if (!gpio_is_valid(gpio)) { |
| 899 | status = -EINVAL; | ||
| 899 | goto done; | 900 | goto done; |
| 901 | } | ||
| 900 | 902 | ||
| 901 | mutex_lock(&sysfs_lock); | 903 | mutex_lock(&sysfs_lock); |
| 902 | 904 | ||
| @@ -911,7 +913,6 @@ void gpio_unexport(unsigned gpio) | |||
| 911 | clear_bit(FLAG_EXPORT, &desc->flags); | 913 | clear_bit(FLAG_EXPORT, &desc->flags); |
| 912 | put_device(dev); | 914 | put_device(dev); |
| 913 | device_unregister(dev); | 915 | device_unregister(dev); |
| 914 | status = 0; | ||
| 915 | } else | 916 | } else |
| 916 | status = -ENODEV; | 917 | status = -ENODEV; |
| 917 | } | 918 | } |
diff --git a/drivers/net/bnx2x.h b/drivers/net/bnx2x.h index 8bd23687c530..bb0872a63315 100644 --- a/drivers/net/bnx2x.h +++ b/drivers/net/bnx2x.h | |||
| @@ -1062,6 +1062,10 @@ struct bnx2x { | |||
| 1062 | 1062 | ||
| 1063 | /* used to synchronize stats collecting */ | 1063 | /* used to synchronize stats collecting */ |
| 1064 | int stats_state; | 1064 | int stats_state; |
| 1065 | |||
| 1066 | /* used for synchronization of concurrent threads statistics handling */ | ||
| 1067 | spinlock_t stats_lock; | ||
| 1068 | |||
| 1065 | /* used by dmae command loader */ | 1069 | /* used by dmae command loader */ |
| 1066 | struct dmae_command stats_dmae; | 1070 | struct dmae_command stats_dmae; |
| 1067 | int executer_idx; | 1071 | int executer_idx; |
diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c index 57ff5b3bcce6..46167c081727 100644 --- a/drivers/net/bnx2x_main.c +++ b/drivers/net/bnx2x_main.c | |||
| @@ -57,8 +57,8 @@ | |||
| 57 | #include "bnx2x_init_ops.h" | 57 | #include "bnx2x_init_ops.h" |
| 58 | #include "bnx2x_dump.h" | 58 | #include "bnx2x_dump.h" |
| 59 | 59 | ||
| 60 | #define DRV_MODULE_VERSION "1.52.53-1" | 60 | #define DRV_MODULE_VERSION "1.52.53-2" |
| 61 | #define DRV_MODULE_RELDATE "2010/18/04" | 61 | #define DRV_MODULE_RELDATE "2010/21/07" |
| 62 | #define BNX2X_BC_VER 0x040200 | 62 | #define BNX2X_BC_VER 0x040200 |
| 63 | 63 | ||
| 64 | #include <linux/firmware.h> | 64 | #include <linux/firmware.h> |
| @@ -3789,6 +3789,8 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp) | |||
| 3789 | struct eth_query_ramrod_data ramrod_data = {0}; | 3789 | struct eth_query_ramrod_data ramrod_data = {0}; |
| 3790 | int i, rc; | 3790 | int i, rc; |
| 3791 | 3791 | ||
| 3792 | spin_lock_bh(&bp->stats_lock); | ||
| 3793 | |||
| 3792 | ramrod_data.drv_counter = bp->stats_counter++; | 3794 | ramrod_data.drv_counter = bp->stats_counter++; |
| 3793 | ramrod_data.collect_port = bp->port.pmf ? 1 : 0; | 3795 | ramrod_data.collect_port = bp->port.pmf ? 1 : 0; |
| 3794 | for_each_queue(bp, i) | 3796 | for_each_queue(bp, i) |
| @@ -3802,6 +3804,8 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp) | |||
| 3802 | bp->spq_left++; | 3804 | bp->spq_left++; |
| 3803 | bp->stats_pending = 1; | 3805 | bp->stats_pending = 1; |
| 3804 | } | 3806 | } |
| 3807 | |||
| 3808 | spin_unlock_bh(&bp->stats_lock); | ||
| 3805 | } | 3809 | } |
| 3806 | } | 3810 | } |
| 3807 | 3811 | ||
| @@ -4367,6 +4371,14 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp) | |||
| 4367 | struct host_func_stats *fstats = bnx2x_sp(bp, func_stats); | 4371 | struct host_func_stats *fstats = bnx2x_sp(bp, func_stats); |
| 4368 | struct bnx2x_eth_stats *estats = &bp->eth_stats; | 4372 | struct bnx2x_eth_stats *estats = &bp->eth_stats; |
| 4369 | int i; | 4373 | int i; |
| 4374 | u16 cur_stats_counter; | ||
| 4375 | |||
| 4376 | /* Make sure we use the value of the counter | ||
| 4377 | * used for sending the last stats ramrod. | ||
| 4378 | */ | ||
| 4379 | spin_lock_bh(&bp->stats_lock); | ||
| 4380 | cur_stats_counter = bp->stats_counter - 1; | ||
| 4381 | spin_unlock_bh(&bp->stats_lock); | ||
| 4370 | 4382 | ||
| 4371 | memcpy(&(fstats->total_bytes_received_hi), | 4383 | memcpy(&(fstats->total_bytes_received_hi), |
| 4372 | &(bnx2x_sp(bp, func_stats_base)->total_bytes_received_hi), | 4384 | &(bnx2x_sp(bp, func_stats_base)->total_bytes_received_hi), |
| @@ -4394,25 +4406,22 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp) | |||
| 4394 | u32 diff; | 4406 | u32 diff; |
| 4395 | 4407 | ||
| 4396 | /* are storm stats valid? */ | 4408 | /* are storm stats valid? */ |
| 4397 | if ((u16)(le16_to_cpu(xclient->stats_counter) + 1) != | 4409 | if (le16_to_cpu(xclient->stats_counter) != cur_stats_counter) { |
| 4398 | bp->stats_counter) { | ||
| 4399 | DP(BNX2X_MSG_STATS, "[%d] stats not updated by xstorm" | 4410 | DP(BNX2X_MSG_STATS, "[%d] stats not updated by xstorm" |
| 4400 | " xstorm counter (0x%x) != stats_counter (0x%x)\n", | 4411 | " xstorm counter (0x%x) != stats_counter (0x%x)\n", |
| 4401 | i, xclient->stats_counter, bp->stats_counter); | 4412 | i, xclient->stats_counter, cur_stats_counter + 1); |
| 4402 | return -1; | 4413 | return -1; |
| 4403 | } | 4414 | } |
| 4404 | if ((u16)(le16_to_cpu(tclient->stats_counter) + 1) != | 4415 | if (le16_to_cpu(tclient->stats_counter) != cur_stats_counter) { |
| 4405 | bp->stats_counter) { | ||
| 4406 | DP(BNX2X_MSG_STATS, "[%d] stats not updated by tstorm" | 4416 | DP(BNX2X_MSG_STATS, "[%d] stats not updated by tstorm" |
| 4407 | " tstorm counter (0x%x) != stats_counter (0x%x)\n", | 4417 | " tstorm counter (0x%x) != stats_counter (0x%x)\n", |
| 4408 | i, tclient->stats_counter, bp->stats_counter); | 4418 | i, tclient->stats_counter, cur_stats_counter + 1); |
| 4409 | return -2; | 4419 | return -2; |
| 4410 | } | 4420 | } |
| 4411 | if ((u16)(le16_to_cpu(uclient->stats_counter) + 1) != | 4421 | if (le16_to_cpu(uclient->stats_counter) != cur_stats_counter) { |
| 4412 | bp->stats_counter) { | ||
| 4413 | DP(BNX2X_MSG_STATS, "[%d] stats not updated by ustorm" | 4422 | DP(BNX2X_MSG_STATS, "[%d] stats not updated by ustorm" |
| 4414 | " ustorm counter (0x%x) != stats_counter (0x%x)\n", | 4423 | " ustorm counter (0x%x) != stats_counter (0x%x)\n", |
| 4415 | i, uclient->stats_counter, bp->stats_counter); | 4424 | i, uclient->stats_counter, cur_stats_counter + 1); |
| 4416 | return -4; | 4425 | return -4; |
| 4417 | } | 4426 | } |
| 4418 | 4427 | ||
| @@ -4849,16 +4858,18 @@ static const struct { | |||
| 4849 | 4858 | ||
| 4850 | static void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event) | 4859 | static void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event) |
| 4851 | { | 4860 | { |
| 4852 | enum bnx2x_stats_state state = bp->stats_state; | 4861 | enum bnx2x_stats_state state; |
| 4853 | 4862 | ||
| 4854 | if (unlikely(bp->panic)) | 4863 | if (unlikely(bp->panic)) |
| 4855 | return; | 4864 | return; |
| 4856 | 4865 | ||
| 4857 | bnx2x_stats_stm[state][event].action(bp); | 4866 | /* Protect a state change flow */ |
| 4867 | spin_lock_bh(&bp->stats_lock); | ||
| 4868 | state = bp->stats_state; | ||
| 4858 | bp->stats_state = bnx2x_stats_stm[state][event].next_state; | 4869 | bp->stats_state = bnx2x_stats_stm[state][event].next_state; |
| 4870 | spin_unlock_bh(&bp->stats_lock); | ||
| 4859 | 4871 | ||
| 4860 | /* Make sure the state has been "changed" */ | 4872 | bnx2x_stats_stm[state][event].action(bp); |
| 4861 | smp_wmb(); | ||
| 4862 | 4873 | ||
| 4863 | if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp)) | 4874 | if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp)) |
| 4864 | DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n", | 4875 | DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n", |
| @@ -9908,6 +9919,7 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) | |||
| 9908 | 9919 | ||
| 9909 | mutex_init(&bp->port.phy_mutex); | 9920 | mutex_init(&bp->port.phy_mutex); |
| 9910 | mutex_init(&bp->fw_mb_mutex); | 9921 | mutex_init(&bp->fw_mb_mutex); |
| 9922 | spin_lock_init(&bp->stats_lock); | ||
| 9911 | #ifdef BCM_CNIC | 9923 | #ifdef BCM_CNIC |
| 9912 | mutex_init(&bp->cnic_mutex); | 9924 | mutex_init(&bp->cnic_mutex); |
| 9913 | #endif | 9925 | #endif |
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index df483076eda6..8d7dfd2f1e90 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
| @@ -822,7 +822,7 @@ static int rlb_initialize(struct bonding *bond) | |||
| 822 | 822 | ||
| 823 | /*initialize packet type*/ | 823 | /*initialize packet type*/ |
| 824 | pk_type->type = cpu_to_be16(ETH_P_ARP); | 824 | pk_type->type = cpu_to_be16(ETH_P_ARP); |
| 825 | pk_type->dev = NULL; | 825 | pk_type->dev = bond->dev; |
| 826 | pk_type->func = rlb_arp_recv; | 826 | pk_type->func = rlb_arp_recv; |
| 827 | 827 | ||
| 828 | /* register to receive ARPs */ | 828 | /* register to receive ARPs */ |
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 3881918f5382..cea37e0837ff 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
| @@ -1722,6 +1722,15 @@ static int __devinit igb_probe(struct pci_dev *pdev, | |||
| 1722 | u16 eeprom_apme_mask = IGB_EEPROM_APME; | 1722 | u16 eeprom_apme_mask = IGB_EEPROM_APME; |
| 1723 | u32 part_num; | 1723 | u32 part_num; |
| 1724 | 1724 | ||
| 1725 | /* Catch broken hardware that put the wrong VF device ID in | ||
| 1726 | * the PCIe SR-IOV capability. | ||
| 1727 | */ | ||
| 1728 | if (pdev->is_virtfn) { | ||
| 1729 | WARN(1, KERN_ERR "%s (%hx:%hx) should not be a VF!\n", | ||
| 1730 | pci_name(pdev), pdev->vendor, pdev->device); | ||
| 1731 | return -EINVAL; | ||
| 1732 | } | ||
| 1733 | |||
| 1725 | err = pci_enable_device_mem(pdev); | 1734 | err = pci_enable_device_mem(pdev); |
| 1726 | if (err) | 1735 | if (err) |
| 1727 | return err; | 1736 | return err; |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 7b5d9764f317..74d9b6df3029 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -6492,6 +6492,15 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
| 6492 | #endif | 6492 | #endif |
| 6493 | u32 part_num, eec; | 6493 | u32 part_num, eec; |
| 6494 | 6494 | ||
| 6495 | /* Catch broken hardware that put the wrong VF device ID in | ||
| 6496 | * the PCIe SR-IOV capability. | ||
| 6497 | */ | ||
| 6498 | if (pdev->is_virtfn) { | ||
| 6499 | WARN(1, KERN_ERR "%s (%hx:%hx) should not be a VF!\n", | ||
| 6500 | pci_name(pdev), pdev->vendor, pdev->device); | ||
| 6501 | return -EINVAL; | ||
| 6502 | } | ||
| 6503 | |||
| 6495 | err = pci_enable_device_mem(pdev); | 6504 | err = pci_enable_device_mem(pdev); |
| 6496 | if (err) | 6505 | if (err) |
| 6497 | return err; | 6506 | return err; |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 87e8d4cb4057..f15fe2cf72ae 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
| @@ -499,7 +499,7 @@ static const struct net_device_ops macvlan_netdev_ops = { | |||
| 499 | .ndo_validate_addr = eth_validate_addr, | 499 | .ndo_validate_addr = eth_validate_addr, |
| 500 | }; | 500 | }; |
| 501 | 501 | ||
| 502 | static void macvlan_setup(struct net_device *dev) | 502 | void macvlan_common_setup(struct net_device *dev) |
| 503 | { | 503 | { |
| 504 | ether_setup(dev); | 504 | ether_setup(dev); |
| 505 | 505 | ||
| @@ -508,6 +508,12 @@ static void macvlan_setup(struct net_device *dev) | |||
| 508 | dev->destructor = free_netdev; | 508 | dev->destructor = free_netdev; |
| 509 | dev->header_ops = &macvlan_hard_header_ops, | 509 | dev->header_ops = &macvlan_hard_header_ops, |
| 510 | dev->ethtool_ops = &macvlan_ethtool_ops; | 510 | dev->ethtool_ops = &macvlan_ethtool_ops; |
| 511 | } | ||
| 512 | EXPORT_SYMBOL_GPL(macvlan_common_setup); | ||
| 513 | |||
| 514 | static void macvlan_setup(struct net_device *dev) | ||
| 515 | { | ||
| 516 | macvlan_common_setup(dev); | ||
| 511 | dev->tx_queue_len = 0; | 517 | dev->tx_queue_len = 0; |
| 512 | } | 518 | } |
| 513 | 519 | ||
| @@ -705,7 +711,6 @@ int macvlan_link_register(struct rtnl_link_ops *ops) | |||
| 705 | /* common fields */ | 711 | /* common fields */ |
| 706 | ops->priv_size = sizeof(struct macvlan_dev); | 712 | ops->priv_size = sizeof(struct macvlan_dev); |
| 707 | ops->get_tx_queues = macvlan_get_tx_queues; | 713 | ops->get_tx_queues = macvlan_get_tx_queues; |
| 708 | ops->setup = macvlan_setup; | ||
| 709 | ops->validate = macvlan_validate; | 714 | ops->validate = macvlan_validate; |
| 710 | ops->maxtype = IFLA_MACVLAN_MAX; | 715 | ops->maxtype = IFLA_MACVLAN_MAX; |
| 711 | ops->policy = macvlan_policy; | 716 | ops->policy = macvlan_policy; |
| @@ -719,6 +724,7 @@ EXPORT_SYMBOL_GPL(macvlan_link_register); | |||
| 719 | 724 | ||
| 720 | static struct rtnl_link_ops macvlan_link_ops = { | 725 | static struct rtnl_link_ops macvlan_link_ops = { |
| 721 | .kind = "macvlan", | 726 | .kind = "macvlan", |
| 727 | .setup = macvlan_setup, | ||
| 722 | .newlink = macvlan_newlink, | 728 | .newlink = macvlan_newlink, |
| 723 | .dellink = macvlan_dellink, | 729 | .dellink = macvlan_dellink, |
| 724 | }; | 730 | }; |
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index a8a94e2f6ddc..ff02b836c3c4 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
| @@ -180,11 +180,18 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb) | |||
| 180 | { | 180 | { |
| 181 | struct macvtap_queue *q = macvtap_get_queue(dev, skb); | 181 | struct macvtap_queue *q = macvtap_get_queue(dev, skb); |
| 182 | if (!q) | 182 | if (!q) |
| 183 | return -ENOLINK; | 183 | goto drop; |
| 184 | |||
| 185 | if (skb_queue_len(&q->sk.sk_receive_queue) >= dev->tx_queue_len) | ||
| 186 | goto drop; | ||
| 184 | 187 | ||
| 185 | skb_queue_tail(&q->sk.sk_receive_queue, skb); | 188 | skb_queue_tail(&q->sk.sk_receive_queue, skb); |
| 186 | wake_up_interruptible_poll(sk_sleep(&q->sk), POLLIN | POLLRDNORM | POLLRDBAND); | 189 | wake_up_interruptible_poll(sk_sleep(&q->sk), POLLIN | POLLRDNORM | POLLRDBAND); |
| 187 | return 0; | 190 | return NET_RX_SUCCESS; |
| 191 | |||
| 192 | drop: | ||
| 193 | kfree_skb(skb); | ||
| 194 | return NET_RX_DROP; | ||
| 188 | } | 195 | } |
| 189 | 196 | ||
| 190 | /* | 197 | /* |
| @@ -235,8 +242,15 @@ static void macvtap_dellink(struct net_device *dev, | |||
| 235 | macvlan_dellink(dev, head); | 242 | macvlan_dellink(dev, head); |
| 236 | } | 243 | } |
| 237 | 244 | ||
| 245 | static void macvtap_setup(struct net_device *dev) | ||
| 246 | { | ||
| 247 | macvlan_common_setup(dev); | ||
| 248 | dev->tx_queue_len = TUN_READQ_SIZE; | ||
| 249 | } | ||
| 250 | |||
| 238 | static struct rtnl_link_ops macvtap_link_ops __read_mostly = { | 251 | static struct rtnl_link_ops macvtap_link_ops __read_mostly = { |
| 239 | .kind = "macvtap", | 252 | .kind = "macvtap", |
| 253 | .setup = macvtap_setup, | ||
| 240 | .newlink = macvtap_newlink, | 254 | .newlink = macvtap_newlink, |
| 241 | .dellink = macvtap_dellink, | 255 | .dellink = macvtap_dellink, |
| 242 | }; | 256 | }; |
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index 5e52c75892df..7f3a53dcc6ef 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h | |||
| @@ -65,7 +65,7 @@ static int debug_level = ERR_DBG; | |||
| 65 | 65 | ||
| 66 | /* DEBUG message print. */ | 66 | /* DEBUG message print. */ |
| 67 | #define DBG_PRINT(dbg_level, fmt, args...) do { \ | 67 | #define DBG_PRINT(dbg_level, fmt, args...) do { \ |
| 68 | if (dbg_level >= debug_level) \ | 68 | if (dbg_level <= debug_level) \ |
| 69 | pr_info(fmt, ##args); \ | 69 | pr_info(fmt, ##args); \ |
| 70 | } while (0) | 70 | } while (0) |
| 71 | 71 | ||
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 6ad6fe706312..63042596f0cf 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -736,8 +736,18 @@ static __inline__ ssize_t tun_put_user(struct tun_struct *tun, | |||
| 736 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 736 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
| 737 | else if (sinfo->gso_type & SKB_GSO_UDP) | 737 | else if (sinfo->gso_type & SKB_GSO_UDP) |
| 738 | gso.gso_type = VIRTIO_NET_HDR_GSO_UDP; | 738 | gso.gso_type = VIRTIO_NET_HDR_GSO_UDP; |
| 739 | else | 739 | else { |
| 740 | BUG(); | 740 | printk(KERN_ERR "tun: unexpected GSO type: " |
| 741 | "0x%x, gso_size %d, hdr_len %d\n", | ||
| 742 | sinfo->gso_type, gso.gso_size, | ||
| 743 | gso.hdr_len); | ||
| 744 | print_hex_dump(KERN_ERR, "tun: ", | ||
| 745 | DUMP_PREFIX_NONE, | ||
| 746 | 16, 1, skb->head, | ||
| 747 | min((int)gso.hdr_len, 64), true); | ||
| 748 | WARN_ON_ONCE(1); | ||
| 749 | return -EINVAL; | ||
| 750 | } | ||
| 741 | if (sinfo->gso_type & SKB_GSO_TCP_ECN) | 751 | if (sinfo->gso_type & SKB_GSO_TCP_ECN) |
| 742 | gso.gso_type |= VIRTIO_NET_HDR_GSO_ECN; | 752 | gso.gso_type |= VIRTIO_NET_HDR_GSO_ECN; |
| 743 | } else | 753 | } else |
diff --git a/drivers/net/wimax/i2400m/i2400m-usb.h b/drivers/net/wimax/i2400m/i2400m-usb.h index 2d7c96d7e865..eb80243e22df 100644 --- a/drivers/net/wimax/i2400m/i2400m-usb.h +++ b/drivers/net/wimax/i2400m/i2400m-usb.h | |||
| @@ -152,6 +152,7 @@ enum { | |||
| 152 | /* Device IDs */ | 152 | /* Device IDs */ |
| 153 | USB_DEVICE_ID_I6050 = 0x0186, | 153 | USB_DEVICE_ID_I6050 = 0x0186, |
| 154 | USB_DEVICE_ID_I6050_2 = 0x0188, | 154 | USB_DEVICE_ID_I6050_2 = 0x0188, |
| 155 | USB_DEVICE_ID_I6250 = 0x0187, | ||
| 155 | }; | 156 | }; |
| 156 | 157 | ||
| 157 | 158 | ||
diff --git a/drivers/net/wimax/i2400m/usb.c b/drivers/net/wimax/i2400m/usb.c index 0d5081d77dc0..d3365ac85dde 100644 --- a/drivers/net/wimax/i2400m/usb.c +++ b/drivers/net/wimax/i2400m/usb.c | |||
| @@ -491,6 +491,7 @@ int i2400mu_probe(struct usb_interface *iface, | |||
| 491 | switch (id->idProduct) { | 491 | switch (id->idProduct) { |
| 492 | case USB_DEVICE_ID_I6050: | 492 | case USB_DEVICE_ID_I6050: |
| 493 | case USB_DEVICE_ID_I6050_2: | 493 | case USB_DEVICE_ID_I6050_2: |
| 494 | case USB_DEVICE_ID_I6250: | ||
| 494 | i2400mu->i6050 = 1; | 495 | i2400mu->i6050 = 1; |
| 495 | break; | 496 | break; |
| 496 | default: | 497 | default: |
| @@ -739,6 +740,7 @@ static | |||
| 739 | struct usb_device_id i2400mu_id_table[] = { | 740 | struct usb_device_id i2400mu_id_table[] = { |
| 740 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050) }, | 741 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050) }, |
| 741 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050_2) }, | 742 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050_2) }, |
| 743 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6250) }, | ||
| 742 | { USB_DEVICE(0x8086, 0x0181) }, | 744 | { USB_DEVICE(0x8086, 0x0181) }, |
| 743 | { USB_DEVICE(0x8086, 0x1403) }, | 745 | { USB_DEVICE(0x8086, 0x1403) }, |
| 744 | { USB_DEVICE(0x8086, 0x1405) }, | 746 | { USB_DEVICE(0x8086, 0x1405) }, |
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index ca6065b71b46..e3e52913d83a 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
| @@ -844,9 +844,9 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) | |||
| 844 | int dma_type; | 844 | int dma_type; |
| 845 | 845 | ||
| 846 | if (edma) | 846 | if (edma) |
| 847 | dma_type = DMA_FROM_DEVICE; | ||
| 848 | else | ||
| 849 | dma_type = DMA_BIDIRECTIONAL; | 847 | dma_type = DMA_BIDIRECTIONAL; |
| 848 | else | ||
| 849 | dma_type = DMA_FROM_DEVICE; | ||
| 850 | 850 | ||
| 851 | qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP; | 851 | qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP; |
| 852 | spin_lock_bh(&sc->rx.rxbuflock); | 852 | spin_lock_bh(&sc->rx.rxbuflock); |
diff --git a/drivers/power/ds2782_battery.c b/drivers/power/ds2782_battery.c index 2afbeec8b791..84d3c43cf2bc 100644 --- a/drivers/power/ds2782_battery.c +++ b/drivers/power/ds2782_battery.c | |||
| @@ -43,10 +43,9 @@ | |||
| 43 | struct ds278x_info; | 43 | struct ds278x_info; |
| 44 | 44 | ||
| 45 | struct ds278x_battery_ops { | 45 | struct ds278x_battery_ops { |
| 46 | int (*get_current)(struct ds278x_info *info, int *current_uA); | 46 | int (*get_battery_current)(struct ds278x_info *info, int *current_uA); |
| 47 | int (*get_voltage)(struct ds278x_info *info, int *voltage_uA); | 47 | int (*get_battery_voltage)(struct ds278x_info *info, int *voltage_uA); |
| 48 | int (*get_capacity)(struct ds278x_info *info, int *capacity_uA); | 48 | int (*get_battery_capacity)(struct ds278x_info *info, int *capacity_uA); |
| 49 | |||
| 50 | }; | 49 | }; |
| 51 | 50 | ||
| 52 | #define to_ds278x_info(x) container_of(x, struct ds278x_info, battery) | 51 | #define to_ds278x_info(x) container_of(x, struct ds278x_info, battery) |
| @@ -213,11 +212,11 @@ static int ds278x_get_status(struct ds278x_info *info, int *status) | |||
| 213 | int current_uA; | 212 | int current_uA; |
| 214 | int capacity; | 213 | int capacity; |
| 215 | 214 | ||
| 216 | err = info->ops->get_current(info, ¤t_uA); | 215 | err = info->ops->get_battery_current(info, ¤t_uA); |
| 217 | if (err) | 216 | if (err) |
| 218 | return err; | 217 | return err; |
| 219 | 218 | ||
| 220 | err = info->ops->get_capacity(info, &capacity); | 219 | err = info->ops->get_battery_capacity(info, &capacity); |
| 221 | if (err) | 220 | if (err) |
| 222 | return err; | 221 | return err; |
| 223 | 222 | ||
| @@ -246,15 +245,15 @@ static int ds278x_battery_get_property(struct power_supply *psy, | |||
| 246 | break; | 245 | break; |
| 247 | 246 | ||
| 248 | case POWER_SUPPLY_PROP_CAPACITY: | 247 | case POWER_SUPPLY_PROP_CAPACITY: |
| 249 | ret = info->ops->get_capacity(info, &val->intval); | 248 | ret = info->ops->get_battery_capacity(info, &val->intval); |
| 250 | break; | 249 | break; |
| 251 | 250 | ||
| 252 | case POWER_SUPPLY_PROP_VOLTAGE_NOW: | 251 | case POWER_SUPPLY_PROP_VOLTAGE_NOW: |
| 253 | ret = info->ops->get_voltage(info, &val->intval); | 252 | ret = info->ops->get_battery_voltage(info, &val->intval); |
| 254 | break; | 253 | break; |
| 255 | 254 | ||
| 256 | case POWER_SUPPLY_PROP_CURRENT_NOW: | 255 | case POWER_SUPPLY_PROP_CURRENT_NOW: |
| 257 | ret = info->ops->get_current(info, &val->intval); | 256 | ret = info->ops->get_battery_current(info, &val->intval); |
| 258 | break; | 257 | break; |
| 259 | 258 | ||
| 260 | case POWER_SUPPLY_PROP_TEMP: | 259 | case POWER_SUPPLY_PROP_TEMP: |
| @@ -307,14 +306,14 @@ enum ds278x_num_id { | |||
| 307 | 306 | ||
| 308 | static struct ds278x_battery_ops ds278x_ops[] = { | 307 | static struct ds278x_battery_ops ds278x_ops[] = { |
| 309 | [DS2782] = { | 308 | [DS2782] = { |
| 310 | .get_current = ds2782_get_current, | 309 | .get_battery_current = ds2782_get_current, |
| 311 | .get_voltage = ds2782_get_voltage, | 310 | .get_battery_voltage = ds2782_get_voltage, |
| 312 | .get_capacity = ds2782_get_capacity, | 311 | .get_battery_capacity = ds2782_get_capacity, |
| 313 | }, | 312 | }, |
| 314 | [DS2786] = { | 313 | [DS2786] = { |
| 315 | .get_current = ds2786_get_current, | 314 | .get_battery_current = ds2786_get_current, |
| 316 | .get_voltage = ds2786_get_voltage, | 315 | .get_battery_voltage = ds2786_get_voltage, |
| 317 | .get_capacity = ds2786_get_capacity, | 316 | .get_battery_capacity = ds2786_get_capacity, |
| 318 | } | 317 | } |
| 319 | }; | 318 | }; |
| 320 | 319 | ||
diff --git a/drivers/regulator/ab3100.c b/drivers/regulator/ab3100.c index 7b14a67bdca2..11790990277a 100644 --- a/drivers/regulator/ab3100.c +++ b/drivers/regulator/ab3100.c | |||
| @@ -286,7 +286,7 @@ static int ab3100_list_voltage_regulator(struct regulator_dev *reg, | |||
| 286 | { | 286 | { |
| 287 | struct ab3100_regulator *abreg = reg->reg_data; | 287 | struct ab3100_regulator *abreg = reg->reg_data; |
| 288 | 288 | ||
| 289 | if (selector > abreg->voltages_len) | 289 | if (selector >= abreg->voltages_len) |
| 290 | return -EINVAL; | 290 | return -EINVAL; |
| 291 | return abreg->typ_voltages[selector]; | 291 | return abreg->typ_voltages[selector]; |
| 292 | } | 292 | } |
| @@ -318,7 +318,7 @@ static int ab3100_get_voltage_regulator(struct regulator_dev *reg) | |||
| 318 | regval &= 0xE0; | 318 | regval &= 0xE0; |
| 319 | regval >>= 5; | 319 | regval >>= 5; |
| 320 | 320 | ||
| 321 | if (regval > abreg->voltages_len) { | 321 | if (regval >= abreg->voltages_len) { |
| 322 | dev_err(®->dev, | 322 | dev_err(®->dev, |
| 323 | "regulator register %02x contains an illegal voltage setting\n", | 323 | "regulator register %02x contains an illegal voltage setting\n", |
| 324 | abreg->regreg); | 324 | abreg->regreg); |
diff --git a/drivers/regulator/tps6507x-regulator.c b/drivers/regulator/tps6507x-regulator.c index 14b4576281c5..8152d65220f5 100644 --- a/drivers/regulator/tps6507x-regulator.c +++ b/drivers/regulator/tps6507x-regulator.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
| 23 | #include <linux/regulator/driver.h> | 23 | #include <linux/regulator/driver.h> |
| 24 | #include <linux/regulator/machine.h> | 24 | #include <linux/regulator/machine.h> |
| 25 | #include <linux/regulator/tps6507x.h> | ||
| 25 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
| 26 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 27 | #include <linux/mfd/tps6507x.h> | 28 | #include <linux/mfd/tps6507x.h> |
| @@ -101,9 +102,12 @@ struct tps_info { | |||
| 101 | unsigned max_uV; | 102 | unsigned max_uV; |
| 102 | u8 table_len; | 103 | u8 table_len; |
| 103 | const u16 *table; | 104 | const u16 *table; |
| 105 | |||
| 106 | /* Does DCDC high or the low register defines output voltage? */ | ||
| 107 | bool defdcdc_default; | ||
| 104 | }; | 108 | }; |
| 105 | 109 | ||
| 106 | static const struct tps_info tps6507x_pmic_regs[] = { | 110 | static struct tps_info tps6507x_pmic_regs[] = { |
| 107 | { | 111 | { |
| 108 | .name = "VDCDC1", | 112 | .name = "VDCDC1", |
| 109 | .min_uV = 725000, | 113 | .min_uV = 725000, |
| @@ -145,7 +149,7 @@ struct tps6507x_pmic { | |||
| 145 | struct regulator_desc desc[TPS6507X_NUM_REGULATOR]; | 149 | struct regulator_desc desc[TPS6507X_NUM_REGULATOR]; |
| 146 | struct tps6507x_dev *mfd; | 150 | struct tps6507x_dev *mfd; |
| 147 | struct regulator_dev *rdev[TPS6507X_NUM_REGULATOR]; | 151 | struct regulator_dev *rdev[TPS6507X_NUM_REGULATOR]; |
| 148 | const struct tps_info *info[TPS6507X_NUM_REGULATOR]; | 152 | struct tps_info *info[TPS6507X_NUM_REGULATOR]; |
| 149 | struct mutex io_lock; | 153 | struct mutex io_lock; |
| 150 | }; | 154 | }; |
| 151 | static inline int tps6507x_pmic_read(struct tps6507x_pmic *tps, u8 reg) | 155 | static inline int tps6507x_pmic_read(struct tps6507x_pmic *tps, u8 reg) |
| @@ -341,10 +345,16 @@ static int tps6507x_pmic_dcdc_get_voltage(struct regulator_dev *dev) | |||
| 341 | reg = TPS6507X_REG_DEFDCDC1; | 345 | reg = TPS6507X_REG_DEFDCDC1; |
| 342 | break; | 346 | break; |
| 343 | case TPS6507X_DCDC_2: | 347 | case TPS6507X_DCDC_2: |
| 344 | reg = TPS6507X_REG_DEFDCDC2_LOW; | 348 | if (tps->info[dcdc]->defdcdc_default) |
| 349 | reg = TPS6507X_REG_DEFDCDC2_HIGH; | ||
| 350 | else | ||
| 351 | reg = TPS6507X_REG_DEFDCDC2_LOW; | ||
| 345 | break; | 352 | break; |
| 346 | case TPS6507X_DCDC_3: | 353 | case TPS6507X_DCDC_3: |
| 347 | reg = TPS6507X_REG_DEFDCDC3_LOW; | 354 | if (tps->info[dcdc]->defdcdc_default) |
| 355 | reg = TPS6507X_REG_DEFDCDC3_HIGH; | ||
| 356 | else | ||
| 357 | reg = TPS6507X_REG_DEFDCDC3_LOW; | ||
| 348 | break; | 358 | break; |
| 349 | default: | 359 | default: |
| 350 | return -EINVAL; | 360 | return -EINVAL; |
| @@ -370,10 +380,16 @@ static int tps6507x_pmic_dcdc_set_voltage(struct regulator_dev *dev, | |||
| 370 | reg = TPS6507X_REG_DEFDCDC1; | 380 | reg = TPS6507X_REG_DEFDCDC1; |
| 371 | break; | 381 | break; |
| 372 | case TPS6507X_DCDC_2: | 382 | case TPS6507X_DCDC_2: |
| 373 | reg = TPS6507X_REG_DEFDCDC2_LOW; | 383 | if (tps->info[dcdc]->defdcdc_default) |
| 384 | reg = TPS6507X_REG_DEFDCDC2_HIGH; | ||
| 385 | else | ||
| 386 | reg = TPS6507X_REG_DEFDCDC2_LOW; | ||
| 374 | break; | 387 | break; |
| 375 | case TPS6507X_DCDC_3: | 388 | case TPS6507X_DCDC_3: |
| 376 | reg = TPS6507X_REG_DEFDCDC3_LOW; | 389 | if (tps->info[dcdc]->defdcdc_default) |
| 390 | reg = TPS6507X_REG_DEFDCDC3_HIGH; | ||
| 391 | else | ||
| 392 | reg = TPS6507X_REG_DEFDCDC3_LOW; | ||
| 377 | break; | 393 | break; |
| 378 | default: | 394 | default: |
| 379 | return -EINVAL; | 395 | return -EINVAL; |
| @@ -532,7 +548,7 @@ int tps6507x_pmic_probe(struct platform_device *pdev) | |||
| 532 | { | 548 | { |
| 533 | struct tps6507x_dev *tps6507x_dev = dev_get_drvdata(pdev->dev.parent); | 549 | struct tps6507x_dev *tps6507x_dev = dev_get_drvdata(pdev->dev.parent); |
| 534 | static int desc_id; | 550 | static int desc_id; |
| 535 | const struct tps_info *info = &tps6507x_pmic_regs[0]; | 551 | struct tps_info *info = &tps6507x_pmic_regs[0]; |
| 536 | struct regulator_init_data *init_data; | 552 | struct regulator_init_data *init_data; |
| 537 | struct regulator_dev *rdev; | 553 | struct regulator_dev *rdev; |
| 538 | struct tps6507x_pmic *tps; | 554 | struct tps6507x_pmic *tps; |
| @@ -569,6 +585,12 @@ int tps6507x_pmic_probe(struct platform_device *pdev) | |||
| 569 | for (i = 0; i < TPS6507X_NUM_REGULATOR; i++, info++, init_data++) { | 585 | for (i = 0; i < TPS6507X_NUM_REGULATOR; i++, info++, init_data++) { |
| 570 | /* Register the regulators */ | 586 | /* Register the regulators */ |
| 571 | tps->info[i] = info; | 587 | tps->info[i] = info; |
| 588 | if (init_data->driver_data) { | ||
| 589 | struct tps6507x_reg_platform_data *data = | ||
| 590 | init_data->driver_data; | ||
| 591 | tps->info[i]->defdcdc_default = data->defdcdc_default; | ||
| 592 | } | ||
| 593 | |||
| 572 | tps->desc[i].name = info->name; | 594 | tps->desc[i].name = info->name; |
| 573 | tps->desc[i].id = desc_id++; | 595 | tps->desc[i].id = desc_id++; |
| 574 | tps->desc[i].n_voltages = num_voltages[i]; | 596 | tps->desc[i].n_voltages = num_voltages[i]; |
diff --git a/drivers/regulator/wm8350-regulator.c b/drivers/regulator/wm8350-regulator.c index 723cd1fb4867..0e6ed7db9364 100644 --- a/drivers/regulator/wm8350-regulator.c +++ b/drivers/regulator/wm8350-regulator.c | |||
| @@ -1495,7 +1495,7 @@ int wm8350_register_regulator(struct wm8350 *wm8350, int reg, | |||
| 1495 | if (ret != 0) { | 1495 | if (ret != 0) { |
| 1496 | dev_err(wm8350->dev, "Failed to register regulator %d: %d\n", | 1496 | dev_err(wm8350->dev, "Failed to register regulator %d: %d\n", |
| 1497 | reg, ret); | 1497 | reg, ret); |
| 1498 | platform_device_del(pdev); | 1498 | platform_device_put(pdev); |
| 1499 | wm8350->pmic.pdev[reg] = NULL; | 1499 | wm8350->pmic.pdev[reg] = NULL; |
| 1500 | } | 1500 | } |
| 1501 | 1501 | ||
diff --git a/drivers/rtc/rtc-rx8581.c b/drivers/rtc/rtc-rx8581.c index 9718aaaa8215..600b890a3c15 100644 --- a/drivers/rtc/rtc-rx8581.c +++ b/drivers/rtc/rtc-rx8581.c | |||
| @@ -168,7 +168,7 @@ static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
| 168 | return -EIO; | 168 | return -EIO; |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | err = i2c_smbus_write_byte_data(client, RX8581_REG_FLAG, | 171 | err = i2c_smbus_write_byte_data(client, RX8581_REG_CTRL, |
| 172 | (data | RX8581_CTRL_STOP)); | 172 | (data | RX8581_CTRL_STOP)); |
| 173 | if (err < 0) { | 173 | if (err < 0) { |
| 174 | dev_err(&client->dev, "Unable to write control register\n"); | 174 | dev_err(&client->dev, "Unable to write control register\n"); |
| @@ -182,6 +182,20 @@ static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
| 182 | return -EIO; | 182 | return -EIO; |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | /* get VLF and clear it */ | ||
| 186 | data = i2c_smbus_read_byte_data(client, RX8581_REG_FLAG); | ||
| 187 | if (data < 0) { | ||
| 188 | dev_err(&client->dev, "Unable to read flag register\n"); | ||
| 189 | return -EIO; | ||
| 190 | } | ||
| 191 | |||
| 192 | err = i2c_smbus_write_byte_data(client, RX8581_REG_FLAG, | ||
| 193 | (data & ~(RX8581_FLAG_VLF))); | ||
| 194 | if (err != 0) { | ||
| 195 | dev_err(&client->dev, "Unable to write flag register\n"); | ||
| 196 | return -EIO; | ||
| 197 | } | ||
| 198 | |||
| 185 | /* Restart the clock */ | 199 | /* Restart the clock */ |
| 186 | data = i2c_smbus_read_byte_data(client, RX8581_REG_CTRL); | 200 | data = i2c_smbus_read_byte_data(client, RX8581_REG_CTRL); |
| 187 | if (data < 0) { | 201 | if (data < 0) { |
| @@ -189,8 +203,8 @@ static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
| 189 | return -EIO; | 203 | return -EIO; |
| 190 | } | 204 | } |
| 191 | 205 | ||
| 192 | err = i2c_smbus_write_byte_data(client, RX8581_REG_FLAG, | 206 | err = i2c_smbus_write_byte_data(client, RX8581_REG_CTRL, |
| 193 | (data | ~(RX8581_CTRL_STOP))); | 207 | (data & ~(RX8581_CTRL_STOP))); |
| 194 | if (err != 0) { | 208 | if (err != 0) { |
| 195 | dev_err(&client->dev, "Unable to write control register\n"); | 209 | dev_err(&client->dev, "Unable to write control register\n"); |
| 196 | return -EIO; | 210 | return -EIO; |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index e3dbeda97179..fd068bc1bd0a 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
| @@ -714,6 +714,14 @@ static int zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *act) | |||
| 714 | if (zfcp_erp_adapter_strategy_open_fsf_xport(act) == ZFCP_ERP_FAILED) | 714 | if (zfcp_erp_adapter_strategy_open_fsf_xport(act) == ZFCP_ERP_FAILED) |
| 715 | return ZFCP_ERP_FAILED; | 715 | return ZFCP_ERP_FAILED; |
| 716 | 716 | ||
| 717 | if (mempool_resize(act->adapter->pool.status_read_data, | ||
| 718 | act->adapter->stat_read_buf_num, GFP_KERNEL)) | ||
| 719 | return ZFCP_ERP_FAILED; | ||
| 720 | |||
| 721 | if (mempool_resize(act->adapter->pool.status_read_req, | ||
| 722 | act->adapter->stat_read_buf_num, GFP_KERNEL)) | ||
| 723 | return ZFCP_ERP_FAILED; | ||
| 724 | |||
| 717 | atomic_set(&act->adapter->stat_miss, act->adapter->stat_read_buf_num); | 725 | atomic_set(&act->adapter->stat_miss, act->adapter->stat_read_buf_num); |
| 718 | if (zfcp_status_read_refill(act->adapter)) | 726 | if (zfcp_status_read_refill(act->adapter)) |
| 719 | return ZFCP_ERP_FAILED; | 727 | return ZFCP_ERP_FAILED; |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 9ac6a6e4a604..71663fb77310 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
| @@ -496,7 +496,8 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | |||
| 496 | 496 | ||
| 497 | adapter->hydra_version = bottom->adapter_type; | 497 | adapter->hydra_version = bottom->adapter_type; |
| 498 | adapter->timer_ticks = bottom->timer_interval; | 498 | adapter->timer_ticks = bottom->timer_interval; |
| 499 | adapter->stat_read_buf_num = max(bottom->status_read_buf_num, (u16)16); | 499 | adapter->stat_read_buf_num = max(bottom->status_read_buf_num, |
| 500 | (u16)FSF_STATUS_READS_RECOM); | ||
| 500 | 501 | ||
| 501 | if (fc_host_permanent_port_name(shost) == -1) | 502 | if (fc_host_permanent_port_name(shost) == -1) |
| 502 | fc_host_permanent_port_name(shost) = fc_host_port_name(shost); | 503 | fc_host_permanent_port_name(shost) = fc_host_port_name(shost); |
| @@ -719,11 +720,6 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio, | |||
| 719 | zfcp_qdio_req_init(adapter->qdio, &req->qdio_req, req->req_id, sbtype, | 720 | zfcp_qdio_req_init(adapter->qdio, &req->qdio_req, req->req_id, sbtype, |
| 720 | req->qtcb, sizeof(struct fsf_qtcb)); | 721 | req->qtcb, sizeof(struct fsf_qtcb)); |
| 721 | 722 | ||
| 722 | if (!(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) { | ||
| 723 | zfcp_fsf_req_free(req); | ||
| 724 | return ERR_PTR(-EIO); | ||
| 725 | } | ||
| 726 | |||
| 727 | return req; | 723 | return req; |
| 728 | } | 724 | } |
| 729 | 725 | ||
| @@ -981,7 +977,7 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req, | |||
| 981 | } | 977 | } |
| 982 | 978 | ||
| 983 | /* use single, unchained SBAL if it can hold the request */ | 979 | /* use single, unchained SBAL if it can hold the request */ |
| 984 | if (zfcp_qdio_sg_one_sbale(sg_req) || zfcp_qdio_sg_one_sbale(sg_resp)) { | 980 | if (zfcp_qdio_sg_one_sbale(sg_req) && zfcp_qdio_sg_one_sbale(sg_resp)) { |
| 985 | zfcp_fsf_setup_ct_els_unchained(adapter->qdio, &req->qdio_req, | 981 | zfcp_fsf_setup_ct_els_unchained(adapter->qdio, &req->qdio_req, |
| 986 | sg_req, sg_resp); | 982 | sg_req, sg_resp); |
| 987 | return 0; | 983 | return 0; |
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index 28117e130e2c..6fa5e0453176 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
| @@ -251,7 +251,8 @@ static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio) | |||
| 251 | struct zfcp_qdio_queue *req_q = &qdio->req_q; | 251 | struct zfcp_qdio_queue *req_q = &qdio->req_q; |
| 252 | 252 | ||
| 253 | spin_lock_bh(&qdio->req_q_lock); | 253 | spin_lock_bh(&qdio->req_q_lock); |
| 254 | if (atomic_read(&req_q->count)) | 254 | if (atomic_read(&req_q->count) || |
| 255 | !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) | ||
| 255 | return 1; | 256 | return 1; |
| 256 | spin_unlock_bh(&qdio->req_q_lock); | 257 | spin_unlock_bh(&qdio->req_q_lock); |
| 257 | return 0; | 258 | return 0; |
| @@ -274,8 +275,13 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio) | |||
| 274 | spin_unlock_bh(&qdio->req_q_lock); | 275 | spin_unlock_bh(&qdio->req_q_lock); |
| 275 | ret = wait_event_interruptible_timeout(qdio->req_q_wq, | 276 | ret = wait_event_interruptible_timeout(qdio->req_q_wq, |
| 276 | zfcp_qdio_sbal_check(qdio), 5 * HZ); | 277 | zfcp_qdio_sbal_check(qdio), 5 * HZ); |
| 278 | |||
| 279 | if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) | ||
| 280 | return -EIO; | ||
| 281 | |||
| 277 | if (ret > 0) | 282 | if (ret > 0) |
| 278 | return 0; | 283 | return 0; |
| 284 | |||
| 279 | if (!ret) { | 285 | if (!ret) { |
| 280 | atomic_inc(&qdio->req_q_full); | 286 | atomic_inc(&qdio->req_q_full); |
| 281 | /* assume hanging outbound queue, try queue recovery */ | 287 | /* assume hanging outbound queue, try queue recovery */ |
| @@ -375,6 +381,8 @@ void zfcp_qdio_close(struct zfcp_qdio *qdio) | |||
| 375 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status); | 381 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status); |
| 376 | spin_unlock_bh(&qdio->req_q_lock); | 382 | spin_unlock_bh(&qdio->req_q_lock); |
| 377 | 383 | ||
| 384 | wake_up(&qdio->req_q_wq); | ||
| 385 | |||
| 378 | qdio_shutdown(qdio->adapter->ccw_device, | 386 | qdio_shutdown(qdio->adapter->ccw_device, |
| 379 | QDIO_FLAG_CLEANUP_USING_CLEAR); | 387 | QDIO_FLAG_CLEANUP_USING_CLEAR); |
| 380 | 388 | ||
diff --git a/drivers/scsi/ibmvscsi/rpa_vscsi.c b/drivers/scsi/ibmvscsi/rpa_vscsi.c index a864ccc0a342..989b9a8ba72d 100644 --- a/drivers/scsi/ibmvscsi/rpa_vscsi.c +++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c | |||
| @@ -277,6 +277,12 @@ static int rpavscsi_init_crq_queue(struct crq_queue *queue, | |||
| 277 | goto reg_crq_failed; | 277 | goto reg_crq_failed; |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | queue->cur = 0; | ||
| 281 | spin_lock_init(&queue->lock); | ||
| 282 | |||
| 283 | tasklet_init(&hostdata->srp_task, (void *)rpavscsi_task, | ||
| 284 | (unsigned long)hostdata); | ||
| 285 | |||
| 280 | if (request_irq(vdev->irq, | 286 | if (request_irq(vdev->irq, |
| 281 | rpavscsi_handle_event, | 287 | rpavscsi_handle_event, |
| 282 | 0, "ibmvscsi", (void *)hostdata) != 0) { | 288 | 0, "ibmvscsi", (void *)hostdata) != 0) { |
| @@ -291,15 +297,10 @@ static int rpavscsi_init_crq_queue(struct crq_queue *queue, | |||
| 291 | goto req_irq_failed; | 297 | goto req_irq_failed; |
| 292 | } | 298 | } |
| 293 | 299 | ||
| 294 | queue->cur = 0; | ||
| 295 | spin_lock_init(&queue->lock); | ||
| 296 | |||
| 297 | tasklet_init(&hostdata->srp_task, (void *)rpavscsi_task, | ||
| 298 | (unsigned long)hostdata); | ||
| 299 | |||
| 300 | return retrc; | 300 | return retrc; |
| 301 | 301 | ||
| 302 | req_irq_failed: | 302 | req_irq_failed: |
| 303 | tasklet_kill(&hostdata->srp_task); | ||
| 303 | do { | 304 | do { |
| 304 | rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); | 305 | rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); |
| 305 | } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); | 306 | } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 82ea4a8226b0..f820cffb7f00 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
| @@ -1129,20 +1129,22 @@ static int ipr_is_same_device(struct ipr_resource_entry *res, | |||
| 1129 | } | 1129 | } |
| 1130 | 1130 | ||
| 1131 | /** | 1131 | /** |
| 1132 | * ipr_format_resource_path - Format the resource path for printing. | 1132 | * ipr_format_res_path - Format the resource path for printing. |
| 1133 | * @res_path: resource path | 1133 | * @res_path: resource path |
| 1134 | * @buf: buffer | 1134 | * @buf: buffer |
| 1135 | * | 1135 | * |
| 1136 | * Return value: | 1136 | * Return value: |
| 1137 | * pointer to buffer | 1137 | * pointer to buffer |
| 1138 | **/ | 1138 | **/ |
| 1139 | static char *ipr_format_resource_path(u8 *res_path, char *buffer) | 1139 | static char *ipr_format_res_path(u8 *res_path, char *buffer, int len) |
| 1140 | { | 1140 | { |
| 1141 | int i; | 1141 | int i; |
| 1142 | char *p = buffer; | ||
| 1142 | 1143 | ||
| 1143 | sprintf(buffer, "%02X", res_path[0]); | 1144 | res_path[0] = '\0'; |
| 1144 | for (i=1; res_path[i] != 0xff; i++) | 1145 | p += snprintf(p, buffer + len - p, "%02X", res_path[0]); |
| 1145 | sprintf(buffer, "%s-%02X", buffer, res_path[i]); | 1146 | for (i = 1; res_path[i] != 0xff && ((i * 3) < len); i++) |
| 1147 | p += snprintf(p, buffer + len - p, "-%02X", res_path[i]); | ||
| 1146 | 1148 | ||
| 1147 | return buffer; | 1149 | return buffer; |
| 1148 | } | 1150 | } |
| @@ -1187,7 +1189,8 @@ static void ipr_update_res_entry(struct ipr_resource_entry *res, | |||
| 1187 | 1189 | ||
| 1188 | if (res->sdev && new_path) | 1190 | if (res->sdev && new_path) |
| 1189 | sdev_printk(KERN_INFO, res->sdev, "Resource path: %s\n", | 1191 | sdev_printk(KERN_INFO, res->sdev, "Resource path: %s\n", |
| 1190 | ipr_format_resource_path(&res->res_path[0], &buffer[0])); | 1192 | ipr_format_res_path(res->res_path, buffer, |
| 1193 | sizeof(buffer))); | ||
| 1191 | } else { | 1194 | } else { |
| 1192 | res->flags = cfgtew->u.cfgte->flags; | 1195 | res->flags = cfgtew->u.cfgte->flags; |
| 1193 | if (res->flags & IPR_IS_IOA_RESOURCE) | 1196 | if (res->flags & IPR_IS_IOA_RESOURCE) |
| @@ -1573,7 +1576,8 @@ static void ipr_log_sis64_config_error(struct ipr_ioa_cfg *ioa_cfg, | |||
| 1573 | ipr_err_separator; | 1576 | ipr_err_separator; |
| 1574 | 1577 | ||
| 1575 | ipr_err("Device %d : %s", i + 1, | 1578 | ipr_err("Device %d : %s", i + 1, |
| 1576 | ipr_format_resource_path(&dev_entry->res_path[0], &buffer[0])); | 1579 | ipr_format_res_path(dev_entry->res_path, buffer, |
| 1580 | sizeof(buffer))); | ||
| 1577 | ipr_log_ext_vpd(&dev_entry->vpd); | 1581 | ipr_log_ext_vpd(&dev_entry->vpd); |
| 1578 | 1582 | ||
| 1579 | ipr_err("-----New Device Information-----\n"); | 1583 | ipr_err("-----New Device Information-----\n"); |
| @@ -1919,13 +1923,14 @@ static void ipr_log64_fabric_path(struct ipr_hostrcb *hostrcb, | |||
| 1919 | 1923 | ||
| 1920 | ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s\n", | 1924 | ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s\n", |
| 1921 | path_active_desc[i].desc, path_state_desc[j].desc, | 1925 | path_active_desc[i].desc, path_state_desc[j].desc, |
| 1922 | ipr_format_resource_path(&fabric->res_path[0], &buffer[0])); | 1926 | ipr_format_res_path(fabric->res_path, buffer, |
| 1927 | sizeof(buffer))); | ||
| 1923 | return; | 1928 | return; |
| 1924 | } | 1929 | } |
| 1925 | } | 1930 | } |
| 1926 | 1931 | ||
| 1927 | ipr_err("Path state=%02X Resource Path=%s\n", path_state, | 1932 | ipr_err("Path state=%02X Resource Path=%s\n", path_state, |
| 1928 | ipr_format_resource_path(&fabric->res_path[0], &buffer[0])); | 1933 | ipr_format_res_path(fabric->res_path, buffer, sizeof(buffer))); |
| 1929 | } | 1934 | } |
| 1930 | 1935 | ||
| 1931 | static const struct { | 1936 | static const struct { |
| @@ -2066,7 +2071,8 @@ static void ipr_log64_path_elem(struct ipr_hostrcb *hostrcb, | |||
| 2066 | 2071 | ||
| 2067 | ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s, Link rate=%s, WWN=%08X%08X\n", | 2072 | ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s, Link rate=%s, WWN=%08X%08X\n", |
| 2068 | path_status_desc[j].desc, path_type_desc[i].desc, | 2073 | path_status_desc[j].desc, path_type_desc[i].desc, |
| 2069 | ipr_format_resource_path(&cfg->res_path[0], &buffer[0]), | 2074 | ipr_format_res_path(cfg->res_path, buffer, |
| 2075 | sizeof(buffer)), | ||
| 2070 | link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], | 2076 | link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], |
| 2071 | be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); | 2077 | be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); |
| 2072 | return; | 2078 | return; |
| @@ -2074,7 +2080,7 @@ static void ipr_log64_path_elem(struct ipr_hostrcb *hostrcb, | |||
| 2074 | } | 2080 | } |
| 2075 | ipr_hcam_err(hostrcb, "Path element=%02X: Resource Path=%s, Link rate=%s " | 2081 | ipr_hcam_err(hostrcb, "Path element=%02X: Resource Path=%s, Link rate=%s " |
| 2076 | "WWN=%08X%08X\n", cfg->type_status, | 2082 | "WWN=%08X%08X\n", cfg->type_status, |
| 2077 | ipr_format_resource_path(&cfg->res_path[0], &buffer[0]), | 2083 | ipr_format_res_path(cfg->res_path, buffer, sizeof(buffer)), |
| 2078 | link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], | 2084 | link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], |
| 2079 | be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); | 2085 | be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); |
| 2080 | } | 2086 | } |
| @@ -2139,7 +2145,7 @@ static void ipr_log_sis64_array_error(struct ipr_ioa_cfg *ioa_cfg, | |||
| 2139 | 2145 | ||
| 2140 | ipr_err("RAID %s Array Configuration: %s\n", | 2146 | ipr_err("RAID %s Array Configuration: %s\n", |
| 2141 | error->protection_level, | 2147 | error->protection_level, |
| 2142 | ipr_format_resource_path(&error->last_res_path[0], &buffer[0])); | 2148 | ipr_format_res_path(error->last_res_path, buffer, sizeof(buffer))); |
| 2143 | 2149 | ||
| 2144 | ipr_err_separator; | 2150 | ipr_err_separator; |
| 2145 | 2151 | ||
| @@ -2160,9 +2166,11 @@ static void ipr_log_sis64_array_error(struct ipr_ioa_cfg *ioa_cfg, | |||
| 2160 | ipr_err("Array Member %d:\n", i); | 2166 | ipr_err("Array Member %d:\n", i); |
| 2161 | ipr_log_ext_vpd(&array_entry->vpd); | 2167 | ipr_log_ext_vpd(&array_entry->vpd); |
| 2162 | ipr_err("Current Location: %s", | 2168 | ipr_err("Current Location: %s", |
| 2163 | ipr_format_resource_path(&array_entry->res_path[0], &buffer[0])); | 2169 | ipr_format_res_path(array_entry->res_path, buffer, |
| 2170 | sizeof(buffer))); | ||
| 2164 | ipr_err("Expected Location: %s", | 2171 | ipr_err("Expected Location: %s", |
| 2165 | ipr_format_resource_path(&array_entry->expected_res_path[0], &buffer[0])); | 2172 | ipr_format_res_path(array_entry->expected_res_path, |
| 2173 | buffer, sizeof(buffer))); | ||
| 2166 | 2174 | ||
| 2167 | ipr_err_separator; | 2175 | ipr_err_separator; |
| 2168 | } | 2176 | } |
| @@ -4079,7 +4087,8 @@ static struct device_attribute ipr_adapter_handle_attr = { | |||
| 4079 | }; | 4087 | }; |
| 4080 | 4088 | ||
| 4081 | /** | 4089 | /** |
| 4082 | * ipr_show_resource_path - Show the resource path for this device. | 4090 | * ipr_show_resource_path - Show the resource path or the resource address for |
| 4091 | * this device. | ||
| 4083 | * @dev: device struct | 4092 | * @dev: device struct |
| 4084 | * @buf: buffer | 4093 | * @buf: buffer |
| 4085 | * | 4094 | * |
| @@ -4097,9 +4106,14 @@ static ssize_t ipr_show_resource_path(struct device *dev, struct device_attribut | |||
| 4097 | 4106 | ||
| 4098 | spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); | 4107 | spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); |
| 4099 | res = (struct ipr_resource_entry *)sdev->hostdata; | 4108 | res = (struct ipr_resource_entry *)sdev->hostdata; |
| 4100 | if (res) | 4109 | if (res && ioa_cfg->sis64) |
| 4101 | len = snprintf(buf, PAGE_SIZE, "%s\n", | 4110 | len = snprintf(buf, PAGE_SIZE, "%s\n", |
| 4102 | ipr_format_resource_path(&res->res_path[0], &buffer[0])); | 4111 | ipr_format_res_path(res->res_path, buffer, |
| 4112 | sizeof(buffer))); | ||
| 4113 | else if (res) | ||
| 4114 | len = snprintf(buf, PAGE_SIZE, "%d:%d:%d:%d\n", ioa_cfg->host->host_no, | ||
| 4115 | res->bus, res->target, res->lun); | ||
| 4116 | |||
| 4103 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | 4117 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); |
| 4104 | return len; | 4118 | return len; |
| 4105 | } | 4119 | } |
| @@ -4351,7 +4365,8 @@ static int ipr_slave_configure(struct scsi_device *sdev) | |||
| 4351 | scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); | 4365 | scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); |
| 4352 | if (ioa_cfg->sis64) | 4366 | if (ioa_cfg->sis64) |
| 4353 | sdev_printk(KERN_INFO, sdev, "Resource path: %s\n", | 4367 | sdev_printk(KERN_INFO, sdev, "Resource path: %s\n", |
| 4354 | ipr_format_resource_path(&res->res_path[0], &buffer[0])); | 4368 | ipr_format_res_path(res->res_path, buffer, |
| 4369 | sizeof(buffer))); | ||
| 4355 | return 0; | 4370 | return 0; |
| 4356 | } | 4371 | } |
| 4357 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | 4372 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); |
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index 9ecd2259eb39..b965f3587c9d 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h | |||
| @@ -1684,8 +1684,9 @@ struct ipr_ucode_image_header { | |||
| 1684 | if (ipr_is_device(hostrcb)) { \ | 1684 | if (ipr_is_device(hostrcb)) { \ |
| 1685 | if ((hostrcb)->ioa_cfg->sis64) { \ | 1685 | if ((hostrcb)->ioa_cfg->sis64) { \ |
| 1686 | printk(KERN_ERR IPR_NAME ": %s: " fmt, \ | 1686 | printk(KERN_ERR IPR_NAME ": %s: " fmt, \ |
| 1687 | ipr_format_resource_path(&hostrcb->hcam.u.error64.fd_res_path[0], \ | 1687 | ipr_format_res_path(hostrcb->hcam.u.error64.fd_res_path, \ |
| 1688 | &hostrcb->rp_buffer[0]), \ | 1688 | hostrcb->rp_buffer, \ |
| 1689 | sizeof(hostrcb->rp_buffer)), \ | ||
| 1689 | __VA_ARGS__); \ | 1690 | __VA_ARGS__); \ |
| 1690 | } else { \ | 1691 | } else { \ |
| 1691 | ipr_ra_err((hostrcb)->ioa_cfg, \ | 1692 | ipr_ra_err((hostrcb)->ioa_cfg, \ |
diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index d61e3b28ce37..36d961f342af 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c | |||
| @@ -146,7 +146,7 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 146 | while (rdir->head < rdir->tail) { | 146 | while (rdir->head < rdir->tail) { |
| 147 | p9stat_init(&st); | 147 | p9stat_init(&st); |
| 148 | err = p9stat_read(rdir->buf + rdir->head, | 148 | err = p9stat_read(rdir->buf + rdir->head, |
| 149 | buflen - rdir->head, &st, | 149 | rdir->tail - rdir->head, &st, |
| 150 | fid->clnt->proto_version); | 150 | fid->clnt->proto_version); |
| 151 | if (err) { | 151 | if (err) { |
| 152 | P9_DPRINTK(P9_DEBUG_VFS, "returned %d\n", err); | 152 | P9_DPRINTK(P9_DEBUG_VFS, "returned %d\n", err); |
diff --git a/fs/ceph/Kconfig b/fs/ceph/Kconfig index 04b8280582a9..bc87b9c1d27e 100644 --- a/fs/ceph/Kconfig +++ b/fs/ceph/Kconfig | |||
| @@ -2,7 +2,7 @@ config CEPH_FS | |||
| 2 | tristate "Ceph distributed file system (EXPERIMENTAL)" | 2 | tristate "Ceph distributed file system (EXPERIMENTAL)" |
| 3 | depends on INET && EXPERIMENTAL | 3 | depends on INET && EXPERIMENTAL |
| 4 | select LIBCRC32C | 4 | select LIBCRC32C |
| 5 | select CONFIG_CRYPTO_AES | 5 | select CRYPTO_AES |
| 6 | help | 6 | help |
| 7 | Choose Y or M here to include support for mounting the | 7 | Choose Y or M here to include support for mounting the |
| 8 | experimental Ceph distributed file system. Ceph is an extremely | 8 | experimental Ceph distributed file system. Ceph is an extremely |
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 74144d6389f0..b81be9a56487 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -627,7 +627,7 @@ retry: | |||
| 627 | if (fmode >= 0) | 627 | if (fmode >= 0) |
| 628 | __ceph_get_fmode(ci, fmode); | 628 | __ceph_get_fmode(ci, fmode); |
| 629 | spin_unlock(&inode->i_lock); | 629 | spin_unlock(&inode->i_lock); |
| 630 | wake_up(&ci->i_cap_wq); | 630 | wake_up_all(&ci->i_cap_wq); |
| 631 | return 0; | 631 | return 0; |
| 632 | } | 632 | } |
| 633 | 633 | ||
| @@ -1181,7 +1181,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | |||
| 1181 | } | 1181 | } |
| 1182 | 1182 | ||
| 1183 | if (wake) | 1183 | if (wake) |
| 1184 | wake_up(&ci->i_cap_wq); | 1184 | wake_up_all(&ci->i_cap_wq); |
| 1185 | 1185 | ||
| 1186 | return delayed; | 1186 | return delayed; |
| 1187 | } | 1187 | } |
| @@ -2153,7 +2153,7 @@ void ceph_put_cap_refs(struct ceph_inode_info *ci, int had) | |||
| 2153 | else if (flushsnaps) | 2153 | else if (flushsnaps) |
| 2154 | ceph_flush_snaps(ci); | 2154 | ceph_flush_snaps(ci); |
| 2155 | if (wake) | 2155 | if (wake) |
| 2156 | wake_up(&ci->i_cap_wq); | 2156 | wake_up_all(&ci->i_cap_wq); |
| 2157 | if (put) | 2157 | if (put) |
| 2158 | iput(inode); | 2158 | iput(inode); |
| 2159 | } | 2159 | } |
| @@ -2229,7 +2229,7 @@ void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr, | |||
| 2229 | iput(inode); | 2229 | iput(inode); |
| 2230 | } else if (complete_capsnap) { | 2230 | } else if (complete_capsnap) { |
| 2231 | ceph_flush_snaps(ci); | 2231 | ceph_flush_snaps(ci); |
| 2232 | wake_up(&ci->i_cap_wq); | 2232 | wake_up_all(&ci->i_cap_wq); |
| 2233 | } | 2233 | } |
| 2234 | if (drop_capsnap) | 2234 | if (drop_capsnap) |
| 2235 | iput(inode); | 2235 | iput(inode); |
| @@ -2405,7 +2405,7 @@ static void handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant, | |||
| 2405 | if (queue_invalidate) | 2405 | if (queue_invalidate) |
| 2406 | ceph_queue_invalidate(inode); | 2406 | ceph_queue_invalidate(inode); |
| 2407 | if (wake) | 2407 | if (wake) |
| 2408 | wake_up(&ci->i_cap_wq); | 2408 | wake_up_all(&ci->i_cap_wq); |
| 2409 | 2409 | ||
| 2410 | if (check_caps == 1) | 2410 | if (check_caps == 1) |
| 2411 | ceph_check_caps(ci, CHECK_CAPS_NODELAY|CHECK_CAPS_AUTHONLY, | 2411 | ceph_check_caps(ci, CHECK_CAPS_NODELAY|CHECK_CAPS_AUTHONLY, |
| @@ -2460,7 +2460,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid, | |||
| 2460 | struct ceph_inode_info, | 2460 | struct ceph_inode_info, |
| 2461 | i_flushing_item)->vfs_inode); | 2461 | i_flushing_item)->vfs_inode); |
| 2462 | mdsc->num_cap_flushing--; | 2462 | mdsc->num_cap_flushing--; |
| 2463 | wake_up(&mdsc->cap_flushing_wq); | 2463 | wake_up_all(&mdsc->cap_flushing_wq); |
| 2464 | dout(" inode %p now !flushing\n", inode); | 2464 | dout(" inode %p now !flushing\n", inode); |
| 2465 | 2465 | ||
| 2466 | if (ci->i_dirty_caps == 0) { | 2466 | if (ci->i_dirty_caps == 0) { |
| @@ -2472,7 +2472,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid, | |||
| 2472 | } | 2472 | } |
| 2473 | } | 2473 | } |
| 2474 | spin_unlock(&mdsc->cap_dirty_lock); | 2474 | spin_unlock(&mdsc->cap_dirty_lock); |
| 2475 | wake_up(&ci->i_cap_wq); | 2475 | wake_up_all(&ci->i_cap_wq); |
| 2476 | 2476 | ||
| 2477 | out: | 2477 | out: |
| 2478 | spin_unlock(&inode->i_lock); | 2478 | spin_unlock(&inode->i_lock); |
| @@ -2984,6 +2984,7 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry, | |||
| 2984 | memcpy(*p, dentry->d_name.name, dentry->d_name.len); | 2984 | memcpy(*p, dentry->d_name.name, dentry->d_name.len); |
| 2985 | *p += dentry->d_name.len; | 2985 | *p += dentry->d_name.len; |
| 2986 | rel->dname_seq = cpu_to_le32(di->lease_seq); | 2986 | rel->dname_seq = cpu_to_le32(di->lease_seq); |
| 2987 | __ceph_mdsc_drop_dentry_lease(dentry); | ||
| 2987 | } | 2988 | } |
| 2988 | spin_unlock(&dentry->d_lock); | 2989 | spin_unlock(&dentry->d_lock); |
| 2989 | return ret; | 2990 | return ret; |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index f85719310db2..f94ed3c7f6a5 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -266,6 +266,7 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 266 | spin_lock(&inode->i_lock); | 266 | spin_lock(&inode->i_lock); |
| 267 | if ((filp->f_pos == 2 || fi->dentry) && | 267 | if ((filp->f_pos == 2 || fi->dentry) && |
| 268 | !ceph_test_opt(client, NOASYNCREADDIR) && | 268 | !ceph_test_opt(client, NOASYNCREADDIR) && |
| 269 | ceph_snap(inode) != CEPH_SNAPDIR && | ||
| 269 | (ci->i_ceph_flags & CEPH_I_COMPLETE) && | 270 | (ci->i_ceph_flags & CEPH_I_COMPLETE) && |
| 270 | __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) { | 271 | __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) { |
| 271 | err = __dcache_readdir(filp, dirent, filldir); | 272 | err = __dcache_readdir(filp, dirent, filldir); |
| @@ -1013,18 +1014,22 @@ out_touch: | |||
| 1013 | 1014 | ||
| 1014 | /* | 1015 | /* |
| 1015 | * When a dentry is released, clear the dir I_COMPLETE if it was part | 1016 | * When a dentry is released, clear the dir I_COMPLETE if it was part |
| 1016 | * of the current dir gen. | 1017 | * of the current dir gen or if this is in the snapshot namespace. |
| 1017 | */ | 1018 | */ |
| 1018 | static void ceph_dentry_release(struct dentry *dentry) | 1019 | static void ceph_dentry_release(struct dentry *dentry) |
| 1019 | { | 1020 | { |
| 1020 | struct ceph_dentry_info *di = ceph_dentry(dentry); | 1021 | struct ceph_dentry_info *di = ceph_dentry(dentry); |
| 1021 | struct inode *parent_inode = dentry->d_parent->d_inode; | 1022 | struct inode *parent_inode = dentry->d_parent->d_inode; |
| 1023 | u64 snapid = ceph_snap(parent_inode); | ||
| 1022 | 1024 | ||
| 1023 | if (parent_inode) { | 1025 | dout("dentry_release %p parent %p\n", dentry, parent_inode); |
| 1026 | |||
| 1027 | if (parent_inode && snapid != CEPH_SNAPDIR) { | ||
| 1024 | struct ceph_inode_info *ci = ceph_inode(parent_inode); | 1028 | struct ceph_inode_info *ci = ceph_inode(parent_inode); |
| 1025 | 1029 | ||
| 1026 | spin_lock(&parent_inode->i_lock); | 1030 | spin_lock(&parent_inode->i_lock); |
| 1027 | if (ci->i_shared_gen == di->lease_shared_gen) { | 1031 | if (ci->i_shared_gen == di->lease_shared_gen || |
| 1032 | snapid <= CEPH_MAXSNAP) { | ||
| 1028 | dout(" clearing %p complete (d_release)\n", | 1033 | dout(" clearing %p complete (d_release)\n", |
| 1029 | parent_inode); | 1034 | parent_inode); |
| 1030 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; | 1035 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; |
| @@ -1241,7 +1246,9 @@ struct dentry_operations ceph_dentry_ops = { | |||
| 1241 | 1246 | ||
| 1242 | struct dentry_operations ceph_snapdir_dentry_ops = { | 1247 | struct dentry_operations ceph_snapdir_dentry_ops = { |
| 1243 | .d_revalidate = ceph_snapdir_d_revalidate, | 1248 | .d_revalidate = ceph_snapdir_d_revalidate, |
| 1249 | .d_release = ceph_dentry_release, | ||
| 1244 | }; | 1250 | }; |
| 1245 | 1251 | ||
| 1246 | struct dentry_operations ceph_snap_dentry_ops = { | 1252 | struct dentry_operations ceph_snap_dentry_ops = { |
| 1253 | .d_release = ceph_dentry_release, | ||
| 1247 | }; | 1254 | }; |
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 6251a1574b94..7c08698fad3e 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
| @@ -265,7 +265,7 @@ int ceph_release(struct inode *inode, struct file *file) | |||
| 265 | kmem_cache_free(ceph_file_cachep, cf); | 265 | kmem_cache_free(ceph_file_cachep, cf); |
| 266 | 266 | ||
| 267 | /* wake up anyone waiting for caps on this inode */ | 267 | /* wake up anyone waiting for caps on this inode */ |
| 268 | wake_up(&ci->i_cap_wq); | 268 | wake_up_all(&ci->i_cap_wq); |
| 269 | return 0; | 269 | return 0; |
| 270 | } | 270 | } |
| 271 | 271 | ||
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 8f9b9fe8ef9f..389f9dbd9949 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -1199,8 +1199,10 @@ retry_lookup: | |||
| 1199 | goto out; | 1199 | goto out; |
| 1200 | } | 1200 | } |
| 1201 | err = ceph_init_dentry(dn); | 1201 | err = ceph_init_dentry(dn); |
| 1202 | if (err < 0) | 1202 | if (err < 0) { |
| 1203 | dput(dn); | ||
| 1203 | goto out; | 1204 | goto out; |
| 1205 | } | ||
| 1204 | } else if (dn->d_inode && | 1206 | } else if (dn->d_inode && |
| 1205 | (ceph_ino(dn->d_inode) != vino.ino || | 1207 | (ceph_ino(dn->d_inode) != vino.ino || |
| 1206 | ceph_snap(dn->d_inode) != vino.snap)) { | 1208 | ceph_snap(dn->d_inode) != vino.snap)) { |
| @@ -1499,7 +1501,7 @@ retry: | |||
| 1499 | if (wrbuffer_refs == 0) | 1501 | if (wrbuffer_refs == 0) |
| 1500 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); | 1502 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); |
| 1501 | if (wake) | 1503 | if (wake) |
| 1502 | wake_up(&ci->i_cap_wq); | 1504 | wake_up_all(&ci->i_cap_wq); |
| 1503 | } | 1505 | } |
| 1504 | 1506 | ||
| 1505 | 1507 | ||
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 416c08d315db..dd440bd438a9 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -868,7 +868,7 @@ static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap, | |||
| 868 | { | 868 | { |
| 869 | struct ceph_inode_info *ci = ceph_inode(inode); | 869 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 870 | 870 | ||
| 871 | wake_up(&ci->i_cap_wq); | 871 | wake_up_all(&ci->i_cap_wq); |
| 872 | if (arg) { | 872 | if (arg) { |
| 873 | spin_lock(&inode->i_lock); | 873 | spin_lock(&inode->i_lock); |
| 874 | ci->i_wanted_max_size = 0; | 874 | ci->i_wanted_max_size = 0; |
| @@ -1564,7 +1564,7 @@ static void complete_request(struct ceph_mds_client *mdsc, | |||
| 1564 | if (req->r_callback) | 1564 | if (req->r_callback) |
| 1565 | req->r_callback(mdsc, req); | 1565 | req->r_callback(mdsc, req); |
| 1566 | else | 1566 | else |
| 1567 | complete(&req->r_completion); | 1567 | complete_all(&req->r_completion); |
| 1568 | } | 1568 | } |
| 1569 | 1569 | ||
| 1570 | /* | 1570 | /* |
| @@ -1932,7 +1932,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) | |||
| 1932 | if (head->safe) { | 1932 | if (head->safe) { |
| 1933 | req->r_got_safe = true; | 1933 | req->r_got_safe = true; |
| 1934 | __unregister_request(mdsc, req); | 1934 | __unregister_request(mdsc, req); |
| 1935 | complete(&req->r_safe_completion); | 1935 | complete_all(&req->r_safe_completion); |
| 1936 | 1936 | ||
| 1937 | if (req->r_got_unsafe) { | 1937 | if (req->r_got_unsafe) { |
| 1938 | /* | 1938 | /* |
| @@ -1947,7 +1947,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) | |||
| 1947 | 1947 | ||
| 1948 | /* last unsafe request during umount? */ | 1948 | /* last unsafe request during umount? */ |
| 1949 | if (mdsc->stopping && !__get_oldest_req(mdsc)) | 1949 | if (mdsc->stopping && !__get_oldest_req(mdsc)) |
| 1950 | complete(&mdsc->safe_umount_waiters); | 1950 | complete_all(&mdsc->safe_umount_waiters); |
| 1951 | mutex_unlock(&mdsc->mutex); | 1951 | mutex_unlock(&mdsc->mutex); |
| 1952 | goto out; | 1952 | goto out; |
| 1953 | } | 1953 | } |
| @@ -2126,7 +2126,7 @@ static void handle_session(struct ceph_mds_session *session, | |||
| 2126 | pr_info("mds%d reconnect denied\n", session->s_mds); | 2126 | pr_info("mds%d reconnect denied\n", session->s_mds); |
| 2127 | remove_session_caps(session); | 2127 | remove_session_caps(session); |
| 2128 | wake = 1; /* for good measure */ | 2128 | wake = 1; /* for good measure */ |
| 2129 | complete(&mdsc->session_close_waiters); | 2129 | complete_all(&mdsc->session_close_waiters); |
| 2130 | kick_requests(mdsc, mds); | 2130 | kick_requests(mdsc, mds); |
| 2131 | break; | 2131 | break; |
| 2132 | 2132 | ||
diff --git a/fs/ceph/mon_client.c b/fs/ceph/mon_client.c index cc115eafae11..54fe01c50706 100644 --- a/fs/ceph/mon_client.c +++ b/fs/ceph/mon_client.c | |||
| @@ -345,7 +345,7 @@ static void ceph_monc_handle_map(struct ceph_mon_client *monc, | |||
| 345 | 345 | ||
| 346 | out: | 346 | out: |
| 347 | mutex_unlock(&monc->mutex); | 347 | mutex_unlock(&monc->mutex); |
| 348 | wake_up(&client->auth_wq); | 348 | wake_up_all(&client->auth_wq); |
| 349 | } | 349 | } |
| 350 | 350 | ||
| 351 | /* | 351 | /* |
| @@ -462,7 +462,7 @@ static void handle_statfs_reply(struct ceph_mon_client *monc, | |||
| 462 | } | 462 | } |
| 463 | mutex_unlock(&monc->mutex); | 463 | mutex_unlock(&monc->mutex); |
| 464 | if (req) { | 464 | if (req) { |
| 465 | complete(&req->completion); | 465 | complete_all(&req->completion); |
| 466 | put_generic_request(req); | 466 | put_generic_request(req); |
| 467 | } | 467 | } |
| 468 | return; | 468 | return; |
| @@ -718,7 +718,7 @@ static void handle_auth_reply(struct ceph_mon_client *monc, | |||
| 718 | monc->m_auth->front_max); | 718 | monc->m_auth->front_max); |
| 719 | if (ret < 0) { | 719 | if (ret < 0) { |
| 720 | monc->client->auth_err = ret; | 720 | monc->client->auth_err = ret; |
| 721 | wake_up(&monc->client->auth_wq); | 721 | wake_up_all(&monc->client->auth_wq); |
| 722 | } else if (ret > 0) { | 722 | } else if (ret > 0) { |
| 723 | __send_prepared_auth_request(monc, ret); | 723 | __send_prepared_auth_request(monc, ret); |
| 724 | } else if (!was_auth && monc->auth->ops->is_authenticated(monc->auth)) { | 724 | } else if (!was_auth && monc->auth->ops->is_authenticated(monc->auth)) { |
diff --git a/fs/ceph/osd_client.c b/fs/ceph/osd_client.c index 92b7251a53f1..e38522347898 100644 --- a/fs/ceph/osd_client.c +++ b/fs/ceph/osd_client.c | |||
| @@ -862,12 +862,12 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 862 | if (req->r_callback) | 862 | if (req->r_callback) |
| 863 | req->r_callback(req, msg); | 863 | req->r_callback(req, msg); |
| 864 | else | 864 | else |
| 865 | complete(&req->r_completion); | 865 | complete_all(&req->r_completion); |
| 866 | 866 | ||
| 867 | if (flags & CEPH_OSD_FLAG_ONDISK) { | 867 | if (flags & CEPH_OSD_FLAG_ONDISK) { |
| 868 | if (req->r_safe_callback) | 868 | if (req->r_safe_callback) |
| 869 | req->r_safe_callback(req, msg); | 869 | req->r_safe_callback(req, msg); |
| 870 | complete(&req->r_safe_completion); /* fsync waiter */ | 870 | complete_all(&req->r_safe_completion); /* fsync waiter */ |
| 871 | } | 871 | } |
| 872 | 872 | ||
| 873 | done: | 873 | done: |
| @@ -1083,7 +1083,7 @@ done: | |||
| 1083 | if (newmap) | 1083 | if (newmap) |
| 1084 | kick_requests(osdc, NULL); | 1084 | kick_requests(osdc, NULL); |
| 1085 | up_read(&osdc->map_sem); | 1085 | up_read(&osdc->map_sem); |
| 1086 | wake_up(&osdc->client->auth_wq); | 1086 | wake_up_all(&osdc->client->auth_wq); |
| 1087 | return; | 1087 | return; |
| 1088 | 1088 | ||
| 1089 | bad: | 1089 | bad: |
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c index 277f8b339577..416d46adbf87 100644 --- a/fs/ceph/osdmap.c +++ b/fs/ceph/osdmap.c | |||
| @@ -831,12 +831,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 831 | /* remove any? */ | 831 | /* remove any? */ |
| 832 | while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping, | 832 | while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping, |
| 833 | node)->pgid, pgid) <= 0) { | 833 | node)->pgid, pgid) <= 0) { |
| 834 | struct rb_node *cur = rbp; | 834 | struct ceph_pg_mapping *cur = |
| 835 | rb_entry(rbp, struct ceph_pg_mapping, node); | ||
| 836 | |||
| 835 | rbp = rb_next(rbp); | 837 | rbp = rb_next(rbp); |
| 836 | dout(" removed pg_temp %llx\n", | 838 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); |
| 837 | *(u64 *)&rb_entry(cur, struct ceph_pg_mapping, | 839 | rb_erase(&cur->node, &map->pg_temp); |
| 838 | node)->pgid); | 840 | kfree(cur); |
| 839 | rb_erase(cur, &map->pg_temp); | ||
| 840 | } | 841 | } |
| 841 | 842 | ||
| 842 | if (pglen) { | 843 | if (pglen) { |
| @@ -852,19 +853,22 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 852 | for (j = 0; j < pglen; j++) | 853 | for (j = 0; j < pglen; j++) |
| 853 | pg->osds[j] = ceph_decode_32(p); | 854 | pg->osds[j] = ceph_decode_32(p); |
| 854 | err = __insert_pg_mapping(pg, &map->pg_temp); | 855 | err = __insert_pg_mapping(pg, &map->pg_temp); |
| 855 | if (err) | 856 | if (err) { |
| 857 | kfree(pg); | ||
| 856 | goto bad; | 858 | goto bad; |
| 859 | } | ||
| 857 | dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, | 860 | dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, |
| 858 | pglen); | 861 | pglen); |
| 859 | } | 862 | } |
| 860 | } | 863 | } |
| 861 | while (rbp) { | 864 | while (rbp) { |
| 862 | struct rb_node *cur = rbp; | 865 | struct ceph_pg_mapping *cur = |
| 866 | rb_entry(rbp, struct ceph_pg_mapping, node); | ||
| 867 | |||
| 863 | rbp = rb_next(rbp); | 868 | rbp = rb_next(rbp); |
| 864 | dout(" removed pg_temp %llx\n", | 869 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); |
| 865 | *(u64 *)&rb_entry(cur, struct ceph_pg_mapping, | 870 | rb_erase(&cur->node, &map->pg_temp); |
| 866 | node)->pgid); | 871 | kfree(cur); |
| 867 | rb_erase(cur, &map->pg_temp); | ||
| 868 | } | 872 | } |
| 869 | 873 | ||
| 870 | /* ignore the rest */ | 874 | /* ignore the rest */ |
diff --git a/fs/ecryptfs/messaging.c b/fs/ecryptfs/messaging.c index 2d8dbce9d485..46c4dd8dfcc3 100644 --- a/fs/ecryptfs/messaging.c +++ b/fs/ecryptfs/messaging.c | |||
| @@ -31,9 +31,9 @@ static struct mutex ecryptfs_msg_ctx_lists_mux; | |||
| 31 | 31 | ||
| 32 | static struct hlist_head *ecryptfs_daemon_hash; | 32 | static struct hlist_head *ecryptfs_daemon_hash; |
| 33 | struct mutex ecryptfs_daemon_hash_mux; | 33 | struct mutex ecryptfs_daemon_hash_mux; |
| 34 | static int ecryptfs_hash_buckets; | 34 | static int ecryptfs_hash_bits; |
| 35 | #define ecryptfs_uid_hash(uid) \ | 35 | #define ecryptfs_uid_hash(uid) \ |
| 36 | hash_long((unsigned long)uid, ecryptfs_hash_buckets) | 36 | hash_long((unsigned long)uid, ecryptfs_hash_bits) |
| 37 | 37 | ||
| 38 | static u32 ecryptfs_msg_counter; | 38 | static u32 ecryptfs_msg_counter; |
| 39 | static struct ecryptfs_msg_ctx *ecryptfs_msg_ctx_arr; | 39 | static struct ecryptfs_msg_ctx *ecryptfs_msg_ctx_arr; |
| @@ -486,18 +486,19 @@ int ecryptfs_init_messaging(void) | |||
| 486 | } | 486 | } |
| 487 | mutex_init(&ecryptfs_daemon_hash_mux); | 487 | mutex_init(&ecryptfs_daemon_hash_mux); |
| 488 | mutex_lock(&ecryptfs_daemon_hash_mux); | 488 | mutex_lock(&ecryptfs_daemon_hash_mux); |
| 489 | ecryptfs_hash_buckets = 1; | 489 | ecryptfs_hash_bits = 1; |
| 490 | while (ecryptfs_number_of_users >> ecryptfs_hash_buckets) | 490 | while (ecryptfs_number_of_users >> ecryptfs_hash_bits) |
| 491 | ecryptfs_hash_buckets++; | 491 | ecryptfs_hash_bits++; |
| 492 | ecryptfs_daemon_hash = kmalloc((sizeof(struct hlist_head) | 492 | ecryptfs_daemon_hash = kmalloc((sizeof(struct hlist_head) |
| 493 | * ecryptfs_hash_buckets), GFP_KERNEL); | 493 | * (1 << ecryptfs_hash_bits)), |
| 494 | GFP_KERNEL); | ||
| 494 | if (!ecryptfs_daemon_hash) { | 495 | if (!ecryptfs_daemon_hash) { |
| 495 | rc = -ENOMEM; | 496 | rc = -ENOMEM; |
| 496 | printk(KERN_ERR "%s: Failed to allocate memory\n", __func__); | 497 | printk(KERN_ERR "%s: Failed to allocate memory\n", __func__); |
| 497 | mutex_unlock(&ecryptfs_daemon_hash_mux); | 498 | mutex_unlock(&ecryptfs_daemon_hash_mux); |
| 498 | goto out; | 499 | goto out; |
| 499 | } | 500 | } |
| 500 | for (i = 0; i < ecryptfs_hash_buckets; i++) | 501 | for (i = 0; i < (1 << ecryptfs_hash_bits); i++) |
| 501 | INIT_HLIST_HEAD(&ecryptfs_daemon_hash[i]); | 502 | INIT_HLIST_HEAD(&ecryptfs_daemon_hash[i]); |
| 502 | mutex_unlock(&ecryptfs_daemon_hash_mux); | 503 | mutex_unlock(&ecryptfs_daemon_hash_mux); |
| 503 | ecryptfs_msg_ctx_arr = kmalloc((sizeof(struct ecryptfs_msg_ctx) | 504 | ecryptfs_msg_ctx_arr = kmalloc((sizeof(struct ecryptfs_msg_ctx) |
| @@ -554,7 +555,7 @@ void ecryptfs_release_messaging(void) | |||
| 554 | int i; | 555 | int i; |
| 555 | 556 | ||
| 556 | mutex_lock(&ecryptfs_daemon_hash_mux); | 557 | mutex_lock(&ecryptfs_daemon_hash_mux); |
| 557 | for (i = 0; i < ecryptfs_hash_buckets; i++) { | 558 | for (i = 0; i < (1 << ecryptfs_hash_bits); i++) { |
| 558 | int rc; | 559 | int rc; |
| 559 | 560 | ||
| 560 | hlist_for_each_entry(daemon, elem, | 561 | hlist_for_each_entry(daemon, elem, |
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index 26ca3361a8bc..6b48d7c268b2 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c | |||
| @@ -1231,6 +1231,25 @@ static int do_filldir_main(struct gfs2_inode *dip, u64 *offset, | |||
| 1231 | return 0; | 1231 | return 0; |
| 1232 | } | 1232 | } |
| 1233 | 1233 | ||
| 1234 | static void *gfs2_alloc_sort_buffer(unsigned size) | ||
| 1235 | { | ||
| 1236 | void *ptr = NULL; | ||
| 1237 | |||
| 1238 | if (size < KMALLOC_MAX_SIZE) | ||
| 1239 | ptr = kmalloc(size, GFP_NOFS | __GFP_NOWARN); | ||
| 1240 | if (!ptr) | ||
| 1241 | ptr = __vmalloc(size, GFP_NOFS, PAGE_KERNEL); | ||
| 1242 | return ptr; | ||
| 1243 | } | ||
| 1244 | |||
| 1245 | static void gfs2_free_sort_buffer(void *ptr) | ||
| 1246 | { | ||
| 1247 | if (is_vmalloc_addr(ptr)) | ||
| 1248 | vfree(ptr); | ||
| 1249 | else | ||
| 1250 | kfree(ptr); | ||
| 1251 | } | ||
| 1252 | |||
| 1234 | static int gfs2_dir_read_leaf(struct inode *inode, u64 *offset, void *opaque, | 1253 | static int gfs2_dir_read_leaf(struct inode *inode, u64 *offset, void *opaque, |
| 1235 | filldir_t filldir, int *copied, unsigned *depth, | 1254 | filldir_t filldir, int *copied, unsigned *depth, |
| 1236 | u64 leaf_no) | 1255 | u64 leaf_no) |
| @@ -1271,7 +1290,7 @@ static int gfs2_dir_read_leaf(struct inode *inode, u64 *offset, void *opaque, | |||
| 1271 | * 99 is the maximum number of entries that can fit in a single | 1290 | * 99 is the maximum number of entries that can fit in a single |
| 1272 | * leaf block. | 1291 | * leaf block. |
| 1273 | */ | 1292 | */ |
| 1274 | larr = vmalloc((leaves + entries + 99) * sizeof(void *)); | 1293 | larr = gfs2_alloc_sort_buffer((leaves + entries + 99) * sizeof(void *)); |
| 1275 | if (!larr) | 1294 | if (!larr) |
| 1276 | goto out; | 1295 | goto out; |
| 1277 | darr = (const struct gfs2_dirent **)(larr + leaves); | 1296 | darr = (const struct gfs2_dirent **)(larr + leaves); |
| @@ -1282,7 +1301,7 @@ static int gfs2_dir_read_leaf(struct inode *inode, u64 *offset, void *opaque, | |||
| 1282 | do { | 1301 | do { |
| 1283 | error = get_leaf(ip, lfn, &bh); | 1302 | error = get_leaf(ip, lfn, &bh); |
| 1284 | if (error) | 1303 | if (error) |
| 1285 | goto out_kfree; | 1304 | goto out_free; |
| 1286 | lf = (struct gfs2_leaf *)bh->b_data; | 1305 | lf = (struct gfs2_leaf *)bh->b_data; |
| 1287 | lfn = be64_to_cpu(lf->lf_next); | 1306 | lfn = be64_to_cpu(lf->lf_next); |
| 1288 | if (lf->lf_entries) { | 1307 | if (lf->lf_entries) { |
| @@ -1291,7 +1310,7 @@ static int gfs2_dir_read_leaf(struct inode *inode, u64 *offset, void *opaque, | |||
| 1291 | gfs2_dirent_gather, NULL, &g); | 1310 | gfs2_dirent_gather, NULL, &g); |
| 1292 | error = PTR_ERR(dent); | 1311 | error = PTR_ERR(dent); |
| 1293 | if (IS_ERR(dent)) | 1312 | if (IS_ERR(dent)) |
| 1294 | goto out_kfree; | 1313 | goto out_free; |
| 1295 | if (entries2 != g.offset) { | 1314 | if (entries2 != g.offset) { |
| 1296 | fs_warn(sdp, "Number of entries corrupt in dir " | 1315 | fs_warn(sdp, "Number of entries corrupt in dir " |
| 1297 | "leaf %llu, entries2 (%u) != " | 1316 | "leaf %llu, entries2 (%u) != " |
| @@ -1300,7 +1319,7 @@ static int gfs2_dir_read_leaf(struct inode *inode, u64 *offset, void *opaque, | |||
| 1300 | entries2, g.offset); | 1319 | entries2, g.offset); |
| 1301 | 1320 | ||
| 1302 | error = -EIO; | 1321 | error = -EIO; |
| 1303 | goto out_kfree; | 1322 | goto out_free; |
| 1304 | } | 1323 | } |
| 1305 | error = 0; | 1324 | error = 0; |
| 1306 | larr[leaf++] = bh; | 1325 | larr[leaf++] = bh; |
| @@ -1312,10 +1331,10 @@ static int gfs2_dir_read_leaf(struct inode *inode, u64 *offset, void *opaque, | |||
| 1312 | BUG_ON(entries2 != entries); | 1331 | BUG_ON(entries2 != entries); |
| 1313 | error = do_filldir_main(ip, offset, opaque, filldir, darr, | 1332 | error = do_filldir_main(ip, offset, opaque, filldir, darr, |
| 1314 | entries, copied); | 1333 | entries, copied); |
| 1315 | out_kfree: | 1334 | out_free: |
| 1316 | for(i = 0; i < leaf; i++) | 1335 | for(i = 0; i < leaf; i++) |
| 1317 | brelse(larr[i]); | 1336 | brelse(larr[i]); |
| 1318 | vfree(larr); | 1337 | gfs2_free_sort_buffer(larr); |
| 1319 | out: | 1338 | out: |
| 1320 | return error; | 1339 | return error; |
| 1321 | } | 1340 | } |
diff --git a/fs/proc/array.c b/fs/proc/array.c index 9b58d38bc911..fff6572676ae 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
| @@ -176,7 +176,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | |||
| 176 | if (tracer) | 176 | if (tracer) |
| 177 | tpid = task_pid_nr_ns(tracer, ns); | 177 | tpid = task_pid_nr_ns(tracer, ns); |
| 178 | } | 178 | } |
| 179 | cred = get_cred((struct cred *) __task_cred(p)); | 179 | cred = get_task_cred(p); |
| 180 | seq_printf(m, | 180 | seq_printf(m, |
| 181 | "State:\t%s\n" | 181 | "State:\t%s\n" |
| 182 | "Tgid:\t%d\n" | 182 | "Tgid:\t%d\n" |
diff --git a/include/linux/cred.h b/include/linux/cred.h index 75c0fa881308..4d2c39573f36 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
| @@ -153,6 +153,7 @@ struct cred { | |||
| 153 | extern void __put_cred(struct cred *); | 153 | extern void __put_cred(struct cred *); |
| 154 | extern void exit_creds(struct task_struct *); | 154 | extern void exit_creds(struct task_struct *); |
| 155 | extern int copy_creds(struct task_struct *, unsigned long); | 155 | extern int copy_creds(struct task_struct *, unsigned long); |
| 156 | extern const struct cred *get_task_cred(struct task_struct *); | ||
| 156 | extern struct cred *cred_alloc_blank(void); | 157 | extern struct cred *cred_alloc_blank(void); |
| 157 | extern struct cred *prepare_creds(void); | 158 | extern struct cred *prepare_creds(void); |
| 158 | extern struct cred *prepare_exec_creds(void); | 159 | extern struct cred *prepare_exec_creds(void); |
| @@ -273,33 +274,18 @@ static inline void put_cred(const struct cred *_cred) | |||
| 273 | * @task: The task to query | 274 | * @task: The task to query |
| 274 | * | 275 | * |
| 275 | * Access the objective credentials of a task. The caller must hold the RCU | 276 | * Access the objective credentials of a task. The caller must hold the RCU |
| 276 | * readlock. | 277 | * readlock or the task must be dead and unable to change its own credentials. |
| 277 | * | 278 | * |
| 278 | * The caller must make sure task doesn't go away, either by holding a ref on | 279 | * The result of this function should not be passed directly to get_cred(); |
| 279 | * task or by holding tasklist_lock to prevent it from being unlinked. | 280 | * rather get_task_cred() should be used instead. |
| 280 | */ | 281 | */ |
| 281 | #define __task_cred(task) \ | 282 | #define __task_cred(task) \ |
| 282 | ((const struct cred *)(rcu_dereference_check((task)->real_cred, rcu_read_lock_held() || lockdep_tasklist_lock_is_held()))) | 283 | ({ \ |
| 283 | 284 | const struct task_struct *__t = (task); \ | |
| 284 | /** | 285 | rcu_dereference_check(__t->real_cred, \ |
| 285 | * get_task_cred - Get another task's objective credentials | 286 | rcu_read_lock_held() || \ |
| 286 | * @task: The task to query | 287 | task_is_dead(__t)); \ |
| 287 | * | 288 | }) |
| 288 | * Get the objective credentials of a task, pinning them so that they can't go | ||
| 289 | * away. Accessing a task's credentials directly is not permitted. | ||
| 290 | * | ||
| 291 | * The caller must make sure task doesn't go away, either by holding a ref on | ||
| 292 | * task or by holding tasklist_lock to prevent it from being unlinked. | ||
| 293 | */ | ||
| 294 | #define get_task_cred(task) \ | ||
| 295 | ({ \ | ||
| 296 | struct cred *__cred; \ | ||
| 297 | rcu_read_lock(); \ | ||
| 298 | __cred = (struct cred *) __task_cred((task)); \ | ||
| 299 | get_cred(__cred); \ | ||
| 300 | rcu_read_unlock(); \ | ||
| 301 | __cred; \ | ||
| 302 | }) | ||
| 303 | 289 | ||
| 304 | /** | 290 | /** |
| 305 | * get_current_cred - Get the current task's subjective credentials | 291 | * get_current_cred - Get the current task's subjective credentials |
diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index 9ea047aca795..1ffaeffeff74 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h | |||
| @@ -67,6 +67,8 @@ static inline void macvlan_count_rx(const struct macvlan_dev *vlan, | |||
| 67 | } | 67 | } |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | extern void macvlan_common_setup(struct net_device *dev); | ||
| 71 | |||
| 70 | extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev, | 72 | extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev, |
| 71 | struct nlattr *tb[], struct nlattr *data[], | 73 | struct nlattr *tb[], struct nlattr *data[], |
| 72 | int (*receive)(struct sk_buff *skb), | 74 | int (*receive)(struct sk_buff *skb), |
diff --git a/include/linux/regulator/tps6507x.h b/include/linux/regulator/tps6507x.h new file mode 100644 index 000000000000..4892f591bab1 --- /dev/null +++ b/include/linux/regulator/tps6507x.h | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | /* | ||
| 2 | * tps6507x.h -- Voltage regulation for the Texas Instruments TPS6507X | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Texas Instruments, Inc. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifndef REGULATOR_TPS6507X | ||
| 21 | #define REGULATOR_TPS6507X | ||
| 22 | |||
| 23 | /** | ||
| 24 | * tps6507x_reg_platform_data - platform data for tps6507x | ||
| 25 | * @defdcdc_default: Defines whether DCDC high or the low register controls | ||
| 26 | * output voltage by default. Valid for DCDC2 and DCDC3 outputs only. | ||
| 27 | */ | ||
| 28 | struct tps6507x_reg_platform_data { | ||
| 29 | bool defdcdc_default; | ||
| 30 | }; | ||
| 31 | |||
| 32 | #endif | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index 747fcaedddb7..0478888c6899 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -214,6 +214,7 @@ extern char ___assert_task_state[1 - 2*!!( | |||
| 214 | 214 | ||
| 215 | #define task_is_traced(task) ((task->state & __TASK_TRACED) != 0) | 215 | #define task_is_traced(task) ((task->state & __TASK_TRACED) != 0) |
| 216 | #define task_is_stopped(task) ((task->state & __TASK_STOPPED) != 0) | 216 | #define task_is_stopped(task) ((task->state & __TASK_STOPPED) != 0) |
| 217 | #define task_is_dead(task) ((task)->exit_state != 0) | ||
| 217 | #define task_is_stopped_or_traced(task) \ | 218 | #define task_is_stopped_or_traced(task) \ |
| 218 | ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) | 219 | ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) |
| 219 | #define task_contributes_to_load(task) \ | 220 | #define task_contributes_to_load(task) \ |
diff --git a/include/net/tc_act/tc_mirred.h b/include/net/tc_act/tc_mirred.h index ceac661cdfd5..cfe2943690ff 100644 --- a/include/net/tc_act/tc_mirred.h +++ b/include/net/tc_act/tc_mirred.h | |||
| @@ -9,6 +9,7 @@ struct tcf_mirred { | |||
| 9 | int tcfm_ifindex; | 9 | int tcfm_ifindex; |
| 10 | int tcfm_ok_push; | 10 | int tcfm_ok_push; |
| 11 | struct net_device *tcfm_dev; | 11 | struct net_device *tcfm_dev; |
| 12 | struct list_head tcfm_list; | ||
| 12 | }; | 13 | }; |
| 13 | #define to_mirred(pc) \ | 14 | #define to_mirred(pc) \ |
| 14 | container_of(pc, struct tcf_mirred, common) | 15 | container_of(pc, struct tcf_mirred, common) |
diff --git a/kernel/cred.c b/kernel/cred.c index a2d5504fbcc2..60bc8b1e32e6 100644 --- a/kernel/cred.c +++ b/kernel/cred.c | |||
| @@ -209,6 +209,31 @@ void exit_creds(struct task_struct *tsk) | |||
| 209 | } | 209 | } |
| 210 | } | 210 | } |
| 211 | 211 | ||
| 212 | /** | ||
| 213 | * get_task_cred - Get another task's objective credentials | ||
| 214 | * @task: The task to query | ||
| 215 | * | ||
| 216 | * Get the objective credentials of a task, pinning them so that they can't go | ||
| 217 | * away. Accessing a task's credentials directly is not permitted. | ||
| 218 | * | ||
| 219 | * The caller must also make sure task doesn't get deleted, either by holding a | ||
| 220 | * ref on task or by holding tasklist_lock to prevent it from being unlinked. | ||
| 221 | */ | ||
| 222 | const struct cred *get_task_cred(struct task_struct *task) | ||
| 223 | { | ||
| 224 | const struct cred *cred; | ||
| 225 | |||
| 226 | rcu_read_lock(); | ||
| 227 | |||
| 228 | do { | ||
| 229 | cred = __task_cred((task)); | ||
| 230 | BUG_ON(!cred); | ||
| 231 | } while (!atomic_inc_not_zero(&((struct cred *)cred)->usage)); | ||
| 232 | |||
| 233 | rcu_read_unlock(); | ||
| 234 | return cred; | ||
| 235 | } | ||
| 236 | |||
| 212 | /* | 237 | /* |
| 213 | * Allocate blank credentials, such that the credentials can be filled in at a | 238 | * Allocate blank credentials, such that the credentials can be filled in at a |
| 214 | * later date without risk of ENOMEM. | 239 | * later date without risk of ENOMEM. |
diff --git a/kernel/module.c b/kernel/module.c index 5d2d28197c82..6c562828c85c 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -787,7 +787,6 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user, | |||
| 787 | 787 | ||
| 788 | /* Store the name of the last unloaded module for diagnostic purposes */ | 788 | /* Store the name of the last unloaded module for diagnostic purposes */ |
| 789 | strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); | 789 | strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); |
| 790 | ddebug_remove_module(mod->name); | ||
| 791 | 790 | ||
| 792 | free_module(mod); | 791 | free_module(mod); |
| 793 | return 0; | 792 | return 0; |
| @@ -1550,6 +1549,9 @@ static void free_module(struct module *mod) | |||
| 1550 | remove_sect_attrs(mod); | 1549 | remove_sect_attrs(mod); |
| 1551 | mod_kobject_remove(mod); | 1550 | mod_kobject_remove(mod); |
| 1552 | 1551 | ||
| 1552 | /* Remove dynamic debug info */ | ||
| 1553 | ddebug_remove_module(mod->name); | ||
| 1554 | |||
| 1553 | /* Arch-specific cleanup. */ | 1555 | /* Arch-specific cleanup. */ |
| 1554 | module_arch_cleanup(mod); | 1556 | module_arch_cleanup(mod); |
| 1555 | 1557 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 0ea10f849be8..1f466e82ac33 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1488,6 +1488,7 @@ static inline void net_timestamp_check(struct sk_buff *skb) | |||
| 1488 | int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | 1488 | int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) |
| 1489 | { | 1489 | { |
| 1490 | skb_orphan(skb); | 1490 | skb_orphan(skb); |
| 1491 | nf_reset(skb); | ||
| 1491 | 1492 | ||
| 1492 | if (!(dev->flags & IFF_UP) || | 1493 | if (!(dev->flags & IFF_UP) || |
| 1493 | (skb->len > (dev->mtu + dev->hard_header_len))) { | 1494 | (skb->len > (dev->mtu + dev->hard_header_len))) { |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 34432b4e96bb..ce88293a34e2 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -843,7 +843,9 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | |||
| 843 | skb->network_header += off; | 843 | skb->network_header += off; |
| 844 | if (skb_mac_header_was_set(skb)) | 844 | if (skb_mac_header_was_set(skb)) |
| 845 | skb->mac_header += off; | 845 | skb->mac_header += off; |
| 846 | skb->csum_start += nhead; | 846 | /* Only adjust this if it actually is csum_start rather than csum */ |
| 847 | if (skb->ip_summed == CHECKSUM_PARTIAL) | ||
| 848 | skb->csum_start += nhead; | ||
| 847 | skb->cloned = 0; | 849 | skb->cloned = 0; |
| 848 | skb->hdr_len = 0; | 850 | skb->hdr_len = 0; |
| 849 | skb->nohdr = 0; | 851 | skb->nohdr = 0; |
| @@ -930,7 +932,8 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, | |||
| 930 | copy_skb_header(n, skb); | 932 | copy_skb_header(n, skb); |
| 931 | 933 | ||
| 932 | off = newheadroom - oldheadroom; | 934 | off = newheadroom - oldheadroom; |
| 933 | n->csum_start += off; | 935 | if (n->ip_summed == CHECKSUM_PARTIAL) |
| 936 | n->csum_start += off; | ||
| 934 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 937 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| 935 | n->transport_header += off; | 938 | n->transport_header += off; |
| 936 | n->network_header += off; | 939 | n->network_header += off; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index e1a698df5706..784f34d11fdd 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1760,7 +1760,10 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev) | |||
| 1760 | 1760 | ||
| 1761 | idev = ipv6_find_idev(dev); | 1761 | idev = ipv6_find_idev(dev); |
| 1762 | if (!idev) | 1762 | if (!idev) |
| 1763 | return NULL; | 1763 | return ERR_PTR(-ENOBUFS); |
| 1764 | |||
| 1765 | if (idev->cnf.disable_ipv6) | ||
| 1766 | return ERR_PTR(-EACCES); | ||
| 1764 | 1767 | ||
| 1765 | /* Add default multicast route */ | 1768 | /* Add default multicast route */ |
| 1766 | addrconf_add_mroute(dev); | 1769 | addrconf_add_mroute(dev); |
| @@ -2129,8 +2132,9 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx, | |||
| 2129 | if (!dev) | 2132 | if (!dev) |
| 2130 | return -ENODEV; | 2133 | return -ENODEV; |
| 2131 | 2134 | ||
| 2132 | if ((idev = addrconf_add_dev(dev)) == NULL) | 2135 | idev = addrconf_add_dev(dev); |
| 2133 | return -ENOBUFS; | 2136 | if (IS_ERR(idev)) |
| 2137 | return PTR_ERR(idev); | ||
| 2134 | 2138 | ||
| 2135 | scope = ipv6_addr_scope(pfx); | 2139 | scope = ipv6_addr_scope(pfx); |
| 2136 | 2140 | ||
| @@ -2377,7 +2381,7 @@ static void addrconf_dev_config(struct net_device *dev) | |||
| 2377 | } | 2381 | } |
| 2378 | 2382 | ||
| 2379 | idev = addrconf_add_dev(dev); | 2383 | idev = addrconf_add_dev(dev); |
| 2380 | if (idev == NULL) | 2384 | if (IS_ERR(idev)) |
| 2381 | return; | 2385 | return; |
| 2382 | 2386 | ||
| 2383 | memset(&addr, 0, sizeof(struct in6_addr)); | 2387 | memset(&addr, 0, sizeof(struct in6_addr)); |
| @@ -2468,7 +2472,7 @@ static void addrconf_ip6_tnl_config(struct net_device *dev) | |||
| 2468 | ASSERT_RTNL(); | 2472 | ASSERT_RTNL(); |
| 2469 | 2473 | ||
| 2470 | idev = addrconf_add_dev(dev); | 2474 | idev = addrconf_add_dev(dev); |
| 2471 | if (!idev) { | 2475 | if (IS_ERR(idev)) { |
| 2472 | printk(KERN_DEBUG "init ip6-ip6: add_dev failed\n"); | 2476 | printk(KERN_DEBUG "init ip6-ip6: add_dev failed\n"); |
| 2473 | return; | 2477 | return; |
| 2474 | } | 2478 | } |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index c7000a6ca379..67ee34f57df7 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
| @@ -632,7 +632,7 @@ static void ieee80211_send_layer2_update(struct sta_info *sta) | |||
| 632 | skb->dev = sta->sdata->dev; | 632 | skb->dev = sta->sdata->dev; |
| 633 | skb->protocol = eth_type_trans(skb, sta->sdata->dev); | 633 | skb->protocol = eth_type_trans(skb, sta->sdata->dev); |
| 634 | memset(skb->cb, 0, sizeof(skb->cb)); | 634 | memset(skb->cb, 0, sizeof(skb->cb)); |
| 635 | netif_rx(skb); | 635 | netif_rx_ni(skb); |
| 636 | } | 636 | } |
| 637 | 637 | ||
| 638 | static void sta_apply_parameters(struct ieee80211_local *local, | 638 | static void sta_apply_parameters(struct ieee80211_local *local, |
diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c index c0b6863e3b87..1980b71c283f 100644 --- a/net/sched/act_mirred.c +++ b/net/sched/act_mirred.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | static struct tcf_common *tcf_mirred_ht[MIRRED_TAB_MASK + 1]; | 33 | static struct tcf_common *tcf_mirred_ht[MIRRED_TAB_MASK + 1]; |
| 34 | static u32 mirred_idx_gen; | 34 | static u32 mirred_idx_gen; |
| 35 | static DEFINE_RWLOCK(mirred_lock); | 35 | static DEFINE_RWLOCK(mirred_lock); |
| 36 | static LIST_HEAD(mirred_list); | ||
| 36 | 37 | ||
| 37 | static struct tcf_hashinfo mirred_hash_info = { | 38 | static struct tcf_hashinfo mirred_hash_info = { |
| 38 | .htab = tcf_mirred_ht, | 39 | .htab = tcf_mirred_ht, |
| @@ -47,7 +48,9 @@ static inline int tcf_mirred_release(struct tcf_mirred *m, int bind) | |||
| 47 | m->tcf_bindcnt--; | 48 | m->tcf_bindcnt--; |
| 48 | m->tcf_refcnt--; | 49 | m->tcf_refcnt--; |
| 49 | if(!m->tcf_bindcnt && m->tcf_refcnt <= 0) { | 50 | if(!m->tcf_bindcnt && m->tcf_refcnt <= 0) { |
| 50 | dev_put(m->tcfm_dev); | 51 | list_del(&m->tcfm_list); |
| 52 | if (m->tcfm_dev) | ||
| 53 | dev_put(m->tcfm_dev); | ||
| 51 | tcf_hash_destroy(&m->common, &mirred_hash_info); | 54 | tcf_hash_destroy(&m->common, &mirred_hash_info); |
| 52 | return 1; | 55 | return 1; |
| 53 | } | 56 | } |
| @@ -134,8 +137,10 @@ static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est, | |||
| 134 | m->tcfm_ok_push = ok_push; | 137 | m->tcfm_ok_push = ok_push; |
| 135 | } | 138 | } |
| 136 | spin_unlock_bh(&m->tcf_lock); | 139 | spin_unlock_bh(&m->tcf_lock); |
| 137 | if (ret == ACT_P_CREATED) | 140 | if (ret == ACT_P_CREATED) { |
| 141 | list_add(&m->tcfm_list, &mirred_list); | ||
| 138 | tcf_hash_insert(pc, &mirred_hash_info); | 142 | tcf_hash_insert(pc, &mirred_hash_info); |
| 143 | } | ||
| 139 | 144 | ||
| 140 | return ret; | 145 | return ret; |
| 141 | } | 146 | } |
| @@ -162,9 +167,14 @@ static int tcf_mirred(struct sk_buff *skb, struct tc_action *a, | |||
| 162 | m->tcf_tm.lastuse = jiffies; | 167 | m->tcf_tm.lastuse = jiffies; |
| 163 | 168 | ||
| 164 | dev = m->tcfm_dev; | 169 | dev = m->tcfm_dev; |
| 170 | if (!dev) { | ||
| 171 | printk_once(KERN_NOTICE "tc mirred: target device is gone\n"); | ||
| 172 | goto out; | ||
| 173 | } | ||
| 174 | |||
| 165 | if (!(dev->flags & IFF_UP)) { | 175 | if (!(dev->flags & IFF_UP)) { |
| 166 | if (net_ratelimit()) | 176 | if (net_ratelimit()) |
| 167 | pr_notice("tc mirred to Houston: device %s is gone!\n", | 177 | pr_notice("tc mirred to Houston: device %s is down\n", |
| 168 | dev->name); | 178 | dev->name); |
| 169 | goto out; | 179 | goto out; |
| 170 | } | 180 | } |
| @@ -232,6 +242,28 @@ nla_put_failure: | |||
| 232 | return -1; | 242 | return -1; |
| 233 | } | 243 | } |
| 234 | 244 | ||
| 245 | static int mirred_device_event(struct notifier_block *unused, | ||
| 246 | unsigned long event, void *ptr) | ||
| 247 | { | ||
| 248 | struct net_device *dev = ptr; | ||
| 249 | struct tcf_mirred *m; | ||
| 250 | |||
| 251 | if (event == NETDEV_UNREGISTER) | ||
| 252 | list_for_each_entry(m, &mirred_list, tcfm_list) { | ||
| 253 | if (m->tcfm_dev == dev) { | ||
| 254 | dev_put(dev); | ||
| 255 | m->tcfm_dev = NULL; | ||
| 256 | } | ||
| 257 | } | ||
| 258 | |||
| 259 | return NOTIFY_DONE; | ||
| 260 | } | ||
| 261 | |||
| 262 | static struct notifier_block mirred_device_notifier = { | ||
| 263 | .notifier_call = mirred_device_event, | ||
| 264 | }; | ||
| 265 | |||
| 266 | |||
| 235 | static struct tc_action_ops act_mirred_ops = { | 267 | static struct tc_action_ops act_mirred_ops = { |
| 236 | .kind = "mirred", | 268 | .kind = "mirred", |
| 237 | .hinfo = &mirred_hash_info, | 269 | .hinfo = &mirred_hash_info, |
| @@ -252,12 +284,17 @@ MODULE_LICENSE("GPL"); | |||
| 252 | 284 | ||
| 253 | static int __init mirred_init_module(void) | 285 | static int __init mirred_init_module(void) |
| 254 | { | 286 | { |
| 287 | int err = register_netdevice_notifier(&mirred_device_notifier); | ||
| 288 | if (err) | ||
| 289 | return err; | ||
| 290 | |||
| 255 | pr_info("Mirror/redirect action on\n"); | 291 | pr_info("Mirror/redirect action on\n"); |
| 256 | return tcf_register_action(&act_mirred_ops); | 292 | return tcf_register_action(&act_mirred_ops); |
| 257 | } | 293 | } |
| 258 | 294 | ||
| 259 | static void __exit mirred_cleanup_module(void) | 295 | static void __exit mirred_cleanup_module(void) |
| 260 | { | 296 | { |
| 297 | unregister_netdevice_notifier(&mirred_device_notifier); | ||
| 261 | tcf_unregister_action(&act_mirred_ops); | 298 | tcf_unregister_action(&act_mirred_ops); |
| 262 | } | 299 | } |
| 263 | 300 | ||
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 86067ee78632..2fc53961054e 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -52,6 +52,10 @@ struct hdmi_spec { | |||
| 52 | */ | 52 | */ |
| 53 | struct hda_multi_out multiout; | 53 | struct hda_multi_out multiout; |
| 54 | unsigned int codec_type; | 54 | unsigned int codec_type; |
| 55 | |||
| 56 | /* misc flags */ | ||
| 57 | /* PD bit indicates only the update, not the current state */ | ||
| 58 | unsigned int old_pin_detect:1; | ||
| 55 | }; | 59 | }; |
| 56 | 60 | ||
| 57 | 61 | ||
| @@ -616,6 +620,9 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, | |||
| 616 | * Unsolicited events | 620 | * Unsolicited events |
| 617 | */ | 621 | */ |
| 618 | 622 | ||
| 623 | static void hdmi_present_sense(struct hda_codec *codec, hda_nid_t pin_nid, | ||
| 624 | struct hdmi_eld *eld); | ||
| 625 | |||
| 619 | static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) | 626 | static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) |
| 620 | { | 627 | { |
| 621 | struct hdmi_spec *spec = codec->spec; | 628 | struct hdmi_spec *spec = codec->spec; |
| @@ -632,6 +639,12 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) | |||
| 632 | if (index < 0) | 639 | if (index < 0) |
| 633 | return; | 640 | return; |
| 634 | 641 | ||
| 642 | if (spec->old_pin_detect) { | ||
| 643 | if (pind) | ||
| 644 | hdmi_present_sense(codec, tag, &spec->sink_eld[index]); | ||
| 645 | pind = spec->sink_eld[index].monitor_present; | ||
| 646 | } | ||
| 647 | |||
| 635 | spec->sink_eld[index].monitor_present = pind; | 648 | spec->sink_eld[index].monitor_present = pind; |
| 636 | spec->sink_eld[index].eld_valid = eldv; | 649 | spec->sink_eld[index].eld_valid = eldv; |
| 637 | 650 | ||
diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index 3c10c0b149f4..b0652acee9b2 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c | |||
| @@ -478,6 +478,7 @@ static int patch_nvhdmi_8ch_89(struct hda_codec *codec) | |||
| 478 | 478 | ||
| 479 | codec->spec = spec; | 479 | codec->spec = spec; |
| 480 | spec->codec_type = HDA_CODEC_NVIDIA_MCP89; | 480 | spec->codec_type = HDA_CODEC_NVIDIA_MCP89; |
| 481 | spec->old_pin_detect = 1; | ||
| 481 | 482 | ||
| 482 | if (hdmi_parse_codec(codec) < 0) { | 483 | if (hdmi_parse_codec(codec) < 0) { |
| 483 | codec->spec = NULL; | 484 | codec->spec = NULL; |
| @@ -508,6 +509,7 @@ static int patch_nvhdmi_8ch_7x(struct hda_codec *codec) | |||
| 508 | spec->multiout.max_channels = 8; | 509 | spec->multiout.max_channels = 8; |
| 509 | spec->multiout.dig_out_nid = nvhdmi_master_con_nid_7x; | 510 | spec->multiout.dig_out_nid = nvhdmi_master_con_nid_7x; |
| 510 | spec->codec_type = HDA_CODEC_NVIDIA_MCP7X; | 511 | spec->codec_type = HDA_CODEC_NVIDIA_MCP7X; |
| 512 | spec->old_pin_detect = 1; | ||
| 511 | 513 | ||
| 512 | codec->patch_ops = nvhdmi_patch_ops_8ch_7x; | 514 | codec->patch_ops = nvhdmi_patch_ops_8ch_7x; |
| 513 | 515 | ||
| @@ -528,6 +530,7 @@ static int patch_nvhdmi_2ch(struct hda_codec *codec) | |||
| 528 | spec->multiout.max_channels = 2; | 530 | spec->multiout.max_channels = 2; |
| 529 | spec->multiout.dig_out_nid = nvhdmi_master_con_nid_7x; | 531 | spec->multiout.dig_out_nid = nvhdmi_master_con_nid_7x; |
| 530 | spec->codec_type = HDA_CODEC_NVIDIA_MCP7X; | 532 | spec->codec_type = HDA_CODEC_NVIDIA_MCP7X; |
| 533 | spec->old_pin_detect = 1; | ||
| 531 | 534 | ||
| 532 | codec->patch_ops = nvhdmi_patch_ops_2ch; | 535 | codec->patch_ops = nvhdmi_patch_ops_2ch; |
| 533 | 536 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index ff614dd824c1..596ea2f12cf6 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1267,11 +1267,11 @@ static int alc_auto_parse_customize_define(struct hda_codec *codec) | |||
| 1267 | unsigned nid = 0; | 1267 | unsigned nid = 0; |
| 1268 | struct alc_spec *spec = codec->spec; | 1268 | struct alc_spec *spec = codec->spec; |
| 1269 | 1269 | ||
| 1270 | spec->cdefine.enable_pcbeep = 1; /* assume always enabled */ | ||
| 1271 | |||
| 1270 | ass = codec->subsystem_id & 0xffff; | 1272 | ass = codec->subsystem_id & 0xffff; |
| 1271 | if (ass != codec->bus->pci->subsystem_device && (ass & 1)) { | 1273 | if (ass != codec->bus->pci->subsystem_device && (ass & 1)) |
| 1272 | spec->cdefine.enable_pcbeep = 1; /* assume always enabled */ | ||
| 1273 | goto do_sku; | 1274 | goto do_sku; |
| 1274 | } | ||
| 1275 | 1275 | ||
| 1276 | nid = 0x1d; | 1276 | nid = 0x1d; |
| 1277 | if (codec->vendor_id == 0x10ec0260) | 1277 | if (codec->vendor_id == 0x10ec0260) |
| @@ -5180,8 +5180,24 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, | |||
| 5180 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | 5180 | #ifdef CONFIG_SND_HDA_INPUT_BEEP |
| 5181 | #define set_beep_amp(spec, nid, idx, dir) \ | 5181 | #define set_beep_amp(spec, nid, idx, dir) \ |
| 5182 | ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) | 5182 | ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) |
| 5183 | |||
| 5184 | static struct snd_pci_quirk beep_white_list[] = { | ||
| 5185 | SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), | ||
| 5186 | {} | ||
| 5187 | }; | ||
| 5188 | |||
| 5189 | static inline int has_cdefine_beep(struct hda_codec *codec) | ||
| 5190 | { | ||
| 5191 | struct alc_spec *spec = codec->spec; | ||
| 5192 | const struct snd_pci_quirk *q; | ||
| 5193 | q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list); | ||
| 5194 | if (q) | ||
| 5195 | return q->value; | ||
| 5196 | return spec->cdefine.enable_pcbeep; | ||
| 5197 | } | ||
| 5183 | #else | 5198 | #else |
| 5184 | #define set_beep_amp(spec, nid, idx, dir) /* NOP */ | 5199 | #define set_beep_amp(spec, nid, idx, dir) /* NOP */ |
| 5200 | #define has_cdefine_beep(codec) 0 | ||
| 5185 | #endif | 5201 | #endif |
| 5186 | 5202 | ||
| 5187 | /* | 5203 | /* |
| @@ -10566,10 +10582,12 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 10566 | } | 10582 | } |
| 10567 | } | 10583 | } |
| 10568 | 10584 | ||
| 10569 | err = snd_hda_attach_beep_device(codec, 0x1); | 10585 | if (has_cdefine_beep(codec)) { |
| 10570 | if (err < 0) { | 10586 | err = snd_hda_attach_beep_device(codec, 0x1); |
| 10571 | alc_free(codec); | 10587 | if (err < 0) { |
| 10572 | return err; | 10588 | alc_free(codec); |
| 10589 | return err; | ||
| 10590 | } | ||
| 10573 | } | 10591 | } |
| 10574 | 10592 | ||
| 10575 | if (board_config != ALC882_AUTO) | 10593 | if (board_config != ALC882_AUTO) |
| @@ -10619,7 +10637,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 10619 | 10637 | ||
| 10620 | set_capture_mixer(codec); | 10638 | set_capture_mixer(codec); |
| 10621 | 10639 | ||
| 10622 | if (spec->cdefine.enable_pcbeep) | 10640 | if (has_cdefine_beep(codec)) |
| 10623 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 10641 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
| 10624 | 10642 | ||
| 10625 | if (board_config == ALC882_AUTO) | 10643 | if (board_config == ALC882_AUTO) |
| @@ -12435,7 +12453,7 @@ static int patch_alc262(struct hda_codec *codec) | |||
| 12435 | } | 12453 | } |
| 12436 | } | 12454 | } |
| 12437 | 12455 | ||
| 12438 | if (!spec->no_analog) { | 12456 | if (!spec->no_analog && has_cdefine_beep(codec)) { |
| 12439 | err = snd_hda_attach_beep_device(codec, 0x1); | 12457 | err = snd_hda_attach_beep_device(codec, 0x1); |
| 12440 | if (err < 0) { | 12458 | if (err < 0) { |
| 12441 | alc_free(codec); | 12459 | alc_free(codec); |
| @@ -12486,7 +12504,7 @@ static int patch_alc262(struct hda_codec *codec) | |||
| 12486 | } | 12504 | } |
| 12487 | if (!spec->cap_mixer && !spec->no_analog) | 12505 | if (!spec->cap_mixer && !spec->no_analog) |
| 12488 | set_capture_mixer(codec); | 12506 | set_capture_mixer(codec); |
| 12489 | if (!spec->no_analog && spec->cdefine.enable_pcbeep) | 12507 | if (!spec->no_analog && has_cdefine_beep(codec)) |
| 12490 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 12508 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
| 12491 | 12509 | ||
| 12492 | spec->vmaster_nid = 0x0c; | 12510 | spec->vmaster_nid = 0x0c; |
| @@ -14458,10 +14476,12 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 14458 | } | 14476 | } |
| 14459 | } | 14477 | } |
| 14460 | 14478 | ||
| 14461 | err = snd_hda_attach_beep_device(codec, 0x1); | 14479 | if (has_cdefine_beep(codec)) { |
| 14462 | if (err < 0) { | 14480 | err = snd_hda_attach_beep_device(codec, 0x1); |
| 14463 | alc_free(codec); | 14481 | if (err < 0) { |
| 14464 | return err; | 14482 | alc_free(codec); |
| 14483 | return err; | ||
| 14484 | } | ||
| 14465 | } | 14485 | } |
| 14466 | 14486 | ||
| 14467 | if (board_config != ALC269_AUTO) | 14487 | if (board_config != ALC269_AUTO) |
| @@ -14494,7 +14514,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 14494 | 14514 | ||
| 14495 | if (!spec->cap_mixer) | 14515 | if (!spec->cap_mixer) |
| 14496 | set_capture_mixer(codec); | 14516 | set_capture_mixer(codec); |
| 14497 | if (spec->cdefine.enable_pcbeep) | 14517 | if (has_cdefine_beep(codec)) |
| 14498 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | 14518 | set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); |
| 14499 | 14519 | ||
| 14500 | if (board_config == ALC269_AUTO) | 14520 | if (board_config == ALC269_AUTO) |
| @@ -18691,10 +18711,12 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 18691 | } | 18711 | } |
| 18692 | } | 18712 | } |
| 18693 | 18713 | ||
| 18694 | err = snd_hda_attach_beep_device(codec, 0x1); | 18714 | if (has_cdefine_beep(codec)) { |
| 18695 | if (err < 0) { | 18715 | err = snd_hda_attach_beep_device(codec, 0x1); |
| 18696 | alc_free(codec); | 18716 | if (err < 0) { |
| 18697 | return err; | 18717 | alc_free(codec); |
| 18718 | return err; | ||
| 18719 | } | ||
| 18698 | } | 18720 | } |
| 18699 | 18721 | ||
| 18700 | if (board_config != ALC662_AUTO) | 18722 | if (board_config != ALC662_AUTO) |
| @@ -18716,7 +18738,7 @@ static int patch_alc662(struct hda_codec *codec) | |||
| 18716 | if (!spec->cap_mixer) | 18738 | if (!spec->cap_mixer) |
| 18717 | set_capture_mixer(codec); | 18739 | set_capture_mixer(codec); |
| 18718 | 18740 | ||
| 18719 | if (spec->cdefine.enable_pcbeep) { | 18741 | if (has_cdefine_beep(codec)) { |
| 18720 | switch (codec->vendor_id) { | 18742 | switch (codec->vendor_id) { |
| 18721 | case 0x10ec0662: | 18743 | case 0x10ec0662: |
| 18722 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); | 18744 | set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); |
