diff options
| -rw-r--r-- | arch/arm/mach-davinci/board-da850-evm.c | 8 | ||||
| -rw-r--r-- | drivers/regulator/ab3100.c | 4 | ||||
| -rw-r--r-- | drivers/regulator/tps6507x-regulator.c | 36 | ||||
| -rw-r--r-- | drivers/regulator/wm8350-regulator.c | 2 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 8 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 10 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/ibmvscsi/rpa_vscsi.c | 13 | ||||
| -rw-r--r-- | drivers/scsi/ipr.c | 51 | ||||
| -rw-r--r-- | drivers/scsi/ipr.h | 5 | ||||
| -rw-r--r-- | fs/ceph/Kconfig | 2 | ||||
| -rw-r--r-- | fs/ceph/caps.c | 15 | ||||
| -rw-r--r-- | fs/ceph/dir.c | 13 | ||||
| -rw-r--r-- | fs/ceph/file.c | 2 | ||||
| -rw-r--r-- | fs/ceph/inode.c | 6 | ||||
| -rw-r--r-- | fs/ceph/mds_client.c | 10 | ||||
| -rw-r--r-- | fs/ceph/mon_client.c | 6 | ||||
| -rw-r--r-- | fs/ceph/osd_client.c | 6 | ||||
| -rw-r--r-- | fs/ceph/osdmap.c | 26 | ||||
| -rw-r--r-- | fs/ecryptfs/messaging.c | 17 | ||||
| -rw-r--r-- | fs/gfs2/dir.c | 31 | ||||
| -rw-r--r-- | include/linux/regulator/tps6507x.h | 32 |
22 files changed, 219 insertions, 94 deletions
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/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/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/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/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 | ||
