mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 12:57:06 +09:00
Merge 9eaa88c703 ("Merge tag 'libata-5.16-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata") into android-mainline
Steps on the way to 5.16-rc6 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I411d608f111cb9efb0de7ee82de44dcc1a075d7c
This commit is contained in:
@@ -21066,7 +21066,7 @@ S: Maintained
|
||||
F: arch/x86/kernel/cpu/zhaoxin.c
|
||||
|
||||
ZONEFS FILESYSTEM
|
||||
M: Damien Le Moal <damien.lemoal@wdc.com>
|
||||
M: Damien Le Moal <damien.lemoal@opensource.wdc.com>
|
||||
M: Naohiro Aota <naohiro.aota@wdc.com>
|
||||
R: Johannes Thumshirn <jth@kernel.org>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
spi-max-frequency = <20000000>;
|
||||
voltage-ranges = <3300 3300>;
|
||||
disable-wp;
|
||||
gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/* Copyright (c) 2020 SiFive, Inc */
|
||||
|
||||
#include "fu740-c000.dtsi"
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
|
||||
/* Clock frequency (in Hz) of the PCB crystal for rtcclk */
|
||||
@@ -54,10 +55,21 @@
|
||||
temperature-sensor@4c {
|
||||
compatible = "ti,tmp451";
|
||||
reg = <0x4c>;
|
||||
vcc-supply = <&vdd_bpro>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
|
||||
eeprom@54 {
|
||||
compatible = "microchip,24c02", "atmel,24c02";
|
||||
reg = <0x54>;
|
||||
vcc-supply = <&vdd_bpro>;
|
||||
label = "board-id";
|
||||
pagesize = <16>;
|
||||
read-only;
|
||||
size = <256>;
|
||||
};
|
||||
|
||||
pmic@58 {
|
||||
compatible = "dlg,da9063";
|
||||
reg = <0x58>;
|
||||
@@ -65,48 +77,44 @@
|
||||
interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-controller;
|
||||
|
||||
regulators {
|
||||
vdd_bcore1: bcore1 {
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <900000>;
|
||||
regulator-min-microamp = <5000000>;
|
||||
regulator-max-microamp = <5000000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
onkey {
|
||||
compatible = "dlg,da9063-onkey";
|
||||
};
|
||||
|
||||
vdd_bcore2: bcore2 {
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <900000>;
|
||||
regulator-min-microamp = <5000000>;
|
||||
regulator-max-microamp = <5000000>;
|
||||
rtc {
|
||||
compatible = "dlg,da9063-rtc";
|
||||
};
|
||||
|
||||
wdt {
|
||||
compatible = "dlg,da9063-watchdog";
|
||||
};
|
||||
|
||||
regulators {
|
||||
vdd_bcore: bcores-merged {
|
||||
regulator-min-microvolt = <1050000>;
|
||||
regulator-max-microvolt = <1050000>;
|
||||
regulator-min-microamp = <4800000>;
|
||||
regulator-max-microamp = <4800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_bpro: bpro {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microamp = <2500000>;
|
||||
regulator-max-microamp = <2500000>;
|
||||
regulator-min-microamp = <2400000>;
|
||||
regulator-max-microamp = <2400000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_bperi: bperi {
|
||||
regulator-min-microvolt = <1050000>;
|
||||
regulator-max-microvolt = <1050000>;
|
||||
regulator-min-microvolt = <1060000>;
|
||||
regulator-max-microvolt = <1060000>;
|
||||
regulator-min-microamp = <1500000>;
|
||||
regulator-max-microamp = <1500000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_bmem: bmem {
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
regulator-min-microamp = <3000000>;
|
||||
regulator-max-microamp = <3000000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_bio: bio {
|
||||
vdd_bmem_bio: bmem-bio-merged {
|
||||
regulator-min-microvolt = <1200000>;
|
||||
regulator-max-microvolt = <1200000>;
|
||||
regulator-min-microamp = <3000000>;
|
||||
@@ -117,86 +125,66 @@
|
||||
vdd_ldo1: ldo1 {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microamp = <100000>;
|
||||
regulator-max-microamp = <100000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo2: ldo2 {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microamp = <200000>;
|
||||
regulator-max-microamp = <200000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo3: ldo3 {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microamp = <200000>;
|
||||
regulator-max-microamp = <200000>;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo4: ldo4 {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microamp = <200000>;
|
||||
regulator-max-microamp = <200000>;
|
||||
regulator-min-microvolt = <2500000>;
|
||||
regulator-max-microvolt = <2500000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo5: ldo5 {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microamp = <100000>;
|
||||
regulator-max-microamp = <100000>;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo6: ldo6 {
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-min-microamp = <200000>;
|
||||
regulator-max-microamp = <200000>;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo7: ldo7 {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microamp = <200000>;
|
||||
regulator-max-microamp = <200000>;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo8: ldo8 {
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microamp = <200000>;
|
||||
regulator-max-microamp = <200000>;
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ld09: ldo9 {
|
||||
regulator-min-microvolt = <1050000>;
|
||||
regulator-max-microvolt = <1050000>;
|
||||
regulator-min-microamp = <200000>;
|
||||
regulator-max-microamp = <200000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo10: ldo10 {
|
||||
regulator-min-microvolt = <1000000>;
|
||||
regulator-max-microvolt = <1000000>;
|
||||
regulator-min-microamp = <300000>;
|
||||
regulator-max-microamp = <300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_ldo11: ldo11 {
|
||||
regulator-min-microvolt = <2500000>;
|
||||
regulator-max-microvolt = <2500000>;
|
||||
regulator-min-microamp = <300000>;
|
||||
regulator-max-microamp = <300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
@@ -223,6 +211,7 @@
|
||||
spi-max-frequency = <20000000>;
|
||||
voltage-ranges = <3300 3300>;
|
||||
disable-wp;
|
||||
gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -245,4 +234,8 @@
|
||||
|
||||
&gpio {
|
||||
status = "okay";
|
||||
gpio-line-names = "J29.1", "PMICNTB", "PMICSHDN", "J8.1", "J8.3",
|
||||
"PCIe_PWREN", "THERM", "UBRDG_RSTN", "PCIe_PERSTN",
|
||||
"ULPI_RSTN", "J8.2", "UHUB_RSTN", "GEMGXL_RST", "J8.4",
|
||||
"EN_VDD_SD", "SD_CD";
|
||||
};
|
||||
|
||||
@@ -1484,6 +1484,8 @@ EXPORT_SYMBOL(kblockd_schedule_work);
|
||||
int kblockd_mod_delayed_work_on(int cpu, struct delayed_work *dwork,
|
||||
unsigned long delay)
|
||||
{
|
||||
if (!delay)
|
||||
return queue_work_on(cpu, kblockd_workqueue, &dwork->work);
|
||||
return mod_delayed_work_on(cpu, kblockd_workqueue, dwork, delay);
|
||||
}
|
||||
EXPORT_SYMBOL(kblockd_mod_delayed_work_on);
|
||||
|
||||
@@ -2311,7 +2311,14 @@ static void ioc_timer_fn(struct timer_list *timer)
|
||||
hwm = current_hweight_max(iocg);
|
||||
new_hwi = hweight_after_donation(iocg, old_hwi, hwm,
|
||||
usage, &now);
|
||||
if (new_hwi < hwm) {
|
||||
/*
|
||||
* Donation calculation assumes hweight_after_donation
|
||||
* to be positive, a condition that a donor w/ hwa < 2
|
||||
* can't meet. Don't bother with donation if hwa is
|
||||
* below 2. It's not gonna make a meaningful difference
|
||||
* anyway.
|
||||
*/
|
||||
if (new_hwi < hwm && hwa >= 2) {
|
||||
iocg->hweight_donating = hwa;
|
||||
iocg->hweight_after_donation = new_hwi;
|
||||
list_add(&iocg->surplus_list, &surpluses);
|
||||
|
||||
@@ -2859,8 +2859,19 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
|
||||
goto invalid_fld;
|
||||
}
|
||||
|
||||
if (ata_is_ncq(tf->protocol) && (cdb[2 + cdb_offset] & 0x3) == 0)
|
||||
tf->protocol = ATA_PROT_NCQ_NODATA;
|
||||
if ((cdb[2 + cdb_offset] & 0x3) == 0) {
|
||||
/*
|
||||
* When T_LENGTH is zero (No data is transferred), dir should
|
||||
* be DMA_NONE.
|
||||
*/
|
||||
if (scmd->sc_data_direction != DMA_NONE) {
|
||||
fp = 2 + cdb_offset;
|
||||
goto invalid_fld;
|
||||
}
|
||||
|
||||
if (ata_is_ncq(tf->protocol))
|
||||
tf->protocol = ATA_PROT_NCQ_NODATA;
|
||||
}
|
||||
|
||||
/* enable LBA */
|
||||
tf->flags |= ATA_TFLAG_LBA;
|
||||
|
||||
@@ -373,7 +373,7 @@ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan,
|
||||
struct axi_dma_desc *first)
|
||||
{
|
||||
u32 priority = chan->chip->dw->hdata->priority[chan->id];
|
||||
struct axi_dma_chan_config config;
|
||||
struct axi_dma_chan_config config = {};
|
||||
u32 irq_mask;
|
||||
u8 lms = 0; /* Select AXI0 master for LLI fetching */
|
||||
|
||||
@@ -391,7 +391,7 @@ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan,
|
||||
config.tt_fc = DWAXIDMAC_TT_FC_MEM_TO_MEM_DMAC;
|
||||
config.prior = priority;
|
||||
config.hs_sel_dst = DWAXIDMAC_HS_SEL_HW;
|
||||
config.hs_sel_dst = DWAXIDMAC_HS_SEL_HW;
|
||||
config.hs_sel_src = DWAXIDMAC_HS_SEL_HW;
|
||||
switch (chan->direction) {
|
||||
case DMA_MEM_TO_DEV:
|
||||
dw_axi_dma_set_byte_halfword(chan, true);
|
||||
|
||||
@@ -187,17 +187,9 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
|
||||
|
||||
/* DMA configuration */
|
||||
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
|
||||
if (!err) {
|
||||
if (err) {
|
||||
pci_err(pdev, "DMA mask 64 set failed\n");
|
||||
return err;
|
||||
} else {
|
||||
pci_err(pdev, "DMA mask 64 set failed\n");
|
||||
|
||||
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
|
||||
if (err) {
|
||||
pci_err(pdev, "DMA mask 32 set failed\n");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
/* Data structure allocation */
|
||||
|
||||
@@ -137,10 +137,10 @@ halt:
|
||||
INIT_WORK(&idxd->work, idxd_device_reinit);
|
||||
queue_work(idxd->wq, &idxd->work);
|
||||
} else {
|
||||
spin_lock(&idxd->dev_lock);
|
||||
idxd->state = IDXD_DEV_HALTED;
|
||||
idxd_wqs_quiesce(idxd);
|
||||
idxd_wqs_unmap_portal(idxd);
|
||||
spin_lock(&idxd->dev_lock);
|
||||
idxd_device_clear_state(idxd);
|
||||
dev_err(&idxd->pdev->dev,
|
||||
"idxd halted, need %s.\n",
|
||||
|
||||
@@ -106,6 +106,7 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
|
||||
{
|
||||
struct idxd_desc *d, *t, *found = NULL;
|
||||
struct llist_node *head;
|
||||
LIST_HEAD(flist);
|
||||
|
||||
desc->completion->status = IDXD_COMP_DESC_ABORT;
|
||||
/*
|
||||
@@ -120,7 +121,11 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
|
||||
found = desc;
|
||||
continue;
|
||||
}
|
||||
list_add_tail(&desc->list, &ie->work_list);
|
||||
|
||||
if (d->completion->status)
|
||||
list_add_tail(&d->list, &flist);
|
||||
else
|
||||
list_add_tail(&d->list, &ie->work_list);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,6 +135,17 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
|
||||
|
||||
if (found)
|
||||
complete_desc(found, IDXD_COMPLETE_ABORT);
|
||||
|
||||
/*
|
||||
* complete_desc() will return desc to allocator and the desc can be
|
||||
* acquired by a different process and the desc->list can be modified.
|
||||
* Delete desc from list so the list trasversing does not get corrupted
|
||||
* by the other process.
|
||||
*/
|
||||
list_for_each_entry_safe(d, t, &flist, list) {
|
||||
list_del_init(&d->list);
|
||||
complete_desc(d, IDXD_COMPLETE_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)
|
||||
|
||||
@@ -874,4 +874,4 @@ MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("STMicroelectronics FDMA engine driver");
|
||||
MODULE_AUTHOR("Ludovic.barre <Ludovic.barre@st.com>");
|
||||
MODULE_AUTHOR("Peter Griffin <peter.griffin@linaro.org>");
|
||||
MODULE_ALIAS("platform: " DRIVER_NAME);
|
||||
MODULE_ALIAS("platform:" DRIVER_NAME);
|
||||
|
||||
@@ -4534,45 +4534,60 @@ static int udma_setup_resources(struct udma_dev *ud)
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
|
||||
if (IS_ERR(rm_res)) {
|
||||
bitmap_zero(ud->tchan_map, ud->tchan_cnt);
|
||||
irq_res.sets = 1;
|
||||
} else {
|
||||
bitmap_fill(ud->tchan_map, ud->tchan_cnt);
|
||||
for (i = 0; i < rm_res->sets; i++)
|
||||
udma_mark_resource_ranges(ud, ud->tchan_map,
|
||||
&rm_res->desc[i], "tchan");
|
||||
irq_res.sets = rm_res->sets;
|
||||
}
|
||||
irq_res.sets = rm_res->sets;
|
||||
|
||||
/* rchan and matching default flow ranges */
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
|
||||
if (IS_ERR(rm_res)) {
|
||||
bitmap_zero(ud->rchan_map, ud->rchan_cnt);
|
||||
irq_res.sets++;
|
||||
} else {
|
||||
bitmap_fill(ud->rchan_map, ud->rchan_cnt);
|
||||
for (i = 0; i < rm_res->sets; i++)
|
||||
udma_mark_resource_ranges(ud, ud->rchan_map,
|
||||
&rm_res->desc[i], "rchan");
|
||||
irq_res.sets += rm_res->sets;
|
||||
}
|
||||
|
||||
irq_res.sets += rm_res->sets;
|
||||
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
|
||||
if (!irq_res.desc)
|
||||
return -ENOMEM;
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
|
||||
for (i = 0; i < rm_res->sets; i++) {
|
||||
irq_res.desc[i].start = rm_res->desc[i].start;
|
||||
irq_res.desc[i].num = rm_res->desc[i].num;
|
||||
irq_res.desc[i].start_sec = rm_res->desc[i].start_sec;
|
||||
irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
|
||||
if (IS_ERR(rm_res)) {
|
||||
irq_res.desc[0].start = 0;
|
||||
irq_res.desc[0].num = ud->tchan_cnt;
|
||||
i = 1;
|
||||
} else {
|
||||
for (i = 0; i < rm_res->sets; i++) {
|
||||
irq_res.desc[i].start = rm_res->desc[i].start;
|
||||
irq_res.desc[i].num = rm_res->desc[i].num;
|
||||
irq_res.desc[i].start_sec = rm_res->desc[i].start_sec;
|
||||
irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
|
||||
}
|
||||
}
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
|
||||
for (j = 0; j < rm_res->sets; j++, i++) {
|
||||
if (rm_res->desc[j].num) {
|
||||
irq_res.desc[i].start = rm_res->desc[j].start +
|
||||
ud->soc_data->oes.udma_rchan;
|
||||
irq_res.desc[i].num = rm_res->desc[j].num;
|
||||
}
|
||||
if (rm_res->desc[j].num_sec) {
|
||||
irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
|
||||
ud->soc_data->oes.udma_rchan;
|
||||
irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
|
||||
if (IS_ERR(rm_res)) {
|
||||
irq_res.desc[i].start = 0;
|
||||
irq_res.desc[i].num = ud->rchan_cnt;
|
||||
} else {
|
||||
for (j = 0; j < rm_res->sets; j++, i++) {
|
||||
if (rm_res->desc[j].num) {
|
||||
irq_res.desc[i].start = rm_res->desc[j].start +
|
||||
ud->soc_data->oes.udma_rchan;
|
||||
irq_res.desc[i].num = rm_res->desc[j].num;
|
||||
}
|
||||
if (rm_res->desc[j].num_sec) {
|
||||
irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
|
||||
ud->soc_data->oes.udma_rchan;
|
||||
irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
|
||||
@@ -4690,14 +4705,15 @@ static int bcdma_setup_resources(struct udma_dev *ud)
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
|
||||
if (IS_ERR(rm_res)) {
|
||||
bitmap_zero(ud->bchan_map, ud->bchan_cnt);
|
||||
irq_res.sets++;
|
||||
} else {
|
||||
bitmap_fill(ud->bchan_map, ud->bchan_cnt);
|
||||
for (i = 0; i < rm_res->sets; i++)
|
||||
udma_mark_resource_ranges(ud, ud->bchan_map,
|
||||
&rm_res->desc[i],
|
||||
"bchan");
|
||||
irq_res.sets += rm_res->sets;
|
||||
}
|
||||
irq_res.sets += rm_res->sets;
|
||||
}
|
||||
|
||||
/* tchan ranges */
|
||||
@@ -4705,14 +4721,15 @@ static int bcdma_setup_resources(struct udma_dev *ud)
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
|
||||
if (IS_ERR(rm_res)) {
|
||||
bitmap_zero(ud->tchan_map, ud->tchan_cnt);
|
||||
irq_res.sets += 2;
|
||||
} else {
|
||||
bitmap_fill(ud->tchan_map, ud->tchan_cnt);
|
||||
for (i = 0; i < rm_res->sets; i++)
|
||||
udma_mark_resource_ranges(ud, ud->tchan_map,
|
||||
&rm_res->desc[i],
|
||||
"tchan");
|
||||
irq_res.sets += rm_res->sets * 2;
|
||||
}
|
||||
irq_res.sets += rm_res->sets * 2;
|
||||
}
|
||||
|
||||
/* rchan ranges */
|
||||
@@ -4720,47 +4737,72 @@ static int bcdma_setup_resources(struct udma_dev *ud)
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
|
||||
if (IS_ERR(rm_res)) {
|
||||
bitmap_zero(ud->rchan_map, ud->rchan_cnt);
|
||||
irq_res.sets += 2;
|
||||
} else {
|
||||
bitmap_fill(ud->rchan_map, ud->rchan_cnt);
|
||||
for (i = 0; i < rm_res->sets; i++)
|
||||
udma_mark_resource_ranges(ud, ud->rchan_map,
|
||||
&rm_res->desc[i],
|
||||
"rchan");
|
||||
irq_res.sets += rm_res->sets * 2;
|
||||
}
|
||||
irq_res.sets += rm_res->sets * 2;
|
||||
}
|
||||
|
||||
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
|
||||
if (!irq_res.desc)
|
||||
return -ENOMEM;
|
||||
if (ud->bchan_cnt) {
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
|
||||
for (i = 0; i < rm_res->sets; i++) {
|
||||
irq_res.desc[i].start = rm_res->desc[i].start +
|
||||
oes->bcdma_bchan_ring;
|
||||
irq_res.desc[i].num = rm_res->desc[i].num;
|
||||
if (IS_ERR(rm_res)) {
|
||||
irq_res.desc[0].start = oes->bcdma_bchan_ring;
|
||||
irq_res.desc[0].num = ud->bchan_cnt;
|
||||
i = 1;
|
||||
} else {
|
||||
for (i = 0; i < rm_res->sets; i++) {
|
||||
irq_res.desc[i].start = rm_res->desc[i].start +
|
||||
oes->bcdma_bchan_ring;
|
||||
irq_res.desc[i].num = rm_res->desc[i].num;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ud->tchan_cnt) {
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
|
||||
for (j = 0; j < rm_res->sets; j++, i += 2) {
|
||||
irq_res.desc[i].start = rm_res->desc[j].start +
|
||||
oes->bcdma_tchan_data;
|
||||
irq_res.desc[i].num = rm_res->desc[j].num;
|
||||
if (IS_ERR(rm_res)) {
|
||||
irq_res.desc[i].start = oes->bcdma_tchan_data;
|
||||
irq_res.desc[i].num = ud->tchan_cnt;
|
||||
irq_res.desc[i + 1].start = oes->bcdma_tchan_ring;
|
||||
irq_res.desc[i + 1].num = ud->tchan_cnt;
|
||||
i += 2;
|
||||
} else {
|
||||
for (j = 0; j < rm_res->sets; j++, i += 2) {
|
||||
irq_res.desc[i].start = rm_res->desc[j].start +
|
||||
oes->bcdma_tchan_data;
|
||||
irq_res.desc[i].num = rm_res->desc[j].num;
|
||||
|
||||
irq_res.desc[i + 1].start = rm_res->desc[j].start +
|
||||
oes->bcdma_tchan_ring;
|
||||
irq_res.desc[i + 1].num = rm_res->desc[j].num;
|
||||
irq_res.desc[i + 1].start = rm_res->desc[j].start +
|
||||
oes->bcdma_tchan_ring;
|
||||
irq_res.desc[i + 1].num = rm_res->desc[j].num;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ud->rchan_cnt) {
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
|
||||
for (j = 0; j < rm_res->sets; j++, i += 2) {
|
||||
irq_res.desc[i].start = rm_res->desc[j].start +
|
||||
oes->bcdma_rchan_data;
|
||||
irq_res.desc[i].num = rm_res->desc[j].num;
|
||||
if (IS_ERR(rm_res)) {
|
||||
irq_res.desc[i].start = oes->bcdma_rchan_data;
|
||||
irq_res.desc[i].num = ud->rchan_cnt;
|
||||
irq_res.desc[i + 1].start = oes->bcdma_rchan_ring;
|
||||
irq_res.desc[i + 1].num = ud->rchan_cnt;
|
||||
i += 2;
|
||||
} else {
|
||||
for (j = 0; j < rm_res->sets; j++, i += 2) {
|
||||
irq_res.desc[i].start = rm_res->desc[j].start +
|
||||
oes->bcdma_rchan_data;
|
||||
irq_res.desc[i].num = rm_res->desc[j].num;
|
||||
|
||||
irq_res.desc[i + 1].start = rm_res->desc[j].start +
|
||||
oes->bcdma_rchan_ring;
|
||||
irq_res.desc[i + 1].num = rm_res->desc[j].num;
|
||||
irq_res.desc[i + 1].start = rm_res->desc[j].start +
|
||||
oes->bcdma_rchan_ring;
|
||||
irq_res.desc[i + 1].num = rm_res->desc[j].num;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4858,39 +4900,54 @@ static int pktdma_setup_resources(struct udma_dev *ud)
|
||||
if (IS_ERR(rm_res)) {
|
||||
/* all rflows are assigned exclusively to Linux */
|
||||
bitmap_zero(ud->rflow_in_use, ud->rflow_cnt);
|
||||
irq_res.sets = 1;
|
||||
} else {
|
||||
bitmap_fill(ud->rflow_in_use, ud->rflow_cnt);
|
||||
for (i = 0; i < rm_res->sets; i++)
|
||||
udma_mark_resource_ranges(ud, ud->rflow_in_use,
|
||||
&rm_res->desc[i], "rflow");
|
||||
irq_res.sets = rm_res->sets;
|
||||
}
|
||||
irq_res.sets = rm_res->sets;
|
||||
|
||||
/* tflow ranges */
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
|
||||
if (IS_ERR(rm_res)) {
|
||||
/* all tflows are assigned exclusively to Linux */
|
||||
bitmap_zero(ud->tflow_map, ud->tflow_cnt);
|
||||
irq_res.sets++;
|
||||
} else {
|
||||
bitmap_fill(ud->tflow_map, ud->tflow_cnt);
|
||||
for (i = 0; i < rm_res->sets; i++)
|
||||
udma_mark_resource_ranges(ud, ud->tflow_map,
|
||||
&rm_res->desc[i], "tflow");
|
||||
irq_res.sets += rm_res->sets;
|
||||
}
|
||||
irq_res.sets += rm_res->sets;
|
||||
|
||||
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
|
||||
if (!irq_res.desc)
|
||||
return -ENOMEM;
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
|
||||
for (i = 0; i < rm_res->sets; i++) {
|
||||
irq_res.desc[i].start = rm_res->desc[i].start +
|
||||
oes->pktdma_tchan_flow;
|
||||
irq_res.desc[i].num = rm_res->desc[i].num;
|
||||
if (IS_ERR(rm_res)) {
|
||||
irq_res.desc[0].start = oes->pktdma_tchan_flow;
|
||||
irq_res.desc[0].num = ud->tflow_cnt;
|
||||
i = 1;
|
||||
} else {
|
||||
for (i = 0; i < rm_res->sets; i++) {
|
||||
irq_res.desc[i].start = rm_res->desc[i].start +
|
||||
oes->pktdma_tchan_flow;
|
||||
irq_res.desc[i].num = rm_res->desc[i].num;
|
||||
}
|
||||
}
|
||||
rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW];
|
||||
for (j = 0; j < rm_res->sets; j++, i++) {
|
||||
irq_res.desc[i].start = rm_res->desc[j].start +
|
||||
oes->pktdma_rchan_flow;
|
||||
irq_res.desc[i].num = rm_res->desc[j].num;
|
||||
if (IS_ERR(rm_res)) {
|
||||
irq_res.desc[i].start = oes->pktdma_rchan_flow;
|
||||
irq_res.desc[i].num = ud->rflow_cnt;
|
||||
} else {
|
||||
for (j = 0; j < rm_res->sets; j++, i++) {
|
||||
irq_res.desc[i].start = rm_res->desc[j].start +
|
||||
oes->pktdma_rchan_flow;
|
||||
irq_res.desc[i].num = rm_res->desc[j].num;
|
||||
}
|
||||
}
|
||||
ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
|
||||
kfree(irq_res.desc);
|
||||
|
||||
@@ -3070,8 +3070,8 @@ static void gfx_v9_0_init_pg(struct amdgpu_device *adev)
|
||||
AMD_PG_SUPPORT_CP |
|
||||
AMD_PG_SUPPORT_GDS |
|
||||
AMD_PG_SUPPORT_RLC_SMU_HS)) {
|
||||
WREG32(mmRLC_JUMP_TABLE_RESTORE,
|
||||
adev->gfx.rlc.cp_table_gpu_addr >> 8);
|
||||
WREG32_SOC15(GC, 0, mmRLC_JUMP_TABLE_RESTORE,
|
||||
adev->gfx.rlc.cp_table_gpu_addr >> 8);
|
||||
gfx_v9_0_init_gfx_power_gating(adev);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +162,6 @@ static void gfxhub_v1_0_init_tlb_regs(struct amdgpu_device *adev)
|
||||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC);/* XXX for emulation. */
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
|
||||
|
||||
@@ -196,7 +196,6 @@ static void gfxhub_v2_0_init_tlb_regs(struct amdgpu_device *adev)
|
||||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC); /* UC, uncached */
|
||||
|
||||
|
||||
@@ -197,7 +197,6 @@ static void gfxhub_v2_1_init_tlb_regs(struct amdgpu_device *adev)
|
||||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC); /* UC, uncached */
|
||||
|
||||
|
||||
@@ -1808,6 +1808,14 @@ static int gmc_v9_0_hw_fini(void *handle)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Pair the operations did in gmc_v9_0_hw_init and thus maintain
|
||||
* a correct cached state for GMC. Otherwise, the "gate" again
|
||||
* operation on S3 resuming will fail due to wrong cached state.
|
||||
*/
|
||||
if (adev->mmhub.funcs->update_power_gating)
|
||||
adev->mmhub.funcs->update_power_gating(adev, false);
|
||||
|
||||
amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0);
|
||||
amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
|
||||
|
||||
|
||||
@@ -145,7 +145,6 @@ static void mmhub_v1_0_init_tlb_regs(struct amdgpu_device *adev)
|
||||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC);/* XXX for emulation. */
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
|
||||
@@ -302,10 +301,10 @@ static void mmhub_v1_0_update_power_gating(struct amdgpu_device *adev,
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
return;
|
||||
|
||||
if (enable && adev->pg_flags & AMD_PG_SUPPORT_MMHUB) {
|
||||
amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GMC, true);
|
||||
|
||||
}
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_MMHUB)
|
||||
amdgpu_dpm_set_powergating_by_smu(adev,
|
||||
AMD_IP_BLOCK_TYPE_GMC,
|
||||
enable);
|
||||
}
|
||||
|
||||
static int mmhub_v1_0_gart_enable(struct amdgpu_device *adev)
|
||||
|
||||
@@ -165,7 +165,6 @@ static void mmhub_v1_7_init_tlb_regs(struct amdgpu_device *adev)
|
||||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC);/* XXX for emulation. */
|
||||
tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
|
||||
|
||||
@@ -267,7 +267,6 @@ static void mmhub_v2_0_init_tlb_regs(struct amdgpu_device *adev)
|
||||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC); /* UC, uncached */
|
||||
|
||||
|
||||
@@ -194,7 +194,6 @@ static void mmhub_v2_3_init_tlb_regs(struct amdgpu_device *adev)
|
||||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC); /* UC, uncached */
|
||||
|
||||
|
||||
@@ -189,8 +189,6 @@ static void mmhub_v9_4_init_tlb_regs(struct amdgpu_device *adev, int hubid)
|
||||
ENABLE_ADVANCED_DRIVER_MODEL, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
|
||||
ECO_BITS, 0);
|
||||
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
|
||||
MTYPE, MTYPE_UC);/* XXX for emulation. */
|
||||
tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
|
||||
|
||||
@@ -1051,6 +1051,11 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Reset DMCUB if it was previously running - before we overwrite its memory. */
|
||||
status = dmub_srv_hw_reset(dmub_srv);
|
||||
if (status != DMUB_STATUS_OK)
|
||||
DRM_WARN("Error resetting DMUB HW: %d\n", status);
|
||||
|
||||
hdr = (const struct dmcub_firmware_header_v1_0 *)dmub_fw->data;
|
||||
|
||||
fw_inst_const = dmub_fw->data +
|
||||
|
||||
@@ -101,6 +101,7 @@ static const struct hw_sequencer_funcs dcn31_funcs = {
|
||||
.z10_restore = dcn31_z10_restore,
|
||||
.z10_save_init = dcn31_z10_save_init,
|
||||
.set_disp_pattern_generator = dcn30_set_disp_pattern_generator,
|
||||
.exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state,
|
||||
.update_visual_confirm_color = dcn20_update_visual_confirm_color,
|
||||
};
|
||||
|
||||
|
||||
@@ -1328,7 +1328,12 @@ static int pp_set_powergating_by_smu(void *handle,
|
||||
pp_dpm_powergate_vce(handle, gate);
|
||||
break;
|
||||
case AMD_IP_BLOCK_TYPE_GMC:
|
||||
pp_dpm_powergate_mmhub(handle);
|
||||
/*
|
||||
* For now, this is only used on PICASSO.
|
||||
* And only "gate" operation is supported.
|
||||
*/
|
||||
if (gate)
|
||||
pp_dpm_powergate_mmhub(handle);
|
||||
break;
|
||||
case AMD_IP_BLOCK_TYPE_GFX:
|
||||
ret = pp_dpm_powergate_gfx(handle, gate);
|
||||
|
||||
@@ -191,6 +191,9 @@ int smu_v12_0_fini_smc_tables(struct smu_context *smu)
|
||||
kfree(smu_table->watermarks_table);
|
||||
smu_table->watermarks_table = NULL;
|
||||
|
||||
kfree(smu_table->gpu_metrics_table);
|
||||
smu_table->gpu_metrics_table = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -198,6 +198,7 @@ int smu_v13_0_check_fw_status(struct smu_context *smu)
|
||||
|
||||
int smu_v13_0_check_fw_version(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
uint32_t if_version = 0xff, smu_version = 0xff;
|
||||
uint16_t smu_major;
|
||||
uint8_t smu_minor, smu_debug;
|
||||
@@ -210,6 +211,8 @@ int smu_v13_0_check_fw_version(struct smu_context *smu)
|
||||
smu_major = (smu_version >> 16) & 0xffff;
|
||||
smu_minor = (smu_version >> 8) & 0xff;
|
||||
smu_debug = (smu_version >> 0) & 0xff;
|
||||
if (smu->is_apu)
|
||||
adev->pm.fw_version = smu_version;
|
||||
|
||||
switch (smu->adev->ip_versions[MP1_HWIP][0]) {
|
||||
case IP_VERSION(13, 0, 2):
|
||||
|
||||
@@ -1121,7 +1121,10 @@ static void ast_crtc_reset(struct drm_crtc *crtc)
|
||||
if (crtc->state)
|
||||
crtc->funcs->atomic_destroy_state(crtc, crtc->state);
|
||||
|
||||
__drm_atomic_helper_crtc_reset(crtc, &ast_state->base);
|
||||
if (ast_state)
|
||||
__drm_atomic_helper_crtc_reset(crtc, &ast_state->base);
|
||||
else
|
||||
__drm_atomic_helper_crtc_reset(crtc, NULL);
|
||||
}
|
||||
|
||||
static struct drm_crtc_state *
|
||||
|
||||
@@ -1743,7 +1743,13 @@ void drm_fb_helper_fill_info(struct fb_info *info,
|
||||
sizes->fb_width, sizes->fb_height);
|
||||
|
||||
info->par = fb_helper;
|
||||
snprintf(info->fix.id, sizeof(info->fix.id), "%s",
|
||||
/*
|
||||
* The DRM drivers fbdev emulation device name can be confusing if the
|
||||
* driver name also has a "drm" suffix on it. Leading to names such as
|
||||
* "simpledrmdrmfb" in /proc/fb. Unfortunately, it's an uAPI and can't
|
||||
* be changed due user-space tools (e.g: pm-utils) matching against it.
|
||||
*/
|
||||
snprintf(info->fix.id, sizeof(info->fix.id), "%sdrmfb",
|
||||
fb_helper->dev->driver->name);
|
||||
|
||||
}
|
||||
|
||||
@@ -596,7 +596,7 @@ static void parse_dmc_fw(struct drm_i915_private *dev_priv,
|
||||
continue;
|
||||
|
||||
offset = readcount + dmc->dmc_info[id].dmc_offset * 4;
|
||||
if (fw->size - offset < 0) {
|
||||
if (offset > fw->size) {
|
||||
drm_err(&dev_priv->drm, "Reading beyond the fw_size\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -458,7 +458,7 @@ static struct drm_display_mode simpledrm_mode(unsigned int width,
|
||||
{
|
||||
struct drm_display_mode mode = { SIMPLEDRM_MODE(width, height) };
|
||||
|
||||
mode.clock = 60 /* Hz */ * mode.hdisplay * mode.vdisplay;
|
||||
mode.clock = mode.hdisplay * mode.vdisplay * 60 / 1000 /* kHz */;
|
||||
drm_mode_set_name(&mode);
|
||||
|
||||
return mode;
|
||||
|
||||
@@ -1139,6 +1139,7 @@ static void cancel_writeback_rate_update_dwork(struct cached_dev *dc)
|
||||
static void cached_dev_detach_finish(struct work_struct *w)
|
||||
{
|
||||
struct cached_dev *dc = container_of(w, struct cached_dev, detach);
|
||||
struct cache_set *c = dc->disk.c;
|
||||
|
||||
BUG_ON(!test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags));
|
||||
BUG_ON(refcount_read(&dc->count));
|
||||
@@ -1156,7 +1157,7 @@ static void cached_dev_detach_finish(struct work_struct *w)
|
||||
|
||||
bcache_device_detach(&dc->disk);
|
||||
list_move(&dc->list, &uncached_devices);
|
||||
calc_cached_dev_sectors(dc->disk.c);
|
||||
calc_cached_dev_sectors(c);
|
||||
|
||||
clear_bit(BCACHE_DEV_DETACHING, &dc->disk.flags);
|
||||
clear_bit(BCACHE_DEV_UNLINK_DONE, &dc->disk.flags);
|
||||
|
||||
@@ -3053,7 +3053,6 @@ mpi_smp_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
|
||||
struct smp_completion_resp *psmpPayload;
|
||||
struct task_status_struct *ts;
|
||||
struct pm8001_device *pm8001_dev;
|
||||
char *pdma_respaddr = NULL;
|
||||
|
||||
psmpPayload = (struct smp_completion_resp *)(piomb + 4);
|
||||
status = le32_to_cpu(psmpPayload->status);
|
||||
@@ -3080,19 +3079,23 @@ mpi_smp_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
|
||||
if (pm8001_dev)
|
||||
atomic_dec(&pm8001_dev->running_req);
|
||||
if (pm8001_ha->smp_exp_mode == SMP_DIRECT) {
|
||||
struct scatterlist *sg_resp = &t->smp_task.smp_resp;
|
||||
u8 *payload;
|
||||
void *to;
|
||||
|
||||
pm8001_dbg(pm8001_ha, IO,
|
||||
"DIRECT RESPONSE Length:%d\n",
|
||||
param);
|
||||
pdma_respaddr = (char *)(phys_to_virt(cpu_to_le64
|
||||
((u64)sg_dma_address
|
||||
(&t->smp_task.smp_resp))));
|
||||
to = kmap_atomic(sg_page(sg_resp));
|
||||
payload = to + sg_resp->offset;
|
||||
for (i = 0; i < param; i++) {
|
||||
*(pdma_respaddr+i) = psmpPayload->_r_a[i];
|
||||
*(payload + i) = psmpPayload->_r_a[i];
|
||||
pm8001_dbg(pm8001_ha, IO,
|
||||
"SMP Byte%d DMA data 0x%x psmp 0x%x\n",
|
||||
i, *(pdma_respaddr + i),
|
||||
i, *(payload + i),
|
||||
psmpPayload->_r_a[i]);
|
||||
}
|
||||
kunmap_atomic(to);
|
||||
}
|
||||
break;
|
||||
case IO_ABORTED:
|
||||
@@ -4236,14 +4239,14 @@ static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
|
||||
struct sas_task *task = ccb->task;
|
||||
struct domain_device *dev = task->dev;
|
||||
struct pm8001_device *pm8001_dev = dev->lldd_dev;
|
||||
struct scatterlist *sg_req, *sg_resp;
|
||||
struct scatterlist *sg_req, *sg_resp, *smp_req;
|
||||
u32 req_len, resp_len;
|
||||
struct smp_req smp_cmd;
|
||||
u32 opc;
|
||||
struct inbound_queue_table *circularQ;
|
||||
char *preq_dma_addr = NULL;
|
||||
__le64 tmp_addr;
|
||||
u32 i, length;
|
||||
u8 *payload;
|
||||
u8 *to;
|
||||
|
||||
memset(&smp_cmd, 0, sizeof(smp_cmd));
|
||||
/*
|
||||
@@ -4280,8 +4283,9 @@ static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
|
||||
pm8001_ha->smp_exp_mode = SMP_INDIRECT;
|
||||
|
||||
|
||||
tmp_addr = cpu_to_le64((u64)sg_dma_address(&task->smp_task.smp_req));
|
||||
preq_dma_addr = (char *)phys_to_virt(tmp_addr);
|
||||
smp_req = &task->smp_task.smp_req;
|
||||
to = kmap_atomic(sg_page(smp_req));
|
||||
payload = to + smp_req->offset;
|
||||
|
||||
/* INDIRECT MODE command settings. Use DMA */
|
||||
if (pm8001_ha->smp_exp_mode == SMP_INDIRECT) {
|
||||
@@ -4289,7 +4293,7 @@ static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
|
||||
/* for SPCv indirect mode. Place the top 4 bytes of
|
||||
* SMP Request header here. */
|
||||
for (i = 0; i < 4; i++)
|
||||
smp_cmd.smp_req16[i] = *(preq_dma_addr + i);
|
||||
smp_cmd.smp_req16[i] = *(payload + i);
|
||||
/* exclude top 4 bytes for SMP req header */
|
||||
smp_cmd.long_smp_req.long_req_addr =
|
||||
cpu_to_le64((u64)sg_dma_address
|
||||
@@ -4320,20 +4324,20 @@ static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
|
||||
pm8001_dbg(pm8001_ha, IO, "SMP REQUEST DIRECT MODE\n");
|
||||
for (i = 0; i < length; i++)
|
||||
if (i < 16) {
|
||||
smp_cmd.smp_req16[i] = *(preq_dma_addr+i);
|
||||
smp_cmd.smp_req16[i] = *(payload + i);
|
||||
pm8001_dbg(pm8001_ha, IO,
|
||||
"Byte[%d]:%x (DMA data:%x)\n",
|
||||
i, smp_cmd.smp_req16[i],
|
||||
*(preq_dma_addr));
|
||||
*(payload));
|
||||
} else {
|
||||
smp_cmd.smp_req[i] = *(preq_dma_addr+i);
|
||||
smp_cmd.smp_req[i] = *(payload + i);
|
||||
pm8001_dbg(pm8001_ha, IO,
|
||||
"Byte[%d]:%x (DMA data:%x)\n",
|
||||
i, smp_cmd.smp_req[i],
|
||||
*(preq_dma_addr));
|
||||
*(payload));
|
||||
}
|
||||
}
|
||||
|
||||
kunmap_atomic(to);
|
||||
build_smp_cmd(pm8001_dev->device_id, smp_cmd.tag,
|
||||
&smp_cmd, pm8001_ha->smp_exp_mode, length);
|
||||
rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &smp_cmd,
|
||||
|
||||
@@ -463,8 +463,8 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
|
||||
BUG_ON(ret < 0);
|
||||
rcu_assign_pointer(root->node, cow);
|
||||
|
||||
btrfs_free_tree_block(trans, root, buf, parent_start,
|
||||
last_ref);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(root), buf,
|
||||
parent_start, last_ref);
|
||||
free_extent_buffer(buf);
|
||||
add_root_to_dirty_list(root);
|
||||
} else {
|
||||
@@ -485,8 +485,8 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
btrfs_free_tree_block(trans, root, buf, parent_start,
|
||||
last_ref);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(root), buf,
|
||||
parent_start, last_ref);
|
||||
}
|
||||
if (unlock_orig)
|
||||
btrfs_tree_unlock(buf);
|
||||
@@ -927,7 +927,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
|
||||
free_extent_buffer(mid);
|
||||
|
||||
root_sub_used(root, mid->len);
|
||||
btrfs_free_tree_block(trans, root, mid, 0, 1);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(root), mid, 0, 1);
|
||||
/* once for the root ptr */
|
||||
free_extent_buffer_stale(mid);
|
||||
return 0;
|
||||
@@ -986,7 +986,8 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
|
||||
btrfs_tree_unlock(right);
|
||||
del_ptr(root, path, level + 1, pslot + 1);
|
||||
root_sub_used(root, right->len);
|
||||
btrfs_free_tree_block(trans, root, right, 0, 1);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(root), right,
|
||||
0, 1);
|
||||
free_extent_buffer_stale(right);
|
||||
right = NULL;
|
||||
} else {
|
||||
@@ -1031,7 +1032,7 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
|
||||
btrfs_tree_unlock(mid);
|
||||
del_ptr(root, path, level + 1, pslot);
|
||||
root_sub_used(root, mid->len);
|
||||
btrfs_free_tree_block(trans, root, mid, 0, 1);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(root), mid, 0, 1);
|
||||
free_extent_buffer_stale(mid);
|
||||
mid = NULL;
|
||||
} else {
|
||||
@@ -4032,7 +4033,7 @@ static noinline void btrfs_del_leaf(struct btrfs_trans_handle *trans,
|
||||
root_sub_used(root, leaf->len);
|
||||
|
||||
atomic_inc(&leaf->refs);
|
||||
btrfs_free_tree_block(trans, root, leaf, 0, 1);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(root), leaf, 0, 1);
|
||||
free_extent_buffer_stale(leaf);
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -2257,6 +2257,11 @@ static inline bool btrfs_root_dead(const struct btrfs_root *root)
|
||||
return (root->root_item.flags & cpu_to_le64(BTRFS_ROOT_SUBVOL_DEAD)) != 0;
|
||||
}
|
||||
|
||||
static inline u64 btrfs_root_id(const struct btrfs_root *root)
|
||||
{
|
||||
return root->root_key.objectid;
|
||||
}
|
||||
|
||||
/* struct btrfs_root_backup */
|
||||
BTRFS_SETGET_STACK_FUNCS(backup_tree_root, struct btrfs_root_backup,
|
||||
tree_root, 64);
|
||||
@@ -2719,7 +2724,7 @@ struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans,
|
||||
u64 empty_size,
|
||||
enum btrfs_lock_nesting nest);
|
||||
void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root,
|
||||
u64 root_id,
|
||||
struct extent_buffer *buf,
|
||||
u64 parent, int last_ref);
|
||||
int btrfs_alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
|
||||
|
||||
@@ -1732,6 +1732,14 @@ again:
|
||||
}
|
||||
return root;
|
||||
fail:
|
||||
/*
|
||||
* If our caller provided us an anonymous device, then it's his
|
||||
* responsability to free it in case we fail. So we have to set our
|
||||
* root's anon_dev to 0 to avoid a double free, once by btrfs_put_root()
|
||||
* and once again by our caller.
|
||||
*/
|
||||
if (anon_dev)
|
||||
root->anon_dev = 0;
|
||||
btrfs_put_root(root);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
@@ -3275,20 +3275,20 @@ out_delayed_unlock:
|
||||
}
|
||||
|
||||
void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root,
|
||||
u64 root_id,
|
||||
struct extent_buffer *buf,
|
||||
u64 parent, int last_ref)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
struct btrfs_fs_info *fs_info = trans->fs_info;
|
||||
struct btrfs_ref generic_ref = { 0 };
|
||||
int ret;
|
||||
|
||||
btrfs_init_generic_ref(&generic_ref, BTRFS_DROP_DELAYED_REF,
|
||||
buf->start, buf->len, parent);
|
||||
btrfs_init_tree_ref(&generic_ref, btrfs_header_level(buf),
|
||||
root->root_key.objectid, 0, false);
|
||||
root_id, 0, false);
|
||||
|
||||
if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) {
|
||||
if (root_id != BTRFS_TREE_LOG_OBJECTID) {
|
||||
btrfs_ref_tree_mod(fs_info, &generic_ref);
|
||||
ret = btrfs_add_delayed_tree_ref(trans, &generic_ref, NULL);
|
||||
BUG_ON(ret); /* -ENOMEM */
|
||||
@@ -3298,7 +3298,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_block_group *cache;
|
||||
bool must_pin = false;
|
||||
|
||||
if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) {
|
||||
if (root_id != BTRFS_TREE_LOG_OBJECTID) {
|
||||
ret = check_ref_cleanup(trans, buf->start);
|
||||
if (!ret) {
|
||||
btrfs_redirty_list_add(trans->transaction, buf);
|
||||
@@ -5472,7 +5472,8 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans,
|
||||
goto owner_mismatch;
|
||||
}
|
||||
|
||||
btrfs_free_tree_block(trans, root, eb, parent, wc->refs[level] == 1);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(root), eb, parent,
|
||||
wc->refs[level] == 1);
|
||||
out:
|
||||
wc->refs[level] = 0;
|
||||
wc->flags[level] = 0;
|
||||
|
||||
@@ -6611,6 +6611,14 @@ int read_extent_buffer_pages(struct extent_buffer *eb, int wait, int mirror_num)
|
||||
if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* We could have had EXTENT_BUFFER_UPTODATE cleared by the write
|
||||
* operation, which could potentially still be in flight. In this case
|
||||
* we simply want to return an error.
|
||||
*/
|
||||
if (unlikely(test_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags)))
|
||||
return -EIO;
|
||||
|
||||
if (eb->fs_info->sectorsize < PAGE_SIZE)
|
||||
return read_extent_buffer_subpage(eb, wait, mirror_num);
|
||||
|
||||
|
||||
@@ -1256,8 +1256,8 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info)
|
||||
btrfs_tree_lock(free_space_root->node);
|
||||
btrfs_clean_tree_block(free_space_root->node);
|
||||
btrfs_tree_unlock(free_space_root->node);
|
||||
btrfs_free_tree_block(trans, free_space_root, free_space_root->node,
|
||||
0, 1);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(free_space_root),
|
||||
free_space_root->node, 0, 1);
|
||||
|
||||
btrfs_put_root(free_space_root);
|
||||
|
||||
|
||||
@@ -617,11 +617,13 @@ static noinline int create_subvol(struct user_namespace *mnt_userns,
|
||||
* Since we don't abort the transaction in this case, free the
|
||||
* tree block so that we don't leak space and leave the
|
||||
* filesystem in an inconsistent state (an extent item in the
|
||||
* extent tree without backreferences). Also no need to have
|
||||
* the tree block locked since it is not in any tree at this
|
||||
* point, so no other task can find it and use it.
|
||||
* extent tree with a backreference for a root that does not
|
||||
* exists).
|
||||
*/
|
||||
btrfs_free_tree_block(trans, root, leaf, 0, 1);
|
||||
btrfs_tree_lock(leaf);
|
||||
btrfs_clean_tree_block(leaf);
|
||||
btrfs_tree_unlock(leaf);
|
||||
btrfs_free_tree_block(trans, objectid, leaf, 0, 1);
|
||||
free_extent_buffer(leaf);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -1219,7 +1219,8 @@ int btrfs_quota_disable(struct btrfs_fs_info *fs_info)
|
||||
btrfs_tree_lock(quota_root->node);
|
||||
btrfs_clean_tree_block(quota_root->node);
|
||||
btrfs_tree_unlock(quota_root->node);
|
||||
btrfs_free_tree_block(trans, quota_root, quota_root->node, 0, 1);
|
||||
btrfs_free_tree_block(trans, btrfs_root_id(quota_root),
|
||||
quota_root->node, 0, 1);
|
||||
|
||||
btrfs_put_root(quota_root);
|
||||
|
||||
|
||||
@@ -1181,6 +1181,7 @@ again:
|
||||
parent_objectid, victim_name,
|
||||
victim_name_len);
|
||||
if (ret < 0) {
|
||||
kfree(victim_name);
|
||||
return ret;
|
||||
} else if (!ret) {
|
||||
ret = -ENOENT;
|
||||
@@ -3977,6 +3978,7 @@ search:
|
||||
goto done;
|
||||
}
|
||||
if (btrfs_header_generation(path->nodes[0]) != trans->transid) {
|
||||
ctx->last_dir_item_offset = min_key.offset;
|
||||
ret = overwrite_item(trans, log, dst_path,
|
||||
path->nodes[0], path->slots[0],
|
||||
&min_key);
|
||||
|
||||
@@ -1370,8 +1370,10 @@ struct btrfs_device *btrfs_scan_one_device(const char *path, fmode_t flags,
|
||||
|
||||
bytenr_orig = btrfs_sb_offset(0);
|
||||
ret = btrfs_sb_log_location_bdev(bdev, 0, READ, &bytenr);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
if (ret) {
|
||||
device = ERR_PTR(ret);
|
||||
goto error_bdev_put;
|
||||
}
|
||||
|
||||
disk_super = btrfs_read_disk_super(bdev, bytenr, bytenr_orig);
|
||||
if (IS_ERR(disk_super)) {
|
||||
|
||||
@@ -395,7 +395,9 @@ static void io_wqe_dec_running(struct io_worker *worker)
|
||||
if (atomic_dec_and_test(&acct->nr_running) && io_acct_run_queue(acct)) {
|
||||
atomic_inc(&acct->nr_running);
|
||||
atomic_inc(&wqe->wq->worker_refs);
|
||||
raw_spin_unlock(&wqe->lock);
|
||||
io_queue_worker_create(worker, acct, create_worker_cb);
|
||||
raw_spin_lock(&wqe->lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1787,5 +1787,6 @@ static void __exit zonefs_exit(void)
|
||||
MODULE_AUTHOR("Damien Le Moal");
|
||||
MODULE_DESCRIPTION("Zone file system for zoned block devices");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS_FS("zonefs");
|
||||
module_init(zonefs_init);
|
||||
module_exit(zonefs_exit);
|
||||
|
||||
@@ -611,10 +611,11 @@ static int bad_option(struct superblock_security_struct *sbsec, char flag,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_sid(struct super_block *sb, const char *s, u32 *sid)
|
||||
static int parse_sid(struct super_block *sb, const char *s, u32 *sid,
|
||||
gfp_t gfp)
|
||||
{
|
||||
int rc = security_context_str_to_sid(&selinux_state, s,
|
||||
sid, GFP_KERNEL);
|
||||
sid, gfp);
|
||||
if (rc)
|
||||
pr_warn("SELinux: security_context_str_to_sid"
|
||||
"(%s) failed for (dev %s, type %s) errno=%d\n",
|
||||
@@ -685,7 +686,8 @@ static int selinux_set_mnt_opts(struct super_block *sb,
|
||||
*/
|
||||
if (opts) {
|
||||
if (opts->fscontext) {
|
||||
rc = parse_sid(sb, opts->fscontext, &fscontext_sid);
|
||||
rc = parse_sid(sb, opts->fscontext, &fscontext_sid,
|
||||
GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out;
|
||||
if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
|
||||
@@ -694,7 +696,8 @@ static int selinux_set_mnt_opts(struct super_block *sb,
|
||||
sbsec->flags |= FSCONTEXT_MNT;
|
||||
}
|
||||
if (opts->context) {
|
||||
rc = parse_sid(sb, opts->context, &context_sid);
|
||||
rc = parse_sid(sb, opts->context, &context_sid,
|
||||
GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out;
|
||||
if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
|
||||
@@ -703,7 +706,8 @@ static int selinux_set_mnt_opts(struct super_block *sb,
|
||||
sbsec->flags |= CONTEXT_MNT;
|
||||
}
|
||||
if (opts->rootcontext) {
|
||||
rc = parse_sid(sb, opts->rootcontext, &rootcontext_sid);
|
||||
rc = parse_sid(sb, opts->rootcontext, &rootcontext_sid,
|
||||
GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out;
|
||||
if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
|
||||
@@ -712,7 +716,8 @@ static int selinux_set_mnt_opts(struct super_block *sb,
|
||||
sbsec->flags |= ROOTCONTEXT_MNT;
|
||||
}
|
||||
if (opts->defcontext) {
|
||||
rc = parse_sid(sb, opts->defcontext, &defcontext_sid);
|
||||
rc = parse_sid(sb, opts->defcontext, &defcontext_sid,
|
||||
GFP_KERNEL);
|
||||
if (rc)
|
||||
goto out;
|
||||
if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
|
||||
@@ -2702,14 +2707,14 @@ static int selinux_sb_mnt_opts_compat(struct super_block *sb, void *mnt_opts)
|
||||
return (sbsec->flags & SE_MNTMASK) ? 1 : 0;
|
||||
|
||||
if (opts->fscontext) {
|
||||
rc = parse_sid(sb, opts->fscontext, &sid);
|
||||
rc = parse_sid(sb, opts->fscontext, &sid, GFP_NOWAIT);
|
||||
if (rc)
|
||||
return 1;
|
||||
if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
|
||||
return 1;
|
||||
}
|
||||
if (opts->context) {
|
||||
rc = parse_sid(sb, opts->context, &sid);
|
||||
rc = parse_sid(sb, opts->context, &sid, GFP_NOWAIT);
|
||||
if (rc)
|
||||
return 1;
|
||||
if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
|
||||
@@ -2719,14 +2724,14 @@ static int selinux_sb_mnt_opts_compat(struct super_block *sb, void *mnt_opts)
|
||||
struct inode_security_struct *root_isec;
|
||||
|
||||
root_isec = backing_inode_security(sb->s_root);
|
||||
rc = parse_sid(sb, opts->rootcontext, &sid);
|
||||
rc = parse_sid(sb, opts->rootcontext, &sid, GFP_NOWAIT);
|
||||
if (rc)
|
||||
return 1;
|
||||
if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
|
||||
return 1;
|
||||
}
|
||||
if (opts->defcontext) {
|
||||
rc = parse_sid(sb, opts->defcontext, &sid);
|
||||
rc = parse_sid(sb, opts->defcontext, &sid, GFP_NOWAIT);
|
||||
if (rc)
|
||||
return 1;
|
||||
if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
|
||||
@@ -2749,14 +2754,14 @@ static int selinux_sb_remount(struct super_block *sb, void *mnt_opts)
|
||||
return 0;
|
||||
|
||||
if (opts->fscontext) {
|
||||
rc = parse_sid(sb, opts->fscontext, &sid);
|
||||
rc = parse_sid(sb, opts->fscontext, &sid, GFP_KERNEL);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
|
||||
goto out_bad_option;
|
||||
}
|
||||
if (opts->context) {
|
||||
rc = parse_sid(sb, opts->context, &sid);
|
||||
rc = parse_sid(sb, opts->context, &sid, GFP_KERNEL);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
|
||||
@@ -2765,14 +2770,14 @@ static int selinux_sb_remount(struct super_block *sb, void *mnt_opts)
|
||||
if (opts->rootcontext) {
|
||||
struct inode_security_struct *root_isec;
|
||||
root_isec = backing_inode_security(sb->s_root);
|
||||
rc = parse_sid(sb, opts->rootcontext, &sid);
|
||||
rc = parse_sid(sb, opts->rootcontext, &sid, GFP_KERNEL);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
|
||||
goto out_bad_option;
|
||||
}
|
||||
if (opts->defcontext) {
|
||||
rc = parse_sid(sb, opts->defcontext, &sid);
|
||||
rc = parse_sid(sb, opts->defcontext, &sid, GFP_KERNEL);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
|
||||
|
||||
Reference in New Issue
Block a user