mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02:00
Merge 6642d600b5 ("Merge tag '5.11-rc5-smb3' of git://git.samba.org/sfrench/cifs-2.6") into android-mainline
Steps on the way to 5.11-rc6 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I8e7939a90a92a0164d02d78d4fd4f3ba826546d5
This commit is contained in:
commit
c9bdbd3ed7
|
|
@ -232,7 +232,6 @@ properties:
|
|||
by this cpu (see ./idle-states.yaml).
|
||||
|
||||
capacity-dmips-mhz:
|
||||
$ref: '/schemas/types.yaml#/definitions/uint32'
|
||||
description:
|
||||
u32 value representing CPU capacity (see ./cpu-capacity.txt) in
|
||||
DMIPS/MHz, relative to highest capacity-dmips-mhz
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ Optional properties:
|
|||
documents on how to describe the way the sii902x device is
|
||||
connected to the rest of the audio system:
|
||||
Documentation/devicetree/bindings/sound/simple-card.yaml
|
||||
Documentation/devicetree/bindings/sound/audio-graph-card.txt
|
||||
Documentation/devicetree/bindings/sound/audio-graph-card.yaml
|
||||
Note: In case of the audio-graph-card binding the used port
|
||||
index should be 3.
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ connected to.
|
|||
|
||||
For a description of the display interface sink function blocks, see
|
||||
Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.txt and
|
||||
Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.txt.
|
||||
Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.
|
||||
|
||||
Required properties (all function blocks):
|
||||
- compatible: "mediatek,<chip>-disp-<function>", one of
|
||||
|
|
@ -61,7 +61,7 @@ Required properties (DMA function blocks):
|
|||
"mediatek,<chip>-disp-wdma"
|
||||
the supported chips are mt2701, mt8167 and mt8173.
|
||||
- larb: Should contain a phandle pointing to the local arbiter device as defined
|
||||
in Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
|
||||
in Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
|
||||
- iommus: Should point to the respective IOMMU block with master port as
|
||||
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
||||
for details.
|
||||
|
|
|
|||
|
|
@ -85,7 +85,6 @@ properties:
|
|||
wlf,micd-timeout-ms:
|
||||
description:
|
||||
Timeout for microphone detection, specified in milliseconds.
|
||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
|
||||
wlf,micd-force-micbias:
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@ properties:
|
|||
description:
|
||||
This property controls the Accumulation Dead band which allows to set the
|
||||
level of current below which no accumulation takes place.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
maximum: 255
|
||||
default: 0
|
||||
|
||||
|
|
|
|||
|
|
@ -73,11 +73,9 @@ properties:
|
|||
description: |
|
||||
Temperature sensor trimming factor. It can be used to manually adjust the
|
||||
temperature measurements within 7.130 degrees Celsius.
|
||||
maxItems: 1
|
||||
items:
|
||||
default: 0
|
||||
minimum: 0
|
||||
maximum: 7130
|
||||
default: 0
|
||||
minimum: 0
|
||||
maximum: 7130
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@ properties:
|
|||
ti,bus-range-microvolt:
|
||||
description: |
|
||||
This is the operating range of the bus voltage in microvolt
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [16000000, 32000000]
|
||||
default: 32000000
|
||||
|
||||
|
|
|
|||
|
|
@ -39,11 +39,9 @@ properties:
|
|||
|
||||
i2c-gpio,delay-us:
|
||||
description: delay between GPIO operations (may depend on each platform)
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
i2c-gpio,timeout-ms:
|
||||
description: timeout to get data
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
# Deprecated properties, do not use in new device tree sources:
|
||||
gpios:
|
||||
|
|
|
|||
|
|
@ -66,21 +66,18 @@ properties:
|
|||
default: 400000
|
||||
|
||||
i2c-sda-hold-time-ns:
|
||||
maxItems: 1
|
||||
description: |
|
||||
The property should contain the SDA hold time in nanoseconds. This option
|
||||
is only supported in hardware blocks version 1.11a or newer or on
|
||||
Microsemi SoCs.
|
||||
|
||||
i2c-scl-falling-time-ns:
|
||||
maxItems: 1
|
||||
description: |
|
||||
The property should contain the SCL falling time in nanoseconds.
|
||||
This value is used to compute the tLOW period.
|
||||
default: 300
|
||||
|
||||
i2c-sda-falling-time-ns:
|
||||
maxItems: 1
|
||||
description: |
|
||||
The property should contain the SDA falling time in nanoseconds.
|
||||
This value is used to compute the tHIGH period.
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ properties:
|
|||
type: boolean
|
||||
|
||||
bipolar:
|
||||
description: see Documentation/devicetree/bindings/iio/adc/adc.txt
|
||||
description: see Documentation/devicetree/bindings/iio/adc/adc.yaml
|
||||
type: boolean
|
||||
|
||||
required:
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ properties:
|
|||
maxItems: 1
|
||||
|
||||
shunt-resistor-micro-ohms:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: |
|
||||
Value in micro Ohms of the shunt resistor connected between the RS+ and
|
||||
RS- inputs, across which the current is measured. Value needed to compute
|
||||
|
|
|
|||
|
|
@ -246,7 +246,6 @@ patternProperties:
|
|||
Resolution (bits) to use for conversions:
|
||||
- can be 6, 8, 10 or 12 on stm32f4
|
||||
- can be 8, 10, 12, 14 or 16 on stm32h7 and stm32mp1
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
st,adc-channels:
|
||||
description: |
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ properties:
|
|||
const: 1
|
||||
|
||||
ti,channel0-current-microamp:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: Channel 0 current in uA.
|
||||
enum:
|
||||
- 0
|
||||
|
|
@ -51,7 +50,6 @@ properties:
|
|||
- 20
|
||||
|
||||
ti,channel3-current-microamp:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: Channel 3 current in uA.
|
||||
enum:
|
||||
- 0
|
||||
|
|
|
|||
|
|
@ -46,31 +46,42 @@ properties:
|
|||
two properties must be present:
|
||||
|
||||
adi,range-microvolt:
|
||||
$ref: /schemas/types.yaml#/definitions/int32-array
|
||||
description: |
|
||||
Voltage output range specified as <minimum, maximum>
|
||||
enum:
|
||||
- [[0, 5000000]]
|
||||
- [[0, 10000000]]
|
||||
- [[-5000000, 5000000]]
|
||||
- [[-10000000, 10000000]]
|
||||
oneOf:
|
||||
- items:
|
||||
- const: 0
|
||||
- enum: [5000000, 10000000]
|
||||
- items:
|
||||
- const: -5000000
|
||||
- const: 5000000
|
||||
- items:
|
||||
- const: -10000000
|
||||
- const: 10000000
|
||||
|
||||
adi,range-microamp:
|
||||
$ref: /schemas/types.yaml#/definitions/int32-array
|
||||
description: |
|
||||
Current output range specified as <minimum, maximum>
|
||||
enum:
|
||||
- [[0, 20000]]
|
||||
- [[0, 24000]]
|
||||
- [[4, 24000]]
|
||||
- [[-20000, 20000]]
|
||||
- [[-24000, 24000]]
|
||||
- [[-1000, 22000]]
|
||||
oneOf:
|
||||
- items:
|
||||
- const: 0
|
||||
- enum: [20000, 24000]
|
||||
- items:
|
||||
- const: 4
|
||||
- const: 24000
|
||||
- items:
|
||||
- const: -20000
|
||||
- const: 20000
|
||||
- items:
|
||||
- const: -24000
|
||||
- const: 24000
|
||||
- items:
|
||||
- const: -1000
|
||||
- const: 22000
|
||||
|
||||
reset-gpios: true
|
||||
|
||||
adi,dc-dc-ilim-microamp:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [150000, 200000, 250000, 300000, 350000, 400000]
|
||||
description: |
|
||||
The dc-to-dc converter current limit.
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ properties:
|
|||
description: Connected to ADC_RDY pin.
|
||||
|
||||
maxim,led-current-microamp:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
description: |
|
||||
|
|
|
|||
|
|
@ -70,11 +70,9 @@ properties:
|
|||
|
||||
touchscreen-x-mm:
|
||||
description: horizontal length in mm of the touchscreen
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
touchscreen-y-mm:
|
||||
description: vertical length in mm of the touchscreen
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
dependencies:
|
||||
touchscreen-size-x: [ touchscreen-size-y ]
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ Required properties:
|
|||
- power-domains: a phandle to the power domain, see
|
||||
Documentation/devicetree/bindings/power/power_domain.txt for details.
|
||||
- mediatek,larb: must contain the local arbiters in the current Socs, see
|
||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
|
||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
|
||||
for details.
|
||||
- iommus: should point to the respective IOMMU block with master port as
|
||||
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ Required properties:
|
|||
- power-domains: a phandle to the power domain, see
|
||||
Documentation/devicetree/bindings/power/power_domain.txt for details.
|
||||
- mediatek,larb: must contain the local arbiters in the current SoCs, see
|
||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
|
||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
|
||||
for details.
|
||||
- iommus: should point to the respective IOMMU block with master port as
|
||||
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ Required properties (DMA function blocks, child node):
|
|||
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
|
||||
for details.
|
||||
- mediatek,larb: must contain the local arbiters in the current Socs, see
|
||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
|
||||
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
|
||||
for details.
|
||||
|
||||
Example:
|
||||
|
|
|
|||
|
|
@ -259,7 +259,6 @@ properties:
|
|||
waiting for I/O signalling and card power supply to be stable,
|
||||
regardless of whether pwrseq-simple is used. Default to 10ms if
|
||||
no available.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
default: 10
|
||||
|
||||
supports-cqe:
|
||||
|
|
|
|||
|
|
@ -41,13 +41,11 @@ properties:
|
|||
description:
|
||||
Delay in ms after powering the card and de-asserting the
|
||||
reset-gpios (if any).
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
power-off-delay-us:
|
||||
description:
|
||||
Delay in us after asserting the reset-gpios (if any)
|
||||
during power off of the card.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
|
|
|||
|
|
@ -122,7 +122,6 @@ properties:
|
|||
such as flow control thresholds.
|
||||
|
||||
rx-internal-delay-ps:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: |
|
||||
RGMII Receive Clock Delay defined in pico seconds.
|
||||
This is used for controllers that have configurable RX internal delays.
|
||||
|
|
@ -140,7 +139,6 @@ properties:
|
|||
is used for components that can have configurable fifo sizes.
|
||||
|
||||
tx-internal-delay-ps:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: |
|
||||
RGMII Transmit Clock Delay defined in pico seconds.
|
||||
This is used for controllers that have configurable TX internal delays.
|
||||
|
|
|
|||
|
|
@ -212,7 +212,6 @@ properties:
|
|||
Triplet of delays. The 1st cell is reset pre-delay in micro
|
||||
seconds. The 2nd cell is reset pulse in micro seconds. The 3rd
|
||||
cell is reset post-delay in micro seconds.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
|
||||
|
|
|
|||
|
|
@ -83,21 +83,18 @@ properties:
|
|||
for each of the battery capacity lookup table.
|
||||
|
||||
operating-range-celsius:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
description: operating temperature range of a battery
|
||||
items:
|
||||
- description: minimum temperature at which battery can operate
|
||||
- description: maximum temperature at which battery can operate
|
||||
|
||||
ambient-celsius:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
description: safe range of ambient temperature
|
||||
items:
|
||||
- description: alert when ambient temperature is lower than this value
|
||||
- description: alert when ambient temperature is higher than this value
|
||||
|
||||
alert-celsius:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
description: safe range of battery temperature
|
||||
items:
|
||||
- description: alert when battery temperature is lower than this value
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@ properties:
|
|||
maxItems: 1
|
||||
|
||||
input-current-limit-microamp:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: Maximum input current in micro Amps.
|
||||
minimum: 50000
|
||||
maximum: 500000
|
||||
|
|
|
|||
|
|
@ -62,7 +62,6 @@ properties:
|
|||
description: IRQ line information.
|
||||
|
||||
dlg,irq-polling-delay-passive-ms:
|
||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
minimum: 1000
|
||||
maximum: 10000
|
||||
description: |
|
||||
|
|
|
|||
|
|
@ -72,11 +72,9 @@ properties:
|
|||
|
||||
startup-delay-us:
|
||||
description: startup time in microseconds
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
off-on-delay-us:
|
||||
description: off delay time in microseconds
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
enable-active-high:
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ properties:
|
|||
1: chargeable
|
||||
|
||||
quartz-load-femtofarads:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
The capacitive load of the quartz(x-tal), expressed in femto
|
||||
Farad (fF). The default value shall be listed (if optional),
|
||||
|
|
@ -47,7 +46,6 @@ properties:
|
|||
deprecated: true
|
||||
|
||||
trickle-resistor-ohms:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
Selected resistor for trickle charger. Should be given
|
||||
if trickle charger should be enabled.
|
||||
|
|
|
|||
|
|
@ -88,14 +88,12 @@ properties:
|
|||
description:
|
||||
Rate at which poll occurs when auto-poll is set.
|
||||
default 100ms.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
default: 100
|
||||
|
||||
poll-timeout-ms:
|
||||
description:
|
||||
Poll timeout when auto-poll is set, default
|
||||
3000ms.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
default: 3000
|
||||
|
||||
required:
|
||||
|
|
|
|||
|
|
@ -41,14 +41,12 @@ properties:
|
|||
values of 2k, 4k or 8k. If set to 0 it will be off. If this node is not
|
||||
mentioned or if the value is unknown, then micbias resistor is set to
|
||||
4k.
|
||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
enum: [ 0, 2, 4, 8 ]
|
||||
|
||||
micbias-voltage-m-volts:
|
||||
description: The bias voltage to be used in mVolts. The voltage can take
|
||||
values from 1.25V to 3V by 250mV steps. If this node is not mentioned
|
||||
or the value is unknown, then the value is set to 1.25V.
|
||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
enum: [ 1250, 1500, 1750, 2000, 2250, 2500, 2750, 3000 ]
|
||||
|
||||
lrclk-strength:
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ properties:
|
|||
reg:
|
||||
description: module registers
|
||||
|
||||
ranges: true
|
||||
|
||||
power-domains:
|
||||
description:
|
||||
PM domain provider node and an args specifier containing
|
||||
|
|
@ -62,6 +64,8 @@ properties:
|
|||
'#size-cells':
|
||||
const: 2
|
||||
|
||||
dma-coherent: true
|
||||
|
||||
patternProperties:
|
||||
"^usb@":
|
||||
type: object
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ properties:
|
|||
pattern: "^watchdog(@.*|-[0-9a-f])?$"
|
||||
|
||||
timeout-sec:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
Contains the watchdog timeout in seconds.
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,8 @@ static int node_offset(void *fdt, const char *node_path)
|
|||
{
|
||||
int offset = fdt_path_offset(fdt, node_path);
|
||||
if (offset == -FDT_ERR_NOTFOUND)
|
||||
offset = fdt_add_subnode(fdt, 0, node_path);
|
||||
/* Add the node to root if not found, dropping the leading '/' */
|
||||
offset = fdt_add_subnode(fdt, 0, node_path + 1);
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ void __init setup_bootmem(void)
|
|||
max_pfn = PFN_DOWN(dram_end);
|
||||
max_low_pfn = max_pfn;
|
||||
dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn));
|
||||
set_max_mapnr(max_low_pfn);
|
||||
set_max_mapnr(max_low_pfn - ARCH_PFN_OFFSET);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
setup_initrd();
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ void uv_query_info(void)
|
|||
uv_info.guest_cpu_stor_len = uvcb.cpu_stor_len;
|
||||
uv_info.max_sec_stor_addr = ALIGN(uvcb.max_guest_stor_addr, PAGE_SIZE);
|
||||
uv_info.max_num_sec_conf = uvcb.max_num_sec_conf;
|
||||
uv_info.max_guest_cpus = uvcb.max_guest_cpus;
|
||||
uv_info.max_guest_cpu_id = uvcb.max_guest_cpu_id;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ struct uv_cb_qui {
|
|||
u32 max_num_sec_conf;
|
||||
u64 max_guest_stor_addr;
|
||||
u8 reserved88[158 - 136];
|
||||
u16 max_guest_cpus;
|
||||
u16 max_guest_cpu_id;
|
||||
u8 reserveda0[200 - 160];
|
||||
} __packed __aligned(8);
|
||||
|
||||
|
|
@ -273,7 +273,7 @@ struct uv_info {
|
|||
unsigned long guest_cpu_stor_len;
|
||||
unsigned long max_sec_stor_addr;
|
||||
unsigned int max_num_sec_conf;
|
||||
unsigned short max_guest_cpus;
|
||||
unsigned short max_guest_cpu_id;
|
||||
};
|
||||
|
||||
extern struct uv_info uv_info;
|
||||
|
|
|
|||
|
|
@ -368,7 +368,7 @@ static ssize_t uv_query_max_guest_cpus(struct kobject *kobj,
|
|||
struct kobj_attribute *attr, char *page)
|
||||
{
|
||||
return scnprintf(page, PAGE_SIZE, "%d\n",
|
||||
uv_info.max_guest_cpus);
|
||||
uv_info.max_guest_cpu_id + 1);
|
||||
}
|
||||
|
||||
static struct kobj_attribute uv_query_max_guest_cpus_attr =
|
||||
|
|
|
|||
|
|
@ -162,9 +162,11 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
|
|||
mask = DMA_BIT_MASK(ilog2(end) + 1);
|
||||
dev->coherent_dma_mask &= mask;
|
||||
*dev->dma_mask &= mask;
|
||||
/* ...but only set bus limit if we found valid dma-ranges earlier */
|
||||
if (!ret)
|
||||
/* ...but only set bus limit and range map if we found valid dma-ranges earlier */
|
||||
if (!ret) {
|
||||
dev->bus_dma_limit = end;
|
||||
dev->dma_range_map = map;
|
||||
}
|
||||
|
||||
coherent = of_dma_is_coherent(np);
|
||||
dev_dbg(dev, "device is%sdma coherent\n",
|
||||
|
|
@ -172,6 +174,9 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
|
|||
|
||||
iommu = of_iommu_configure(dev, np, id);
|
||||
if (PTR_ERR(iommu) == -EPROBE_DEFER) {
|
||||
/* Don't touch range map if it wasn't set from a valid dma-ranges */
|
||||
if (!ret)
|
||||
dev->dma_range_map = NULL;
|
||||
kfree(map);
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
|
@ -181,7 +186,6 @@ int of_dma_configure_id(struct device *dev, struct device_node *np,
|
|||
|
||||
arch_setup_dma_ops(dev, dma_start, size, iommu, coherent);
|
||||
|
||||
dev->dma_range_map = map;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_dma_configure_id);
|
||||
|
|
|
|||
|
|
@ -71,15 +71,11 @@ static int vfio_ap_queue_dev_probe(struct ap_device *apdev)
|
|||
static void vfio_ap_queue_dev_remove(struct ap_device *apdev)
|
||||
{
|
||||
struct vfio_ap_queue *q;
|
||||
int apid, apqi;
|
||||
|
||||
mutex_lock(&matrix_dev->lock);
|
||||
q = dev_get_drvdata(&apdev->device);
|
||||
vfio_ap_mdev_reset_queue(q, 1);
|
||||
dev_set_drvdata(&apdev->device, NULL);
|
||||
apid = AP_QID_CARD(q->apqn);
|
||||
apqi = AP_QID_QUEUE(q->apqn);
|
||||
vfio_ap_mdev_reset_queue(apid, apqi, 1);
|
||||
vfio_ap_irq_disable(q);
|
||||
kfree(q);
|
||||
mutex_unlock(&matrix_dev->lock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#define VFIO_AP_MDEV_NAME_HWVIRT "VFIO AP Passthrough Device"
|
||||
|
||||
static int vfio_ap_mdev_reset_queues(struct mdev_device *mdev);
|
||||
static struct vfio_ap_queue *vfio_ap_find_queue(int apqn);
|
||||
|
||||
static int match_apqn(struct device *dev, const void *data)
|
||||
{
|
||||
|
|
@ -49,20 +50,15 @@ static struct vfio_ap_queue *vfio_ap_get_queue(
|
|||
int apqn)
|
||||
{
|
||||
struct vfio_ap_queue *q;
|
||||
struct device *dev;
|
||||
|
||||
if (!test_bit_inv(AP_QID_CARD(apqn), matrix_mdev->matrix.apm))
|
||||
return NULL;
|
||||
if (!test_bit_inv(AP_QID_QUEUE(apqn), matrix_mdev->matrix.aqm))
|
||||
return NULL;
|
||||
|
||||
dev = driver_find_device(&matrix_dev->vfio_ap_drv->driver, NULL,
|
||||
&apqn, match_apqn);
|
||||
if (!dev)
|
||||
return NULL;
|
||||
q = dev_get_drvdata(dev);
|
||||
q->matrix_mdev = matrix_mdev;
|
||||
put_device(dev);
|
||||
q = vfio_ap_find_queue(apqn);
|
||||
if (q)
|
||||
q->matrix_mdev = matrix_mdev;
|
||||
|
||||
return q;
|
||||
}
|
||||
|
|
@ -119,13 +115,18 @@ static void vfio_ap_wait_for_irqclear(int apqn)
|
|||
*/
|
||||
static void vfio_ap_free_aqic_resources(struct vfio_ap_queue *q)
|
||||
{
|
||||
if (q->saved_isc != VFIO_AP_ISC_INVALID && q->matrix_mdev)
|
||||
if (!q)
|
||||
return;
|
||||
if (q->saved_isc != VFIO_AP_ISC_INVALID &&
|
||||
!WARN_ON(!(q->matrix_mdev && q->matrix_mdev->kvm))) {
|
||||
kvm_s390_gisc_unregister(q->matrix_mdev->kvm, q->saved_isc);
|
||||
if (q->saved_pfn && q->matrix_mdev)
|
||||
q->saved_isc = VFIO_AP_ISC_INVALID;
|
||||
}
|
||||
if (q->saved_pfn && !WARN_ON(!q->matrix_mdev)) {
|
||||
vfio_unpin_pages(mdev_dev(q->matrix_mdev->mdev),
|
||||
&q->saved_pfn, 1);
|
||||
q->saved_pfn = 0;
|
||||
q->saved_isc = VFIO_AP_ISC_INVALID;
|
||||
q->saved_pfn = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -144,7 +145,7 @@ static void vfio_ap_free_aqic_resources(struct vfio_ap_queue *q)
|
|||
* Returns if ap_aqic function failed with invalid, deconfigured or
|
||||
* checkstopped AP.
|
||||
*/
|
||||
struct ap_queue_status vfio_ap_irq_disable(struct vfio_ap_queue *q)
|
||||
static struct ap_queue_status vfio_ap_irq_disable(struct vfio_ap_queue *q)
|
||||
{
|
||||
struct ap_qirq_ctrl aqic_gisa = {};
|
||||
struct ap_queue_status status;
|
||||
|
|
@ -1037,19 +1038,14 @@ static int vfio_ap_mdev_set_kvm(struct ap_matrix_mdev *matrix_mdev,
|
|||
{
|
||||
struct ap_matrix_mdev *m;
|
||||
|
||||
mutex_lock(&matrix_dev->lock);
|
||||
|
||||
list_for_each_entry(m, &matrix_dev->mdev_list, node) {
|
||||
if ((m != matrix_mdev) && (m->kvm == kvm)) {
|
||||
mutex_unlock(&matrix_dev->lock);
|
||||
if ((m != matrix_mdev) && (m->kvm == kvm))
|
||||
return -EPERM;
|
||||
}
|
||||
}
|
||||
|
||||
matrix_mdev->kvm = kvm;
|
||||
kvm_get_kvm(kvm);
|
||||
kvm->arch.crypto.pqap_hook = &matrix_mdev->pqap_hook;
|
||||
mutex_unlock(&matrix_dev->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1083,79 +1079,118 @@ static int vfio_ap_mdev_iommu_notifier(struct notifier_block *nb,
|
|||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static void vfio_ap_mdev_unset_kvm(struct ap_matrix_mdev *matrix_mdev)
|
||||
{
|
||||
kvm_arch_crypto_clear_masks(matrix_mdev->kvm);
|
||||
matrix_mdev->kvm->arch.crypto.pqap_hook = NULL;
|
||||
vfio_ap_mdev_reset_queues(matrix_mdev->mdev);
|
||||
kvm_put_kvm(matrix_mdev->kvm);
|
||||
matrix_mdev->kvm = NULL;
|
||||
}
|
||||
|
||||
static int vfio_ap_mdev_group_notifier(struct notifier_block *nb,
|
||||
unsigned long action, void *data)
|
||||
{
|
||||
int ret;
|
||||
int ret, notify_rc = NOTIFY_OK;
|
||||
struct ap_matrix_mdev *matrix_mdev;
|
||||
|
||||
if (action != VFIO_GROUP_NOTIFY_SET_KVM)
|
||||
return NOTIFY_OK;
|
||||
|
||||
matrix_mdev = container_of(nb, struct ap_matrix_mdev, group_notifier);
|
||||
mutex_lock(&matrix_dev->lock);
|
||||
|
||||
if (!data) {
|
||||
matrix_mdev->kvm = NULL;
|
||||
return NOTIFY_OK;
|
||||
if (matrix_mdev->kvm)
|
||||
vfio_ap_mdev_unset_kvm(matrix_mdev);
|
||||
goto notify_done;
|
||||
}
|
||||
|
||||
ret = vfio_ap_mdev_set_kvm(matrix_mdev, data);
|
||||
if (ret)
|
||||
return NOTIFY_DONE;
|
||||
if (ret) {
|
||||
notify_rc = NOTIFY_DONE;
|
||||
goto notify_done;
|
||||
}
|
||||
|
||||
/* If there is no CRYCB pointer, then we can't copy the masks */
|
||||
if (!matrix_mdev->kvm->arch.crypto.crycbd)
|
||||
return NOTIFY_DONE;
|
||||
if (!matrix_mdev->kvm->arch.crypto.crycbd) {
|
||||
notify_rc = NOTIFY_DONE;
|
||||
goto notify_done;
|
||||
}
|
||||
|
||||
kvm_arch_crypto_set_masks(matrix_mdev->kvm, matrix_mdev->matrix.apm,
|
||||
matrix_mdev->matrix.aqm,
|
||||
matrix_mdev->matrix.adm);
|
||||
|
||||
return NOTIFY_OK;
|
||||
notify_done:
|
||||
mutex_unlock(&matrix_dev->lock);
|
||||
return notify_rc;
|
||||
}
|
||||
|
||||
static void vfio_ap_irq_disable_apqn(int apqn)
|
||||
static struct vfio_ap_queue *vfio_ap_find_queue(int apqn)
|
||||
{
|
||||
struct device *dev;
|
||||
struct vfio_ap_queue *q;
|
||||
struct vfio_ap_queue *q = NULL;
|
||||
|
||||
dev = driver_find_device(&matrix_dev->vfio_ap_drv->driver, NULL,
|
||||
&apqn, match_apqn);
|
||||
if (dev) {
|
||||
q = dev_get_drvdata(dev);
|
||||
vfio_ap_irq_disable(q);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
return q;
|
||||
}
|
||||
|
||||
int vfio_ap_mdev_reset_queue(unsigned int apid, unsigned int apqi,
|
||||
int vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q,
|
||||
unsigned int retry)
|
||||
{
|
||||
struct ap_queue_status status;
|
||||
int ret;
|
||||
int retry2 = 2;
|
||||
int apqn = AP_MKQID(apid, apqi);
|
||||
|
||||
do {
|
||||
status = ap_zapq(apqn);
|
||||
switch (status.response_code) {
|
||||
case AP_RESPONSE_NORMAL:
|
||||
while (!status.queue_empty && retry2--) {
|
||||
msleep(20);
|
||||
status = ap_tapq(apqn, NULL);
|
||||
}
|
||||
WARN_ON_ONCE(retry2 <= 0);
|
||||
return 0;
|
||||
case AP_RESPONSE_RESET_IN_PROGRESS:
|
||||
case AP_RESPONSE_BUSY:
|
||||
if (!q)
|
||||
return 0;
|
||||
|
||||
retry_zapq:
|
||||
status = ap_zapq(q->apqn);
|
||||
switch (status.response_code) {
|
||||
case AP_RESPONSE_NORMAL:
|
||||
ret = 0;
|
||||
break;
|
||||
case AP_RESPONSE_RESET_IN_PROGRESS:
|
||||
if (retry--) {
|
||||
msleep(20);
|
||||
break;
|
||||
default:
|
||||
/* things are really broken, give up */
|
||||
return -EIO;
|
||||
goto retry_zapq;
|
||||
}
|
||||
} while (retry--);
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
case AP_RESPONSE_Q_NOT_AVAIL:
|
||||
case AP_RESPONSE_DECONFIGURED:
|
||||
case AP_RESPONSE_CHECKSTOPPED:
|
||||
WARN_ON_ONCE(status.irq_enabled);
|
||||
ret = -EBUSY;
|
||||
goto free_resources;
|
||||
default:
|
||||
/* things are really broken, give up */
|
||||
WARN(true, "PQAP/ZAPQ completed with invalid rc (%x)\n",
|
||||
status.response_code);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return -EBUSY;
|
||||
/* wait for the reset to take effect */
|
||||
while (retry2--) {
|
||||
if (status.queue_empty && !status.irq_enabled)
|
||||
break;
|
||||
msleep(20);
|
||||
status = ap_tapq(q->apqn, NULL);
|
||||
}
|
||||
WARN_ON_ONCE(retry2 <= 0);
|
||||
|
||||
free_resources:
|
||||
vfio_ap_free_aqic_resources(q);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int vfio_ap_mdev_reset_queues(struct mdev_device *mdev)
|
||||
|
|
@ -1163,13 +1198,15 @@ static int vfio_ap_mdev_reset_queues(struct mdev_device *mdev)
|
|||
int ret;
|
||||
int rc = 0;
|
||||
unsigned long apid, apqi;
|
||||
struct vfio_ap_queue *q;
|
||||
struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev);
|
||||
|
||||
for_each_set_bit_inv(apid, matrix_mdev->matrix.apm,
|
||||
matrix_mdev->matrix.apm_max + 1) {
|
||||
for_each_set_bit_inv(apqi, matrix_mdev->matrix.aqm,
|
||||
matrix_mdev->matrix.aqm_max + 1) {
|
||||
ret = vfio_ap_mdev_reset_queue(apid, apqi, 1);
|
||||
q = vfio_ap_find_queue(AP_MKQID(apid, apqi));
|
||||
ret = vfio_ap_mdev_reset_queue(q, 1);
|
||||
/*
|
||||
* Regardless whether a queue turns out to be busy, or
|
||||
* is not operational, we need to continue resetting
|
||||
|
|
@ -1177,7 +1214,6 @@ static int vfio_ap_mdev_reset_queues(struct mdev_device *mdev)
|
|||
*/
|
||||
if (ret)
|
||||
rc = ret;
|
||||
vfio_ap_irq_disable_apqn(AP_MKQID(apid, apqi));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1222,13 +1258,8 @@ static void vfio_ap_mdev_release(struct mdev_device *mdev)
|
|||
struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev);
|
||||
|
||||
mutex_lock(&matrix_dev->lock);
|
||||
if (matrix_mdev->kvm) {
|
||||
kvm_arch_crypto_clear_masks(matrix_mdev->kvm);
|
||||
matrix_mdev->kvm->arch.crypto.pqap_hook = NULL;
|
||||
vfio_ap_mdev_reset_queues(mdev);
|
||||
kvm_put_kvm(matrix_mdev->kvm);
|
||||
matrix_mdev->kvm = NULL;
|
||||
}
|
||||
if (matrix_mdev->kvm)
|
||||
vfio_ap_mdev_unset_kvm(matrix_mdev);
|
||||
mutex_unlock(&matrix_dev->lock);
|
||||
|
||||
vfio_unregister_notifier(mdev_dev(mdev), VFIO_IOMMU_NOTIFY,
|
||||
|
|
|
|||
|
|
@ -88,11 +88,6 @@ struct ap_matrix_mdev {
|
|||
struct mdev_device *mdev;
|
||||
};
|
||||
|
||||
extern int vfio_ap_mdev_register(void);
|
||||
extern void vfio_ap_mdev_unregister(void);
|
||||
int vfio_ap_mdev_reset_queue(unsigned int apid, unsigned int apqi,
|
||||
unsigned int retry);
|
||||
|
||||
struct vfio_ap_queue {
|
||||
struct ap_matrix_mdev *matrix_mdev;
|
||||
unsigned long saved_pfn;
|
||||
|
|
@ -100,5 +95,10 @@ struct vfio_ap_queue {
|
|||
#define VFIO_AP_ISC_INVALID 0xff
|
||||
unsigned char saved_isc;
|
||||
};
|
||||
struct ap_queue_status vfio_ap_irq_disable(struct vfio_ap_queue *q);
|
||||
|
||||
int vfio_ap_mdev_register(void);
|
||||
void vfio_ap_mdev_unregister(void);
|
||||
int vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q,
|
||||
unsigned int retry);
|
||||
|
||||
#endif /* _VFIO_AP_PRIVATE_H_ */
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ MODULE_PARM_DESC(ql2xfulldump_on_mpifail,
|
|||
int ql2xenforce_iocb_limit = 1;
|
||||
module_param(ql2xenforce_iocb_limit, int, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(ql2xenforce_iocb_limit,
|
||||
"Enforce IOCB throttling, to avoid FW congestion. (default: 0)");
|
||||
"Enforce IOCB throttling, to avoid FW congestion. (default: 1)");
|
||||
|
||||
/*
|
||||
* CT6 CTX allocation cache
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ config LITEX
|
|||
config LITEX_SOC_CONTROLLER
|
||||
tristate "Enable LiteX SoC Controller driver"
|
||||
depends on OF || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
select LITEX
|
||||
help
|
||||
This option enables the SoC Controller Driver which verifies
|
||||
|
|
|
|||
|
|
@ -896,7 +896,7 @@ int iscsit_setup_np(
|
|||
else
|
||||
len = sizeof(struct sockaddr_in);
|
||||
/*
|
||||
* Set SO_REUSEADDR, and disable Nagel Algorithm with TCP_NODELAY.
|
||||
* Set SO_REUSEADDR, and disable Nagle Algorithm with TCP_NODELAY.
|
||||
*/
|
||||
if (np->np_network_transport == ISCSI_TCP)
|
||||
tcp_sock_set_nodelay(sock->sk);
|
||||
|
|
|
|||
|
|
@ -133,8 +133,9 @@ cifs_build_devname(char *nodename, const char *prepath)
|
|||
* Caller is responsible for freeing returned value if it is not error.
|
||||
*/
|
||||
char *cifs_compose_mount_options(const char *sb_mountdata,
|
||||
const char *fullpath,
|
||||
const struct dfs_info3_param *ref)
|
||||
const char *fullpath,
|
||||
const struct dfs_info3_param *ref,
|
||||
char **devname)
|
||||
{
|
||||
int rc;
|
||||
char *name;
|
||||
|
|
@ -231,7 +232,10 @@ char *cifs_compose_mount_options(const char *sb_mountdata,
|
|||
strcat(mountdata, "ip=");
|
||||
strcat(mountdata, srvIP);
|
||||
|
||||
kfree(name);
|
||||
if (devname)
|
||||
*devname = name;
|
||||
else
|
||||
kfree(name);
|
||||
|
||||
/*cifs_dbg(FYI, "%s: parent mountdata: %s\n", __func__, sb_mountdata);*/
|
||||
/*cifs_dbg(FYI, "%s: submount mountdata: %s\n", __func__, mountdata );*/
|
||||
|
|
@ -278,7 +282,7 @@ static struct vfsmount *cifs_dfs_do_mount(struct dentry *mntpt,
|
|||
|
||||
/* strip first '\' from fullpath */
|
||||
mountdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
|
||||
fullpath + 1, NULL);
|
||||
fullpath + 1, NULL, NULL);
|
||||
if (IS_ERR(mountdata)) {
|
||||
kfree(devname);
|
||||
return (struct vfsmount *)mountdata;
|
||||
|
|
|
|||
|
|
@ -822,7 +822,7 @@ cifs_smb3_do_mount(struct file_system_type *fs_type,
|
|||
goto out;
|
||||
}
|
||||
|
||||
rc = cifs_setup_volume_info(cifs_sb->ctx);
|
||||
rc = cifs_setup_volume_info(cifs_sb->ctx, NULL, old_ctx->UNC);
|
||||
if (rc) {
|
||||
root = ERR_PTR(rc);
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -78,7 +78,8 @@ extern char *cifs_build_path_to_root(struct smb3_fs_context *ctx,
|
|||
int add_treename);
|
||||
extern char *build_wildcard_path_from_dentry(struct dentry *direntry);
|
||||
extern char *cifs_compose_mount_options(const char *sb_mountdata,
|
||||
const char *fullpath, const struct dfs_info3_param *ref);
|
||||
const char *fullpath, const struct dfs_info3_param *ref,
|
||||
char **devname);
|
||||
/* extern void renew_parental_timestamps(struct dentry *direntry);*/
|
||||
extern struct mid_q_entry *AllocMidQEntry(const struct smb_hdr *smb_buffer,
|
||||
struct TCP_Server_Info *server);
|
||||
|
|
@ -89,6 +90,7 @@ extern void cifs_wake_up_task(struct mid_q_entry *mid);
|
|||
extern int cifs_handle_standard(struct TCP_Server_Info *server,
|
||||
struct mid_q_entry *mid);
|
||||
extern int smb3_parse_devname(const char *devname, struct smb3_fs_context *ctx);
|
||||
extern int smb3_parse_opt(const char *options, const char *key, char **val);
|
||||
extern bool cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs);
|
||||
extern int cifs_discard_remaining_data(struct TCP_Server_Info *server);
|
||||
extern int cifs_call_async(struct TCP_Server_Info *server,
|
||||
|
|
@ -549,7 +551,7 @@ extern int SMBencrypt(unsigned char *passwd, const unsigned char *c8,
|
|||
unsigned char *p24);
|
||||
|
||||
extern int
|
||||
cifs_setup_volume_info(struct smb3_fs_context *ctx);
|
||||
cifs_setup_volume_info(struct smb3_fs_context *ctx, const char *mntopts, const char *devname);
|
||||
|
||||
extern struct TCP_Server_Info *
|
||||
cifs_find_tcp_session(struct smb3_fs_context *ctx);
|
||||
|
|
|
|||
|
|
@ -2972,17 +2972,20 @@ expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
|
|||
rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
|
||||
ref_path, &referral, NULL);
|
||||
if (!rc) {
|
||||
char *fake_devname = NULL;
|
||||
|
||||
mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
|
||||
full_path + 1, &referral);
|
||||
full_path + 1, &referral,
|
||||
&fake_devname);
|
||||
free_dfs_info_param(&referral);
|
||||
|
||||
if (IS_ERR(mdata)) {
|
||||
rc = PTR_ERR(mdata);
|
||||
mdata = NULL;
|
||||
} else {
|
||||
smb3_cleanup_fs_context_contents(ctx);
|
||||
rc = cifs_setup_volume_info(ctx);
|
||||
rc = cifs_setup_volume_info(ctx, mdata, fake_devname);
|
||||
}
|
||||
kfree(fake_devname);
|
||||
kfree(cifs_sb->ctx->mount_options);
|
||||
cifs_sb->ctx->mount_options = mdata;
|
||||
}
|
||||
|
|
@ -3036,6 +3039,7 @@ static int setup_dfs_tgt_conn(const char *path, const char *full_path,
|
|||
struct dfs_info3_param ref = {0};
|
||||
char *mdata = NULL;
|
||||
struct smb3_fs_context fake_ctx = {NULL};
|
||||
char *fake_devname = NULL;
|
||||
|
||||
cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
|
||||
|
||||
|
|
@ -3044,16 +3048,18 @@ static int setup_dfs_tgt_conn(const char *path, const char *full_path,
|
|||
return rc;
|
||||
|
||||
mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
|
||||
full_path + 1, &ref);
|
||||
full_path + 1, &ref,
|
||||
&fake_devname);
|
||||
free_dfs_info_param(&ref);
|
||||
|
||||
if (IS_ERR(mdata)) {
|
||||
rc = PTR_ERR(mdata);
|
||||
mdata = NULL;
|
||||
} else
|
||||
rc = cifs_setup_volume_info(&fake_ctx);
|
||||
rc = cifs_setup_volume_info(&fake_ctx, mdata, fake_devname);
|
||||
|
||||
kfree(mdata);
|
||||
kfree(fake_devname);
|
||||
|
||||
if (!rc) {
|
||||
/*
|
||||
|
|
@ -3122,10 +3128,24 @@ static int do_dfs_failover(const char *path, const char *full_path, struct cifs_
|
|||
* we should pass a clone of the original context?
|
||||
*/
|
||||
int
|
||||
cifs_setup_volume_info(struct smb3_fs_context *ctx)
|
||||
cifs_setup_volume_info(struct smb3_fs_context *ctx, const char *mntopts, const char *devname)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
smb3_parse_devname(devname, ctx);
|
||||
|
||||
if (mntopts) {
|
||||
char *ip;
|
||||
|
||||
cifs_dbg(FYI, "%s: mntopts=%s\n", __func__, mntopts);
|
||||
rc = smb3_parse_opt(mntopts, "ip", &ip);
|
||||
if (!rc && !cifs_convert_address((struct sockaddr *)&ctx->dstaddr, ip,
|
||||
strlen(ip))) {
|
||||
cifs_dbg(VFS, "%s: failed to convert ip address\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx->nullauth) {
|
||||
cifs_dbg(FYI, "Anonymous login\n");
|
||||
kfree(ctx->username);
|
||||
|
|
|
|||
|
|
@ -1417,7 +1417,7 @@ static struct cifs_ses *find_root_ses(struct vol_info *vi,
|
|||
int rc;
|
||||
struct cache_entry *ce;
|
||||
struct dfs_info3_param ref = {0};
|
||||
char *mdata = NULL;
|
||||
char *mdata = NULL, *devname = NULL;
|
||||
struct TCP_Server_Info *server;
|
||||
struct cifs_ses *ses;
|
||||
struct smb3_fs_context ctx = {NULL};
|
||||
|
|
@ -1444,7 +1444,8 @@ static struct cifs_ses *find_root_ses(struct vol_info *vi,
|
|||
|
||||
up_read(&htable_rw_lock);
|
||||
|
||||
mdata = cifs_compose_mount_options(vi->mntdata, rpath, &ref);
|
||||
mdata = cifs_compose_mount_options(vi->mntdata, rpath, &ref,
|
||||
&devname);
|
||||
free_dfs_info_param(&ref);
|
||||
|
||||
if (IS_ERR(mdata)) {
|
||||
|
|
@ -1453,7 +1454,7 @@ static struct cifs_ses *find_root_ses(struct vol_info *vi,
|
|||
goto out;
|
||||
}
|
||||
|
||||
rc = cifs_setup_volume_info(&ctx);
|
||||
rc = cifs_setup_volume_info(&ctx, NULL, devname);
|
||||
|
||||
if (rc) {
|
||||
ses = ERR_PTR(rc);
|
||||
|
|
@ -1472,6 +1473,7 @@ static struct cifs_ses *find_root_ses(struct vol_info *vi,
|
|||
smb3_cleanup_fs_context_contents(&ctx);
|
||||
kfree(mdata);
|
||||
kfree(rpath);
|
||||
kfree(devname);
|
||||
|
||||
return ses;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -175,8 +175,10 @@ const struct fs_parameter_spec smb3_fs_parameters[] = {
|
|||
fsparam_flag_no("exec", Opt_ignore),
|
||||
fsparam_flag_no("dev", Opt_ignore),
|
||||
fsparam_flag_no("mand", Opt_ignore),
|
||||
fsparam_flag_no("auto", Opt_ignore),
|
||||
fsparam_string("cred", Opt_ignore),
|
||||
fsparam_string("credentials", Opt_ignore),
|
||||
fsparam_string("prefixpath", Opt_ignore),
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
@ -399,6 +401,37 @@ cifs_parse_smb_version(char *value, struct smb3_fs_context *ctx, bool is_smb3)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int smb3_parse_opt(const char *options, const char *key, char **val)
|
||||
{
|
||||
int rc = -ENOENT;
|
||||
char *opts, *orig, *p;
|
||||
|
||||
orig = opts = kstrdup(options, GFP_KERNEL);
|
||||
if (!opts)
|
||||
return -ENOMEM;
|
||||
|
||||
while ((p = strsep(&opts, ","))) {
|
||||
char *nval;
|
||||
|
||||
if (!*p)
|
||||
continue;
|
||||
if (strncasecmp(p, key, strlen(key)))
|
||||
continue;
|
||||
nval = strchr(p, '=');
|
||||
if (nval) {
|
||||
if (nval == p)
|
||||
continue;
|
||||
*nval++ = 0;
|
||||
*val = kstrndup(nval, strlen(nval), GFP_KERNEL);
|
||||
rc = !*val ? -ENOMEM : 0;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
out:
|
||||
kfree(orig);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse a devname into substrings and populate the ctx->UNC and ctx->prepath
|
||||
* fields with the result. Returns 0 on success and an error otherwise
|
||||
|
|
@ -531,7 +564,7 @@ static int smb3_fs_context_validate(struct fs_context *fc)
|
|||
|
||||
if (ctx->rdma && ctx->vals->protocol_id < SMB30_PROT_ID) {
|
||||
cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
|
||||
return -1;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_KEYS
|
||||
|
|
@ -554,7 +587,7 @@ static int smb3_fs_context_validate(struct fs_context *fc)
|
|||
/* make sure UNC has a share name */
|
||||
if (strlen(ctx->UNC) < 3 || !strchr(ctx->UNC + 3, '\\')) {
|
||||
cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
|
||||
return -1;
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
if (!ctx->got_ip) {
|
||||
|
|
@ -568,7 +601,7 @@ static int smb3_fs_context_validate(struct fs_context *fc)
|
|||
if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
|
||||
&ctx->UNC[2], len)) {
|
||||
pr_err("Unable to determine destination address\n");
|
||||
return -1;
|
||||
return -EHOSTUNREACH;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1263,7 +1296,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
|
|||
return 0;
|
||||
|
||||
cifs_parse_mount_err:
|
||||
return 1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int smb3_init_fs_context(struct fs_context *fc)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user