38 cifs/smb3 fixes including improvement to fallocate emulation, some DFS fixes. About 1/3 are to address Coverity warnings
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmDaXUUACgkQiiy9cAdy T1HIgQv8CyUHp3NzQkRgfw0TJ0iozOE1TvcvZxlcnE1gXAc6F2hDavpoPrex2cp3 OQEph0+JA7w3cKr84GNyjnVt00EWgvxhM0CBFVQt/x0dlEdUVJRfZ+jaUp4iyRqR R8Jml00vJwup+xHVHVUfhEpS6EhF5I39pb4zxGP9Efh5CfctsUucFJBTXD/xLJl5 eTgdO1w/9Zte0Ga/f6nB0k+c4IzCkJUsgt9/H4ivA3xOv3r8+i/fyOHTyyOkRsGq GStAo0pfV5h9s4laYK/brGAAsCaCn/2jsKriB7dwfOUql6M6VKIVFBbQ3TNLTw7f lYxxlOjABn7gY9LvkOpRYtu0yd9iUHTwZLreWLdaSsvSftfX6+XZfm7b5lfCn8xn 5UCxw1obhczxZM2qWdV5Tl+EzJpNrVkdK5Q3wvpXBmbl92embHb85DQHYEzgxsy3 OBwlSUYDgLdgc8eXuP0WlfF15NA91RC3msgfQ3PKRqM3xnNSqbp6RbPXW1Bd1M1V UqZBZhJc =EIWo -----END PGP SIGNATURE----- Merge tag '5.14-rc-smb3-fixes-part1' of git://git.samba.org/sfrench/cifs-2.6 Pull cifs updates from Steve French: - improve fallocate emulation - DFS fixes - minor multichannel fixes - various cleanup patches, many to address Coverity warnings * tag '5.14-rc-smb3-fixes-part1' of git://git.samba.org/sfrench/cifs-2.6: (38 commits) smb3: prevent races updating CurrentMid cifs: fix missing spinlock around update to ses->status cifs: missing null pointer check in cifs_mount smb3: fix possible access to uninitialized pointer to DACL cifs: missing null check for newinode pointer cifs: remove two cases where rc is set unnecessarily in sid_to_id SMB3: Add new info level for query directory cifs: fix NULL dereference in smb2_check_message() smbdirect: missing rc checks while waiting for rdma events cifs: Avoid field over-reading memcpy() smb311: remove dead code for non compounded posix query info cifs: fix SMB1 error path in cifs_get_file_info_unix smb3: fix uninitialized value for port in witness protocol move cifs: fix unneeded null check cifs: use SPDX-Licence-Identifier cifs: convert list_for_each to entry variant in cifs_debug.c cifs: convert list_for_each to entry variant in smb2misc.c cifs: avoid extra calls in posix_info_parse cifs: retry lookup and readdir when EAGAIN is returned. cifs: fix check of dfs interlinks ...
This commit is contained in:
commit
bbd91626f7
|
@ -19,6 +19,8 @@ config CIFS
|
|||
select CRYPTO_LIB_DES
|
||||
select KEYS
|
||||
select DNS_RESOLVER
|
||||
select ASN1
|
||||
select OID_REGISTRY
|
||||
help
|
||||
This is the client VFS module for the SMB3 family of NAS protocols,
|
||||
(including support for the most recent, most secure dialect SMB3.1.1)
|
||||
|
@ -57,6 +59,7 @@ config CIFS
|
|||
config CIFS_STATS2
|
||||
bool "Extended statistics"
|
||||
depends on CIFS
|
||||
default y
|
||||
help
|
||||
Enabling this option will allow more detailed statistics on SMB
|
||||
request timing to be displayed in /proc/fs/cifs/DebugData and also
|
||||
|
@ -65,8 +68,7 @@ config CIFS_STATS2
|
|||
for more details. These additional statistics may have a minor effect
|
||||
on performance and memory utilization.
|
||||
|
||||
Unless you are a developer or are doing network performance analysis
|
||||
or tuning, say N.
|
||||
If unsure, say Y.
|
||||
|
||||
config CIFS_ALLOW_INSECURE_LEGACY
|
||||
bool "Support legacy servers which use less secure dialects"
|
||||
|
|
|
@ -6,12 +6,16 @@ ccflags-y += -I$(src) # needed for trace events
|
|||
obj-$(CONFIG_CIFS) += cifs.o
|
||||
|
||||
cifs-y := trace.o cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o \
|
||||
inode.o link.o misc.o netmisc.o smbencrypt.o transport.o asn1.o \
|
||||
inode.o link.o misc.o netmisc.o smbencrypt.o transport.o \
|
||||
cifs_unicode.o nterr.o cifsencrypt.o \
|
||||
readdir.o ioctl.o sess.o export.o smb1ops.o unc.o winucase.o \
|
||||
smb2ops.o smb2maperror.o smb2transport.o \
|
||||
smb2misc.o smb2pdu.o smb2inode.o smb2file.o cifsacl.o fs_context.o \
|
||||
dns_resolve.o
|
||||
dns_resolve.o cifs_spnego_negtokeninit.asn1.o asn1.o
|
||||
|
||||
$(obj)/asn1.o: $(obj)/cifs_spnego_negtokeninit.asn1.h
|
||||
|
||||
$(obj)/cifs_spnego_negtokeninit.asn1.o: $(obj)/cifs_spnego_negtokeninit.asn1.c $(obj)/cifs_spnego_negtokeninit.asn1.h
|
||||
|
||||
cifs-$(CONFIG_CIFS_XATTR) += xattr.o
|
||||
|
||||
|
|
647
fs/cifs/asn1.c
647
fs/cifs/asn1.c
|
@ -1,612 +1,63 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* The ASB.1/BER parsing code is derived from ip_nat_snmp_basic.c which was in
|
||||
* turn derived from the gxsnmp package by Gregory McLean & Jochen Friedrich
|
||||
*
|
||||
* Copyright (c) 2000 RP Internet (www.rpi.net.au).
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include "cifspdu.h"
|
||||
#include <linux/oid_registry.h>
|
||||
#include "cifsglob.h"
|
||||
#include "cifs_debug.h"
|
||||
#include "cifsproto.h"
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Basic ASN.1 decoding routines (gxsnmp author Dirk Wisse)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/* Class */
|
||||
#define ASN1_UNI 0 /* Universal */
|
||||
#define ASN1_APL 1 /* Application */
|
||||
#define ASN1_CTX 2 /* Context */
|
||||
#define ASN1_PRV 3 /* Private */
|
||||
|
||||
/* Tag */
|
||||
#define ASN1_EOC 0 /* End Of Contents or N/A */
|
||||
#define ASN1_BOL 1 /* Boolean */
|
||||
#define ASN1_INT 2 /* Integer */
|
||||
#define ASN1_BTS 3 /* Bit String */
|
||||
#define ASN1_OTS 4 /* Octet String */
|
||||
#define ASN1_NUL 5 /* Null */
|
||||
#define ASN1_OJI 6 /* Object Identifier */
|
||||
#define ASN1_OJD 7 /* Object Description */
|
||||
#define ASN1_EXT 8 /* External */
|
||||
#define ASN1_ENUM 10 /* Enumerated */
|
||||
#define ASN1_SEQ 16 /* Sequence */
|
||||
#define ASN1_SET 17 /* Set */
|
||||
#define ASN1_NUMSTR 18 /* Numerical String */
|
||||
#define ASN1_PRNSTR 19 /* Printable String */
|
||||
#define ASN1_TEXSTR 20 /* Teletext String */
|
||||
#define ASN1_VIDSTR 21 /* Video String */
|
||||
#define ASN1_IA5STR 22 /* IA5 String */
|
||||
#define ASN1_UNITIM 23 /* Universal Time */
|
||||
#define ASN1_GENTIM 24 /* General Time */
|
||||
#define ASN1_GRASTR 25 /* Graphical String */
|
||||
#define ASN1_VISSTR 26 /* Visible String */
|
||||
#define ASN1_GENSTR 27 /* General String */
|
||||
|
||||
/* Primitive / Constructed methods*/
|
||||
#define ASN1_PRI 0 /* Primitive */
|
||||
#define ASN1_CON 1 /* Constructed */
|
||||
|
||||
/*
|
||||
* Error codes.
|
||||
*/
|
||||
#define ASN1_ERR_NOERROR 0
|
||||
#define ASN1_ERR_DEC_EMPTY 2
|
||||
#define ASN1_ERR_DEC_EOC_MISMATCH 3
|
||||
#define ASN1_ERR_DEC_LENGTH_MISMATCH 4
|
||||
#define ASN1_ERR_DEC_BADVALUE 5
|
||||
|
||||
#define SPNEGO_OID_LEN 7
|
||||
#define NTLMSSP_OID_LEN 10
|
||||
#define KRB5_OID_LEN 7
|
||||
#define KRB5U2U_OID_LEN 8
|
||||
#define MSKRB5_OID_LEN 7
|
||||
static unsigned long SPNEGO_OID[7] = { 1, 3, 6, 1, 5, 5, 2 };
|
||||
static unsigned long NTLMSSP_OID[10] = { 1, 3, 6, 1, 4, 1, 311, 2, 2, 10 };
|
||||
static unsigned long KRB5_OID[7] = { 1, 2, 840, 113554, 1, 2, 2 };
|
||||
static unsigned long KRB5U2U_OID[8] = { 1, 2, 840, 113554, 1, 2, 2, 3 };
|
||||
static unsigned long MSKRB5_OID[7] = { 1, 2, 840, 48018, 1, 2, 2 };
|
||||
|
||||
/*
|
||||
* ASN.1 context.
|
||||
*/
|
||||
struct asn1_ctx {
|
||||
int error; /* Error condition */
|
||||
unsigned char *pointer; /* Octet just to be decoded */
|
||||
unsigned char *begin; /* First octet */
|
||||
unsigned char *end; /* Octet after last octet */
|
||||
};
|
||||
|
||||
/*
|
||||
* Octet string (not null terminated)
|
||||
*/
|
||||
struct asn1_octstr {
|
||||
unsigned char *data;
|
||||
unsigned int len;
|
||||
};
|
||||
|
||||
static void
|
||||
asn1_open(struct asn1_ctx *ctx, unsigned char *buf, unsigned int len)
|
||||
{
|
||||
ctx->begin = buf;
|
||||
ctx->end = buf + len;
|
||||
ctx->pointer = buf;
|
||||
ctx->error = ASN1_ERR_NOERROR;
|
||||
}
|
||||
|
||||
static unsigned char
|
||||
asn1_octet_decode(struct asn1_ctx *ctx, unsigned char *ch)
|
||||
{
|
||||
if (ctx->pointer >= ctx->end) {
|
||||
ctx->error = ASN1_ERR_DEC_EMPTY;
|
||||
return 0;
|
||||
}
|
||||
*ch = *(ctx->pointer)++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if 0 /* will be needed later by spnego decoding/encoding of ntlmssp */
|
||||
static unsigned char
|
||||
asn1_enum_decode(struct asn1_ctx *ctx, __le32 *val)
|
||||
{
|
||||
unsigned char ch;
|
||||
|
||||
if (ctx->pointer >= ctx->end) {
|
||||
ctx->error = ASN1_ERR_DEC_EMPTY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ch = *(ctx->pointer)++; /* ch has 0xa, ptr points to length octet */
|
||||
if ((ch) == ASN1_ENUM) /* if ch value is ENUM, 0xa */
|
||||
*val = *(++(ctx->pointer)); /* value has enum value */
|
||||
else
|
||||
return 0;
|
||||
|
||||
ctx->pointer++;
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static unsigned char
|
||||
asn1_tag_decode(struct asn1_ctx *ctx, unsigned int *tag)
|
||||
{
|
||||
unsigned char ch;
|
||||
|
||||
*tag = 0;
|
||||
|
||||
do {
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
*tag <<= 7;
|
||||
*tag |= ch & 0x7F;
|
||||
} while ((ch & 0x80) == 0x80);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned char
|
||||
asn1_id_decode(struct asn1_ctx *ctx,
|
||||
unsigned int *cls, unsigned int *con, unsigned int *tag)
|
||||
{
|
||||
unsigned char ch;
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
*cls = (ch & 0xC0) >> 6;
|
||||
*con = (ch & 0x20) >> 5;
|
||||
*tag = (ch & 0x1F);
|
||||
|
||||
if (*tag == 0x1F) {
|
||||
if (!asn1_tag_decode(ctx, tag))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned char
|
||||
asn1_length_decode(struct asn1_ctx *ctx, unsigned int *def, unsigned int *len)
|
||||
{
|
||||
unsigned char ch, cnt;
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
if (ch == 0x80)
|
||||
*def = 0;
|
||||
else {
|
||||
*def = 1;
|
||||
|
||||
if (ch < 0x80)
|
||||
*len = ch;
|
||||
else {
|
||||
cnt = (unsigned char) (ch & 0x7F);
|
||||
*len = 0;
|
||||
|
||||
while (cnt > 0) {
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
*len <<= 8;
|
||||
*len |= ch;
|
||||
cnt--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* don't trust len bigger than ctx buffer */
|
||||
if (*len > ctx->end - ctx->pointer)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned char
|
||||
asn1_header_decode(struct asn1_ctx *ctx,
|
||||
unsigned char **eoc,
|
||||
unsigned int *cls, unsigned int *con, unsigned int *tag)
|
||||
{
|
||||
unsigned int def = 0;
|
||||
unsigned int len = 0;
|
||||
|
||||
if (!asn1_id_decode(ctx, cls, con, tag))
|
||||
return 0;
|
||||
|
||||
if (!asn1_length_decode(ctx, &def, &len))
|
||||
return 0;
|
||||
|
||||
/* primitive shall be definite, indefinite shall be constructed */
|
||||
if (*con == ASN1_PRI && !def)
|
||||
return 0;
|
||||
|
||||
if (def)
|
||||
*eoc = ctx->pointer + len;
|
||||
else
|
||||
*eoc = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned char
|
||||
asn1_eoc_decode(struct asn1_ctx *ctx, unsigned char *eoc)
|
||||
{
|
||||
unsigned char ch;
|
||||
|
||||
if (eoc == NULL) {
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
if (ch != 0x00) {
|
||||
ctx->error = ASN1_ERR_DEC_EOC_MISMATCH;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
if (ch != 0x00) {
|
||||
ctx->error = ASN1_ERR_DEC_EOC_MISMATCH;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
if (ctx->pointer != eoc) {
|
||||
ctx->error = ASN1_ERR_DEC_LENGTH_MISMATCH;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* static unsigned char asn1_null_decode(struct asn1_ctx *ctx,
|
||||
unsigned char *eoc)
|
||||
{
|
||||
ctx->pointer = eoc;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned char asn1_long_decode(struct asn1_ctx *ctx,
|
||||
unsigned char *eoc, long *integer)
|
||||
{
|
||||
unsigned char ch;
|
||||
unsigned int len;
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
*integer = (signed char) ch;
|
||||
len = 1;
|
||||
|
||||
while (ctx->pointer < eoc) {
|
||||
if (++len > sizeof(long)) {
|
||||
ctx->error = ASN1_ERR_DEC_BADVALUE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
*integer <<= 8;
|
||||
*integer |= ch;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned char asn1_uint_decode(struct asn1_ctx *ctx,
|
||||
unsigned char *eoc,
|
||||
unsigned int *integer)
|
||||
{
|
||||
unsigned char ch;
|
||||
unsigned int len;
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
*integer = ch;
|
||||
if (ch == 0)
|
||||
len = 0;
|
||||
else
|
||||
len = 1;
|
||||
|
||||
while (ctx->pointer < eoc) {
|
||||
if (++len > sizeof(unsigned int)) {
|
||||
ctx->error = ASN1_ERR_DEC_BADVALUE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
*integer <<= 8;
|
||||
*integer |= ch;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx,
|
||||
unsigned char *eoc,
|
||||
unsigned long *integer)
|
||||
{
|
||||
unsigned char ch;
|
||||
unsigned int len;
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
*integer = ch;
|
||||
if (ch == 0)
|
||||
len = 0;
|
||||
else
|
||||
len = 1;
|
||||
|
||||
while (ctx->pointer < eoc) {
|
||||
if (++len > sizeof(unsigned long)) {
|
||||
ctx->error = ASN1_ERR_DEC_BADVALUE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
*integer <<= 8;
|
||||
*integer |= ch;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static unsigned char
|
||||
asn1_octets_decode(struct asn1_ctx *ctx,
|
||||
unsigned char *eoc,
|
||||
unsigned char **octets, unsigned int *len)
|
||||
{
|
||||
unsigned char *ptr;
|
||||
|
||||
*len = 0;
|
||||
|
||||
*octets = kmalloc(eoc - ctx->pointer, GFP_ATOMIC);
|
||||
if (*octets == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
ptr = *octets;
|
||||
while (ctx->pointer < eoc) {
|
||||
if (!asn1_octet_decode(ctx, (unsigned char *) ptr++)) {
|
||||
kfree(*octets);
|
||||
*octets = NULL;
|
||||
return 0;
|
||||
}
|
||||
(*len)++;
|
||||
}
|
||||
return 1;
|
||||
} */
|
||||
|
||||
static unsigned char
|
||||
asn1_subid_decode(struct asn1_ctx *ctx, unsigned long *subid)
|
||||
{
|
||||
unsigned char ch;
|
||||
|
||||
*subid = 0;
|
||||
|
||||
do {
|
||||
if (!asn1_octet_decode(ctx, &ch))
|
||||
return 0;
|
||||
|
||||
*subid <<= 7;
|
||||
*subid |= ch & 0x7F;
|
||||
} while ((ch & 0x80) == 0x80);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
asn1_oid_decode(struct asn1_ctx *ctx,
|
||||
unsigned char *eoc, unsigned long **oid, unsigned int *len)
|
||||
{
|
||||
unsigned long subid;
|
||||
unsigned int size;
|
||||
unsigned long *optr;
|
||||
|
||||
size = eoc - ctx->pointer + 1;
|
||||
|
||||
/* first subid actually encodes first two subids */
|
||||
if (size < 2 || size > UINT_MAX/sizeof(unsigned long))
|
||||
return 0;
|
||||
|
||||
*oid = kmalloc_array(size, sizeof(unsigned long), GFP_ATOMIC);
|
||||
if (*oid == NULL)
|
||||
return 0;
|
||||
|
||||
optr = *oid;
|
||||
|
||||
if (!asn1_subid_decode(ctx, &subid)) {
|
||||
kfree(*oid);
|
||||
*oid = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (subid < 40) {
|
||||
optr[0] = 0;
|
||||
optr[1] = subid;
|
||||
} else if (subid < 80) {
|
||||
optr[0] = 1;
|
||||
optr[1] = subid - 40;
|
||||
} else {
|
||||
optr[0] = 2;
|
||||
optr[1] = subid - 80;
|
||||
}
|
||||
|
||||
*len = 2;
|
||||
optr += 2;
|
||||
|
||||
while (ctx->pointer < eoc) {
|
||||
if (++(*len) > size) {
|
||||
ctx->error = ASN1_ERR_DEC_BADVALUE;
|
||||
kfree(*oid);
|
||||
*oid = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!asn1_subid_decode(ctx, optr++)) {
|
||||
kfree(*oid);
|
||||
*oid = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
compare_oid(unsigned long *oid1, unsigned int oid1len,
|
||||
unsigned long *oid2, unsigned int oid2len)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (oid1len != oid2len)
|
||||
return 0;
|
||||
else {
|
||||
for (i = 0; i < oid1len; i++) {
|
||||
if (oid1[i] != oid2[i])
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* BB check for endian conversion issues here */
|
||||
#include "cifs_spnego_negtokeninit.asn1.h"
|
||||
|
||||
int
|
||||
decode_negTokenInit(unsigned char *security_blob, int length,
|
||||
struct TCP_Server_Info *server)
|
||||
{
|
||||
struct asn1_ctx ctx;
|
||||
unsigned char *end;
|
||||
unsigned char *sequence_end;
|
||||
unsigned long *oid = NULL;
|
||||
unsigned int cls, con, tag, oidlen, rc;
|
||||
|
||||
/* cifs_dump_mem(" Received SecBlob ", security_blob, length); */
|
||||
|
||||
asn1_open(&ctx, security_blob, length);
|
||||
|
||||
/* GSSAPI header */
|
||||
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
|
||||
cifs_dbg(FYI, "Error decoding negTokenInit header\n");
|
||||
if (asn1_ber_decoder(&cifs_spnego_negtokeninit_decoder, server,
|
||||
security_blob, length) == 0)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
} else if ((cls != ASN1_APL) || (con != ASN1_CON)
|
||||
|| (tag != ASN1_EOC)) {
|
||||
cifs_dbg(FYI, "cls = %d con = %d tag = %d\n", cls, con, tag);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check for SPNEGO OID -- remember to free obj->oid */
|
||||
rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag);
|
||||
if (rc) {
|
||||
if ((tag == ASN1_OJI) && (con == ASN1_PRI) &&
|
||||
(cls == ASN1_UNI)) {
|
||||
rc = asn1_oid_decode(&ctx, end, &oid, &oidlen);
|
||||
if (rc) {
|
||||
rc = compare_oid(oid, oidlen, SPNEGO_OID,
|
||||
SPNEGO_OID_LEN);
|
||||
kfree(oid);
|
||||
}
|
||||
} else
|
||||
rc = 0;
|
||||
}
|
||||
|
||||
/* SPNEGO OID not present or garbled -- bail out */
|
||||
if (!rc) {
|
||||
cifs_dbg(FYI, "Error decoding negTokenInit header\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* SPNEGO */
|
||||
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
|
||||
cifs_dbg(FYI, "Error decoding negTokenInit\n");
|
||||
return 0;
|
||||
} else if ((cls != ASN1_CTX) || (con != ASN1_CON)
|
||||
|| (tag != ASN1_EOC)) {
|
||||
cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p exit 0\n",
|
||||
cls, con, tag, end);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* negTokenInit */
|
||||
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
|
||||
cifs_dbg(FYI, "Error decoding negTokenInit\n");
|
||||
return 0;
|
||||
} else if ((cls != ASN1_UNI) || (con != ASN1_CON)
|
||||
|| (tag != ASN1_SEQ)) {
|
||||
cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p exit 1\n",
|
||||
cls, con, tag, end);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* sequence */
|
||||
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
|
||||
cifs_dbg(FYI, "Error decoding 2nd part of negTokenInit\n");
|
||||
return 0;
|
||||
} else if ((cls != ASN1_CTX) || (con != ASN1_CON)
|
||||
|| (tag != ASN1_EOC)) {
|
||||
cifs_dbg(FYI, "cls = %d con = %d tag = %d end = %p exit 0\n",
|
||||
cls, con, tag, end);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* sequence of */
|
||||
if (asn1_header_decode
|
||||
(&ctx, &sequence_end, &cls, &con, &tag) == 0) {
|
||||
cifs_dbg(FYI, "Error decoding 2nd part of negTokenInit\n");
|
||||
return 0;
|
||||
} else if ((cls != ASN1_UNI) || (con != ASN1_CON)
|
||||
|| (tag != ASN1_SEQ)) {
|
||||
cifs_dbg(FYI, "cls = %d con = %d tag = %d sequence_end = %p exit 1\n",
|
||||
cls, con, tag, sequence_end);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* list of security mechanisms */
|
||||
while (!asn1_eoc_decode(&ctx, sequence_end)) {
|
||||
rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag);
|
||||
if (!rc) {
|
||||
cifs_dbg(FYI, "Error decoding negTokenInit hdr exit2\n");
|
||||
return 0;
|
||||
}
|
||||
if ((tag == ASN1_OJI) && (con == ASN1_PRI)) {
|
||||
if (asn1_oid_decode(&ctx, end, &oid, &oidlen)) {
|
||||
|
||||
cifs_dbg(FYI, "OID len = %d oid = 0x%lx 0x%lx 0x%lx 0x%lx\n",
|
||||
oidlen, *oid, *(oid + 1), *(oid + 2),
|
||||
*(oid + 3));
|
||||
|
||||
if (compare_oid(oid, oidlen, MSKRB5_OID,
|
||||
MSKRB5_OID_LEN))
|
||||
server->sec_mskerberos = true;
|
||||
else if (compare_oid(oid, oidlen, KRB5U2U_OID,
|
||||
KRB5U2U_OID_LEN))
|
||||
server->sec_kerberosu2u = true;
|
||||
else if (compare_oid(oid, oidlen, KRB5_OID,
|
||||
KRB5_OID_LEN))
|
||||
server->sec_kerberos = true;
|
||||
else if (compare_oid(oid, oidlen, NTLMSSP_OID,
|
||||
NTLMSSP_OID_LEN))
|
||||
server->sec_ntlmssp = true;
|
||||
|
||||
kfree(oid);
|
||||
}
|
||||
} else {
|
||||
cifs_dbg(FYI, "Should be an oid what is going on?\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We currently ignore anything at the end of the SPNEGO blob after
|
||||
* the mechTypes have been parsed, since none of that info is
|
||||
* used at the moment.
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
|
||||
int cifs_gssapi_this_mech(void *context, size_t hdrlen,
|
||||
unsigned char tag, const void *value, size_t vlen)
|
||||
{
|
||||
enum OID oid;
|
||||
|
||||
oid = look_up_OID(value, vlen);
|
||||
if (oid != OID_spnego) {
|
||||
char buf[50];
|
||||
|
||||
sprint_oid(value, vlen, buf, sizeof(buf));
|
||||
cifs_dbg(FYI, "Error decoding negTokenInit header: unexpected OID %s\n",
|
||||
buf);
|
||||
return -EBADMSG;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cifs_neg_token_init_mech_type(void *context, size_t hdrlen,
|
||||
unsigned char tag,
|
||||
const void *value, size_t vlen)
|
||||
{
|
||||
struct TCP_Server_Info *server = context;
|
||||
enum OID oid;
|
||||
|
||||
oid = look_up_OID(value, vlen);
|
||||
if (oid == OID_mskrb5)
|
||||
server->sec_mskerberos = true;
|
||||
else if (oid == OID_krb5u2u)
|
||||
server->sec_kerberosu2u = true;
|
||||
else if (oid == OID_krb5)
|
||||
server->sec_kerberos = true;
|
||||
else if (oid == OID_ntlmssp)
|
||||
server->sec_ntlmssp = true;
|
||||
else {
|
||||
char buf[50];
|
||||
|
||||
sprint_oid(value, vlen, buf, sizeof(buf));
|
||||
cifs_dbg(FYI, "Decoding negTokenInit: unsupported OID %s\n",
|
||||
buf);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/cache.c - CIFS filesystem cache index structure definitions
|
||||
*
|
||||
* Copyright (c) 2010 Novell, Inc.
|
||||
* Authors(s): Suresh Jayaraman (sjayaraman@suse.de>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include "fscache.h"
|
||||
#include "cifs_debug.h"
|
||||
|
|
|
@ -50,7 +50,6 @@ void cifs_dump_detail(void *buf, struct TCP_Server_Info *server)
|
|||
void cifs_dump_mids(struct TCP_Server_Info *server)
|
||||
{
|
||||
#ifdef CONFIG_CIFS_DEBUG2
|
||||
struct list_head *tmp;
|
||||
struct mid_q_entry *mid_entry;
|
||||
|
||||
if (server == NULL)
|
||||
|
@ -58,8 +57,7 @@ void cifs_dump_mids(struct TCP_Server_Info *server)
|
|||
|
||||
cifs_dbg(VFS, "Dump pending requests:\n");
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
list_for_each(tmp, &server->pending_mid_q) {
|
||||
mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
|
||||
list_for_each_entry(mid_entry, &server->pending_mid_q, qhead) {
|
||||
cifs_dbg(VFS, "State: %d Cmd: %d Pid: %d Cbdata: %p Mid %llu\n",
|
||||
mid_entry->mid_state,
|
||||
le16_to_cpu(mid_entry->command),
|
||||
|
@ -168,7 +166,7 @@ cifs_dump_iface(struct seq_file *m, struct cifs_server_iface *iface)
|
|||
|
||||
static int cifs_debug_files_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct list_head *stmp, *tmp, *tmp1, *tmp2;
|
||||
struct list_head *tmp, *tmp1, *tmp2;
|
||||
struct TCP_Server_Info *server;
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
|
@ -183,9 +181,7 @@ static int cifs_debug_files_proc_show(struct seq_file *m, void *v)
|
|||
seq_printf(m, " <filename>\n");
|
||||
#endif /* CIFS_DEBUG2 */
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(stmp, &cifs_tcp_ses_list) {
|
||||
server = list_entry(stmp, struct TCP_Server_Info,
|
||||
tcp_ses_list);
|
||||
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
|
||||
list_for_each(tmp, &server->smb_ses_list) {
|
||||
ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
|
||||
list_for_each(tmp1, &ses->tcon_list) {
|
||||
|
@ -220,7 +216,7 @@ static int cifs_debug_files_proc_show(struct seq_file *m, void *v)
|
|||
|
||||
static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct list_head *tmp1, *tmp2, *tmp3;
|
||||
struct list_head *tmp2, *tmp3;
|
||||
struct mid_q_entry *mid_entry;
|
||||
struct TCP_Server_Info *server;
|
||||
struct cifs_ses *ses;
|
||||
|
@ -278,11 +274,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
|
|||
|
||||
c = 0;
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(tmp1, &cifs_tcp_ses_list) {
|
||||
server = list_entry(tmp1, struct TCP_Server_Info,
|
||||
tcp_ses_list);
|
||||
|
||||
/* channel info will be printed as a part of sessions below */
|
||||
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
|
||||
if (server->is_channel)
|
||||
continue;
|
||||
|
||||
|
@ -563,7 +555,7 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v)
|
|||
#ifdef CONFIG_CIFS_STATS2
|
||||
int j;
|
||||
#endif /* STATS2 */
|
||||
struct list_head *tmp1, *tmp2, *tmp3;
|
||||
struct list_head *tmp2, *tmp3;
|
||||
struct TCP_Server_Info *server;
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
|
@ -594,9 +586,7 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v)
|
|||
|
||||
i = 0;
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(tmp1, &cifs_tcp_ses_list) {
|
||||
server = list_entry(tmp1, struct TCP_Server_Info,
|
||||
tcp_ses_list);
|
||||
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
|
||||
seq_printf(m, "\nMax requests in flight: %d", server->max_in_flight);
|
||||
#ifdef CONFIG_CIFS_STATS2
|
||||
seq_puts(m, "\nTotal time spent processing by command. Time ");
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright (c) International Business Machines Corp., 2000,2002
|
||||
* Modified by Steve French (sfrench@us.ibm.com)
|
||||
*/
|
||||
*/
|
||||
|
||||
#ifndef _H_CIFS_DEBUG
|
||||
#define _H_CIFS_DEBUG
|
||||
|
|
|
@ -125,7 +125,7 @@ cifs_build_devname(char *nodename, const char *prepath)
|
|||
* @sb_mountdata: parent/root DFS mount options (template)
|
||||
* @fullpath: full path in UNC format
|
||||
* @ref: optional server's referral
|
||||
*
|
||||
* @devname: return the built cifs device name if passed pointer not NULL
|
||||
* creates mount options for submount based on template options sb_mountdata
|
||||
* and replacing unc,ip,prefixpath options with ones we've got form ref_unc.
|
||||
*
|
||||
|
|
|
@ -1,19 +1,10 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/cifs_fs_sb.h
|
||||
*
|
||||
* Copyright (c) International Business Machines Corp., 2002,2004
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
*/
|
||||
#include <linux/rbtree.h>
|
||||
|
||||
|
@ -72,11 +63,12 @@ struct cifs_sb_info {
|
|||
char *prepath;
|
||||
|
||||
/*
|
||||
* Path initially provided by the mount call. We might connect
|
||||
* to something different via DFS but we want to keep it to do
|
||||
* failover properly.
|
||||
* Canonical DFS path initially provided by the mount call. We might connect to something
|
||||
* different via DFS but we want to keep it to do failover properly.
|
||||
*/
|
||||
char *origin_fullpath; /* \\HOST\SHARE\[OPTIONAL PATH] */
|
||||
/* randomly generated 128-bit number for indexing dfs mount groups in referral cache */
|
||||
uuid_t dfs_mount_id;
|
||||
/*
|
||||
* Indicate whether serverino option was turned off later
|
||||
* (cifs_autodisable_serverino) in order to match new mounts.
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/cifs_ioctl.h
|
||||
*
|
||||
|
@ -5,16 +6,6 @@
|
|||
*
|
||||
* Copyright (c) 2015 Steve French <steve.french@primarydata.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
struct smb_mnt_fs_info {
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/cifs_spnego.c -- SPNEGO upcall management for CIFS
|
||||
*
|
||||
* Copyright (c) 2007 Red Hat, Inc.
|
||||
* Author(s): Jeff Layton (jlayton@redhat.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/list.h>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/cifs_spnego.h -- SPNEGO upcall management for CIFS
|
||||
*
|
||||
|
@ -5,19 +6,6 @@
|
|||
* Author(s): Jeff Layton (jlayton@redhat.com)
|
||||
* Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _CIFS_SPNEGO_H
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
GSSAPI ::=
|
||||
[APPLICATION 0] IMPLICIT SEQUENCE {
|
||||
thisMech
|
||||
OBJECT IDENTIFIER ({cifs_gssapi_this_mech}),
|
||||
negotiationToken
|
||||
NegotiationToken
|
||||
}
|
||||
|
||||
MechType ::= OBJECT IDENTIFIER ({cifs_neg_token_init_mech_type})
|
||||
|
||||
MechTypeList ::= SEQUENCE OF MechType
|
||||
|
||||
NegHints ::= SEQUENCE {
|
||||
hintName
|
||||
[0] GeneralString OPTIONAL,
|
||||
hintAddress
|
||||
[1] OCTET STRING OPTIONAL
|
||||
}
|
||||
|
||||
NegTokenInit2 ::=
|
||||
SEQUENCE {
|
||||
mechTypes
|
||||
[0] MechTypeList OPTIONAL,
|
||||
reqFlags
|
||||
[1] BIT STRING OPTIONAL,
|
||||
mechToken
|
||||
[2] OCTET STRING OPTIONAL,
|
||||
negHints
|
||||
[3] NegHints OPTIONAL,
|
||||
mechListMIC
|
||||
[3] OCTET STRING OPTIONAL
|
||||
}
|
||||
|
||||
NegotiationToken ::=
|
||||
CHOICE {
|
||||
negTokenInit
|
||||
[0] NegTokenInit2,
|
||||
negTokenTarg
|
||||
[1] ANY
|
||||
}
|
|
@ -447,15 +447,13 @@ static int cifs_swn_store_swn_addr(const struct sockaddr_storage *new,
|
|||
const struct sockaddr_storage *old,
|
||||
struct sockaddr_storage *dst)
|
||||
{
|
||||
__be16 port;
|
||||
__be16 port = cpu_to_be16(CIFS_PORT);
|
||||
|
||||
if (old->ss_family == AF_INET) {
|
||||
struct sockaddr_in *ipv4 = (struct sockaddr_in *)old;
|
||||
|
||||
port = ipv4->sin_port;
|
||||
}
|
||||
|
||||
if (old->ss_family == AF_INET6) {
|
||||
} else if (old->ss_family == AF_INET6) {
|
||||
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)old;
|
||||
|
||||
port = ipv6->sin6_port;
|
||||
|
@ -465,9 +463,7 @@ static int cifs_swn_store_swn_addr(const struct sockaddr_storage *new,
|
|||
struct sockaddr_in *ipv4 = (struct sockaddr_in *)new;
|
||||
|
||||
ipv4->sin_port = port;
|
||||
}
|
||||
|
||||
if (new->ss_family == AF_INET6) {
|
||||
} else if (new->ss_family == AF_INET6) {
|
||||
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)new;
|
||||
|
||||
ipv6->sin6_port = port;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/cifsacl.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
*
|
||||
* Contains the routines for mapping CIFS/NTFS ACLs
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/fs.h>
|
||||
|
@ -409,7 +397,6 @@ try_upcall_to_get_id:
|
|||
saved_cred = override_creds(root_cred);
|
||||
sidkey = request_key(&cifs_idmap_key_type, sidstr, "");
|
||||
if (IS_ERR(sidkey)) {
|
||||
rc = -EINVAL;
|
||||
cifs_dbg(FYI, "%s: Can't map SID %s to a %cid\n",
|
||||
__func__, sidstr, sidtype == SIDOWNER ? 'u' : 'g');
|
||||
goto out_revert_creds;
|
||||
|
@ -422,7 +409,6 @@ try_upcall_to_get_id:
|
|||
*/
|
||||
BUILD_BUG_ON(sizeof(uid_t) != sizeof(gid_t));
|
||||
if (sidkey->datalen != sizeof(uid_t)) {
|
||||
rc = -EIO;
|
||||
cifs_dbg(FYI, "%s: Downcall contained malformed key (datalen=%hu)\n",
|
||||
__func__, sidkey->datalen);
|
||||
key_invalidate(sidkey);
|
||||
|
@ -1308,7 +1294,7 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd,
|
|||
ndacl_ptr = (struct cifs_acl *)((char *)pnntsd + ndacloffset);
|
||||
ndacl_ptr->revision =
|
||||
dacloffset ? dacl_ptr->revision : cpu_to_le16(ACL_REVISION);
|
||||
ndacl_ptr->num_aces = dacl_ptr->num_aces;
|
||||
ndacl_ptr->num_aces = dacl_ptr ? dacl_ptr->num_aces : 0;
|
||||
|
||||
if (uid_valid(uid)) { /* chown */
|
||||
uid_t id;
|
||||
|
|
|
@ -1,28 +1,15 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/cifsacl.h
|
||||
*
|
||||
* Copyright (c) International Business Machines Corp., 2007
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _CIFSACL_H
|
||||
#define _CIFSACL_H
|
||||
|
||||
|
||||
#define NUM_AUTHS (6) /* number of authority fields */
|
||||
#define SID_MAX_SUB_AUTHORITIES (15) /* max number of sub authority fields */
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/cifsencrypt.c
|
||||
*
|
||||
|
@ -7,19 +8,6 @@
|
|||
* Copyright (C) International Business Machines Corp., 2005,2013
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/fs.h>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/cifsfs.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
*
|
||||
* Common Internet FileSystem (CIFS) client
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* Note that BB means BUGBUG (ie something to fix eventually) */
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/cifsfs.h
|
||||
*
|
||||
* Copyright (c) International Business Machines Corp., 2002, 2007
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _CIFSFS_H
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/cifsglob.h
|
||||
*
|
||||
|
@ -5,16 +6,6 @@
|
|||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
* Jeremy Allison (jra@samba.org)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
*/
|
||||
#ifndef _CIFS_GLOB_H
|
||||
#define _CIFS_GLOB_H
|
||||
|
@ -630,7 +621,7 @@ struct TCP_Server_Info {
|
|||
/* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
|
||||
unsigned int capabilities; /* selective disabling of caps by smb sess */
|
||||
int timeAdj; /* Adjust for difference in server time zone in sec */
|
||||
__u64 CurrentMid; /* multiplex id - rotating counter */
|
||||
__u64 CurrentMid; /* multiplex id - rotating counter, protected by GlobalMid_Lock */
|
||||
char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlm, ntlmv2 etc */
|
||||
/* 16th byte of RFC1001 workstation name is always null */
|
||||
char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL];
|
||||
|
@ -896,7 +887,7 @@ struct cifs_ses {
|
|||
struct mutex session_mutex;
|
||||
struct TCP_Server_Info *server; /* pointer to server info */
|
||||
int ses_count; /* reference counter */
|
||||
enum statusEnum status;
|
||||
enum statusEnum status; /* updates protected by GlobalMid_Lock */
|
||||
unsigned overrideSecFlg; /* if non-zero override global sec flags */
|
||||
char *serverOS; /* name of operating system underlying server */
|
||||
char *serverNOS; /* name of network operating system of server */
|
||||
|
@ -1093,8 +1084,7 @@ struct cifs_tcon {
|
|||
struct cached_fid crfid; /* Cached root fid */
|
||||
/* BB add field for back pointer to sb struct(s)? */
|
||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||
char *dfs_path;
|
||||
int remap:2;
|
||||
char *dfs_path; /* canonical DFS path */
|
||||
struct list_head ulist; /* cache update list */
|
||||
#endif
|
||||
};
|
||||
|
@ -1795,6 +1785,8 @@ require use of the stronger protocol */
|
|||
* list operations on pending_mid_q and oplockQ
|
||||
* updates to XID counters, multiplex id and SMB sequence numbers
|
||||
* list operations on global DnotifyReqList
|
||||
* updates to ses->status
|
||||
* updates to server->CurrentMid
|
||||
* tcp_ses_lock protects:
|
||||
* list operations on tcp and SMB session lists
|
||||
* tcon->open_file_lock protects the list of open files hanging off the tcon
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/cifspdu.h
|
||||
*
|
||||
* Copyright (c) International Business Machines Corp., 2002,2009
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _CIFSPDU_H
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/cifsproto.h
|
||||
*
|
||||
* Copyright (c) International Business Machines Corp., 2002,2008
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _CIFSPROTO_H
|
||||
#define _CIFSPROTO_H
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/cifssmb.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
*
|
||||
* Contains the routines for constructing the SMB PDUs themselves
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* SMB/CIFS PDU handling routines here - except for leftovers in connect.c */
|
||||
|
@ -1220,7 +1208,7 @@ SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon,
|
|||
int *pOplock, FILE_ALL_INFO *pfile_info,
|
||||
const struct nls_table *nls_codepage, int remap)
|
||||
{
|
||||
int rc = -EACCES;
|
||||
int rc;
|
||||
OPENX_REQ *pSMB = NULL;
|
||||
OPENX_RSP *pSMBr = NULL;
|
||||
int bytes_returned;
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/connect.c
|
||||
*
|
||||
* Copyright (C) International Business Machines Corp., 2002,2011
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/net.h>
|
||||
|
@ -368,13 +356,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
|
|||
cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
|
||||
__func__, rc);
|
||||
}
|
||||
rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
|
||||
if (rc) {
|
||||
cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
|
||||
__func__, rc);
|
||||
}
|
||||
dfs_cache_free_tgts(&tgt_list);
|
||||
|
||||
}
|
||||
|
||||
cifs_put_tcp_super(sb);
|
||||
|
@ -1557,29 +1539,25 @@ out:
|
|||
/**
|
||||
* cifs_free_ipc - helper to release the session IPC tcon
|
||||
*
|
||||
* Needs to be called everytime a session is destroyed
|
||||
* Needs to be called everytime a session is destroyed.
|
||||
*
|
||||
* On session close, the IPC is closed and the server must release all tcons of the session.
|
||||
* No need to send a tree disconnect here.
|
||||
*
|
||||
* Besides, it will make the server to not close durable and resilient files on session close, as
|
||||
* specified in MS-SMB2 3.3.5.6 Receiving an SMB2 LOGOFF Request.
|
||||
*/
|
||||
static int
|
||||
cifs_free_ipc(struct cifs_ses *ses)
|
||||
{
|
||||
int rc = 0, xid;
|
||||
struct cifs_tcon *tcon = ses->tcon_ipc;
|
||||
|
||||
if (tcon == NULL)
|
||||
return 0;
|
||||
|
||||
if (ses->server->ops->tree_disconnect) {
|
||||
xid = get_xid();
|
||||
rc = ses->server->ops->tree_disconnect(xid, tcon);
|
||||
free_xid(xid);
|
||||
}
|
||||
|
||||
if (rc)
|
||||
cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
|
||||
|
||||
tconInfoFree(tcon);
|
||||
ses->tcon_ipc = NULL;
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct cifs_ses *
|
||||
|
@ -1605,7 +1583,6 @@ void cifs_put_smb_ses(struct cifs_ses *ses)
|
|||
{
|
||||
unsigned int rc, xid;
|
||||
struct TCP_Server_Info *server = ses->server;
|
||||
|
||||
cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
|
||||
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
|
@ -1613,13 +1590,20 @@ void cifs_put_smb_ses(struct cifs_ses *ses)
|
|||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
|
||||
cifs_dbg(FYI, "%s: ses ipc: %s\n", __func__, ses->tcon_ipc ? ses->tcon_ipc->treeName : "NONE");
|
||||
|
||||
if (--ses->ses_count > 0) {
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
return;
|
||||
}
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
if (ses->status == CifsGood)
|
||||
ses->status = CifsExiting;
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
|
||||
cifs_free_ipc(ses);
|
||||
|
||||
|
@ -1951,10 +1935,7 @@ cifs_find_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
|
|||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(tmp, &ses->tcon_list) {
|
||||
tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
|
||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||
if (tcon->dfs_path)
|
||||
continue;
|
||||
#endif
|
||||
|
||||
if (!match_tcon(tcon, ctx))
|
||||
continue;
|
||||
++tcon->tc_count;
|
||||
|
@ -3017,9 +2998,8 @@ expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
|
|||
return rc;
|
||||
}
|
||||
|
||||
static inline int get_next_dfs_tgt(const char *path,
|
||||
struct dfs_cache_tgt_list *tgt_list,
|
||||
struct dfs_cache_tgt_iterator **tgt_it)
|
||||
static int get_next_dfs_tgt(struct dfs_cache_tgt_list *tgt_list,
|
||||
struct dfs_cache_tgt_iterator **tgt_it)
|
||||
{
|
||||
if (!*tgt_it)
|
||||
*tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
|
||||
|
@ -3059,6 +3039,7 @@ static int do_dfs_failover(const char *path, const char *full_path, struct cifs_
|
|||
struct cifs_ses **ses, struct cifs_tcon **tcon)
|
||||
{
|
||||
int rc;
|
||||
char *npath = NULL;
|
||||
struct dfs_cache_tgt_list tgt_list = {0};
|
||||
struct dfs_cache_tgt_iterator *tgt_it = NULL;
|
||||
struct smb3_fs_context tmp_ctx = {NULL};
|
||||
|
@ -3066,11 +3047,15 @@ static int do_dfs_failover(const char *path, const char *full_path, struct cifs_
|
|||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
cifs_dbg(FYI, "%s: path=%s full_path=%s\n", __func__, path, full_path);
|
||||
npath = dfs_cache_canonical_path(path, cifs_sb->local_nls, cifs_remap(cifs_sb));
|
||||
if (IS_ERR(npath))
|
||||
return PTR_ERR(npath);
|
||||
|
||||
rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
|
||||
cifs_dbg(FYI, "%s: path=%s full_path=%s\n", __func__, npath, full_path);
|
||||
|
||||
rc = dfs_cache_noreq_find(npath, NULL, &tgt_list);
|
||||
if (rc)
|
||||
return rc;
|
||||
goto out;
|
||||
/*
|
||||
* We use a 'tmp_ctx' here because we need pass it down to the mount_{get,put} functions to
|
||||
* test connection against new DFS targets.
|
||||
|
@ -3084,11 +3069,11 @@ static int do_dfs_failover(const char *path, const char *full_path, struct cifs_
|
|||
char *fake_devname = NULL, *mdata = NULL;
|
||||
|
||||
/* Get next DFS target server - if any */
|
||||
rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
|
||||
rc = get_next_dfs_tgt(&tgt_list, &tgt_it);
|
||||
if (rc)
|
||||
break;
|
||||
|
||||
rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
|
||||
rc = dfs_cache_get_tgt_referral(npath, tgt_it, &ref);
|
||||
if (rc)
|
||||
break;
|
||||
|
||||
|
@ -3137,6 +3122,7 @@ static int do_dfs_failover(const char *path, const char *full_path, struct cifs_
|
|||
}
|
||||
|
||||
out:
|
||||
kfree(npath);
|
||||
smb3_cleanup_fs_context_contents(&tmp_ctx);
|
||||
dfs_cache_free_tgts(&tgt_list);
|
||||
return rc;
|
||||
|
@ -3288,25 +3274,18 @@ static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *
|
|||
}
|
||||
|
||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||
static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
|
||||
static void set_root_ses(struct cifs_sb_info *cifs_sb, const uuid_t *mount_id, struct cifs_ses *ses,
|
||||
struct cifs_ses **root_ses)
|
||||
{
|
||||
if (ses) {
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
ses->ses_count++;
|
||||
if (ses->tcon_ipc)
|
||||
ses->tcon_ipc->remap = cifs_remap(cifs_sb);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
dfs_cache_add_refsrv_session(mount_id, ses);
|
||||
}
|
||||
*root_ses = ses;
|
||||
}
|
||||
|
||||
static void put_root_ses(struct cifs_ses *ses)
|
||||
{
|
||||
if (ses)
|
||||
cifs_put_smb_ses(ses);
|
||||
}
|
||||
|
||||
/* Set up next dfs prefix path in @dfs_path */
|
||||
static int next_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
|
||||
const unsigned int xid, struct TCP_Server_Info *server,
|
||||
|
@ -3352,17 +3331,25 @@ out:
|
|||
}
|
||||
|
||||
/* Check if resolved targets can handle any DFS referrals */
|
||||
static int is_referral_server(const char *ref_path, struct cifs_tcon *tcon, bool *ref_server)
|
||||
static int is_referral_server(const char *ref_path, struct cifs_sb_info *cifs_sb,
|
||||
struct cifs_tcon *tcon, bool *ref_server)
|
||||
{
|
||||
int rc;
|
||||
struct dfs_info3_param ref = {0};
|
||||
|
||||
cifs_dbg(FYI, "%s: ref_path=%s\n", __func__, ref_path);
|
||||
|
||||
if (is_tcon_dfs(tcon)) {
|
||||
*ref_server = true;
|
||||
} else {
|
||||
cifs_dbg(FYI, "%s: ref_path=%s\n", __func__, ref_path);
|
||||
char *npath;
|
||||
|
||||
rc = dfs_cache_noreq_find(ref_path, &ref, NULL);
|
||||
npath = dfs_cache_canonical_path(ref_path, cifs_sb->local_nls, cifs_remap(cifs_sb));
|
||||
if (IS_ERR(npath))
|
||||
return PTR_ERR(npath);
|
||||
|
||||
rc = dfs_cache_noreq_find(npath, &ref, NULL);
|
||||
kfree(npath);
|
||||
if (rc) {
|
||||
cifs_dbg(VFS, "%s: dfs_cache_noreq_find: failed (rc=%d)\n", __func__, rc);
|
||||
return rc;
|
||||
|
@ -3386,9 +3373,9 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
|||
struct cifs_ses *ses = NULL, *root_ses = NULL;
|
||||
struct cifs_tcon *tcon = NULL;
|
||||
int count = 0;
|
||||
uuid_t mount_id = {0};
|
||||
char *ref_path = NULL, *full_path = NULL;
|
||||
char *oldmnt = NULL;
|
||||
char *mntdata = NULL;
|
||||
bool ref_server = false;
|
||||
|
||||
rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
|
||||
|
@ -3411,12 +3398,9 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
|||
if (rc != -EREMOTE)
|
||||
goto error;
|
||||
}
|
||||
/* Save mount options */
|
||||
mntdata = kstrdup(cifs_sb->ctx->mount_options, GFP_KERNEL);
|
||||
if (!mntdata) {
|
||||
rc = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
ctx->nosharesock = true;
|
||||
|
||||
/* Get path of DFS root */
|
||||
ref_path = build_unc_path_to_root(ctx, cifs_sb, false);
|
||||
if (IS_ERR(ref_path)) {
|
||||
|
@ -3425,7 +3409,8 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
|||
goto error;
|
||||
}
|
||||
|
||||
set_root_ses(cifs_sb, ses, &root_ses);
|
||||
uuid_gen(&mount_id);
|
||||
set_root_ses(cifs_sb, &mount_id, ses, &root_ses);
|
||||
do {
|
||||
/* Save full path of last DFS path we used to resolve final target server */
|
||||
kfree(full_path);
|
||||
|
@ -3456,13 +3441,11 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
|||
continue;
|
||||
|
||||
/* Make sure that requests go through new root servers */
|
||||
rc = is_referral_server(ref_path + 1, tcon, &ref_server);
|
||||
rc = is_referral_server(ref_path + 1, cifs_sb, tcon, &ref_server);
|
||||
if (rc)
|
||||
break;
|
||||
if (ref_server) {
|
||||
put_root_ses(root_ses);
|
||||
set_root_ses(cifs_sb, ses, &root_ses);
|
||||
}
|
||||
if (ref_server)
|
||||
set_root_ses(cifs_sb, &mount_id, ses, &root_ses);
|
||||
|
||||
/* Get next dfs path and then continue chasing them if -EREMOTE */
|
||||
rc = next_dfs_prepath(cifs_sb, ctx, xid, server, tcon, &ref_path);
|
||||
|
@ -3471,12 +3454,10 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
|||
rc = -ELOOP;
|
||||
} while (rc == -EREMOTE);
|
||||
|
||||
if (rc)
|
||||
if (rc || !tcon)
|
||||
goto error;
|
||||
put_root_ses(root_ses);
|
||||
root_ses = NULL;
|
||||
|
||||
kfree(ref_path);
|
||||
ref_path = NULL;
|
||||
/*
|
||||
* Store DFS full path in both superblock and tree connect structures.
|
||||
*
|
||||
|
@ -3485,21 +3466,27 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
|||
* links, the prefix path is included in both and may be changed during reconnect. See
|
||||
* cifs_tree_connect().
|
||||
*/
|
||||
cifs_sb->origin_fullpath = kstrdup(full_path, GFP_KERNEL);
|
||||
if (!cifs_sb->origin_fullpath) {
|
||||
ref_path = dfs_cache_canonical_path(full_path, cifs_sb->local_nls, cifs_remap(cifs_sb));
|
||||
kfree(full_path);
|
||||
full_path = NULL;
|
||||
|
||||
if (IS_ERR(ref_path)) {
|
||||
rc = PTR_ERR(ref_path);
|
||||
ref_path = NULL;
|
||||
goto error;
|
||||
}
|
||||
cifs_sb->origin_fullpath = ref_path;
|
||||
|
||||
ref_path = kstrdup(cifs_sb->origin_fullpath, GFP_KERNEL);
|
||||
if (!ref_path) {
|
||||
rc = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
tcon->dfs_path = full_path;
|
||||
full_path = NULL;
|
||||
tcon->remap = cifs_remap(cifs_sb);
|
||||
tcon->dfs_path = ref_path;
|
||||
ref_path = NULL;
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
|
||||
/* Add original context for DFS cache to be used when refreshing referrals */
|
||||
rc = dfs_cache_add_vol(mntdata, ctx, cifs_sb->origin_fullpath);
|
||||
if (rc)
|
||||
goto error;
|
||||
/*
|
||||
* After reconnecting to a different server, unique ids won't
|
||||
* match anymore, so we disable serverino. This prevents
|
||||
|
@ -3514,6 +3501,7 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
|
|||
kfree(cifs_sb->prepath);
|
||||
cifs_sb->prepath = ctx->prepath;
|
||||
ctx->prepath = NULL;
|
||||
uuid_copy(&cifs_sb->dfs_mount_id, &mount_id);
|
||||
|
||||
out:
|
||||
free_xid(xid);
|
||||
|
@ -3523,9 +3511,8 @@ out:
|
|||
error:
|
||||
kfree(ref_path);
|
||||
kfree(full_path);
|
||||
kfree(mntdata);
|
||||
kfree(cifs_sb->origin_fullpath);
|
||||
put_root_ses(root_ses);
|
||||
dfs_cache_put_refsrv_sessions(&mount_id);
|
||||
mount_put_conns(cifs_sb, xid, server, ses, tcon);
|
||||
return rc;
|
||||
}
|
||||
|
@ -3755,7 +3742,7 @@ cifs_umount(struct cifs_sb_info *cifs_sb)
|
|||
|
||||
kfree(cifs_sb->prepath);
|
||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||
dfs_cache_del_vol(cifs_sb->origin_fullpath);
|
||||
dfs_cache_put_refsrv_sessions(&cifs_sb->dfs_mount_id);
|
||||
kfree(cifs_sb->origin_fullpath);
|
||||
#endif
|
||||
call_rcu(&cifs_sb->rcu, delayed_free);
|
||||
|
|
1119
fs/cifs/dfs_cache.c
1119
fs/cifs/dfs_cache.c
File diff suppressed because it is too large
Load Diff
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include <linux/nls.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/uuid.h>
|
||||
#include "cifsglob.h"
|
||||
|
||||
struct dfs_cache_tgt_list {
|
||||
|
@ -23,34 +24,26 @@ struct dfs_cache_tgt_iterator {
|
|||
struct list_head it_list;
|
||||
};
|
||||
|
||||
extern int dfs_cache_init(void);
|
||||
extern void dfs_cache_destroy(void);
|
||||
int dfs_cache_init(void);
|
||||
void dfs_cache_destroy(void);
|
||||
extern const struct proc_ops dfscache_proc_ops;
|
||||
|
||||
extern int dfs_cache_find(const unsigned int xid, struct cifs_ses *ses,
|
||||
const struct nls_table *nls_codepage, int remap,
|
||||
const char *path, struct dfs_info3_param *ref,
|
||||
struct dfs_cache_tgt_list *tgt_list);
|
||||
extern int dfs_cache_noreq_find(const char *path, struct dfs_info3_param *ref,
|
||||
struct dfs_cache_tgt_list *tgt_list);
|
||||
extern int dfs_cache_update_tgthint(const unsigned int xid,
|
||||
struct cifs_ses *ses,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap, const char *path,
|
||||
const struct dfs_cache_tgt_iterator *it);
|
||||
extern int
|
||||
dfs_cache_noreq_update_tgthint(const char *path,
|
||||
const struct dfs_cache_tgt_iterator *it);
|
||||
extern int dfs_cache_get_tgt_referral(const char *path,
|
||||
const struct dfs_cache_tgt_iterator *it,
|
||||
struct dfs_info3_param *ref);
|
||||
extern int dfs_cache_add_vol(char *mntdata, struct smb3_fs_context *ctx,
|
||||
const char *fullpath);
|
||||
extern int dfs_cache_update_vol(const char *fullpath,
|
||||
struct TCP_Server_Info *server);
|
||||
extern void dfs_cache_del_vol(const char *fullpath);
|
||||
extern int dfs_cache_get_tgt_share(char *path, const struct dfs_cache_tgt_iterator *it,
|
||||
char **share, char **prefix);
|
||||
int dfs_cache_find(const unsigned int xid, struct cifs_ses *ses, const struct nls_table *cp,
|
||||
int remap, const char *path, struct dfs_info3_param *ref,
|
||||
struct dfs_cache_tgt_list *tgt_list);
|
||||
int dfs_cache_noreq_find(const char *path, struct dfs_info3_param *ref,
|
||||
struct dfs_cache_tgt_list *tgt_list);
|
||||
int dfs_cache_update_tgthint(const unsigned int xid, struct cifs_ses *ses,
|
||||
const struct nls_table *cp, int remap, const char *path,
|
||||
const struct dfs_cache_tgt_iterator *it);
|
||||
int dfs_cache_noreq_update_tgthint(const char *path, const struct dfs_cache_tgt_iterator *it);
|
||||
int dfs_cache_get_tgt_referral(const char *path, const struct dfs_cache_tgt_iterator *it,
|
||||
struct dfs_info3_param *ref);
|
||||
int dfs_cache_get_tgt_share(char *path, const struct dfs_cache_tgt_iterator *it, char **share,
|
||||
char **prefix);
|
||||
void dfs_cache_put_refsrv_sessions(const uuid_t *mount_id);
|
||||
void dfs_cache_add_refsrv_session(const uuid_t *mount_id, struct cifs_ses *ses);
|
||||
char *dfs_cache_canonical_path(const char *path, const struct nls_table *cp, int remap);
|
||||
|
||||
static inline struct dfs_cache_tgt_iterator *
|
||||
dfs_cache_get_next_tgt(struct dfs_cache_tgt_list *tl,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/dir.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Copyright (C) International Business Machines Corp., 2002,2009
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/stat.h>
|
||||
|
@ -396,10 +384,11 @@ cifs_create_set_dentry:
|
|||
goto out_err;
|
||||
}
|
||||
|
||||
if (S_ISDIR(newinode->i_mode)) {
|
||||
rc = -EISDIR;
|
||||
goto out_err;
|
||||
}
|
||||
if (newinode)
|
||||
if (S_ISDIR(newinode->i_mode)) {
|
||||
rc = -EISDIR;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
d_drop(direntry);
|
||||
d_add(direntry, newinode);
|
||||
|
@ -630,6 +619,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
|
|||
struct inode *newInode = NULL;
|
||||
const char *full_path;
|
||||
void *page;
|
||||
int retry_count = 0;
|
||||
|
||||
xid = get_xid();
|
||||
|
||||
|
@ -673,6 +663,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
|
|||
cifs_dbg(FYI, "Full path: %s inode = 0x%p\n",
|
||||
full_path, d_inode(direntry));
|
||||
|
||||
again:
|
||||
if (pTcon->posix_extensions)
|
||||
rc = smb311_posix_get_inode_info(&newInode, full_path, parent_dir_inode->i_sb, xid);
|
||||
else if (pTcon->unix_ext) {
|
||||
|
@ -687,6 +678,8 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
|
|||
/* since paths are not looked up by component - the parent
|
||||
directories are presumed to be good here */
|
||||
renew_parental_timestamps(direntry);
|
||||
} else if (rc == -EAGAIN && retry_count++ < 10) {
|
||||
goto again;
|
||||
} else if (rc == -ENOENT) {
|
||||
cifs_set_time(direntry, jiffies);
|
||||
newInode = NULL;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/dns_resolve.c
|
||||
*
|
||||
|
@ -10,19 +11,6 @@
|
|||
* Contains the CIFS DFS upcall routines used for hostname to
|
||||
* IP address translation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/dns_resolve.h -- DNS Resolver upcall management for CIFS DFS
|
||||
* Handles host name to IP address resolution
|
||||
|
@ -5,19 +6,6 @@
|
|||
* Copyright (c) International Business Machines Corp., 2008
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _DNS_RESOLVE_H
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/export.c
|
||||
*
|
||||
|
@ -8,19 +9,6 @@
|
|||
*
|
||||
* Operations related to support for exporting files via NFSD
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/file.c
|
||||
*
|
||||
|
@ -7,19 +8,6 @@
|
|||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
* Jeremy Allison (jra@samba.org)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/backing-dev.h>
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/fscache.c - CIFS filesystem cache interface
|
||||
*
|
||||
* Copyright (c) 2010 Novell, Inc.
|
||||
* Author(s): Suresh Jayaraman <sjayaraman@suse.de>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include "fscache.h"
|
||||
#include "cifsglob.h"
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/fscache.h - CIFS filesystem cache interface definitions
|
||||
*
|
||||
* Copyright (c) 2010 Novell, Inc.
|
||||
* Authors(s): Suresh Jayaraman (sjayaraman@suse.de>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _CIFS_FSCACHE_H
|
||||
#define _CIFS_FSCACHE_H
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/inode.c
|
||||
*
|
||||
* Copyright (C) International Business Machines Corp., 2002,2010
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/stat.h>
|
||||
|
@ -367,9 +355,12 @@ cifs_get_file_info_unix(struct file *filp)
|
|||
} else if (rc == -EREMOTE) {
|
||||
cifs_create_dfs_fattr(&fattr, inode->i_sb);
|
||||
rc = 0;
|
||||
}
|
||||
} else
|
||||
goto cifs_gfiunix_out;
|
||||
|
||||
rc = cifs_fattr_to_inode(inode, &fattr);
|
||||
|
||||
cifs_gfiunix_out:
|
||||
free_xid(xid);
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/ioctl.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Copyright (C) International Business Machines Corp., 2005,2013
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/fs.h>
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/link.c
|
||||
*
|
||||
* Copyright (C) International Business Machines Corp., 2002,2008
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/stat.h>
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/misc.c
|
||||
*
|
||||
* Copyright (C) International Business Machines Corp., 2002,2008
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
|
|
|
@ -30,7 +30,7 @@ static const struct nla_policy cifs_genl_policy[CIFS_GENL_ATTR_MAX + 1] = {
|
|||
[CIFS_GENL_ATTR_SWN_RESOURCE_NAME] = { .type = NLA_STRING},
|
||||
};
|
||||
|
||||
static struct genl_ops cifs_genl_ops[] = {
|
||||
static const struct genl_ops cifs_genl_ops[] = {
|
||||
{
|
||||
.cmd = CIFS_GENL_CMD_SWN_NOTIFY,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/ntlmssp.h
|
||||
*
|
||||
* Copyright (c) International Business Machines Corp., 2002,2007
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#define NTLMSSP_SIGNATURE "NTLMSSP"
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/readdir.c
|
||||
*
|
||||
|
@ -7,19 +8,6 @@
|
|||
* Copyright (C) Red Hat, Inc., 2011
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/pagemap.h>
|
||||
|
@ -321,7 +309,7 @@ static void cifs_fulldir_info_to_fattr(struct cifs_fattr *fattr,
|
|||
{
|
||||
__dir_info_to_fattr(fattr, info);
|
||||
|
||||
/* See MS-FSCC 2.4.18 FileIdFullDirectoryInformation */
|
||||
/* See MS-FSCC 2.4.19 FileIdFullDirectoryInformation */
|
||||
if (fattr->cf_cifsattrs & ATTR_REPARSE)
|
||||
fattr->cf_cifstag = le32_to_cpu(info->EaSize);
|
||||
cifs_fill_common_info(fattr, cifs_sb);
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/rfc1002pdu.h
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Copyright (c) International Business Machines Corp., 2004
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* NB: unlike smb/cifs packets, the RFC1002 structures are big endian */
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/sess.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Copyright (c) International Business Machines Corp., 2006, 2009
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "cifspdu.h"
|
||||
|
@ -195,7 +183,7 @@ cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
|
|||
ses, iface->speed, iface->rdma_capable ? "yes" : "no",
|
||||
&ipv4->sin_addr);
|
||||
else
|
||||
cifs_dbg(FYI, "adding channel to ses %p (speed:%zu bps rdma:%s ip:%pI4)\n",
|
||||
cifs_dbg(FYI, "adding channel to ses %p (speed:%zu bps rdma:%s ip:%pI6)\n",
|
||||
ses, iface->speed, iface->rdma_capable ? "yes" : "no",
|
||||
&ipv6->sin6_addr);
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/smb2file.c
|
||||
*
|
||||
|
@ -5,19 +6,6 @@
|
|||
* Author(s): Steve French (sfrench@us.ibm.com),
|
||||
* Pavel Shilovsky ((pshilovsky@samba.org) 2012
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/stat.h>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/smb2glob.h
|
||||
*
|
||||
|
@ -9,16 +10,6 @@
|
|||
* Jeremy Allison (jra@samba.org)
|
||||
* Pavel Shilovsky (pshilovsky@samba.org) 2012
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
*/
|
||||
#ifndef _SMB2_GLOB_H
|
||||
#define _SMB2_GLOB_H
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/smb2inode.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Author(s): Pavel Shilovsky (pshilovsky@samba.org),
|
||||
* Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/fs.h>
|
||||
#include <linux/stat.h>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/smb2/smb2maperror.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Copyright (C) International Business Machines Corp., 2009
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include "cifsglob.h"
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/smb2misc.c
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
* Pavel Shilovsky (pshilovsky@samba.org) 2012
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/ctype.h>
|
||||
#include "smb2pdu.h"
|
||||
|
@ -164,19 +152,16 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
|
|||
struct smb2_transform_hdr *thdr =
|
||||
(struct smb2_transform_hdr *)buf;
|
||||
struct cifs_ses *ses = NULL;
|
||||
struct list_head *tmp;
|
||||
|
||||
/* decrypt frame now that it is completely read in */
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(tmp, &srvr->smb_ses_list) {
|
||||
ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
|
||||
list_for_each_entry(ses, &srvr->smb_ses_list, smb_ses_list) {
|
||||
if (ses->Suid == thdr->SessionId)
|
||||
break;
|
||||
|
||||
ses = NULL;
|
||||
}
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
if (ses == NULL) {
|
||||
if (list_entry_is_head(ses, &srvr->smb_ses_list,
|
||||
smb_ses_list)) {
|
||||
cifs_dbg(VFS, "no decryption - session id not found\n");
|
||||
return 1;
|
||||
}
|
||||
|
@ -548,7 +533,6 @@ static bool
|
|||
smb2_tcon_has_lease(struct cifs_tcon *tcon, struct smb2_lease_break *rsp)
|
||||
{
|
||||
__u8 lease_state;
|
||||
struct list_head *tmp;
|
||||
struct cifsFileInfo *cfile;
|
||||
struct cifsInodeInfo *cinode;
|
||||
int ack_req = le32_to_cpu(rsp->Flags &
|
||||
|
@ -556,8 +540,7 @@ smb2_tcon_has_lease(struct cifs_tcon *tcon, struct smb2_lease_break *rsp)
|
|||
|
||||
lease_state = le32_to_cpu(rsp->NewLeaseState);
|
||||
|
||||
list_for_each(tmp, &tcon->openFileList) {
|
||||
cfile = list_entry(tmp, struct cifsFileInfo, tlist);
|
||||
list_for_each_entry(cfile, &tcon->openFileList, tlist) {
|
||||
cinode = CIFS_I(d_inode(cfile->dentry));
|
||||
|
||||
if (memcmp(cinode->lease_key, rsp->LeaseKey,
|
||||
|
@ -618,7 +601,6 @@ static bool
|
|||
smb2_is_valid_lease_break(char *buffer)
|
||||
{
|
||||
struct smb2_lease_break *rsp = (struct smb2_lease_break *)buffer;
|
||||
struct list_head *tmp, *tmp1, *tmp2;
|
||||
struct TCP_Server_Info *server;
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
|
@ -628,15 +610,9 @@ smb2_is_valid_lease_break(char *buffer)
|
|||
|
||||
/* look up tcon based on tid & uid */
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(tmp, &cifs_tcp_ses_list) {
|
||||
server = list_entry(tmp, struct TCP_Server_Info, tcp_ses_list);
|
||||
|
||||
list_for_each(tmp1, &server->smb_ses_list) {
|
||||
ses = list_entry(tmp1, struct cifs_ses, smb_ses_list);
|
||||
|
||||
list_for_each(tmp2, &ses->tcon_list) {
|
||||
tcon = list_entry(tmp2, struct cifs_tcon,
|
||||
tcon_list);
|
||||
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
|
||||
list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
|
||||
list_for_each_entry(tcon, &ses->tcon_list, tcon_list) {
|
||||
spin_lock(&tcon->open_file_lock);
|
||||
cifs_stats_inc(
|
||||
&tcon->stats.cifs_stats.num_oplock_brks);
|
||||
|
@ -687,7 +663,6 @@ bool
|
|||
smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
|
||||
{
|
||||
struct smb2_oplock_break *rsp = (struct smb2_oplock_break *)buffer;
|
||||
struct list_head *tmp, *tmp1, *tmp2;
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
struct cifsInodeInfo *cinode;
|
||||
|
@ -710,16 +685,11 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
|
|||
|
||||
/* look up tcon based on tid & uid */
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each(tmp, &server->smb_ses_list) {
|
||||
ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
|
||||
|
||||
list_for_each(tmp1, &ses->tcon_list) {
|
||||
tcon = list_entry(tmp1, struct cifs_tcon, tcon_list);
|
||||
list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
|
||||
list_for_each_entry(tcon, &ses->tcon_list, tcon_list) {
|
||||
|
||||
spin_lock(&tcon->open_file_lock);
|
||||
list_for_each(tmp2, &tcon->openFileList) {
|
||||
cfile = list_entry(tmp2, struct cifsFileInfo,
|
||||
tlist);
|
||||
list_for_each_entry(cfile, &tcon->openFileList, tlist) {
|
||||
if (rsp->PersistentFid !=
|
||||
cfile->fid.persistent_fid ||
|
||||
rsp->VolatileFid !=
|
||||
|
|
|
@ -388,7 +388,9 @@ smb2_negotiate(const unsigned int xid, struct cifs_ses *ses)
|
|||
{
|
||||
int rc;
|
||||
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
cifs_ses_server(ses)->CurrentMid = 0;
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
rc = SMB2_negotiate(xid, ses);
|
||||
/* BB we probably don't need to retry with modern servers */
|
||||
if (rc == -EAGAIN)
|
||||
|
@ -2325,6 +2327,7 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
|
|||
struct smb2_query_directory_rsp *qd_rsp = NULL;
|
||||
struct smb2_create_rsp *op_rsp = NULL;
|
||||
struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses);
|
||||
int retry_count = 0;
|
||||
|
||||
utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
|
||||
if (!utf16_path)
|
||||
|
@ -2372,10 +2375,14 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
|
|||
|
||||
smb2_set_related(&rqst[1]);
|
||||
|
||||
again:
|
||||
rc = compound_send_recv(xid, tcon->ses, server,
|
||||
flags, 2, rqst,
|
||||
resp_buftype, rsp_iov);
|
||||
|
||||
if (rc == -EAGAIN && retry_count++ < 10)
|
||||
goto again;
|
||||
|
||||
/* If the open failed there is nothing to do */
|
||||
op_rsp = (struct smb2_create_rsp *)rsp_iov[0].iov_base;
|
||||
if (op_rsp == NULL || op_rsp->sync_hdr.Status != STATUS_SUCCESS) {
|
||||
|
@ -3601,6 +3608,119 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon,
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int smb3_simple_fallocate_write_range(unsigned int xid,
|
||||
struct cifs_tcon *tcon,
|
||||
struct cifsFileInfo *cfile,
|
||||
loff_t off, loff_t len,
|
||||
char *buf)
|
||||
{
|
||||
struct cifs_io_parms io_parms = {0};
|
||||
int nbytes;
|
||||
struct kvec iov[2];
|
||||
|
||||
io_parms.netfid = cfile->fid.netfid;
|
||||
io_parms.pid = current->tgid;
|
||||
io_parms.tcon = tcon;
|
||||
io_parms.persistent_fid = cfile->fid.persistent_fid;
|
||||
io_parms.volatile_fid = cfile->fid.volatile_fid;
|
||||
io_parms.offset = off;
|
||||
io_parms.length = len;
|
||||
|
||||
/* iov[0] is reserved for smb header */
|
||||
iov[1].iov_base = buf;
|
||||
iov[1].iov_len = io_parms.length;
|
||||
return SMB2_write(xid, &io_parms, &nbytes, iov, 1);
|
||||
}
|
||||
|
||||
static int smb3_simple_fallocate_range(unsigned int xid,
|
||||
struct cifs_tcon *tcon,
|
||||
struct cifsFileInfo *cfile,
|
||||
loff_t off, loff_t len)
|
||||
{
|
||||
struct file_allocated_range_buffer in_data, *out_data = NULL, *tmp_data;
|
||||
u32 out_data_len;
|
||||
char *buf = NULL;
|
||||
loff_t l;
|
||||
int rc;
|
||||
|
||||
in_data.file_offset = cpu_to_le64(off);
|
||||
in_data.length = cpu_to_le64(len);
|
||||
rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
|
||||
cfile->fid.volatile_fid,
|
||||
FSCTL_QUERY_ALLOCATED_RANGES, true,
|
||||
(char *)&in_data, sizeof(in_data),
|
||||
1024 * sizeof(struct file_allocated_range_buffer),
|
||||
(char **)&out_data, &out_data_len);
|
||||
if (rc)
|
||||
goto out;
|
||||
/*
|
||||
* It is already all allocated
|
||||
*/
|
||||
if (out_data_len == 0)
|
||||
goto out;
|
||||
|
||||
buf = kzalloc(1024 * 1024, GFP_KERNEL);
|
||||
if (buf == NULL) {
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
tmp_data = out_data;
|
||||
while (len) {
|
||||
/*
|
||||
* The rest of the region is unmapped so write it all.
|
||||
*/
|
||||
if (out_data_len == 0) {
|
||||
rc = smb3_simple_fallocate_write_range(xid, tcon,
|
||||
cfile, off, len, buf);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (out_data_len < sizeof(struct file_allocated_range_buffer)) {
|
||||
rc = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (off < le64_to_cpu(tmp_data->file_offset)) {
|
||||
/*
|
||||
* We are at a hole. Write until the end of the region
|
||||
* or until the next allocated data,
|
||||
* whichever comes next.
|
||||
*/
|
||||
l = le64_to_cpu(tmp_data->file_offset) - off;
|
||||
if (len < l)
|
||||
l = len;
|
||||
rc = smb3_simple_fallocate_write_range(xid, tcon,
|
||||
cfile, off, l, buf);
|
||||
if (rc)
|
||||
goto out;
|
||||
off = off + l;
|
||||
len = len - l;
|
||||
if (len == 0)
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* We are at a section of allocated data, just skip forward
|
||||
* until the end of the data or the end of the region
|
||||
* we are supposed to fallocate, whichever comes first.
|
||||
*/
|
||||
l = le64_to_cpu(tmp_data->length);
|
||||
if (len < l)
|
||||
l = len;
|
||||
off += l;
|
||||
len -= l;
|
||||
|
||||
tmp_data = &tmp_data[1];
|
||||
out_data_len -= sizeof(struct file_allocated_range_buffer);
|
||||
}
|
||||
|
||||
out:
|
||||
kfree(out_data);
|
||||
kfree(buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
|
||||
loff_t off, loff_t len, bool keep_size)
|
||||
{
|
||||
|
@ -3661,6 +3781,26 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon,
|
|||
}
|
||||
|
||||
if ((keep_size == true) || (i_size_read(inode) >= off + len)) {
|
||||
/*
|
||||
* At this point, we are trying to fallocate an internal
|
||||
* regions of a sparse file. Since smb2 does not have a
|
||||
* fallocate command we have two otions on how to emulate this.
|
||||
* We can either turn the entire file to become non-sparse
|
||||
* which we only do if the fallocate is for virtually
|
||||
* the whole file, or we can overwrite the region with zeroes
|
||||
* using SMB2_write, which could be prohibitevly expensive
|
||||
* if len is large.
|
||||
*/
|
||||
/*
|
||||
* We are only trying to fallocate a small region so
|
||||
* just write it with zero.
|
||||
*/
|
||||
if (len <= 1024 * 1024) {
|
||||
rc = smb3_simple_fallocate_range(xid, tcon, cfile,
|
||||
off, len);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if falloc starts within first few pages of file
|
||||
* and ends within a few pages of the end of file to
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/smb2pdu.c
|
||||
*
|
||||
|
@ -8,19 +9,6 @@
|
|||
*
|
||||
* Contains the routines for constructing the SMB2 PDUs themselves
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* SMB2 PDU handling routines here - except for leftovers (eg session setup) */
|
||||
|
@ -1791,10 +1779,8 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
|
|||
rsp = (struct smb2_tree_connect_rsp *)rsp_iov.iov_base;
|
||||
trace_smb3_tcon(xid, tcon->tid, ses->Suid, tree, rc);
|
||||
if (rc != 0) {
|
||||
if (tcon) {
|
||||
cifs_stats_fail_inc(tcon, SMB2_TREE_CONNECT_HE);
|
||||
tcon->need_reconnect = true;
|
||||
}
|
||||
cifs_stats_fail_inc(tcon, SMB2_TREE_CONNECT_HE);
|
||||
tcon->need_reconnect = true;
|
||||
goto tcon_error_exit;
|
||||
}
|
||||
|
||||
|
@ -2906,7 +2892,10 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
|
|||
#endif /* CIFS_DEBUG2 */
|
||||
|
||||
if (buf) {
|
||||
memcpy(buf, &rsp->CreationTime, 32);
|
||||
buf->CreationTime = rsp->CreationTime;
|
||||
buf->LastAccessTime = rsp->LastAccessTime;
|
||||
buf->LastWriteTime = rsp->LastWriteTime;
|
||||
buf->ChangeTime = rsp->ChangeTime;
|
||||
buf->AllocationSize = rsp->AllocationSize;
|
||||
buf->EndOfFile = rsp->EndofFile;
|
||||
buf->Attributes = rsp->FileAttributes;
|
||||
|
@ -3484,6 +3473,8 @@ int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
|
|||
NULL);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* currently unused, as now we are doing compounding instead (see smb311_posix_query_path_info) */
|
||||
int
|
||||
SMB311_posix_query_info(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
u64 persistent_fid, u64 volatile_fid, struct smb311_posix_qinfo *data, u32 *plen)
|
||||
|
@ -3495,7 +3486,9 @@ SMB311_posix_query_info(const unsigned int xid, struct cifs_tcon *tcon,
|
|||
return query_info(xid, tcon, persistent_fid, volatile_fid,
|
||||
SMB_FIND_FILE_POSIX_INFO, SMB2_O_INFO_FILE, 0,
|
||||
output_len, sizeof(struct smb311_posix_qinfo), (void **)&data, plen);
|
||||
/* Note caller must free "data" (passed in above). It may be allocated in query_info call */
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
|
@ -4498,7 +4491,7 @@ int posix_info_parse(const void *beg, const void *end,
|
|||
|
||||
{
|
||||
int total_len = 0;
|
||||
int sid_len;
|
||||
int owner_len, group_len;
|
||||
int name_len;
|
||||
const void *owner_sid;
|
||||
const void *group_sid;
|
||||
|
@ -4521,17 +4514,17 @@ int posix_info_parse(const void *beg, const void *end,
|
|||
|
||||
/* check owner sid */
|
||||
owner_sid = beg + total_len;
|
||||
sid_len = posix_info_sid_size(owner_sid, end);
|
||||
if (sid_len < 0)
|
||||
owner_len = posix_info_sid_size(owner_sid, end);
|
||||
if (owner_len < 0)
|
||||
return -1;
|
||||
total_len += sid_len;
|
||||
total_len += owner_len;
|
||||
|
||||
/* check group sid */
|
||||
group_sid = beg + total_len;
|
||||
sid_len = posix_info_sid_size(group_sid, end);
|
||||
if (sid_len < 0)
|
||||
group_len = posix_info_sid_size(group_sid, end);
|
||||
if (group_len < 0)
|
||||
return -1;
|
||||
total_len += sid_len;
|
||||
total_len += group_len;
|
||||
|
||||
/* check name len */
|
||||
if (beg + total_len + 4 > end)
|
||||
|
@ -4552,10 +4545,8 @@ int posix_info_parse(const void *beg, const void *end,
|
|||
out->size = total_len;
|
||||
out->name_len = name_len;
|
||||
out->name = name;
|
||||
memcpy(&out->owner, owner_sid,
|
||||
posix_info_sid_size(owner_sid, end));
|
||||
memcpy(&out->group, group_sid,
|
||||
posix_info_sid_size(group_sid, end));
|
||||
memcpy(&out->owner, owner_sid, owner_len);
|
||||
memcpy(&out->group, group_sid, group_len);
|
||||
}
|
||||
return total_len;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/smb2pdu.h
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
* Pavel Shilovsky (pshilovsky@samba.org) 2012
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _SMB2PDU_H
|
||||
|
@ -276,7 +264,7 @@ struct share_redirect_error_context_rsp {
|
|||
__le32 NotificationType;
|
||||
__le32 ResourceNameOffset;
|
||||
__le32 ResourceNameLength;
|
||||
__le16 Flags;
|
||||
__le16 Reserved;
|
||||
__le16 TargetType;
|
||||
__le32 IPAddrCount;
|
||||
struct move_dst_ipaddr IpAddrMoveList[];
|
||||
|
@ -1460,6 +1448,22 @@ struct smb2_echo_rsp {
|
|||
|
||||
#define SMB2_QUERY_DIRECTORY_IOV_SIZE 2
|
||||
|
||||
/*
|
||||
* Valid FileInformation classes.
|
||||
*
|
||||
* Note that these are a subset of the (file) QUERY_INFO levels defined
|
||||
* later in this file (but since QUERY_DIRECTORY uses equivalent numbers
|
||||
* we do not redefine them here)
|
||||
*
|
||||
* FileDirectoryInfomation 0x01
|
||||
* FileFullDirectoryInformation 0x02
|
||||
* FileIdFullDirectoryInformation 0x26
|
||||
* FileBothDirectoryInformation 0x03
|
||||
* FileIdBothDirectoryInformation 0x25
|
||||
* FileNamesInformation 0x0C
|
||||
* FileIdExtdDirectoryInformation 0x3C
|
||||
*/
|
||||
|
||||
struct smb2_query_directory_req {
|
||||
struct smb2_sync_hdr sync_hdr;
|
||||
__le16 StructureSize; /* Must be 33 */
|
||||
|
@ -1696,6 +1700,7 @@ struct smb3_fs_vol_info {
|
|||
#define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION 50
|
||||
#define FILE_STANDARD_LINK_INFORMATION 54
|
||||
#define FILE_ID_INFORMATION 59
|
||||
#define FILE_ID_EXTD_DIRECTORY_INFORMATION 60
|
||||
|
||||
struct smb2_file_internal_info {
|
||||
__le64 IndexNumber;
|
||||
|
@ -1776,13 +1781,31 @@ struct smb2_file_network_open_info {
|
|||
__le32 Reserved;
|
||||
} __packed; /* level 34 Query also similar returned in close rsp and open rsp */
|
||||
|
||||
/* See MS-FSCC 2.4.43 */
|
||||
/* See MS-FSCC 2.4.21 */
|
||||
struct smb2_file_id_information {
|
||||
__le64 VolumeSerialNumber;
|
||||
__u64 PersistentFileId; /* opaque endianness */
|
||||
__u64 VolatileFileId; /* opaque endianness */
|
||||
} __packed; /* level 59 */
|
||||
|
||||
/* See MS-FSCC 2.4.18 */
|
||||
struct smb2_file_id_extd_directory_info {
|
||||
__le32 NextEntryOffset;
|
||||
__u32 FileIndex;
|
||||
__le64 CreationTime;
|
||||
__le64 LastAccessTime;
|
||||
__le64 LastWriteTime;
|
||||
__le64 ChangeTime;
|
||||
__le64 EndOfFile;
|
||||
__le64 AllocationSize;
|
||||
__le32 FileAttributes;
|
||||
__le32 FileNameLength;
|
||||
__le32 EaSize; /* EA size */
|
||||
__le32 ReparsePointTag; /* valid if FILE_ATTR_REPARSE_POINT set in FileAttributes */
|
||||
__le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit */
|
||||
char FileName[1];
|
||||
} __packed; /* level 60 */
|
||||
|
||||
extern char smb2_padding[7];
|
||||
|
||||
/* equivalent of the contents of SMB3.1.1 POSIX open context response */
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/smb2proto.h
|
||||
*
|
||||
|
@ -6,19 +7,6 @@
|
|||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
* Pavel Shilovsky (pshilovsky@samba.org) 2012
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _SMB2PROTO_H
|
||||
#define _SMB2PROTO_H
|
||||
|
@ -64,8 +52,6 @@ extern void smb2_echo_request(struct work_struct *work);
|
|||
extern __le32 smb2_get_lease_state(struct cifsInodeInfo *cinode);
|
||||
extern bool smb2_is_valid_oplock_break(char *buffer,
|
||||
struct TCP_Server_Info *srv);
|
||||
extern struct cifs_ses *smb2_find_smb_ses(struct TCP_Server_Info *server,
|
||||
__u64 ses_id);
|
||||
extern int smb3_handle_read_data(struct TCP_Server_Info *server,
|
||||
struct mid_q_entry *mid);
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/smb2status.h
|
||||
*
|
||||
|
@ -7,19 +8,6 @@
|
|||
* Copyright (c) International Business Machines Corp., 2009,2011
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/smb2transport.c
|
||||
*
|
||||
|
@ -7,19 +8,6 @@
|
|||
* Jeremy Allison (jra@samba.org) 2006
|
||||
* Pavel Shilovsky (pshilovsky@samba.org) 2012
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/fs.h>
|
||||
|
@ -154,6 +142,7 @@ smb2_find_smb_ses_unlocked(struct TCP_Server_Info *server, __u64 ses_id)
|
|||
list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
|
||||
if (ses->Suid != ses_id)
|
||||
continue;
|
||||
++ses->ses_count;
|
||||
return ses;
|
||||
}
|
||||
|
||||
|
@ -205,7 +194,14 @@ smb2_find_smb_tcon(struct TCP_Server_Info *server, __u64 ses_id, __u32 tid)
|
|||
return NULL;
|
||||
}
|
||||
tcon = smb2_find_smb_sess_tcon_unlocked(ses, tid);
|
||||
if (!tcon) {
|
||||
cifs_put_smb_ses(ses);
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
return NULL;
|
||||
}
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
/* tcon already has a ref to ses, so we don't need ses anymore */
|
||||
cifs_put_smb_ses(ses);
|
||||
|
||||
return tcon;
|
||||
}
|
||||
|
@ -239,7 +235,7 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server,
|
|||
if (rc) {
|
||||
cifs_server_dbg(VFS,
|
||||
"%s: sha256 alloc failed\n", __func__);
|
||||
return rc;
|
||||
goto out;
|
||||
}
|
||||
shash = &sdesc->shash;
|
||||
} else {
|
||||
|
@ -290,6 +286,8 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server,
|
|||
out:
|
||||
if (allocate_crypto)
|
||||
cifs_free_hash(&hash, &sdesc);
|
||||
if (ses)
|
||||
cifs_put_smb_ses(ses);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
@ -572,8 +572,13 @@ static struct rdma_cm_id *smbd_create_id(
|
|||
log_rdma_event(ERR, "rdma_resolve_addr() failed %i\n", rc);
|
||||
goto out;
|
||||
}
|
||||
wait_for_completion_interruptible_timeout(
|
||||
rc = wait_for_completion_interruptible_timeout(
|
||||
&info->ri_done, msecs_to_jiffies(RDMA_RESOLVE_TIMEOUT));
|
||||
/* e.g. if interrupted returns -ERESTARTSYS */
|
||||
if (rc < 0) {
|
||||
log_rdma_event(ERR, "rdma_resolve_addr timeout rc: %i\n", rc);
|
||||
goto out;
|
||||
}
|
||||
rc = info->ri_rc;
|
||||
if (rc) {
|
||||
log_rdma_event(ERR, "rdma_resolve_addr() completed %i\n", rc);
|
||||
|
@ -586,8 +591,13 @@ static struct rdma_cm_id *smbd_create_id(
|
|||
log_rdma_event(ERR, "rdma_resolve_route() failed %i\n", rc);
|
||||
goto out;
|
||||
}
|
||||
wait_for_completion_interruptible_timeout(
|
||||
rc = wait_for_completion_interruptible_timeout(
|
||||
&info->ri_done, msecs_to_jiffies(RDMA_RESOLVE_TIMEOUT));
|
||||
/* e.g. if interrupted returns -ERESTARTSYS */
|
||||
if (rc < 0) {
|
||||
log_rdma_event(ERR, "rdma_resolve_addr timeout rc: %i\n", rc);
|
||||
goto out;
|
||||
}
|
||||
rc = info->ri_rc;
|
||||
if (rc) {
|
||||
log_rdma_event(ERR, "rdma_resolve_route() completed %i\n", rc);
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/smberr.h
|
||||
*
|
||||
|
@ -7,19 +8,6 @@
|
|||
* See Error Codes section of the SNIA CIFS Specification
|
||||
* for more information
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#define SUCCESS 0x00 /* The request was successful. */
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1 */
|
||||
/*
|
||||
* fs/cifs/smbfsctl.h: SMB, CIFS, SMB2 FSCTL definitions
|
||||
*
|
||||
* Copyright (c) International Business Machines Corp., 2002,2013
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* IOCTL information */
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/transport.c
|
||||
*
|
||||
|
@ -5,19 +6,6 @@
|
|||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
* Jeremy Allison (jra@samba.org) 2006.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/fs.h>
|
||||
|
|
|
@ -1,22 +1,10 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1
|
||||
/*
|
||||
* fs/cifs/xattr.c
|
||||
*
|
||||
* Copyright (c) International Business Machines Corp., 2003, 2007
|
||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 2.1 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/fs.h>
|
||||
|
|
|
@ -54,6 +54,10 @@ enum OID {
|
|||
OID_md4, /* 1.2.840.113549.2.4 */
|
||||
OID_md5, /* 1.2.840.113549.2.5 */
|
||||
|
||||
OID_mskrb5, /* 1.2.840.48018.1.2.2 */
|
||||
OID_krb5, /* 1.2.840.113554.1.2.2 */
|
||||
OID_krb5u2u, /* 1.2.840.113554.1.2.2.3 */
|
||||
|
||||
/* Microsoft Authenticode & Software Publishing */
|
||||
OID_msIndirectData, /* 1.3.6.1.4.1.311.2.1.4 */
|
||||
OID_msStatementType, /* 1.3.6.1.4.1.311.2.1.11 */
|
||||
|
@ -62,6 +66,10 @@ enum OID {
|
|||
OID_msIndividualSPKeyPurpose, /* 1.3.6.1.4.1.311.2.1.21 */
|
||||
OID_msOutlookExpress, /* 1.3.6.1.4.1.311.16.4 */
|
||||
|
||||
OID_ntlmssp, /* 1.3.6.1.4.1.311.2.2.10 */
|
||||
|
||||
OID_spnego, /* 1.3.6.1.5.5.2 */
|
||||
|
||||
OID_certAuthInfoAccess, /* 1.3.6.1.5.5.7.1.1 */
|
||||
OID_sha1, /* 1.3.14.3.2.26 */
|
||||
OID_id_ansip384r1, /* 1.3.132.0.34 */
|
||||
|
|
Loading…
Reference in New Issue