Merge 16f7432c88
("Merge tag 'linux-kselftest-fixes-5.17-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest") into android-mainline
Steps on the way to 5.17-rc4 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Id9a935964b1dc5365b08f64919cd3c9ab152766b
This commit is contained in:
commit
19a0990b69
@ -242,7 +242,7 @@ example:
|
||||
|
||||
int rectangle_area(struct shape *this)
|
||||
{
|
||||
struct rectangle *self = container_of(this, struct shape, parent);
|
||||
struct rectangle *self = container_of(this, struct rectangle, parent);
|
||||
|
||||
return self->length * self->width;
|
||||
};
|
||||
|
@ -13578,7 +13578,7 @@ F: tools/testing/selftests/nci/
|
||||
|
||||
NFS, SUNRPC, AND LOCKD CLIENTS
|
||||
M: Trond Myklebust <trond.myklebust@hammerspace.com>
|
||||
M: Anna Schumaker <anna.schumaker@netapp.com>
|
||||
M: Anna Schumaker <anna@kernel.org>
|
||||
L: linux-nfs@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://client.linux-nfs.org
|
||||
|
@ -83,6 +83,8 @@ hdmi_out: connector {
|
||||
label = "HDMI OUT";
|
||||
type = "a";
|
||||
|
||||
ddc-en-gpios = <&gpa 25 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
port {
|
||||
hdmi_con: endpoint {
|
||||
remote-endpoint = <&dw_hdmi_out>;
|
||||
@ -114,17 +116,6 @@ otg_power: fixedregulator@2 {
|
||||
gpio = <&gpf 14 GPIO_ACTIVE_LOW>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
hdmi_power: fixedregulator@3 {
|
||||
compatible = "regulator-fixed";
|
||||
|
||||
regulator-name = "hdmi_power";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
|
||||
gpio = <&gpa 25 0>;
|
||||
enable-active-high;
|
||||
};
|
||||
};
|
||||
|
||||
&ext {
|
||||
@ -576,8 +567,6 @@ &hdmi {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pins_hdmi_ddc>;
|
||||
|
||||
hdmi-5v-supply = <&hdmi_power>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -4667,6 +4667,8 @@ static long kvm_s390_guest_sida_op(struct kvm_vcpu *vcpu,
|
||||
return -EINVAL;
|
||||
if (mop->size + mop->sida_offset > sida_size(vcpu->arch.sie_block))
|
||||
return -E2BIG;
|
||||
if (!kvm_s390_pv_cpu_is_protected(vcpu))
|
||||
return -EINVAL;
|
||||
|
||||
switch (mop->op) {
|
||||
case KVM_S390_MEMOP_SIDA_READ:
|
||||
|
@ -1324,3 +1324,4 @@ module_exit(crypto_algapi_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Cryptographic algorithms API");
|
||||
MODULE_SOFTDEP("pre: cryptomgr");
|
||||
|
@ -643,4 +643,3 @@ EXPORT_SYMBOL_GPL(crypto_req_done);
|
||||
|
||||
MODULE_DESCRIPTION("Cryptographic core API");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_SOFTDEP("pre: cryptomgr");
|
||||
|
@ -2448,23 +2448,21 @@ static void ata_dev_config_cpr(struct ata_device *dev)
|
||||
struct ata_cpr_log *cpr_log = NULL;
|
||||
u8 *desc, *buf = NULL;
|
||||
|
||||
if (!ata_identify_page_supported(dev,
|
||||
ATA_LOG_CONCURRENT_POSITIONING_RANGES))
|
||||
if (ata_id_major_version(dev->id) < 11 ||
|
||||
!ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES))
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Read IDENTIFY DEVICE data log, page 0x47
|
||||
* (concurrent positioning ranges). We can have at most 255 32B range
|
||||
* descriptors plus a 64B header.
|
||||
* Read the concurrent positioning ranges log (0x47). We can have at
|
||||
* most 255 32B range descriptors plus a 64B header.
|
||||
*/
|
||||
buf_len = (64 + 255 * 32 + 511) & ~511;
|
||||
buf = kzalloc(buf_len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
goto out;
|
||||
|
||||
err_mask = ata_read_log_page(dev, ATA_LOG_IDENTIFY_DEVICE,
|
||||
ATA_LOG_CONCURRENT_POSITIONING_RANGES,
|
||||
buf, buf_len >> 9);
|
||||
err_mask = ata_read_log_page(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES,
|
||||
0, buf, buf_len >> 9);
|
||||
if (err_mask)
|
||||
goto out;
|
||||
|
||||
|
@ -1753,7 +1753,6 @@ void otx2_cpt_print_uc_dbg_info(struct otx2_cptpf_dev *cptpf)
|
||||
char engs_info[2 * OTX2_CPT_NAME_LENGTH];
|
||||
struct otx2_cpt_eng_grp_info *grp;
|
||||
struct otx2_cpt_engs_rsvd *engs;
|
||||
u32 mask[4];
|
||||
int i, j;
|
||||
|
||||
pr_debug("Engine groups global info");
|
||||
@ -1785,6 +1784,8 @@ void otx2_cpt_print_uc_dbg_info(struct otx2_cptpf_dev *cptpf)
|
||||
for (j = 0; j < OTX2_CPT_MAX_ETYPES_PER_GRP; j++) {
|
||||
engs = &grp->engs[j];
|
||||
if (engs->type) {
|
||||
u32 mask[5] = { };
|
||||
|
||||
get_engs_info(grp, engs_info,
|
||||
2 * OTX2_CPT_NAME_LENGTH, j);
|
||||
pr_debug("Slot%d: %s", j, engs_info);
|
||||
|
@ -67,7 +67,7 @@ static const unsigned int sd_au_size[] = {
|
||||
__res & __mask; \
|
||||
})
|
||||
|
||||
#define SD_POWEROFF_NOTIFY_TIMEOUT_MS 2000
|
||||
#define SD_POWEROFF_NOTIFY_TIMEOUT_MS 1000
|
||||
#define SD_WRITE_EXTR_SINGLE_TIMEOUT_MS 1000
|
||||
|
||||
struct sd_busy_data {
|
||||
@ -1664,6 +1664,12 @@ static int sd_poweroff_notify(struct mmc_card *card)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Find out when the command is completed. */
|
||||
err = mmc_poll_for_busy(card, SD_WRITE_EXTR_SINGLE_TIMEOUT_MS, false,
|
||||
MMC_BUSY_EXTR_SINGLE);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
cb_data.card = card;
|
||||
cb_data.reg_buf = reg_buf;
|
||||
err = __mmc_poll_for_busy(card->host, SD_POWEROFF_NOTIFY_TIMEOUT_MS,
|
||||
|
@ -705,12 +705,12 @@ static int moxart_remove(struct platform_device *pdev)
|
||||
if (!IS_ERR_OR_NULL(host->dma_chan_rx))
|
||||
dma_release_channel(host->dma_chan_rx);
|
||||
mmc_remove_host(mmc);
|
||||
mmc_free_host(mmc);
|
||||
|
||||
writel(0, host->base + REG_INTERRUPT_MASK);
|
||||
writel(0, host->base + REG_POWER_CONTROL);
|
||||
writel(readl(host->base + REG_CLOCK_CONTROL) | CLK_OFF,
|
||||
host->base + REG_CLOCK_CONTROL);
|
||||
mmc_free_host(mmc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -524,12 +524,16 @@ static void esdhc_of_adma_workaround(struct sdhci_host *host, u32 intmask)
|
||||
|
||||
static int esdhc_of_enable_dma(struct sdhci_host *host)
|
||||
{
|
||||
int ret;
|
||||
u32 value;
|
||||
struct device *dev = mmc_dev(host->mmc);
|
||||
|
||||
if (of_device_is_compatible(dev->of_node, "fsl,ls1043a-esdhc") ||
|
||||
of_device_is_compatible(dev->of_node, "fsl,ls1046a-esdhc"))
|
||||
dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40));
|
||||
of_device_is_compatible(dev->of_node, "fsl,ls1046a-esdhc")) {
|
||||
ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
value = sdhci_readl(host, ESDHC_DMA_SYSCTL);
|
||||
|
||||
|
@ -405,6 +405,9 @@ static int sh_mmcif_dma_slave_config(struct sh_mmcif_host *host,
|
||||
struct dma_slave_config cfg = { 0, };
|
||||
|
||||
res = platform_get_resource(host->pd, IORESOURCE_MEM, 0);
|
||||
if (!res)
|
||||
return -EINVAL;
|
||||
|
||||
cfg.direction = direction;
|
||||
|
||||
if (direction == DMA_DEV_TO_MEM) {
|
||||
|
@ -370,8 +370,8 @@ source "fs/ksmbd/Kconfig"
|
||||
|
||||
config SMBFS_COMMON
|
||||
tristate
|
||||
default y if CIFS=y
|
||||
default m if CIFS=m
|
||||
default y if CIFS=y || SMB_SERVER=y
|
||||
default m if CIFS=m || SMB_SERVER=m
|
||||
|
||||
source "fs/coda/Kconfig"
|
||||
source "fs/afs/Kconfig"
|
||||
|
@ -817,20 +817,16 @@ static struct file_system_type bm_fs_type = {
|
||||
};
|
||||
MODULE_ALIAS_FS("binfmt_misc");
|
||||
|
||||
static struct ctl_table_header *binfmt_misc_header;
|
||||
|
||||
static int __init init_misc_binfmt(void)
|
||||
{
|
||||
int err = register_filesystem(&bm_fs_type);
|
||||
if (!err)
|
||||
insert_binfmt(&misc_format);
|
||||
binfmt_misc_header = register_sysctl_mount_point("fs/binfmt_misc");
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit exit_misc_binfmt(void)
|
||||
{
|
||||
unregister_sysctl_table(binfmt_misc_header);
|
||||
unregister_binfmt(&misc_format);
|
||||
unregister_filesystem(&bm_fs_type);
|
||||
}
|
||||
|
@ -119,6 +119,8 @@ static struct ctl_table fs_stat_sysctls[] = {
|
||||
static int __init init_fs_stat_sysctls(void)
|
||||
{
|
||||
register_sysctl_init("fs", fs_stat_sysctls);
|
||||
if (IS_ENABLED(CONFIG_BINFMT_MISC))
|
||||
register_sysctl_mount_point("fs/binfmt_misc");
|
||||
return 0;
|
||||
}
|
||||
fs_initcall(init_fs_stat_sysctls);
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "mgmt/user_config.h"
|
||||
#include "crypto_ctx.h"
|
||||
#include "transport_ipc.h"
|
||||
#include "../smbfs_common/arc4.h"
|
||||
|
||||
/*
|
||||
* Fixed format data defining GSS header and fixed string
|
||||
@ -336,6 +337,29 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
|
||||
nt_len - CIFS_ENCPWD_SIZE,
|
||||
domain_name, conn->ntlmssp.cryptkey);
|
||||
kfree(domain_name);
|
||||
|
||||
/* The recovered secondary session key */
|
||||
if (conn->ntlmssp.client_flags & NTLMSSP_NEGOTIATE_KEY_XCH) {
|
||||
struct arc4_ctx *ctx_arc4;
|
||||
unsigned int sess_key_off, sess_key_len;
|
||||
|
||||
sess_key_off = le32_to_cpu(authblob->SessionKey.BufferOffset);
|
||||
sess_key_len = le16_to_cpu(authblob->SessionKey.Length);
|
||||
|
||||
if (blob_len < (u64)sess_key_off + sess_key_len)
|
||||
return -EINVAL;
|
||||
|
||||
ctx_arc4 = kmalloc(sizeof(*ctx_arc4), GFP_KERNEL);
|
||||
if (!ctx_arc4)
|
||||
return -ENOMEM;
|
||||
|
||||
cifs_arc4_setkey(ctx_arc4, sess->sess_key,
|
||||
SMB2_NTLMV2_SESSKEY_SIZE);
|
||||
cifs_arc4_crypt(ctx_arc4, sess->sess_key,
|
||||
(char *)authblob + sess_key_off, sess_key_len);
|
||||
kfree_sensitive(ctx_arc4);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -408,6 +432,9 @@ ksmbd_build_ntlmssp_challenge_blob(struct challenge_message *chgblob,
|
||||
(cflags & NTLMSSP_NEGOTIATE_EXTENDED_SEC))
|
||||
flags |= NTLMSSP_NEGOTIATE_EXTENDED_SEC;
|
||||
|
||||
if (cflags & NTLMSSP_NEGOTIATE_KEY_XCH)
|
||||
flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
|
||||
|
||||
chgblob->NegotiateFlags = cpu_to_le32(flags);
|
||||
len = strlen(ksmbd_netbios_name());
|
||||
name = kmalloc(2 + UNICODE_LEN(len), GFP_KERNEL);
|
||||
|
@ -2688,7 +2688,7 @@ int smb2_open(struct ksmbd_work *work)
|
||||
(struct create_posix *)context;
|
||||
if (le16_to_cpu(context->DataOffset) +
|
||||
le32_to_cpu(context->DataLength) <
|
||||
sizeof(struct create_posix)) {
|
||||
sizeof(struct create_posix) - 4) {
|
||||
rc = -EINVAL;
|
||||
goto err_out1;
|
||||
}
|
||||
@ -3422,9 +3422,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
|
||||
goto free_conv_name;
|
||||
}
|
||||
|
||||
struct_sz = readdir_info_level_struct_sz(info_level);
|
||||
next_entry_offset = ALIGN(struct_sz - 1 + conv_len,
|
||||
KSMBD_DIR_INFO_ALIGNMENT);
|
||||
struct_sz = readdir_info_level_struct_sz(info_level) - 1 + conv_len;
|
||||
next_entry_offset = ALIGN(struct_sz, KSMBD_DIR_INFO_ALIGNMENT);
|
||||
d_info->last_entry_off_align = next_entry_offset - struct_sz;
|
||||
|
||||
if (next_entry_offset > d_info->out_buf_len) {
|
||||
d_info->out_buf_len = 0;
|
||||
@ -3976,6 +3976,7 @@ int smb2_query_dir(struct ksmbd_work *work)
|
||||
((struct file_directory_info *)
|
||||
((char *)rsp->Buffer + d_info.last_entry_offset))
|
||||
->NextEntryOffset = 0;
|
||||
d_info.data_count -= d_info.last_entry_off_align;
|
||||
|
||||
rsp->StructureSize = cpu_to_le16(9);
|
||||
rsp->OutputBufferOffset = cpu_to_le16(72);
|
||||
@ -6126,13 +6127,26 @@ static int smb2_set_remote_key_for_rdma(struct ksmbd_work *work,
|
||||
__le16 ChannelInfoOffset,
|
||||
__le16 ChannelInfoLength)
|
||||
{
|
||||
unsigned int i, ch_count;
|
||||
|
||||
if (work->conn->dialect == SMB30_PROT_ID &&
|
||||
Channel != SMB2_CHANNEL_RDMA_V1)
|
||||
return -EINVAL;
|
||||
|
||||
if (ChannelInfoOffset == 0 ||
|
||||
le16_to_cpu(ChannelInfoLength) < sizeof(*desc))
|
||||
ch_count = le16_to_cpu(ChannelInfoLength) / sizeof(*desc);
|
||||
if (ksmbd_debug_types & KSMBD_DEBUG_RDMA) {
|
||||
for (i = 0; i < ch_count; i++) {
|
||||
pr_info("RDMA r/w request %#x: token %#x, length %#x\n",
|
||||
i,
|
||||
le32_to_cpu(desc[i].token),
|
||||
le32_to_cpu(desc[i].length));
|
||||
}
|
||||
}
|
||||
if (ch_count != 1) {
|
||||
ksmbd_debug(RDMA, "RDMA multiple buffer descriptors %d are not supported yet\n",
|
||||
ch_count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
work->need_invalidate_rkey =
|
||||
(Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE);
|
||||
@ -6185,9 +6199,15 @@ int smb2_read(struct ksmbd_work *work)
|
||||
|
||||
if (req->Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE ||
|
||||
req->Channel == SMB2_CHANNEL_RDMA_V1) {
|
||||
unsigned int ch_offset = le16_to_cpu(req->ReadChannelInfoOffset);
|
||||
|
||||
if (ch_offset < offsetof(struct smb2_read_req, Buffer)) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
err = smb2_set_remote_key_for_rdma(work,
|
||||
(struct smb2_buffer_desc_v1 *)
|
||||
&req->Buffer[0],
|
||||
((char *)req + ch_offset),
|
||||
req->Channel,
|
||||
req->ReadChannelInfoOffset,
|
||||
req->ReadChannelInfoLength);
|
||||
@ -6428,11 +6448,16 @@ int smb2_write(struct ksmbd_work *work)
|
||||
|
||||
if (req->Channel == SMB2_CHANNEL_RDMA_V1 ||
|
||||
req->Channel == SMB2_CHANNEL_RDMA_V1_INVALIDATE) {
|
||||
if (req->Length != 0 || req->DataOffset != 0)
|
||||
return -EINVAL;
|
||||
unsigned int ch_offset = le16_to_cpu(req->WriteChannelInfoOffset);
|
||||
|
||||
if (req->Length != 0 || req->DataOffset != 0 ||
|
||||
ch_offset < offsetof(struct smb2_write_req, Buffer)) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
err = smb2_set_remote_key_for_rdma(work,
|
||||
(struct smb2_buffer_desc_v1 *)
|
||||
&req->Buffer[0],
|
||||
((char *)req + ch_offset),
|
||||
req->Channel,
|
||||
req->WriteChannelInfoOffset,
|
||||
req->WriteChannelInfoLength);
|
||||
|
@ -308,14 +308,17 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level,
|
||||
for (i = 0; i < 2; i++) {
|
||||
struct kstat kstat;
|
||||
struct ksmbd_kstat ksmbd_kstat;
|
||||
struct dentry *dentry;
|
||||
|
||||
if (!dir->dot_dotdot[i]) { /* fill dot entry info */
|
||||
if (i == 0) {
|
||||
d_info->name = ".";
|
||||
d_info->name_len = 1;
|
||||
dentry = dir->filp->f_path.dentry;
|
||||
} else {
|
||||
d_info->name = "..";
|
||||
d_info->name_len = 2;
|
||||
dentry = dir->filp->f_path.dentry->d_parent;
|
||||
}
|
||||
|
||||
if (!match_pattern(d_info->name, d_info->name_len,
|
||||
@ -327,7 +330,7 @@ int ksmbd_populate_dot_dotdot_entries(struct ksmbd_work *work, int info_level,
|
||||
ksmbd_kstat.kstat = &kstat;
|
||||
ksmbd_vfs_fill_dentry_attrs(work,
|
||||
user_ns,
|
||||
dir->filp->f_path.dentry->d_parent,
|
||||
dentry,
|
||||
&ksmbd_kstat);
|
||||
rc = fn(conn, info_level, d_info, &ksmbd_kstat);
|
||||
if (rc)
|
||||
|
@ -80,7 +80,7 @@ static int smb_direct_max_fragmented_recv_size = 1024 * 1024;
|
||||
/* The maximum single-message size which can be received */
|
||||
static int smb_direct_max_receive_size = 8192;
|
||||
|
||||
static int smb_direct_max_read_write_size = 1048512;
|
||||
static int smb_direct_max_read_write_size = 524224;
|
||||
|
||||
static int smb_direct_max_outstanding_rw_ops = 8;
|
||||
|
||||
|
@ -47,6 +47,7 @@ struct ksmbd_dir_info {
|
||||
int last_entry_offset;
|
||||
bool hide_dot_file;
|
||||
int flags;
|
||||
int last_entry_off_align;
|
||||
};
|
||||
|
||||
struct ksmbd_readdir_data {
|
||||
|
@ -177,6 +177,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
|
||||
INIT_LIST_HEAD(&clp->cl_superblocks);
|
||||
clp->cl_rpcclient = ERR_PTR(-EINVAL);
|
||||
|
||||
clp->cl_flags = cl_init->init_flags;
|
||||
clp->cl_proto = cl_init->proto;
|
||||
clp->cl_nconnect = cl_init->nconnect;
|
||||
clp->cl_max_connect = cl_init->max_connect ? cl_init->max_connect : 1;
|
||||
@ -423,7 +424,6 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init)
|
||||
list_add_tail(&new->cl_share_link,
|
||||
&nn->nfs_client_list);
|
||||
spin_unlock(&nn->nfs_client_lock);
|
||||
new->cl_flags = cl_init->init_flags;
|
||||
return rpc_ops->init_client(new, cl_init);
|
||||
}
|
||||
|
||||
|
24
fs/nfs/dir.c
24
fs/nfs/dir.c
@ -80,6 +80,7 @@ static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir
|
||||
ctx->dir_cookie = 0;
|
||||
ctx->dup_cookie = 0;
|
||||
ctx->page_index = 0;
|
||||
ctx->eof = false;
|
||||
spin_lock(&dir->i_lock);
|
||||
if (list_empty(&nfsi->open_files) &&
|
||||
(nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
|
||||
@ -168,6 +169,7 @@ struct nfs_readdir_descriptor {
|
||||
unsigned int cache_entry_index;
|
||||
signed char duped;
|
||||
bool plus;
|
||||
bool eob;
|
||||
bool eof;
|
||||
};
|
||||
|
||||
@ -867,7 +869,8 @@ static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
|
||||
|
||||
status = nfs_readdir_page_filler(desc, entry, pages, pglen,
|
||||
arrays, narrays);
|
||||
} while (!status && nfs_readdir_page_needs_filling(page));
|
||||
} while (!status && nfs_readdir_page_needs_filling(page) &&
|
||||
page_mapping(page));
|
||||
|
||||
nfs_readdir_free_pages(pages, array_size);
|
||||
out:
|
||||
@ -988,7 +991,7 @@ static void nfs_do_filldir(struct nfs_readdir_descriptor *desc,
|
||||
ent = &array->array[i];
|
||||
if (!dir_emit(desc->ctx, ent->name, ent->name_len,
|
||||
nfs_compat_user_ino64(ent->ino), ent->d_type)) {
|
||||
desc->eof = true;
|
||||
desc->eob = true;
|
||||
break;
|
||||
}
|
||||
memcpy(desc->verf, verf, sizeof(desc->verf));
|
||||
@ -1004,7 +1007,7 @@ static void nfs_do_filldir(struct nfs_readdir_descriptor *desc,
|
||||
desc->duped = 1;
|
||||
}
|
||||
if (array->page_is_eof)
|
||||
desc->eof = true;
|
||||
desc->eof = !desc->eob;
|
||||
|
||||
kunmap(desc->page);
|
||||
dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %llu\n",
|
||||
@ -1041,12 +1044,13 @@ static int uncached_readdir(struct nfs_readdir_descriptor *desc)
|
||||
goto out;
|
||||
|
||||
desc->page_index = 0;
|
||||
desc->cache_entry_index = 0;
|
||||
desc->last_cookie = desc->dir_cookie;
|
||||
desc->duped = 0;
|
||||
|
||||
status = nfs_readdir_xdr_to_array(desc, desc->verf, verf, arrays, sz);
|
||||
|
||||
for (i = 0; !desc->eof && i < sz && arrays[i]; i++) {
|
||||
for (i = 0; !desc->eob && i < sz && arrays[i]; i++) {
|
||||
desc->page = arrays[i];
|
||||
nfs_do_filldir(desc, verf);
|
||||
}
|
||||
@ -1105,9 +1109,15 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx)
|
||||
desc->duped = dir_ctx->duped;
|
||||
page_index = dir_ctx->page_index;
|
||||
desc->attr_gencount = dir_ctx->attr_gencount;
|
||||
desc->eof = dir_ctx->eof;
|
||||
memcpy(desc->verf, dir_ctx->verf, sizeof(desc->verf));
|
||||
spin_unlock(&file->f_lock);
|
||||
|
||||
if (desc->eof) {
|
||||
res = 0;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(NFS_INO_FORCE_READDIR, &nfsi->flags) &&
|
||||
list_is_singular(&nfsi->open_files))
|
||||
invalidate_mapping_pages(inode->i_mapping, page_index + 1, -1);
|
||||
@ -1141,7 +1151,7 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx)
|
||||
|
||||
nfs_do_filldir(desc, nfsi->cookieverf);
|
||||
nfs_readdir_page_unlock_and_put_cached(desc);
|
||||
} while (!desc->eof);
|
||||
} while (!desc->eob && !desc->eof);
|
||||
|
||||
spin_lock(&file->f_lock);
|
||||
dir_ctx->dir_cookie = desc->dir_cookie;
|
||||
@ -1149,9 +1159,10 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx)
|
||||
dir_ctx->duped = desc->duped;
|
||||
dir_ctx->attr_gencount = desc->attr_gencount;
|
||||
dir_ctx->page_index = desc->page_index;
|
||||
dir_ctx->eof = desc->eof;
|
||||
memcpy(dir_ctx->verf, desc->verf, sizeof(dir_ctx->verf));
|
||||
spin_unlock(&file->f_lock);
|
||||
|
||||
out_free:
|
||||
kfree(desc);
|
||||
|
||||
out:
|
||||
@ -1193,6 +1204,7 @@ static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
|
||||
if (offset == 0)
|
||||
memset(dir_ctx->verf, 0, sizeof(dir_ctx->verf));
|
||||
dir_ctx->duped = 0;
|
||||
dir_ctx->eof = false;
|
||||
}
|
||||
spin_unlock(&filp->f_lock);
|
||||
return offset;
|
||||
|
@ -8032,7 +8032,8 @@ static int _nfs41_proc_get_locations(struct nfs_server *server,
|
||||
|
||||
/**
|
||||
* nfs4_proc_get_locations - discover locations for a migrated FSID
|
||||
* @inode: inode on FSID that is migrating
|
||||
* @server: pointer to nfs_server to process
|
||||
* @fhandle: pointer to the kernel NFS client file handle
|
||||
* @locations: result of query
|
||||
* @page: buffer
|
||||
* @cred: credential to use for this operation
|
||||
|
@ -150,13 +150,17 @@ nfsd3_proc_read(struct svc_rqst *rqstp)
|
||||
unsigned int len;
|
||||
int v;
|
||||
|
||||
argp->count = min_t(u32, argp->count, max_blocksize);
|
||||
|
||||
dprintk("nfsd: READ(3) %s %lu bytes at %Lu\n",
|
||||
SVCFH_fmt(&argp->fh),
|
||||
(unsigned long) argp->count,
|
||||
(unsigned long long) argp->offset);
|
||||
|
||||
argp->count = min_t(u32, argp->count, max_blocksize);
|
||||
if (argp->offset > (u64)OFFSET_MAX)
|
||||
argp->offset = (u64)OFFSET_MAX;
|
||||
if (argp->offset + argp->count > (u64)OFFSET_MAX)
|
||||
argp->count = (u64)OFFSET_MAX - argp->offset;
|
||||
|
||||
v = 0;
|
||||
len = argp->count;
|
||||
resp->pages = rqstp->rq_next_page;
|
||||
@ -199,6 +203,11 @@ nfsd3_proc_write(struct svc_rqst *rqstp)
|
||||
(unsigned long long) argp->offset,
|
||||
argp->stable? " stable" : "");
|
||||
|
||||
resp->status = nfserr_fbig;
|
||||
if (argp->offset > (u64)OFFSET_MAX ||
|
||||
argp->offset + argp->len > (u64)OFFSET_MAX)
|
||||
return rpc_success;
|
||||
|
||||
fh_copy(&resp->fh, &argp->fh);
|
||||
resp->committed = argp->stable;
|
||||
nvecs = svc_fill_write_vector(rqstp, &argp->payload);
|
||||
@ -651,15 +660,9 @@ nfsd3_proc_commit(struct svc_rqst *rqstp)
|
||||
argp->count,
|
||||
(unsigned long long) argp->offset);
|
||||
|
||||
if (argp->offset > NFS_OFFSET_MAX) {
|
||||
resp->status = nfserr_inval;
|
||||
goto out;
|
||||
}
|
||||
|
||||
fh_copy(&resp->fh, &argp->fh);
|
||||
resp->status = nfsd_commit(rqstp, &resp->fh, argp->offset,
|
||||
argp->count, resp->verf);
|
||||
out:
|
||||
return rpc_success;
|
||||
}
|
||||
|
||||
|
@ -254,7 +254,7 @@ svcxdr_decode_sattr3(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
||||
if (xdr_stream_decode_u64(xdr, &newsize) < 0)
|
||||
return false;
|
||||
iap->ia_valid |= ATTR_SIZE;
|
||||
iap->ia_size = min_t(u64, newsize, NFS_OFFSET_MAX);
|
||||
iap->ia_size = newsize;
|
||||
}
|
||||
if (xdr_stream_decode_u32(xdr, &set_it) < 0)
|
||||
return false;
|
||||
@ -1060,7 +1060,7 @@ svcxdr_encode_entry3_common(struct nfsd3_readdirres *resp, const char *name,
|
||||
return false;
|
||||
/* cookie */
|
||||
resp->cookie_offset = dirlist->len;
|
||||
if (xdr_stream_encode_u64(xdr, NFS_OFFSET_MAX) < 0)
|
||||
if (xdr_stream_encode_u64(xdr, OFFSET_MAX) < 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
@ -782,12 +782,16 @@ nfsd4_read(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||
__be32 status;
|
||||
|
||||
read->rd_nf = NULL;
|
||||
if (read->rd_offset >= OFFSET_MAX)
|
||||
return nfserr_inval;
|
||||
|
||||
trace_nfsd_read_start(rqstp, &cstate->current_fh,
|
||||
read->rd_offset, read->rd_length);
|
||||
|
||||
read->rd_length = min_t(u32, read->rd_length, svc_max_payload(rqstp));
|
||||
if (read->rd_offset > (u64)OFFSET_MAX)
|
||||
read->rd_offset = (u64)OFFSET_MAX;
|
||||
if (read->rd_offset + read->rd_length > (u64)OFFSET_MAX)
|
||||
read->rd_length = (u64)OFFSET_MAX - read->rd_offset;
|
||||
|
||||
/*
|
||||
* If we do a zero copy read, then a client will see read data
|
||||
* that reflects the state of the file *after* performing the
|
||||
@ -1018,8 +1022,9 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||
unsigned long cnt;
|
||||
int nvecs;
|
||||
|
||||
if (write->wr_offset >= OFFSET_MAX)
|
||||
return nfserr_inval;
|
||||
if (write->wr_offset > (u64)OFFSET_MAX ||
|
||||
write->wr_offset + write->wr_buflen > (u64)OFFSET_MAX)
|
||||
return nfserr_fbig;
|
||||
|
||||
cnt = write->wr_buflen;
|
||||
trace_nfsd_write_start(rqstp, &cstate->current_fh,
|
||||
|
@ -3495,7 +3495,7 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
|
||||
p = xdr_reserve_space(xdr, 3*4 + namlen);
|
||||
if (!p)
|
||||
goto fail;
|
||||
p = xdr_encode_hyper(p, NFS_OFFSET_MAX); /* offset of next entry */
|
||||
p = xdr_encode_hyper(p, OFFSET_MAX); /* offset of next entry */
|
||||
p = xdr_encode_array(p, name, namlen); /* name length & name */
|
||||
|
||||
nfserr = nfsd4_encode_dirent_fattr(xdr, cd, name, namlen);
|
||||
@ -3986,10 +3986,8 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
|
||||
}
|
||||
xdr_commit_encode(xdr);
|
||||
|
||||
maxcount = svc_max_payload(resp->rqstp);
|
||||
maxcount = min_t(unsigned long, maxcount,
|
||||
maxcount = min_t(unsigned long, read->rd_length,
|
||||
(xdr->buf->buflen - xdr->buf->len));
|
||||
maxcount = min_t(unsigned long, maxcount, read->rd_length);
|
||||
|
||||
if (file->f_op->splice_read &&
|
||||
test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags))
|
||||
@ -4826,10 +4824,8 @@ nfsd4_encode_read_plus(struct nfsd4_compoundres *resp, __be32 nfserr,
|
||||
return nfserr_resource;
|
||||
xdr_commit_encode(xdr);
|
||||
|
||||
maxcount = svc_max_payload(resp->rqstp);
|
||||
maxcount = min_t(unsigned long, maxcount,
|
||||
maxcount = min_t(unsigned long, read->rd_length,
|
||||
(xdr->buf->buflen - xdr->buf->len));
|
||||
maxcount = min_t(unsigned long, maxcount, read->rd_length);
|
||||
count = maxcount;
|
||||
|
||||
eof = read->rd_offset >= i_size_read(file_inode(file));
|
||||
|
@ -306,14 +306,14 @@ TRACE_EVENT(nfsd_export_update,
|
||||
DECLARE_EVENT_CLASS(nfsd_io_class,
|
||||
TP_PROTO(struct svc_rqst *rqstp,
|
||||
struct svc_fh *fhp,
|
||||
loff_t offset,
|
||||
unsigned long len),
|
||||
u64 offset,
|
||||
u32 len),
|
||||
TP_ARGS(rqstp, fhp, offset, len),
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, xid)
|
||||
__field(u32, fh_hash)
|
||||
__field(loff_t, offset)
|
||||
__field(unsigned long, len)
|
||||
__field(u64, offset)
|
||||
__field(u32, len)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->xid = be32_to_cpu(rqstp->rq_xid);
|
||||
@ -321,7 +321,7 @@ DECLARE_EVENT_CLASS(nfsd_io_class,
|
||||
__entry->offset = offset;
|
||||
__entry->len = len;
|
||||
),
|
||||
TP_printk("xid=0x%08x fh_hash=0x%08x offset=%lld len=%lu",
|
||||
TP_printk("xid=0x%08x fh_hash=0x%08x offset=%llu len=%u",
|
||||
__entry->xid, __entry->fh_hash,
|
||||
__entry->offset, __entry->len)
|
||||
)
|
||||
@ -330,8 +330,8 @@ DECLARE_EVENT_CLASS(nfsd_io_class,
|
||||
DEFINE_EVENT(nfsd_io_class, nfsd_##name, \
|
||||
TP_PROTO(struct svc_rqst *rqstp, \
|
||||
struct svc_fh *fhp, \
|
||||
loff_t offset, \
|
||||
unsigned long len), \
|
||||
u64 offset, \
|
||||
u32 len), \
|
||||
TP_ARGS(rqstp, fhp, offset, len))
|
||||
|
||||
DEFINE_NFSD_IO_EVENT(read_start);
|
||||
|
@ -435,6 +435,10 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
|
||||
.ia_size = iap->ia_size,
|
||||
};
|
||||
|
||||
host_err = -EFBIG;
|
||||
if (iap->ia_size < 0)
|
||||
goto out_unlock;
|
||||
|
||||
host_err = notify_change(&init_user_ns, dentry, &size_attr, NULL);
|
||||
if (host_err)
|
||||
goto out_unlock;
|
||||
@ -1110,42 +1114,61 @@ nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
/*
|
||||
* Commit all pending writes to stable storage.
|
||||
/**
|
||||
* nfsd_commit - Commit pending writes to stable storage
|
||||
* @rqstp: RPC request being processed
|
||||
* @fhp: NFS filehandle
|
||||
* @offset: raw offset from beginning of file
|
||||
* @count: raw count of bytes to sync
|
||||
* @verf: filled in with the server's current write verifier
|
||||
*
|
||||
* Note: we only guarantee that data that lies within the range specified
|
||||
* by the 'offset' and 'count' parameters will be synced.
|
||||
* Note: we guarantee that data that lies within the range specified
|
||||
* by the 'offset' and 'count' parameters will be synced. The server
|
||||
* is permitted to sync data that lies outside this range at the
|
||||
* same time.
|
||||
*
|
||||
* Unfortunately we cannot lock the file to make sure we return full WCC
|
||||
* data to the client, as locking happens lower down in the filesystem.
|
||||
*
|
||||
* Return values:
|
||||
* An nfsstat value in network byte order.
|
||||
*/
|
||||
__be32
|
||||
nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
loff_t offset, unsigned long count, __be32 *verf)
|
||||
nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, u64 offset,
|
||||
u32 count, __be32 *verf)
|
||||
{
|
||||
u64 maxbytes;
|
||||
loff_t start, end;
|
||||
struct nfsd_net *nn;
|
||||
struct nfsd_file *nf;
|
||||
loff_t end = LLONG_MAX;
|
||||
__be32 err = nfserr_inval;
|
||||
|
||||
if (offset < 0)
|
||||
goto out;
|
||||
if (count != 0) {
|
||||
end = offset + (loff_t)count - 1;
|
||||
if (end < offset)
|
||||
goto out;
|
||||
}
|
||||
__be32 err;
|
||||
|
||||
err = nfsd_file_acquire(rqstp, fhp,
|
||||
NFSD_MAY_WRITE|NFSD_MAY_NOT_BREAK_LEASE, &nf);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Convert the client-provided (offset, count) range to a
|
||||
* (start, end) range. If the client-provided range falls
|
||||
* outside the maximum file size of the underlying FS,
|
||||
* clamp the sync range appropriately.
|
||||
*/
|
||||
start = 0;
|
||||
end = LLONG_MAX;
|
||||
maxbytes = (u64)fhp->fh_dentry->d_sb->s_maxbytes;
|
||||
if (offset < maxbytes) {
|
||||
start = offset;
|
||||
if (count && (offset + count - 1 < maxbytes))
|
||||
end = offset + count - 1;
|
||||
}
|
||||
|
||||
nn = net_generic(nf->nf_net, nfsd_net_id);
|
||||
if (EX_ISSYNC(fhp->fh_export)) {
|
||||
errseq_t since = READ_ONCE(nf->nf_file->f_wb_err);
|
||||
int err2;
|
||||
|
||||
err2 = vfs_fsync_range(nf->nf_file, offset, end, 0);
|
||||
err2 = vfs_fsync_range(nf->nf_file, start, end, 0);
|
||||
switch (err2) {
|
||||
case 0:
|
||||
nfsd_copy_write_verifier(verf, nn);
|
||||
|
@ -74,8 +74,8 @@ __be32 do_nfsd_create(struct svc_rqst *, struct svc_fh *,
|
||||
char *name, int len, struct iattr *attrs,
|
||||
struct svc_fh *res, int createmode,
|
||||
u32 *verifier, bool *truncp, bool *created);
|
||||
__be32 nfsd_commit(struct svc_rqst *, struct svc_fh *,
|
||||
loff_t, unsigned long, __be32 *verf);
|
||||
__be32 nfsd_commit(struct svc_rqst *rqst, struct svc_fh *fhp,
|
||||
u64 offset, u32 count, __be32 *verf);
|
||||
#endif /* CONFIG_NFSD_V3 */
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
__be32 nfsd_getxattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
|
@ -324,12 +324,12 @@ enum {
|
||||
ATA_LOG_NCQ_NON_DATA = 0x12,
|
||||
ATA_LOG_NCQ_SEND_RECV = 0x13,
|
||||
ATA_LOG_IDENTIFY_DEVICE = 0x30,
|
||||
ATA_LOG_CONCURRENT_POSITIONING_RANGES = 0x47,
|
||||
|
||||
/* Identify device log pages: */
|
||||
ATA_LOG_SECURITY = 0x06,
|
||||
ATA_LOG_SATA_SETTINGS = 0x08,
|
||||
ATA_LOG_ZONED_INFORMATION = 0x09,
|
||||
ATA_LOG_CONCURRENT_POSITIONING_RANGES = 0x47,
|
||||
|
||||
/* Identify device SATA settings log:*/
|
||||
ATA_LOG_DEVSLP_OFFSET = 0x30,
|
||||
|
@ -36,14 +36,6 @@ static inline void nfs_copy_fh(struct nfs_fh *target, const struct nfs_fh *sourc
|
||||
memcpy(target->data, source->data, source->size);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This is really a general kernel constant, but since nothing like
|
||||
* this is defined in the kernel headers, I have to do it here.
|
||||
*/
|
||||
#define NFS_OFFSET_MAX ((__s64)((~(__u64)0) >> 1))
|
||||
|
||||
|
||||
enum nfs3_stable_how {
|
||||
NFS_UNSTABLE = 0,
|
||||
NFS_DATA_SYNC = 1,
|
||||
|
@ -107,6 +107,7 @@ struct nfs_open_dir_context {
|
||||
__u64 dup_cookie;
|
||||
pgoff_t page_index;
|
||||
signed char duped;
|
||||
bool eof;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -185,7 +185,7 @@ static int audit_match_perm(struct audit_context *ctx, int mask)
|
||||
case AUDITSC_EXECVE:
|
||||
return mask & AUDIT_PERM_EXEC;
|
||||
case AUDITSC_OPENAT2:
|
||||
return mask & ACC_MODE((u32)((struct open_how *)ctx->argv[2])->flags);
|
||||
return mask & ACC_MODE((u32)ctx->openat2.flags);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
@ -115,11 +115,14 @@ static ssize_t rpc_sysfs_xprt_srcaddr_show(struct kobject *kobj,
|
||||
}
|
||||
|
||||
sock = container_of(xprt, struct sock_xprt, xprt);
|
||||
if (kernel_getsockname(sock->sock, (struct sockaddr *)&saddr) < 0)
|
||||
mutex_lock(&sock->recv_mutex);
|
||||
if (sock->sock == NULL ||
|
||||
kernel_getsockname(sock->sock, (struct sockaddr *)&saddr) < 0)
|
||||
goto out;
|
||||
|
||||
ret = sprintf(buf, "%pISc\n", &saddr);
|
||||
out:
|
||||
mutex_unlock(&sock->recv_mutex);
|
||||
xprt_put(xprt);
|
||||
return ret + 1;
|
||||
}
|
||||
|
@ -413,6 +413,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt)
|
||||
IB_POLL_WORKQUEUE);
|
||||
if (IS_ERR(ep->re_attr.send_cq)) {
|
||||
rc = PTR_ERR(ep->re_attr.send_cq);
|
||||
ep->re_attr.send_cq = NULL;
|
||||
goto out_destroy;
|
||||
}
|
||||
|
||||
@ -421,6 +422,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt)
|
||||
IB_POLL_WORKQUEUE);
|
||||
if (IS_ERR(ep->re_attr.recv_cq)) {
|
||||
rc = PTR_ERR(ep->re_attr.recv_cq);
|
||||
ep->re_attr.recv_cq = NULL;
|
||||
goto out_destroy;
|
||||
}
|
||||
ep->re_receive_count = 0;
|
||||
@ -459,6 +461,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt)
|
||||
ep->re_pd = ib_alloc_pd(device, 0);
|
||||
if (IS_ERR(ep->re_pd)) {
|
||||
rc = PTR_ERR(ep->re_pd);
|
||||
ep->re_pd = NULL;
|
||||
goto out_destroy;
|
||||
}
|
||||
|
||||
|
@ -1641,7 +1641,12 @@ static int xs_get_srcport(struct sock_xprt *transport)
|
||||
unsigned short get_srcport(struct rpc_xprt *xprt)
|
||||
{
|
||||
struct sock_xprt *sock = container_of(xprt, struct sock_xprt, xprt);
|
||||
return xs_sock_getport(sock->sock);
|
||||
unsigned short ret = 0;
|
||||
mutex_lock(&sock->recv_mutex);
|
||||
if (sock->sock)
|
||||
ret = xs_sock_getport(sock->sock);
|
||||
mutex_unlock(&sock->recv_mutex);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(get_srcport);
|
||||
|
||||
|
@ -2200,7 +2200,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
|
||||
struct tipc_msg *hdr = buf_msg(skb);
|
||||
struct tipc_gap_ack_blks *ga = NULL;
|
||||
bool reply = msg_probe(hdr), retransmitted = false;
|
||||
u16 dlen = msg_data_sz(hdr), glen = 0;
|
||||
u32 dlen = msg_data_sz(hdr), glen = 0;
|
||||
u16 peers_snd_nxt = msg_next_sent(hdr);
|
||||
u16 peers_tol = msg_link_tolerance(hdr);
|
||||
u16 peers_prio = msg_linkprio(hdr);
|
||||
@ -2214,6 +2214,10 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
|
||||
void *data;
|
||||
|
||||
trace_tipc_proto_rcv(skb, false, l->name);
|
||||
|
||||
if (dlen > U16_MAX)
|
||||
goto exit;
|
||||
|
||||
if (tipc_link_is_blocked(l) || !xmitq)
|
||||
goto exit;
|
||||
|
||||
@ -2309,7 +2313,8 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
|
||||
|
||||
/* Receive Gap ACK blocks from peer if any */
|
||||
glen = tipc_get_gap_ack_blks(&ga, l, hdr, true);
|
||||
|
||||
if(glen > dlen)
|
||||
break;
|
||||
tipc_mon_rcv(l->net, data + glen, dlen - glen, l->addr,
|
||||
&l->mon_state, l->bearer_id);
|
||||
|
||||
|
@ -496,6 +496,8 @@ void tipc_mon_rcv(struct net *net, void *data, u16 dlen, u32 addr,
|
||||
state->probing = false;
|
||||
|
||||
/* Sanity check received domain record */
|
||||
if (new_member_cnt > MAX_MON_DOMAIN)
|
||||
return;
|
||||
if (dlen < dom_rec_len(arrv_dom, 0))
|
||||
return;
|
||||
if (dlen != dom_rec_len(arrv_dom, new_member_cnt))
|
||||
|
@ -109,22 +109,25 @@ int asymmetric_verify(struct key *keyring, const char *sig,
|
||||
|
||||
pk = asymmetric_key_public_key(key);
|
||||
pks.pkey_algo = pk->pkey_algo;
|
||||
if (!strcmp(pk->pkey_algo, "rsa"))
|
||||
if (!strcmp(pk->pkey_algo, "rsa")) {
|
||||
pks.encoding = "pkcs1";
|
||||
else if (!strncmp(pk->pkey_algo, "ecdsa-", 6))
|
||||
} else if (!strncmp(pk->pkey_algo, "ecdsa-", 6)) {
|
||||
/* edcsa-nist-p192 etc. */
|
||||
pks.encoding = "x962";
|
||||
else if (!strcmp(pk->pkey_algo, "ecrdsa") ||
|
||||
!strcmp(pk->pkey_algo, "sm2"))
|
||||
} else if (!strcmp(pk->pkey_algo, "ecrdsa") ||
|
||||
!strcmp(pk->pkey_algo, "sm2")) {
|
||||
pks.encoding = "raw";
|
||||
else
|
||||
return -ENOPKG;
|
||||
} else {
|
||||
ret = -ENOPKG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
pks.digest = (u8 *)data;
|
||||
pks.digest_size = datalen;
|
||||
pks.s = hdr->sig;
|
||||
pks.s_size = siglen;
|
||||
ret = verify_signature(key, &pks);
|
||||
out:
|
||||
key_put(key);
|
||||
pr_debug("%s() = %d\n", __func__, ret);
|
||||
return ret;
|
||||
|
@ -496,12 +496,12 @@ int __init ima_fs_init(void)
|
||||
|
||||
return 0;
|
||||
out:
|
||||
securityfs_remove(ima_policy);
|
||||
securityfs_remove(violations);
|
||||
securityfs_remove(runtime_measurements_count);
|
||||
securityfs_remove(ascii_runtime_measurements);
|
||||
securityfs_remove(binary_runtime_measurements);
|
||||
securityfs_remove(ima_symlink);
|
||||
securityfs_remove(ima_dir);
|
||||
securityfs_remove(ima_policy);
|
||||
return -1;
|
||||
}
|
||||
|
@ -1967,6 +1967,14 @@ int ima_policy_show(struct seq_file *m, void *v)
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
/* Do not print rules with inactive LSM labels */
|
||||
for (i = 0; i < MAX_LSM_RULES; i++) {
|
||||
if (entry->lsm[i].args_p && !entry->lsm[i].rule) {
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (entry->action & MEASURE)
|
||||
seq_puts(m, pt(Opt_measure));
|
||||
if (entry->action & DONT_MEASURE)
|
||||
|
@ -29,6 +29,7 @@ static struct ima_template_desc builtin_templates[] = {
|
||||
|
||||
static LIST_HEAD(defined_templates);
|
||||
static DEFINE_SPINLOCK(template_list);
|
||||
static int template_setup_done;
|
||||
|
||||
static const struct ima_template_field supported_fields[] = {
|
||||
{.field_id = "d", .field_init = ima_eventdigest_init,
|
||||
@ -101,10 +102,11 @@ static int __init ima_template_setup(char *str)
|
||||
struct ima_template_desc *template_desc;
|
||||
int template_len = strlen(str);
|
||||
|
||||
if (ima_template)
|
||||
if (template_setup_done)
|
||||
return 1;
|
||||
|
||||
ima_init_template_list();
|
||||
if (!ima_template)
|
||||
ima_init_template_list();
|
||||
|
||||
/*
|
||||
* Verify that a template with the supplied name exists.
|
||||
@ -128,6 +130,7 @@ static int __init ima_template_setup(char *str)
|
||||
}
|
||||
|
||||
ima_template = template_desc;
|
||||
template_setup_done = 1;
|
||||
return 1;
|
||||
}
|
||||
__setup("ima_template=", ima_template_setup);
|
||||
@ -136,7 +139,7 @@ static int __init ima_template_fmt_setup(char *str)
|
||||
{
|
||||
int num_templates = ARRAY_SIZE(builtin_templates);
|
||||
|
||||
if (ima_template)
|
||||
if (template_setup_done)
|
||||
return 1;
|
||||
|
||||
if (template_desc_init_fields(str, NULL, NULL) < 0) {
|
||||
@ -147,6 +150,7 @@ static int __init ima_template_fmt_setup(char *str)
|
||||
|
||||
builtin_templates[num_templates - 1].fmt = str;
|
||||
ima_template = builtin_templates + num_templates - 1;
|
||||
template_setup_done = 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -45,6 +45,8 @@ void integrity_audit_message(int audit_msgno, struct inode *inode,
|
||||
return;
|
||||
|
||||
ab = audit_log_start(audit_context(), GFP_KERNEL, audit_msgno);
|
||||
if (!ab)
|
||||
return;
|
||||
audit_log_format(ab, "pid=%d uid=%u auid=%u ses=%u",
|
||||
task_pid_nr(current),
|
||||
from_kuid(&init_user_ns, current_uid()),
|
||||
|
@ -61,7 +61,7 @@ def main(argv: Sequence[str]) -> None:
|
||||
elif isinstance(ex, subprocess.CalledProcessError):
|
||||
print(f'{name}: FAILED')
|
||||
else:
|
||||
print('{name}: unexpected exception: {ex}')
|
||||
print(f'{name}: unexpected exception: {ex}')
|
||||
continue
|
||||
|
||||
output = ex.output
|
||||
|
@ -126,8 +126,6 @@ static void test_clone3(uint64_t flags, size_t size, int expected,
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
pid_t pid;
|
||||
|
||||
uid_t uid = getuid();
|
||||
|
||||
ksft_print_header();
|
||||
|
@ -29,6 +29,16 @@
|
||||
#define SYSFS_PATH_MAX 256
|
||||
#define DNAME_PATH_MAX 256
|
||||
|
||||
/*
|
||||
* Support ancient lirc.h which does not have these values. Can be removed
|
||||
* once RHEL 8 is no longer a relevant testing platform.
|
||||
*/
|
||||
#if RC_PROTO_MAX < 26
|
||||
#define RC_PROTO_RCMM12 24
|
||||
#define RC_PROTO_RCMM24 25
|
||||
#define RC_PROTO_RCMM32 26
|
||||
#endif
|
||||
|
||||
static const struct {
|
||||
enum rc_proto proto;
|
||||
const char *name;
|
||||
|
@ -68,7 +68,7 @@
|
||||
#define PIDFD_SKIP 3
|
||||
#define PIDFD_XFAIL 4
|
||||
|
||||
int wait_for_pid(pid_t pid)
|
||||
static inline int wait_for_pid(pid_t pid)
|
||||
{
|
||||
int status, ret;
|
||||
|
||||
@ -78,13 +78,20 @@ int wait_for_pid(pid_t pid)
|
||||
if (errno == EINTR)
|
||||
goto again;
|
||||
|
||||
ksft_print_msg("waitpid returned -1, errno=%d\n", errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!WIFEXITED(status))
|
||||
if (!WIFEXITED(status)) {
|
||||
ksft_print_msg(
|
||||
"waitpid !WIFEXITED, WIFSIGNALED=%d, WTERMSIG=%d\n",
|
||||
WIFSIGNALED(status), WTERMSIG(status));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return WEXITSTATUS(status);
|
||||
ret = WEXITSTATUS(status);
|
||||
ksft_print_msg("waitpid WEXITSTATUS=%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int sys_pidfd_open(pid_t pid, unsigned int flags)
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <string.h>
|
||||
#include <syscall.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "pidfd.h"
|
||||
#include "../kselftest.h"
|
||||
@ -80,7 +81,10 @@ static inline int error_check(struct error *err, const char *test_name)
|
||||
return err->code;
|
||||
}
|
||||
|
||||
#define CHILD_STACK_SIZE 8192
|
||||
|
||||
struct child {
|
||||
char *stack;
|
||||
pid_t pid;
|
||||
int fd;
|
||||
};
|
||||
@ -89,17 +93,22 @@ static struct child clone_newns(int (*fn)(void *), void *args,
|
||||
struct error *err)
|
||||
{
|
||||
static int flags = CLONE_PIDFD | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD;
|
||||
size_t stack_size = 1024;
|
||||
char *stack[1024] = { 0 };
|
||||
struct child ret;
|
||||
|
||||
if (!(flags & CLONE_NEWUSER) && geteuid() != 0)
|
||||
flags |= CLONE_NEWUSER;
|
||||
|
||||
ret.stack = mmap(NULL, CHILD_STACK_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
|
||||
if (ret.stack == MAP_FAILED) {
|
||||
error_set(err, -1, "mmap of stack failed (errno %d)", errno);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef __ia64__
|
||||
ret.pid = __clone2(fn, stack, stack_size, flags, args, &ret.fd);
|
||||
ret.pid = __clone2(fn, ret.stack, CHILD_STACK_SIZE, flags, args, &ret.fd);
|
||||
#else
|
||||
ret.pid = clone(fn, stack + stack_size, flags, args, &ret.fd);
|
||||
ret.pid = clone(fn, ret.stack + CHILD_STACK_SIZE, flags, args, &ret.fd);
|
||||
#endif
|
||||
|
||||
if (ret.pid < 0) {
|
||||
@ -129,6 +138,11 @@ static inline int child_join(struct child *child, struct error *err)
|
||||
else if (r > 0)
|
||||
error_set(err, r, "child %d reported: %d", child->pid, r);
|
||||
|
||||
if (munmap(child->stack, CHILD_STACK_SIZE)) {
|
||||
error_set(err, -1, "munmap of child stack failed (errno %d)", errno);
|
||||
r = -1;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -441,7 +441,6 @@ static void test_pidfd_poll_exec(int use_waitpid)
|
||||
{
|
||||
int pid, pidfd = 0;
|
||||
int status, ret;
|
||||
pthread_t t1;
|
||||
time_t prog_start = time(NULL);
|
||||
const char *test_name = "pidfd_poll check for premature notification on child thread exec";
|
||||
|
||||
@ -500,13 +499,14 @@ static int child_poll_leader_exit_test(void *args)
|
||||
*/
|
||||
*child_exit_secs = time(NULL);
|
||||
syscall(SYS_exit, 0);
|
||||
/* Never reached, but appeases compiler thinking we should return. */
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void test_pidfd_poll_leader_exit(int use_waitpid)
|
||||
{
|
||||
int pid, pidfd = 0;
|
||||
int status, ret;
|
||||
time_t prog_start = time(NULL);
|
||||
int status, ret = 0;
|
||||
const char *test_name = "pidfd_poll check for premature notification on non-empty"
|
||||
"group leader exit";
|
||||
|
||||
|
@ -39,7 +39,7 @@ static int sys_waitid(int which, pid_t pid, siginfo_t *info, int options,
|
||||
|
||||
TEST(wait_simple)
|
||||
{
|
||||
int pidfd = -1, status = 0;
|
||||
int pidfd = -1;
|
||||
pid_t parent_tid = -1;
|
||||
struct clone_args args = {
|
||||
.parent_tid = ptr_to_u64(&parent_tid),
|
||||
@ -47,7 +47,6 @@ TEST(wait_simple)
|
||||
.flags = CLONE_PIDFD | CLONE_PARENT_SETTID,
|
||||
.exit_signal = SIGCHLD,
|
||||
};
|
||||
int ret;
|
||||
pid_t pid;
|
||||
siginfo_t info = {
|
||||
.si_signo = 0,
|
||||
@ -88,7 +87,7 @@ TEST(wait_simple)
|
||||
|
||||
TEST(wait_states)
|
||||
{
|
||||
int pidfd = -1, status = 0;
|
||||
int pidfd = -1;
|
||||
pid_t parent_tid = -1;
|
||||
struct clone_args args = {
|
||||
.parent_tid = ptr_to_u64(&parent_tid),
|
||||
|
Loading…
Reference in New Issue
Block a user