You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6: [CIFS] Fix endian error comparing authusers when cifsacl enabled [CIFS] Rename three structures to avoid camel case Fix extended security auth failure CIFS: Add rwpidforward mount option CIFS: Migrate to shared superblock model [CIFS] Migrate from prefixpath logic CIFS: Fix memory leak in cifs_do_mount [CIFS] When mandatory encryption on share, fail mount CIFS: Use pid saved from cifsFileInfo in writepages and set_file_size cifs: add cifs_async_writev cifs: clean up wsize negotiation and allow for larger wsize cifs: convert cifs_writepages to use async writes CIFS: Fix undefined behavior when mount fails cifs: don't call mid_q_entry->callback under the Global_MidLock (try #5) CIFS: Simplify mount code for further shared sb capability CIFS: Simplify connection structure search calls cifs: remove unused SMB2 config and mount options cifs: add ignore_pend flag to cifs_call_async cifs: make cifs_send_async take a kvec array cifs: consolidate SendReceive response checks
This commit is contained in:
@@ -153,26 +153,6 @@ config CIFS_ACL
|
||||
Allows to fetch CIFS/NTFS ACL from the server. The DACL blob
|
||||
is handed over to the application/caller.
|
||||
|
||||
config CIFS_SMB2
|
||||
bool "SMB2 network file system support (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && INET && BROKEN
|
||||
select NLS
|
||||
select KEYS
|
||||
select FSCACHE
|
||||
select DNS_RESOLVER
|
||||
|
||||
help
|
||||
This enables experimental support for the SMB2 (Server Message Block
|
||||
version 2) protocol. The SMB2 protocol is the successor to the
|
||||
popular CIFS and SMB network file sharing protocols. SMB2 is the
|
||||
native file sharing mechanism for recent versions of Windows
|
||||
operating systems (since Vista). SMB2 enablement will eventually
|
||||
allow users better performance, security and features, than would be
|
||||
possible with cifs. Note that smb2 mount options also are simpler
|
||||
(compared to cifs) due to protocol improvements.
|
||||
|
||||
Unless you are a developer or tester, say N.
|
||||
|
||||
config CIFS_NFSD_EXPORT
|
||||
bool "Allow nfsd to export CIFS file system (EXPERIMENTAL)"
|
||||
depends on CIFS && EXPERIMENTAL
|
||||
|
||||
@@ -457,6 +457,9 @@ A partial list of the supported mount options follows:
|
||||
otherwise - read from the server. All written data are stored
|
||||
in the cache, but if the client doesn't have Exclusive Oplock,
|
||||
it writes the data to the server.
|
||||
rwpidforward Forward pid of a process who opened a file to any read or write
|
||||
operation on that file. This prevent applications like WINE
|
||||
from failing on read and write if we use mandatory brlock style.
|
||||
acl Allow setfacl and getfacl to manage posix ACLs if server
|
||||
supports them. (default)
|
||||
noacl Do not allow setfacl and getfacl calls on this mount
|
||||
|
||||
+3
-3
@@ -146,7 +146,7 @@ static char *extract_sharename(const char *treename)
|
||||
static uint16_t cifs_super_get_key(const void *cookie_netfs_data, void *buffer,
|
||||
uint16_t maxbuf)
|
||||
{
|
||||
const struct cifsTconInfo *tcon = cookie_netfs_data;
|
||||
const struct cifs_tcon *tcon = cookie_netfs_data;
|
||||
char *sharename;
|
||||
uint16_t len;
|
||||
|
||||
@@ -173,7 +173,7 @@ cifs_fscache_super_get_aux(const void *cookie_netfs_data, void *buffer,
|
||||
uint16_t maxbuf)
|
||||
{
|
||||
struct cifs_fscache_super_auxdata auxdata;
|
||||
const struct cifsTconInfo *tcon = cookie_netfs_data;
|
||||
const struct cifs_tcon *tcon = cookie_netfs_data;
|
||||
|
||||
memset(&auxdata, 0, sizeof(auxdata));
|
||||
auxdata.resource_id = tcon->resource_id;
|
||||
@@ -192,7 +192,7 @@ fscache_checkaux cifs_fscache_super_check_aux(void *cookie_netfs_data,
|
||||
uint16_t datalen)
|
||||
{
|
||||
struct cifs_fscache_super_auxdata auxdata;
|
||||
const struct cifsTconInfo *tcon = cookie_netfs_data;
|
||||
const struct cifs_tcon *tcon = cookie_netfs_data;
|
||||
|
||||
if (datalen != sizeof(auxdata))
|
||||
return FSCACHE_CHECKAUX_OBSOLETE;
|
||||
|
||||
+13
-13
@@ -110,8 +110,8 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
|
||||
struct list_head *tmp1, *tmp2, *tmp3;
|
||||
struct mid_q_entry *mid_entry;
|
||||
struct TCP_Server_Info *server;
|
||||
struct cifsSesInfo *ses;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
int i, j;
|
||||
__u32 dev_type;
|
||||
|
||||
@@ -152,7 +152,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
|
||||
tcp_ses_list);
|
||||
i++;
|
||||
list_for_each(tmp2, &server->smb_ses_list) {
|
||||
ses = list_entry(tmp2, struct cifsSesInfo,
|
||||
ses = list_entry(tmp2, struct cifs_ses,
|
||||
smb_ses_list);
|
||||
if ((ses->serverDomain == NULL) ||
|
||||
(ses->serverOS == NULL) ||
|
||||
@@ -171,7 +171,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
|
||||
seq_printf(m, "TCP status: %d\n\tLocal Users To "
|
||||
"Server: %d SecMode: 0x%x Req On Wire: %d",
|
||||
server->tcpStatus, server->srv_count,
|
||||
server->secMode,
|
||||
server->sec_mode,
|
||||
atomic_read(&server->inFlight));
|
||||
|
||||
#ifdef CONFIG_CIFS_STATS2
|
||||
@@ -183,7 +183,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
|
||||
seq_puts(m, "\n\tShares:");
|
||||
j = 0;
|
||||
list_for_each(tmp3, &ses->tcon_list) {
|
||||
tcon = list_entry(tmp3, struct cifsTconInfo,
|
||||
tcon = list_entry(tmp3, struct cifs_tcon,
|
||||
tcon_list);
|
||||
++j;
|
||||
dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
|
||||
@@ -256,8 +256,8 @@ static ssize_t cifs_stats_proc_write(struct file *file,
|
||||
int rc;
|
||||
struct list_head *tmp1, *tmp2, *tmp3;
|
||||
struct TCP_Server_Info *server;
|
||||
struct cifsSesInfo *ses;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
|
||||
rc = get_user(c, buffer);
|
||||
if (rc)
|
||||
@@ -273,11 +273,11 @@ static ssize_t cifs_stats_proc_write(struct file *file,
|
||||
server = list_entry(tmp1, struct TCP_Server_Info,
|
||||
tcp_ses_list);
|
||||
list_for_each(tmp2, &server->smb_ses_list) {
|
||||
ses = list_entry(tmp2, struct cifsSesInfo,
|
||||
ses = list_entry(tmp2, struct cifs_ses,
|
||||
smb_ses_list);
|
||||
list_for_each(tmp3, &ses->tcon_list) {
|
||||
tcon = list_entry(tmp3,
|
||||
struct cifsTconInfo,
|
||||
struct cifs_tcon,
|
||||
tcon_list);
|
||||
atomic_set(&tcon->num_smbs_sent, 0);
|
||||
atomic_set(&tcon->num_writes, 0);
|
||||
@@ -312,8 +312,8 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v)
|
||||
int i;
|
||||
struct list_head *tmp1, *tmp2, *tmp3;
|
||||
struct TCP_Server_Info *server;
|
||||
struct cifsSesInfo *ses;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
|
||||
seq_printf(m,
|
||||
"Resources in use\nCIFS Session: %d\n",
|
||||
@@ -346,11 +346,11 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v)
|
||||
server = list_entry(tmp1, struct TCP_Server_Info,
|
||||
tcp_ses_list);
|
||||
list_for_each(tmp2, &server->smb_ses_list) {
|
||||
ses = list_entry(tmp2, struct cifsSesInfo,
|
||||
ses = list_entry(tmp2, struct cifs_ses,
|
||||
smb_ses_list);
|
||||
list_for_each(tmp3, &ses->tcon_list) {
|
||||
tcon = list_entry(tmp3,
|
||||
struct cifsTconInfo,
|
||||
struct cifs_tcon,
|
||||
tcon_list);
|
||||
i++;
|
||||
seq_printf(m, "\n%d) %s", i, tcon->treeName);
|
||||
|
||||
@@ -272,7 +272,7 @@ static struct vfsmount *cifs_dfs_do_automount(struct dentry *mntpt)
|
||||
struct dfs_info3_param *referrals = NULL;
|
||||
unsigned int num_referrals = 0;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct cifsSesInfo *ses;
|
||||
struct cifs_ses *ses;
|
||||
char *full_path;
|
||||
int xid, i;
|
||||
int rc;
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#define CIFS_MOUNT_MF_SYMLINKS 0x10000 /* Minshall+French Symlinks enabled */
|
||||
#define CIFS_MOUNT_MULTIUSER 0x20000 /* multiuser mount */
|
||||
#define CIFS_MOUNT_STRICT_IO 0x40000 /* strict cache mode */
|
||||
#define CIFS_MOUNT_RWPIDFORWARD 0x80000 /* use pid forwarding for rw */
|
||||
|
||||
struct cifs_sb_info {
|
||||
struct rb_root tlink_tree;
|
||||
@@ -56,8 +57,6 @@ struct cifs_sb_info {
|
||||
mode_t mnt_file_mode;
|
||||
mode_t mnt_dir_mode;
|
||||
unsigned int mnt_cifs_flags;
|
||||
int prepathlen;
|
||||
char *prepath; /* relative path under the share to mount to */
|
||||
char *mountdata; /* options received at mount time or via DFS refs */
|
||||
struct backing_dev_info bdi;
|
||||
struct delayed_work prune_tlinks;
|
||||
|
||||
@@ -95,7 +95,7 @@ struct key_type cifs_spnego_key_type = {
|
||||
|
||||
/* get a key struct with a SPNEGO security blob, suitable for session setup */
|
||||
struct key *
|
||||
cifs_get_spnego_key(struct cifsSesInfo *sesInfo)
|
||||
cifs_get_spnego_key(struct cifs_ses *sesInfo)
|
||||
{
|
||||
struct TCP_Server_Info *server = sesInfo->server;
|
||||
struct sockaddr_in *sa = (struct sockaddr_in *) &server->dstaddr;
|
||||
|
||||
@@ -41,7 +41,7 @@ struct cifs_spnego_msg {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
extern struct key_type cifs_spnego_key_type;
|
||||
extern struct key *cifs_get_spnego_key(struct cifsSesInfo *sesInfo);
|
||||
extern struct key *cifs_get_spnego_key(struct cifs_ses *sesInfo);
|
||||
#endif /* KERNEL */
|
||||
|
||||
#endif /* _CIFS_SPNEGO_H */
|
||||
|
||||
+5
-4
@@ -38,7 +38,7 @@ static const struct cifs_sid sid_everyone = {
|
||||
1, 1, {0, 0, 0, 0, 0, 1}, {0} };
|
||||
/* security id for Authenticated Users system group */
|
||||
static const struct cifs_sid sid_authusers = {
|
||||
1, 1, {0, 0, 0, 0, 0, 5}, {11} };
|
||||
1, 1, {0, 0, 0, 0, 0, 5}, {cpu_to_le32(11)} };
|
||||
/* group users */
|
||||
static const struct cifs_sid sid_user = {1, 2 , {0, 0, 0, 0, 0, 5}, {} };
|
||||
|
||||
@@ -458,7 +458,8 @@ int compare_sids(const struct cifs_sid *ctsid, const struct cifs_sid *cwsid)
|
||||
if (num_subauth) {
|
||||
for (i = 0; i < num_subauth; ++i) {
|
||||
if (ctsid->sub_auth[i] != cwsid->sub_auth[i]) {
|
||||
if (ctsid->sub_auth[i] > cwsid->sub_auth[i])
|
||||
if (le32_to_cpu(ctsid->sub_auth[i]) >
|
||||
le32_to_cpu(cwsid->sub_auth[i]))
|
||||
return 1;
|
||||
else
|
||||
return -1;
|
||||
@@ -945,7 +946,7 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
|
||||
int oplock = 0;
|
||||
int xid, rc;
|
||||
__u16 fid;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
|
||||
|
||||
if (IS_ERR(tlink))
|
||||
@@ -1013,7 +1014,7 @@ static int set_cifs_acl_by_path(struct cifs_sb_info *cifs_sb, const char *path,
|
||||
int oplock = 0;
|
||||
int xid, rc;
|
||||
__u16 fid;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
|
||||
|
||||
if (IS_ERR(tlink))
|
||||
|
||||
@@ -229,7 +229,7 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu,
|
||||
}
|
||||
|
||||
/* first calculate 24 bytes ntlm response and then 16 byte session key */
|
||||
int setup_ntlm_response(struct cifsSesInfo *ses)
|
||||
int setup_ntlm_response(struct cifs_ses *ses)
|
||||
{
|
||||
int rc = 0;
|
||||
unsigned int temp_len = CIFS_SESS_KEY_SIZE + CIFS_AUTH_RESP_SIZE;
|
||||
@@ -312,7 +312,7 @@ int calc_lanman_hash(const char *password, const char *cryptkey, bool encrypt,
|
||||
* Allocate domain name which gets freed when session struct is deallocated.
|
||||
*/
|
||||
static int
|
||||
build_avpair_blob(struct cifsSesInfo *ses, const struct nls_table *nls_cp)
|
||||
build_avpair_blob(struct cifs_ses *ses, const struct nls_table *nls_cp)
|
||||
{
|
||||
unsigned int dlen;
|
||||
unsigned int wlen;
|
||||
@@ -400,7 +400,7 @@ build_avpair_blob(struct cifsSesInfo *ses, const struct nls_table *nls_cp)
|
||||
* about target string i.e. for some, just user name might suffice.
|
||||
*/
|
||||
static int
|
||||
find_domain_name(struct cifsSesInfo *ses, const struct nls_table *nls_cp)
|
||||
find_domain_name(struct cifs_ses *ses, const struct nls_table *nls_cp)
|
||||
{
|
||||
unsigned int attrsize;
|
||||
unsigned int type;
|
||||
@@ -445,7 +445,7 @@ find_domain_name(struct cifsSesInfo *ses, const struct nls_table *nls_cp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int calc_ntlmv2_hash(struct cifsSesInfo *ses, char *ntlmv2_hash,
|
||||
static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash,
|
||||
const struct nls_table *nls_cp)
|
||||
{
|
||||
int rc = 0;
|
||||
@@ -527,7 +527,7 @@ calc_exit_2:
|
||||
}
|
||||
|
||||
static int
|
||||
CalcNTLMv2_response(const struct cifsSesInfo *ses, char *ntlmv2_hash)
|
||||
CalcNTLMv2_response(const struct cifs_ses *ses, char *ntlmv2_hash)
|
||||
{
|
||||
int rc;
|
||||
unsigned int offset = CIFS_SESS_KEY_SIZE + 8;
|
||||
@@ -563,7 +563,7 @@ CalcNTLMv2_response(const struct cifsSesInfo *ses, char *ntlmv2_hash)
|
||||
|
||||
|
||||
int
|
||||
setup_ntlmv2_rsp(struct cifsSesInfo *ses, const struct nls_table *nls_cp)
|
||||
setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp)
|
||||
{
|
||||
int rc;
|
||||
int baselen;
|
||||
@@ -649,7 +649,7 @@ setup_ntlmv2_rsp_ret:
|
||||
}
|
||||
|
||||
int
|
||||
calc_seckey(struct cifsSesInfo *ses)
|
||||
calc_seckey(struct cifs_ses *ses)
|
||||
{
|
||||
int rc;
|
||||
struct crypto_blkcipher *tfm_arc4;
|
||||
|
||||
+185
-48
@@ -104,46 +104,25 @@ cifs_sb_deactive(struct super_block *sb)
|
||||
}
|
||||
|
||||
static int
|
||||
cifs_read_super(struct super_block *sb, void *data,
|
||||
cifs_read_super(struct super_block *sb, struct smb_vol *volume_info,
|
||||
const char *devname, int silent)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
int rc = 0;
|
||||
|
||||
/* BB should we make this contingent on mount parm? */
|
||||
sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
|
||||
sb->s_fs_info = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
|
||||
cifs_sb = CIFS_SB(sb);
|
||||
if (cifs_sb == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&cifs_sb->tlink_tree_lock);
|
||||
cifs_sb->tlink_tree = RB_ROOT;
|
||||
|
||||
rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs", BDI_CAP_MAP_COPY);
|
||||
if (rc) {
|
||||
kfree(cifs_sb);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
cifs_sb->bdi.ra_pages = default_backing_dev_info.ra_pages;
|
||||
|
||||
/*
|
||||
* Copy mount params to sb for use in submounts. Better to do
|
||||
* the copy here and deal with the error before cleanup gets
|
||||
* complicated post-mount.
|
||||
*/
|
||||
if (data) {
|
||||
cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
|
||||
if (cifs_sb->mountdata == NULL) {
|
||||
bdi_destroy(&cifs_sb->bdi);
|
||||
kfree(sb->s_fs_info);
|
||||
sb->s_fs_info = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
rc = cifs_mount(sb, cifs_sb, devname);
|
||||
rc = cifs_mount(sb, cifs_sb, volume_info, devname);
|
||||
|
||||
if (rc) {
|
||||
if (!silent)
|
||||
@@ -194,15 +173,7 @@ out_no_root:
|
||||
cifs_umount(sb, cifs_sb);
|
||||
|
||||
out_mount_failed:
|
||||
if (cifs_sb) {
|
||||
if (cifs_sb->mountdata) {
|
||||
kfree(cifs_sb->mountdata);
|
||||
cifs_sb->mountdata = NULL;
|
||||
}
|
||||
unload_nls(cifs_sb->local_nls);
|
||||
bdi_destroy(&cifs_sb->bdi);
|
||||
kfree(cifs_sb);
|
||||
}
|
||||
bdi_destroy(&cifs_sb->bdi);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -237,7 +208,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
{
|
||||
struct super_block *sb = dentry->d_sb;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
int rc = -EOPNOTSUPP;
|
||||
int xid;
|
||||
|
||||
@@ -390,7 +361,7 @@ static int
|
||||
cifs_show_options(struct seq_file *s, struct vfsmount *m)
|
||||
{
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(m->mnt_sb);
|
||||
struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct sockaddr *srcaddr;
|
||||
srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr;
|
||||
|
||||
@@ -444,14 +415,20 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
|
||||
seq_printf(s, ",nocase");
|
||||
if (tcon->retry)
|
||||
seq_printf(s, ",hard");
|
||||
if (cifs_sb->prepath)
|
||||
seq_printf(s, ",prepath=%s", cifs_sb->prepath);
|
||||
if (tcon->unix_ext)
|
||||
seq_printf(s, ",unix");
|
||||
else
|
||||
seq_printf(s, ",nounix");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
|
||||
seq_printf(s, ",posixpaths");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
|
||||
seq_printf(s, ",setuids");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
|
||||
seq_printf(s, ",serverino");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
|
||||
seq_printf(s, ",rwpidforward");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL)
|
||||
seq_printf(s, ",forcemand");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
|
||||
seq_printf(s, ",directio");
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
|
||||
@@ -484,7 +461,7 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
|
||||
static void cifs_umount_begin(struct super_block *sb)
|
||||
{
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
|
||||
if (cifs_sb == NULL)
|
||||
return;
|
||||
@@ -559,29 +536,189 @@ static const struct super_operations cifs_super_ops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* Get root dentry from superblock according to prefix path mount option.
|
||||
* Return dentry with refcount + 1 on success and NULL otherwise.
|
||||
*/
|
||||
static struct dentry *
|
||||
cifs_get_root(struct smb_vol *vol, struct super_block *sb)
|
||||
{
|
||||
int xid, rc;
|
||||
struct inode *inode;
|
||||
struct qstr name;
|
||||
struct dentry *dparent = NULL, *dchild = NULL, *alias;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
unsigned int i, full_len, len;
|
||||
char *full_path = NULL, *pstart;
|
||||
char sep;
|
||||
|
||||
full_path = cifs_build_path_to_root(vol, cifs_sb,
|
||||
cifs_sb_master_tcon(cifs_sb));
|
||||
if (full_path == NULL)
|
||||
return NULL;
|
||||
|
||||
cFYI(1, "Get root dentry for %s", full_path);
|
||||
|
||||
xid = GetXid();
|
||||
sep = CIFS_DIR_SEP(cifs_sb);
|
||||
dparent = dget(sb->s_root);
|
||||
full_len = strlen(full_path);
|
||||
full_path[full_len] = sep;
|
||||
pstart = full_path + 1;
|
||||
|
||||
for (i = 1, len = 0; i <= full_len; i++) {
|
||||
if (full_path[i] != sep || !len) {
|
||||
len++;
|
||||
continue;
|
||||
}
|
||||
|
||||
full_path[i] = 0;
|
||||
cFYI(1, "get dentry for %s", pstart);
|
||||
|
||||
name.name = pstart;
|
||||
name.len = len;
|
||||
name.hash = full_name_hash(pstart, len);
|
||||
dchild = d_lookup(dparent, &name);
|
||||
if (dchild == NULL) {
|
||||
cFYI(1, "not exists");
|
||||
dchild = d_alloc(dparent, &name);
|
||||
if (dchild == NULL) {
|
||||
dput(dparent);
|
||||
dparent = NULL;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
cFYI(1, "get inode");
|
||||
if (dchild->d_inode == NULL) {
|
||||
cFYI(1, "not exists");
|
||||
inode = NULL;
|
||||
if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
|
||||
rc = cifs_get_inode_info_unix(&inode, full_path,
|
||||
sb, xid);
|
||||
else
|
||||
rc = cifs_get_inode_info(&inode, full_path,
|
||||
NULL, sb, xid, NULL);
|
||||
if (rc) {
|
||||
dput(dchild);
|
||||
dput(dparent);
|
||||
dparent = NULL;
|
||||
goto out;
|
||||
}
|
||||
alias = d_materialise_unique(dchild, inode);
|
||||
if (alias != NULL) {
|
||||
dput(dchild);
|
||||
if (IS_ERR(alias)) {
|
||||
dput(dparent);
|
||||
dparent = NULL;
|
||||
goto out;
|
||||
}
|
||||
dchild = alias;
|
||||
}
|
||||
}
|
||||
cFYI(1, "parent %p, child %p", dparent, dchild);
|
||||
|
||||
dput(dparent);
|
||||
dparent = dchild;
|
||||
len = 0;
|
||||
pstart = full_path + i + 1;
|
||||
full_path[i] = sep;
|
||||
}
|
||||
out:
|
||||
_FreeXid(xid);
|
||||
kfree(full_path);
|
||||
return dparent;
|
||||
}
|
||||
|
||||
static struct dentry *
|
||||
cifs_do_mount(struct file_system_type *fs_type,
|
||||
int flags, const char *dev_name, void *data)
|
||||
int flags, const char *dev_name, void *data)
|
||||
{
|
||||
int rc;
|
||||
struct super_block *sb;
|
||||
|
||||
sb = sget(fs_type, NULL, set_anon_super, NULL);
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct smb_vol *volume_info;
|
||||
struct cifs_mnt_data mnt_data;
|
||||
struct dentry *root;
|
||||
|
||||
cFYI(1, "Devname: %s flags: %d ", dev_name, flags);
|
||||
|
||||
if (IS_ERR(sb))
|
||||
return ERR_CAST(sb);
|
||||
rc = cifs_setup_volume_info(&volume_info, (char *)data, dev_name);
|
||||
if (rc)
|
||||
return ERR_PTR(rc);
|
||||
|
||||
cifs_sb = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
|
||||
if (cifs_sb == NULL) {
|
||||
root = ERR_PTR(-ENOMEM);
|
||||
goto out;
|
||||
}
|
||||
|
||||
cifs_setup_cifs_sb(volume_info, cifs_sb);
|
||||
|
||||
mnt_data.vol = volume_info;
|
||||
mnt_data.cifs_sb = cifs_sb;
|
||||
mnt_data.flags = flags;
|
||||
|
||||
sb = sget(fs_type, cifs_match_super, set_anon_super, &mnt_data);
|
||||
if (IS_ERR(sb)) {
|
||||
root = ERR_CAST(sb);
|
||||
goto out_cifs_sb;
|
||||
}
|
||||
|
||||
if (sb->s_fs_info) {
|
||||
cFYI(1, "Use existing superblock");
|
||||
goto out_shared;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy mount params for use in submounts. Better to do
|
||||
* the copy here and deal with the error before cleanup gets
|
||||
* complicated post-mount.
|
||||
*/
|
||||
cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
|
||||
if (cifs_sb->mountdata == NULL) {
|
||||
root = ERR_PTR(-ENOMEM);
|
||||
goto out_super;
|
||||
}
|
||||
|
||||
sb->s_flags = flags;
|
||||
/* BB should we make this contingent on mount parm? */
|
||||
sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
|
||||
sb->s_fs_info = cifs_sb;
|
||||
|
||||
rc = cifs_read_super(sb, data, dev_name, flags & MS_SILENT ? 1 : 0);
|
||||
rc = cifs_read_super(sb, volume_info, dev_name,
|
||||
flags & MS_SILENT ? 1 : 0);
|
||||
if (rc) {
|
||||
deactivate_locked_super(sb);
|
||||
return ERR_PTR(rc);
|
||||
root = ERR_PTR(rc);
|
||||
goto out_super;
|
||||
}
|
||||
|
||||
sb->s_flags |= MS_ACTIVE;
|
||||
return dget(sb->s_root);
|
||||
|
||||
root = cifs_get_root(volume_info, sb);
|
||||
if (root == NULL)
|
||||
goto out_super;
|
||||
|
||||
cFYI(1, "dentry root is: %p", root);
|
||||
goto out;
|
||||
|
||||
out_shared:
|
||||
root = cifs_get_root(volume_info, sb);
|
||||
if (root)
|
||||
cFYI(1, "dentry root is: %p", root);
|
||||
goto out;
|
||||
|
||||
out_super:
|
||||
kfree(cifs_sb->mountdata);
|
||||
deactivate_locked_super(sb);
|
||||
|
||||
out_cifs_sb:
|
||||
unload_nls(cifs_sb->local_nls);
|
||||
kfree(cifs_sb);
|
||||
|
||||
out:
|
||||
cifs_cleanup_volume_info(&volume_info);
|
||||
return root;
|
||||
}
|
||||
|
||||
static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
|
||||
+116
-13
@@ -155,6 +155,81 @@ struct cifs_cred {
|
||||
*****************************************************************
|
||||
*/
|
||||
|
||||
struct smb_vol {
|
||||
char *username;
|
||||
char *password;
|
||||
char *domainname;
|
||||
char *UNC;
|
||||
char *UNCip;
|
||||
char *iocharset; /* local code page for mapping to and from Unicode */
|
||||
char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* clnt nb name */
|
||||
char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* srvr nb name */
|
||||
uid_t cred_uid;
|
||||
uid_t linux_uid;
|
||||
gid_t linux_gid;
|
||||
mode_t file_mode;
|
||||
mode_t dir_mode;
|
||||
unsigned secFlg;
|
||||
bool retry:1;
|
||||
bool intr:1;
|
||||
bool setuids:1;
|
||||
bool override_uid:1;
|
||||
bool override_gid:1;
|
||||
bool dynperm:1;
|
||||
bool noperm:1;
|
||||
bool no_psx_acl:1; /* set if posix acl support should be disabled */
|
||||
bool cifs_acl:1;
|
||||
bool no_xattr:1; /* set if xattr (EA) support should be disabled*/
|
||||
bool server_ino:1; /* use inode numbers from server ie UniqueId */
|
||||
bool direct_io:1;
|
||||
bool strict_io:1; /* strict cache behavior */
|
||||
bool remap:1; /* set to remap seven reserved chars in filenames */
|
||||
bool posix_paths:1; /* unset to not ask for posix pathnames. */
|
||||
bool no_linux_ext:1;
|
||||
bool sfu_emul:1;
|
||||
bool nullauth:1; /* attempt to authenticate with null user */
|
||||
bool nocase:1; /* request case insensitive filenames */
|
||||
bool nobrl:1; /* disable sending byte range locks to srv */
|
||||
bool mand_lock:1; /* send mandatory not posix byte range lock reqs */
|
||||
bool seal:1; /* request transport encryption on share */
|
||||
bool nodfs:1; /* Do not request DFS, even if available */
|
||||
bool local_lease:1; /* check leases only on local system, not remote */
|
||||
bool noblocksnd:1;
|
||||
bool noautotune:1;
|
||||
bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
|
||||
bool fsc:1; /* enable fscache */
|
||||
bool mfsymlinks:1; /* use Minshall+French Symlinks */
|
||||
bool multiuser:1;
|
||||
bool rwpidforward:1; /* pid forward for read/write operations */
|
||||
unsigned int rsize;
|
||||
unsigned int wsize;
|
||||
bool sockopt_tcp_nodelay:1;
|
||||
unsigned short int port;
|
||||
unsigned long actimeo; /* attribute cache timeout (jiffies) */
|
||||
char *prepath;
|
||||
struct sockaddr_storage srcaddr; /* allow binding to a local IP */
|
||||
struct nls_table *local_nls;
|
||||
};
|
||||
|
||||
#define CIFS_MOUNT_MASK (CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID | \
|
||||
CIFS_MOUNT_SERVER_INUM | CIFS_MOUNT_DIRECT_IO | \
|
||||
CIFS_MOUNT_NO_XATTR | CIFS_MOUNT_MAP_SPECIAL_CHR | \
|
||||
CIFS_MOUNT_UNX_EMUL | CIFS_MOUNT_NO_BRL | \
|
||||
CIFS_MOUNT_CIFS_ACL | CIFS_MOUNT_OVERR_UID | \
|
||||
CIFS_MOUNT_OVERR_GID | CIFS_MOUNT_DYNPERM | \
|
||||
CIFS_MOUNT_NOPOSIXBRL | CIFS_MOUNT_NOSSYNC | \
|
||||
CIFS_MOUNT_FSCACHE | CIFS_MOUNT_MF_SYMLINKS | \
|
||||
CIFS_MOUNT_MULTIUSER | CIFS_MOUNT_STRICT_IO)
|
||||
|
||||
#define CIFS_MS_MASK (MS_RDONLY | MS_MANDLOCK | MS_NOEXEC | MS_NOSUID | \
|
||||
MS_NODEV | MS_SYNCHRONOUS)
|
||||
|
||||
struct cifs_mnt_data {
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct smb_vol *vol;
|
||||
int flags;
|
||||
};
|
||||
|
||||
struct TCP_Server_Info {
|
||||
struct list_head tcp_ses_list;
|
||||
struct list_head smb_ses_list;
|
||||
@@ -179,7 +254,7 @@ struct TCP_Server_Info {
|
||||
struct mutex srv_mutex;
|
||||
struct task_struct *tsk;
|
||||
char server_GUID[16];
|
||||
char secMode;
|
||||
char sec_mode;
|
||||
bool session_estab; /* mark when very first sess is established */
|
||||
u16 dialect; /* dialect index that server chose */
|
||||
enum securityEnum secType;
|
||||
@@ -254,7 +329,7 @@ static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
|
||||
/*
|
||||
* Session structure. One of these for each uid session with a particular host
|
||||
*/
|
||||
struct cifsSesInfo {
|
||||
struct cifs_ses {
|
||||
struct list_head smb_ses_list;
|
||||
struct list_head tcon_list;
|
||||
struct mutex session_mutex;
|
||||
@@ -294,11 +369,11 @@ struct cifsSesInfo {
|
||||
* there is one of these for each connection to a resource on a particular
|
||||
* session
|
||||
*/
|
||||
struct cifsTconInfo {
|
||||
struct cifs_tcon {
|
||||
struct list_head tcon_list;
|
||||
int tc_count;
|
||||
struct list_head openFileList;
|
||||
struct cifsSesInfo *ses; /* pointer to session associated with */
|
||||
struct cifs_ses *ses; /* pointer to session associated with */
|
||||
char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */
|
||||
char *nativeFileSystem;
|
||||
char *password; /* for share-level security */
|
||||
@@ -380,12 +455,12 @@ struct tcon_link {
|
||||
#define TCON_LINK_IN_TREE 2
|
||||
unsigned long tl_time;
|
||||
atomic_t tl_count;
|
||||
struct cifsTconInfo *tl_tcon;
|
||||
struct cifs_tcon *tl_tcon;
|
||||
};
|
||||
|
||||
extern struct tcon_link *cifs_sb_tlink(struct cifs_sb_info *cifs_sb);
|
||||
|
||||
static inline struct cifsTconInfo *
|
||||
static inline struct cifs_tcon *
|
||||
tlink_tcon(struct tcon_link *tlink)
|
||||
{
|
||||
return tlink->tl_tcon;
|
||||
@@ -402,7 +477,7 @@ cifs_get_tlink(struct tcon_link *tlink)
|
||||
}
|
||||
|
||||
/* This function is always expected to succeed */
|
||||
extern struct cifsTconInfo *cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb);
|
||||
extern struct cifs_tcon *cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb);
|
||||
|
||||
/*
|
||||
* This info hangs off the cifsFileInfo structure, pointed to by llist.
|
||||
@@ -455,6 +530,14 @@ struct cifsFileInfo {
|
||||
struct work_struct oplock_break; /* work for oplock breaks */
|
||||
};
|
||||
|
||||
struct cifs_io_parms {
|
||||
__u16 netfid;
|
||||
__u32 pid;
|
||||
__u64 offset;
|
||||
unsigned int length;
|
||||
struct cifs_tcon *tcon;
|
||||
};
|
||||
|
||||
/*
|
||||
* Take a reference on the file private data. Must be called with
|
||||
* cifs_file_list_lock held.
|
||||
@@ -509,10 +592,30 @@ static inline char CIFS_DIR_SEP(const struct cifs_sb_info *cifs_sb)
|
||||
return '\\';
|
||||
}
|
||||
|
||||
static inline void
|
||||
convert_delimiter(char *path, char delim)
|
||||
{
|
||||
int i;
|
||||
char old_delim;
|
||||
|
||||
if (path == NULL)
|
||||
return;
|
||||
|
||||
if (delim == '/')
|
||||
old_delim = '\\';
|
||||
else
|
||||
old_delim = '/';
|
||||
|
||||
for (i = 0; path[i] != '\0'; i++) {
|
||||
if (path[i] == old_delim)
|
||||
path[i] = delim;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CIFS_STATS
|
||||
#define cifs_stats_inc atomic_inc
|
||||
|
||||
static inline void cifs_stats_bytes_written(struct cifsTconInfo *tcon,
|
||||
static inline void cifs_stats_bytes_written(struct cifs_tcon *tcon,
|
||||
unsigned int bytes)
|
||||
{
|
||||
if (bytes) {
|
||||
@@ -522,7 +625,7 @@ static inline void cifs_stats_bytes_written(struct cifsTconInfo *tcon,
|
||||
}
|
||||
}
|
||||
|
||||
static inline void cifs_stats_bytes_read(struct cifsTconInfo *tcon,
|
||||
static inline void cifs_stats_bytes_read(struct cifs_tcon *tcon,
|
||||
unsigned int bytes)
|
||||
{
|
||||
spin_lock(&tcon->stat_lock);
|
||||
@@ -543,9 +646,8 @@ struct mid_q_entry;
|
||||
* This is the prototype for the mid callback function. When creating one,
|
||||
* take special care to avoid deadlocks. Things to bear in mind:
|
||||
*
|
||||
* - it will be called by cifsd
|
||||
* - the GlobalMid_Lock will be held
|
||||
* - the mid will be removed from the pending_mid_q list
|
||||
* - it will be called by cifsd, with no locks held
|
||||
* - the mid will be removed from any lists
|
||||
*/
|
||||
typedef void (mid_callback_t)(struct mid_q_entry *mid);
|
||||
|
||||
@@ -573,7 +675,7 @@ struct mid_q_entry {
|
||||
struct oplock_q_entry {
|
||||
struct list_head qhead;
|
||||
struct inode *pinode;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
__u16 netfid;
|
||||
};
|
||||
|
||||
@@ -656,6 +758,7 @@ static inline void free_dfs_info_array(struct dfs_info3_param *param,
|
||||
#define MID_RESPONSE_RECEIVED 4
|
||||
#define MID_RETRY_NEEDED 8 /* session closed while this request out */
|
||||
#define MID_RESPONSE_MALFORMED 0x10
|
||||
#define MID_SHUTDOWN 0x20
|
||||
|
||||
/* Types of response buffer returned from SendReceive2 */
|
||||
#define CIFS_NO_BUFFER 0 /* Response buffer not returned */
|
||||
|
||||
+116
-93
@@ -57,8 +57,9 @@ extern int init_cifs_idmap(void);
|
||||
extern void exit_cifs_idmap(void);
|
||||
extern void cifs_destroy_idmaptrees(void);
|
||||
extern char *build_path_from_dentry(struct dentry *);
|
||||
extern char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb,
|
||||
struct cifsTconInfo *tcon);
|
||||
extern char *cifs_build_path_to_root(struct smb_vol *vol,
|
||||
struct cifs_sb_info *cifs_sb,
|
||||
struct cifs_tcon *tcon);
|
||||
extern char *build_wildcard_path_from_dentry(struct dentry *direntry);
|
||||
extern char *cifs_compose_mount_options(const char *sb_mountdata,
|
||||
const char *fullpath, const struct dfs_info3_param *ref,
|
||||
@@ -67,20 +68,22 @@ extern char *cifs_compose_mount_options(const char *sb_mountdata,
|
||||
extern struct mid_q_entry *AllocMidQEntry(const struct smb_hdr *smb_buffer,
|
||||
struct TCP_Server_Info *server);
|
||||
extern void DeleteMidQEntry(struct mid_q_entry *midEntry);
|
||||
extern int cifs_call_async(struct TCP_Server_Info *server,
|
||||
struct smb_hdr *in_buf, mid_callback_t *callback,
|
||||
void *cbdata);
|
||||
extern int SendReceive(const unsigned int /* xid */ , struct cifsSesInfo *,
|
||||
extern int cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov,
|
||||
unsigned int nvec, mid_callback_t *callback,
|
||||
void *cbdata, bool ignore_pend);
|
||||
extern int SendReceive(const unsigned int /* xid */ , struct cifs_ses *,
|
||||
struct smb_hdr * /* input */ ,
|
||||
struct smb_hdr * /* out */ ,
|
||||
int * /* bytes returned */ , const int long_op);
|
||||
extern int SendReceiveNoRsp(const unsigned int xid, struct cifsSesInfo *ses,
|
||||
extern int SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,
|
||||
struct smb_hdr *in_buf, int flags);
|
||||
extern int SendReceive2(const unsigned int /* xid */ , struct cifsSesInfo *,
|
||||
extern int cifs_check_receive(struct mid_q_entry *mid,
|
||||
struct TCP_Server_Info *server, bool log_error);
|
||||
extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *,
|
||||
struct kvec *, int /* nvec to send */,
|
||||
int * /* type of buf returned */ , const int flags);
|
||||
extern int SendReceiveBlockingLock(const unsigned int xid,
|
||||
struct cifsTconInfo *ptcon,
|
||||
struct cifs_tcon *ptcon,
|
||||
struct smb_hdr *in_buf ,
|
||||
struct smb_hdr *out_buf,
|
||||
int *bytes_returned);
|
||||
@@ -99,14 +102,14 @@ extern int cifs_convert_address(struct sockaddr *dst, const char *src, int len);
|
||||
extern int cifs_set_port(struct sockaddr *addr, const unsigned short int port);
|
||||
extern int cifs_fill_sockaddr(struct sockaddr *dst, const char *src, int len,
|
||||
const unsigned short int port);
|
||||
extern int map_smb_to_linux_error(struct smb_hdr *smb, int logErr);
|
||||
extern int map_smb_to_linux_error(struct smb_hdr *smb, bool logErr);
|
||||
extern void header_assemble(struct smb_hdr *, char /* command */ ,
|
||||
const struct cifsTconInfo *, int /* length of
|
||||
const struct cifs_tcon *, int /* length of
|
||||
fixed section (word count) in two byte units */);
|
||||
extern int small_smb_init_no_tc(const int smb_cmd, const int wct,
|
||||
struct cifsSesInfo *ses,
|
||||
struct cifs_ses *ses,
|
||||
void **request_buf);
|
||||
extern int CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses,
|
||||
extern int CIFS_SessSetup(unsigned int xid, struct cifs_ses *ses,
|
||||
const struct nls_table *nls_cp);
|
||||
extern __u16 GetNextMid(struct TCP_Server_Info *server);
|
||||
extern struct timespec cifs_NTtimeToUnix(__le64 utc_nanoseconds_since_1601);
|
||||
@@ -148,102 +151,108 @@ extern struct cifs_ntsd *get_cifs_acl(struct cifs_sb_info *, struct inode *,
|
||||
extern int set_cifs_acl(struct cifs_ntsd *, __u32, struct inode *,
|
||||
const char *);
|
||||
|
||||
extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
|
||||
struct cifs_sb_info *cifs_sb);
|
||||
extern int cifs_match_super(struct super_block *, void *);
|
||||
extern void cifs_cleanup_volume_info(struct smb_vol **pvolume_info);
|
||||
extern int cifs_setup_volume_info(struct smb_vol **pvolume_info,
|
||||
char *mount_data, const char *devname);
|
||||
extern int cifs_mount(struct super_block *, struct cifs_sb_info *,
|
||||
const char *);
|
||||
struct smb_vol *, const char *);
|
||||
extern int cifs_umount(struct super_block *, struct cifs_sb_info *);
|
||||
extern void cifs_dfs_release_automount_timer(void);
|
||||
void cifs_proc_init(void);
|
||||
void cifs_proc_clean(void);
|
||||
|
||||
extern int cifs_negotiate_protocol(unsigned int xid,
|
||||
struct cifsSesInfo *ses);
|
||||
extern int cifs_setup_session(unsigned int xid, struct cifsSesInfo *ses,
|
||||
struct cifs_ses *ses);
|
||||
extern int cifs_setup_session(unsigned int xid, struct cifs_ses *ses,
|
||||
struct nls_table *nls_info);
|
||||
extern int CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses);
|
||||
extern int CIFSSMBNegotiate(unsigned int xid, struct cifs_ses *ses);
|
||||
|
||||
extern int CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
|
||||
const char *tree, struct cifsTconInfo *tcon,
|
||||
extern int CIFSTCon(unsigned int xid, struct cifs_ses *ses,
|
||||
const char *tree, struct cifs_tcon *tcon,
|
||||
const struct nls_table *);
|
||||
|
||||
extern int CIFSFindFirst(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSFindFirst(const int xid, struct cifs_tcon *tcon,
|
||||
const char *searchName, const struct nls_table *nls_codepage,
|
||||
__u16 *searchHandle, struct cifs_search_info *psrch_inf,
|
||||
int map, const char dirsep);
|
||||
|
||||
extern int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSFindNext(const int xid, struct cifs_tcon *tcon,
|
||||
__u16 searchHandle, struct cifs_search_info *psrch_inf);
|
||||
|
||||
extern int CIFSFindClose(const int, struct cifsTconInfo *tcon,
|
||||
extern int CIFSFindClose(const int, struct cifs_tcon *tcon,
|
||||
const __u16 search_handle);
|
||||
|
||||
extern int CIFSSMBQFileInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBQFileInfo(const int xid, struct cifs_tcon *tcon,
|
||||
u16 netfid, FILE_ALL_INFO *pFindData);
|
||||
extern int CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBQPathInfo(const int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName,
|
||||
FILE_ALL_INFO *findData,
|
||||
int legacy /* whether to use old info level */,
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
extern int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int SMBQueryInformation(const int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName,
|
||||
FILE_ALL_INFO *findData,
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
|
||||
extern int CIFSSMBUnixQFileInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBUnixQFileInfo(const int xid, struct cifs_tcon *tcon,
|
||||
u16 netfid, FILE_UNIX_BASIC_INFO *pFindData);
|
||||
extern int CIFSSMBUnixQPathInfo(const int xid,
|
||||
struct cifsTconInfo *tcon,
|
||||
struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName,
|
||||
FILE_UNIX_BASIC_INFO *pFindData,
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
|
||||
extern int CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
|
||||
extern int CIFSGetDFSRefer(const int xid, struct cifs_ses *ses,
|
||||
const unsigned char *searchName,
|
||||
struct dfs_info3_param **target_nodes,
|
||||
unsigned int *number_of_nodes_in_array,
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
|
||||
extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
|
||||
extern int get_dfs_path(int xid, struct cifs_ses *pSesInfo,
|
||||
const char *old_path,
|
||||
const struct nls_table *nls_codepage,
|
||||
unsigned int *pnum_referrals,
|
||||
struct dfs_info3_param **preferrals,
|
||||
int remap);
|
||||
extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
|
||||
extern void reset_cifs_unix_caps(int xid, struct cifs_tcon *tcon,
|
||||
struct super_block *sb, struct smb_vol *vol);
|
||||
extern int CIFSSMBQFSInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBQFSInfo(const int xid, struct cifs_tcon *tcon,
|
||||
struct kstatfs *FSData);
|
||||
extern int SMBOldQFSInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int SMBOldQFSInfo(const int xid, struct cifs_tcon *tcon,
|
||||
struct kstatfs *FSData);
|
||||
extern int CIFSSMBSetFSUnixInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetFSUnixInfo(const int xid, struct cifs_tcon *tcon,
|
||||
__u64 cap);
|
||||
|
||||
extern int CIFSSMBQFSAttributeInfo(const int xid,
|
||||
struct cifsTconInfo *tcon);
|
||||
extern int CIFSSMBQFSDeviceInfo(const int xid, struct cifsTconInfo *tcon);
|
||||
extern int CIFSSMBQFSUnixInfo(const int xid, struct cifsTconInfo *tcon);
|
||||
extern int CIFSSMBQFSPosixInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
struct cifs_tcon *tcon);
|
||||
extern int CIFSSMBQFSDeviceInfo(const int xid, struct cifs_tcon *tcon);
|
||||
extern int CIFSSMBQFSUnixInfo(const int xid, struct cifs_tcon *tcon);
|
||||
extern int CIFSSMBQFSPosixInfo(const int xid, struct cifs_tcon *tcon,
|
||||
struct kstatfs *FSData);
|
||||
|
||||
extern int CIFSSMBSetPathInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetPathInfo(const int xid, struct cifs_tcon *tcon,
|
||||
const char *fileName, const FILE_BASIC_INFO *data,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSSMBSetFileInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetFileInfo(const int xid, struct cifs_tcon *tcon,
|
||||
const FILE_BASIC_INFO *data, __u16 fid,
|
||||
__u32 pid_of_opener);
|
||||
extern int CIFSSMBSetFileDisposition(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetFileDisposition(const int xid, struct cifs_tcon *tcon,
|
||||
bool delete_file, __u16 fid, __u32 pid_of_opener);
|
||||
#if 0
|
||||
extern int CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetAttrLegacy(int xid, struct cifs_tcon *tcon,
|
||||
char *fileName, __u16 dos_attributes,
|
||||
const struct nls_table *nls_codepage);
|
||||
#endif /* possibly unneeded function */
|
||||
extern int CIFSSMBSetEOF(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetEOF(const int xid, struct cifs_tcon *tcon,
|
||||
const char *fileName, __u64 size,
|
||||
bool setAllocationSizeFlag,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetFileSize(const int xid, struct cifs_tcon *tcon,
|
||||
__u64 size, __u16 fileHandle, __u32 opener_pid,
|
||||
bool AllocSizeFlag);
|
||||
|
||||
@@ -257,120 +266,116 @@ struct cifs_unix_set_info_args {
|
||||
dev_t device;
|
||||
};
|
||||
|
||||
extern int CIFSSMBUnixSetFileInfo(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon,
|
||||
const struct cifs_unix_set_info_args *args,
|
||||
u16 fid, u32 pid_of_opener);
|
||||
|
||||
extern int CIFSSMBUnixSetPathInfo(const int xid, struct cifsTconInfo *pTcon,
|
||||
extern int CIFSSMBUnixSetPathInfo(const int xid, struct cifs_tcon *pTcon,
|
||||
char *fileName,
|
||||
const struct cifs_unix_set_info_args *args,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
|
||||
extern int CIFSSMBMkDir(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBMkDir(const int xid, struct cifs_tcon *tcon,
|
||||
const char *newName,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSSMBRmDir(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBRmDir(const int xid, struct cifs_tcon *tcon,
|
||||
const char *name, const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSPOSIXDelFile(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSPOSIXDelFile(const int xid, struct cifs_tcon *tcon,
|
||||
const char *name, __u16 type,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSSMBDelFile(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBDelFile(const int xid, struct cifs_tcon *tcon,
|
||||
const char *name,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSSMBRename(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBRename(const int xid, struct cifs_tcon *tcon,
|
||||
const char *fromName, const char *toName,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon,
|
||||
extern int CIFSSMBRenameOpenFile(const int xid, struct cifs_tcon *pTcon,
|
||||
int netfid, const char *target_name,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSCreateHardLink(const int xid,
|
||||
struct cifsTconInfo *tcon,
|
||||
struct cifs_tcon *tcon,
|
||||
const char *fromName, const char *toName,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSUnixCreateHardLink(const int xid,
|
||||
struct cifsTconInfo *tcon,
|
||||
struct cifs_tcon *tcon,
|
||||
const char *fromName, const char *toName,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSUnixCreateSymLink(const int xid,
|
||||
struct cifsTconInfo *tcon,
|
||||
struct cifs_tcon *tcon,
|
||||
const char *fromName, const char *toName,
|
||||
const struct nls_table *nls_codepage);
|
||||
extern int CIFSSMBUnixQuerySymLink(const int xid,
|
||||
struct cifsTconInfo *tcon,
|
||||
struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName, char **syminfo,
|
||||
const struct nls_table *nls_codepage);
|
||||
#ifdef CONFIG_CIFS_SYMLINK_EXPERIMENTAL
|
||||
extern int CIFSSMBQueryReparseLinkInfo(const int xid,
|
||||
struct cifsTconInfo *tcon,
|
||||
struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName,
|
||||
char *symlinkinfo, const int buflen, __u16 fid,
|
||||
const struct nls_table *nls_codepage);
|
||||
#endif /* temporarily unused until cifs_symlink fixed */
|
||||
extern int CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBOpen(const int xid, struct cifs_tcon *tcon,
|
||||
const char *fileName, const int disposition,
|
||||
const int access_flags, const int omode,
|
||||
__u16 *netfid, int *pOplock, FILE_ALL_INFO *,
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
extern int SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int SMBLegacyOpen(const int xid, struct cifs_tcon *tcon,
|
||||
const char *fileName, const int disposition,
|
||||
const int access_flags, const int omode,
|
||||
__u16 *netfid, int *pOplock, FILE_ALL_INFO *,
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
extern int CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSPOSIXCreate(const int xid, struct cifs_tcon *tcon,
|
||||
u32 posix_flags, __u64 mode, __u16 *netfid,
|
||||
FILE_UNIX_BASIC_INFO *pRetData,
|
||||
__u32 *pOplock, const char *name,
|
||||
const struct nls_table *nls_codepage, int remap);
|
||||
extern int CIFSSMBClose(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBClose(const int xid, struct cifs_tcon *tcon,
|
||||
const int smb_file_id);
|
||||
|
||||
extern int CIFSSMBFlush(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBFlush(const int xid, struct cifs_tcon *tcon,
|
||||
const int smb_file_id);
|
||||
|
||||
extern int CIFSSMBRead(const int xid, struct cifsTconInfo *tcon,
|
||||
const int netfid, unsigned int count,
|
||||
const __u64 lseek, unsigned int *nbytes, char **buf,
|
||||
extern int CIFSSMBRead(const int xid, struct cifs_io_parms *io_parms,
|
||||
unsigned int *nbytes, char **buf,
|
||||
int *return_buf_type);
|
||||
extern int CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
|
||||
const int netfid, const unsigned int count,
|
||||
const __u64 lseek, unsigned int *nbytes,
|
||||
const char *buf, const char __user *ubuf,
|
||||
extern int CIFSSMBWrite(const int xid, struct cifs_io_parms *io_parms,
|
||||
unsigned int *nbytes, const char *buf,
|
||||
const char __user *ubuf, const int long_op);
|
||||
extern int CIFSSMBWrite2(const int xid, struct cifs_io_parms *io_parms,
|
||||
unsigned int *nbytes, struct kvec *iov, const int nvec,
|
||||
const int long_op);
|
||||
extern int CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
|
||||
const int netfid, const unsigned int count,
|
||||
const __u64 offset, unsigned int *nbytes,
|
||||
struct kvec *iov, const int nvec, const int long_op);
|
||||
extern int CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSGetSrvInodeNumber(const int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName, __u64 *inode_number,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
|
||||
extern int CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBLock(const int xid, struct cifs_tcon *tcon,
|
||||
const __u16 netfid, const __u64 len,
|
||||
const __u64 offset, const __u32 numUnlock,
|
||||
const __u32 numLock, const __u8 lockType,
|
||||
const bool waitFlag, const __u8 oplock_level);
|
||||
extern int CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBPosixLock(const int xid, struct cifs_tcon *tcon,
|
||||
const __u16 smb_file_id, const int get_flag,
|
||||
const __u64 len, struct file_lock *,
|
||||
const __u16 lock_type, const bool waitFlag);
|
||||
extern int CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon);
|
||||
extern int CIFSSMBTDis(const int xid, struct cifs_tcon *tcon);
|
||||
extern int CIFSSMBEcho(struct TCP_Server_Info *server);
|
||||
extern int CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses);
|
||||
extern int CIFSSMBLogoff(const int xid, struct cifs_ses *ses);
|
||||
|
||||
extern struct cifsSesInfo *sesInfoAlloc(void);
|
||||
extern void sesInfoFree(struct cifsSesInfo *);
|
||||
extern struct cifsTconInfo *tconInfoAlloc(void);
|
||||
extern void tconInfoFree(struct cifsTconInfo *);
|
||||
extern struct cifs_ses *sesInfoAlloc(void);
|
||||
extern void sesInfoFree(struct cifs_ses *);
|
||||
extern struct cifs_tcon *tconInfoAlloc(void);
|
||||
extern void tconInfoFree(struct cifs_tcon *);
|
||||
|
||||
extern int cifs_sign_smb(struct smb_hdr *, struct TCP_Server_Info *, __u32 *);
|
||||
extern int cifs_sign_smb2(struct kvec *iov, int n_vec, struct TCP_Server_Info *,
|
||||
@@ -379,51 +384,51 @@ extern int cifs_verify_signature(struct smb_hdr *,
|
||||
struct TCP_Server_Info *server,
|
||||
__u32 expected_sequence_number);
|
||||
extern int SMBNTencrypt(unsigned char *, unsigned char *, unsigned char *);
|
||||
extern int setup_ntlm_response(struct cifsSesInfo *);
|
||||
extern int setup_ntlmv2_rsp(struct cifsSesInfo *, const struct nls_table *);
|
||||
extern int setup_ntlm_response(struct cifs_ses *);
|
||||
extern int setup_ntlmv2_rsp(struct cifs_ses *, const struct nls_table *);
|
||||
extern int cifs_crypto_shash_allocate(struct TCP_Server_Info *);
|
||||
extern void cifs_crypto_shash_release(struct TCP_Server_Info *);
|
||||
extern int calc_seckey(struct cifsSesInfo *);
|
||||
extern int calc_seckey(struct cifs_ses *);
|
||||
|
||||
#ifdef CONFIG_CIFS_WEAK_PW_HASH
|
||||
extern int calc_lanman_hash(const char *password, const char *cryptkey,
|
||||
bool encrypt, char *lnm_session_key);
|
||||
#endif /* CIFS_WEAK_PW_HASH */
|
||||
#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
|
||||
extern int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBNotify(const int xid, struct cifs_tcon *tcon,
|
||||
const int notify_subdirs, const __u16 netfid,
|
||||
__u32 filter, struct file *file, int multishot,
|
||||
const struct nls_table *nls_codepage);
|
||||
#endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
|
||||
extern int CIFSSMBCopy(int xid,
|
||||
struct cifsTconInfo *source_tcon,
|
||||
struct cifs_tcon *source_tcon,
|
||||
const char *fromName,
|
||||
const __u16 target_tid,
|
||||
const char *toName, const int flags,
|
||||
const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern ssize_t CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
||||
extern ssize_t CIFSSMBQAllEAs(const int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName,
|
||||
const unsigned char *ea_name, char *EAData,
|
||||
size_t bufsize, const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
extern int CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetEA(const int xid, struct cifs_tcon *tcon,
|
||||
const char *fileName, const char *ea_name,
|
||||
const void *ea_value, const __u16 ea_value_len,
|
||||
const struct nls_table *nls_codepage, int remap_special_chars);
|
||||
extern int CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBGetCIFSACL(const int xid, struct cifs_tcon *tcon,
|
||||
__u16 fid, struct cifs_ntsd **acl_inf, __u32 *buflen);
|
||||
extern int CIFSSMBSetCIFSACL(const int, struct cifsTconInfo *, __u16,
|
||||
extern int CIFSSMBSetCIFSACL(const int, struct cifs_tcon *, __u16,
|
||||
struct cifs_ntsd *, __u32);
|
||||
extern int CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBGetPosixACL(const int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName,
|
||||
char *acl_inf, const int buflen, const int acl_type,
|
||||
const struct nls_table *nls_codepage, int remap_special_chars);
|
||||
extern int CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSSMBSetPosixACL(const int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *fileName,
|
||||
const char *local_acl, const int buflen, const int acl_type,
|
||||
const struct nls_table *nls_codepage, int remap_special_chars);
|
||||
extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon,
|
||||
extern int CIFSGetExtAttr(const int xid, struct cifs_tcon *tcon,
|
||||
const int netfid, __u64 *pExtAttrBits, __u64 *pMask);
|
||||
extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb);
|
||||
extern bool CIFSCouldBeMFSymlink(const struct cifs_fattr *fattr);
|
||||
@@ -434,4 +439,22 @@ extern int mdfour(unsigned char *, unsigned char *, int);
|
||||
extern int E_md4hash(const unsigned char *passwd, unsigned char *p16);
|
||||
extern int SMBencrypt(unsigned char *passwd, const unsigned char *c8,
|
||||
unsigned char *p24);
|
||||
|
||||
/* asynchronous write support */
|
||||
struct cifs_writedata {
|
||||
struct kref refcount;
|
||||
enum writeback_sync_modes sync_mode;
|
||||
struct work_struct work;
|
||||
struct cifsFileInfo *cfile;
|
||||
__u64 offset;
|
||||
unsigned int bytes;
|
||||
int result;
|
||||
unsigned int nr_pages;
|
||||
struct page *pages[1];
|
||||
};
|
||||
|
||||
int cifs_async_writev(struct cifs_writedata *wdata);
|
||||
struct cifs_writedata *cifs_writedata_alloc(unsigned int nr_pages);
|
||||
void cifs_writedata_release(struct kref *refcount);
|
||||
|
||||
#endif /* _CIFSPROTO_H */
|
||||
|
||||
+361
-102
File diff suppressed because it is too large
Load Diff
+350
-277
File diff suppressed because it is too large
Load Diff
+16
-17
@@ -50,12 +50,11 @@ build_path_from_dentry(struct dentry *direntry)
|
||||
{
|
||||
struct dentry *temp;
|
||||
int namelen;
|
||||
int pplen;
|
||||
int dfsplen;
|
||||
char *full_path;
|
||||
char dirsep;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
|
||||
struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
|
||||
if (direntry == NULL)
|
||||
return NULL; /* not much we can do if dentry is freed and
|
||||
@@ -63,13 +62,12 @@ build_path_from_dentry(struct dentry *direntry)
|
||||
when the server crashed */
|
||||
|
||||
dirsep = CIFS_DIR_SEP(cifs_sb);
|
||||
pplen = cifs_sb->prepathlen;
|
||||
if (tcon->Flags & SMB_SHARE_IS_IN_DFS)
|
||||
dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1);
|
||||
else
|
||||
dfsplen = 0;
|
||||
cifs_bp_rename_retry:
|
||||
namelen = pplen + dfsplen;
|
||||
namelen = dfsplen;
|
||||
for (temp = direntry; !IS_ROOT(temp);) {
|
||||
namelen += (1 + temp->d_name.len);
|
||||
temp = temp->d_parent;
|
||||
@@ -100,7 +98,7 @@ cifs_bp_rename_retry:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (namelen != pplen + dfsplen) {
|
||||
if (namelen != dfsplen) {
|
||||
cERROR(1, "did not end path lookup where expected namelen is %d",
|
||||
namelen);
|
||||
/* presumably this is only possible if racing with a rename
|
||||
@@ -126,7 +124,6 @@ cifs_bp_rename_retry:
|
||||
}
|
||||
}
|
||||
}
|
||||
strncpy(full_path + dfsplen, CIFS_SB(direntry->d_sb)->prepath, pplen);
|
||||
return full_path;
|
||||
}
|
||||
|
||||
@@ -152,7 +149,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
|
||||
__u16 fileHandle;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
char *full_path = NULL;
|
||||
FILE_ALL_INFO *buf = NULL;
|
||||
struct inode *newinode = NULL;
|
||||
@@ -356,7 +353,8 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
|
||||
int xid;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *pTcon;
|
||||
struct cifs_tcon *pTcon;
|
||||
struct cifs_io_parms io_parms;
|
||||
char *full_path = NULL;
|
||||
struct inode *newinode = NULL;
|
||||
int oplock = 0;
|
||||
@@ -439,16 +437,19 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
|
||||
* timestamps in, but we can reuse it safely */
|
||||
|
||||
pdev = (struct win_dev *)buf;
|
||||
io_parms.netfid = fileHandle;
|
||||
io_parms.pid = current->tgid;
|
||||
io_parms.tcon = pTcon;
|
||||
io_parms.offset = 0;
|
||||
io_parms.length = sizeof(struct win_dev);
|
||||
if (S_ISCHR(mode)) {
|
||||
memcpy(pdev->type, "IntxCHR", 8);
|
||||
pdev->major =
|
||||
cpu_to_le64(MAJOR(device_number));
|
||||
pdev->minor =
|
||||
cpu_to_le64(MINOR(device_number));
|
||||
rc = CIFSSMBWrite(xid, pTcon,
|
||||
fileHandle,
|
||||
sizeof(struct win_dev),
|
||||
0, &bytes_written, (char *)pdev,
|
||||
rc = CIFSSMBWrite(xid, &io_parms,
|
||||
&bytes_written, (char *)pdev,
|
||||
NULL, 0);
|
||||
} else if (S_ISBLK(mode)) {
|
||||
memcpy(pdev->type, "IntxBLK", 8);
|
||||
@@ -456,10 +457,8 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
|
||||
cpu_to_le64(MAJOR(device_number));
|
||||
pdev->minor =
|
||||
cpu_to_le64(MINOR(device_number));
|
||||
rc = CIFSSMBWrite(xid, pTcon,
|
||||
fileHandle,
|
||||
sizeof(struct win_dev),
|
||||
0, &bytes_written, (char *)pdev,
|
||||
rc = CIFSSMBWrite(xid, &io_parms,
|
||||
&bytes_written, (char *)pdev,
|
||||
NULL, 0);
|
||||
} /* else if (S_ISFIFO) */
|
||||
CIFSSMBClose(xid, pTcon, fileHandle);
|
||||
@@ -486,7 +485,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
|
||||
bool posix_open = false;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *pTcon;
|
||||
struct cifs_tcon *pTcon;
|
||||
struct cifsFileInfo *cfile;
|
||||
struct inode *newInode = NULL;
|
||||
char *full_path = NULL;
|
||||
|
||||
+193
-183
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -40,7 +40,7 @@ void cifs_fscache_release_client_cookie(struct TCP_Server_Info *server)
|
||||
server->fscache = NULL;
|
||||
}
|
||||
|
||||
void cifs_fscache_get_super_cookie(struct cifsTconInfo *tcon)
|
||||
void cifs_fscache_get_super_cookie(struct cifs_tcon *tcon)
|
||||
{
|
||||
struct TCP_Server_Info *server = tcon->ses->server;
|
||||
|
||||
@@ -51,7 +51,7 @@ void cifs_fscache_get_super_cookie(struct cifsTconInfo *tcon)
|
||||
server->fscache, tcon->fscache);
|
||||
}
|
||||
|
||||
void cifs_fscache_release_super_cookie(struct cifsTconInfo *tcon)
|
||||
void cifs_fscache_release_super_cookie(struct cifs_tcon *tcon)
|
||||
{
|
||||
cFYI(1, "CIFS: releasing superblock cookie (0x%p)", tcon->fscache);
|
||||
fscache_relinquish_cookie(tcon->fscache, 0);
|
||||
@@ -62,7 +62,7 @@ static void cifs_fscache_enable_inode_cookie(struct inode *inode)
|
||||
{
|
||||
struct cifsInodeInfo *cifsi = CIFS_I(inode);
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
|
||||
if (cifsi->fscache)
|
||||
return;
|
||||
|
||||
+4
-4
@@ -40,8 +40,8 @@ extern void cifs_fscache_unregister(void);
|
||||
*/
|
||||
extern void cifs_fscache_get_client_cookie(struct TCP_Server_Info *);
|
||||
extern void cifs_fscache_release_client_cookie(struct TCP_Server_Info *);
|
||||
extern void cifs_fscache_get_super_cookie(struct cifsTconInfo *);
|
||||
extern void cifs_fscache_release_super_cookie(struct cifsTconInfo *);
|
||||
extern void cifs_fscache_get_super_cookie(struct cifs_tcon *);
|
||||
extern void cifs_fscache_release_super_cookie(struct cifs_tcon *);
|
||||
|
||||
extern void cifs_fscache_release_inode_cookie(struct inode *);
|
||||
extern void cifs_fscache_set_inode_cookie(struct inode *, struct file *);
|
||||
@@ -99,9 +99,9 @@ static inline void
|
||||
cifs_fscache_get_client_cookie(struct TCP_Server_Info *server) {}
|
||||
static inline void
|
||||
cifs_fscache_release_client_cookie(struct TCP_Server_Info *server) {}
|
||||
static inline void cifs_fscache_get_super_cookie(struct cifsTconInfo *tcon) {}
|
||||
static inline void cifs_fscache_get_super_cookie(struct cifs_tcon *tcon) {}
|
||||
static inline void
|
||||
cifs_fscache_release_super_cookie(struct cifsTconInfo *tcon) {}
|
||||
cifs_fscache_release_super_cookie(struct cifs_tcon *tcon) {}
|
||||
|
||||
static inline void cifs_fscache_release_inode_cookie(struct inode *inode) {}
|
||||
static inline void cifs_fscache_set_inode_cookie(struct inode *inode,
|
||||
|
||||
+51
-41
@@ -295,7 +295,7 @@ int cifs_get_file_info_unix(struct file *filp)
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct cifsFileInfo *cfile = filp->private_data;
|
||||
struct cifsTconInfo *tcon = tlink_tcon(cfile->tlink);
|
||||
struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
|
||||
|
||||
xid = GetXid();
|
||||
rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->netfid, &find_data);
|
||||
@@ -318,7 +318,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
||||
int rc;
|
||||
FILE_UNIX_BASIC_INFO find_data;
|
||||
struct cifs_fattr fattr;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
struct tcon_link *tlink;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
|
||||
@@ -373,7 +373,8 @@ cifs_sfu_type(struct cifs_fattr *fattr, const unsigned char *path,
|
||||
int oplock = 0;
|
||||
__u16 netfid;
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
struct cifs_io_parms io_parms;
|
||||
char buf[24];
|
||||
unsigned int bytes_read;
|
||||
char *pbuf;
|
||||
@@ -405,9 +406,13 @@ cifs_sfu_type(struct cifs_fattr *fattr, const unsigned char *path,
|
||||
if (rc == 0) {
|
||||
int buf_type = CIFS_NO_BUFFER;
|
||||
/* Read header */
|
||||
rc = CIFSSMBRead(xid, tcon, netfid,
|
||||
24 /* length */, 0 /* offset */,
|
||||
&bytes_read, &pbuf, &buf_type);
|
||||
io_parms.netfid = netfid;
|
||||
io_parms.pid = current->tgid;
|
||||
io_parms.tcon = tcon;
|
||||
io_parms.offset = 0;
|
||||
io_parms.length = 24;
|
||||
rc = CIFSSMBRead(xid, &io_parms, &bytes_read, &pbuf,
|
||||
&buf_type);
|
||||
if ((rc == 0) && (bytes_read >= 8)) {
|
||||
if (memcmp("IntxBLK", pbuf, 8) == 0) {
|
||||
cFYI(1, "Block device");
|
||||
@@ -468,7 +473,7 @@ static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
|
||||
char ea_value[4];
|
||||
__u32 mode;
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
|
||||
tlink = cifs_sb_tlink(cifs_sb);
|
||||
if (IS_ERR(tlink))
|
||||
@@ -502,7 +507,7 @@ static void
|
||||
cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
|
||||
struct cifs_sb_info *cifs_sb, bool adjust_tz)
|
||||
{
|
||||
struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
|
||||
memset(fattr, 0, sizeof(*fattr));
|
||||
fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
|
||||
@@ -553,7 +558,7 @@ int cifs_get_file_info(struct file *filp)
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct cifsFileInfo *cfile = filp->private_data;
|
||||
struct cifsTconInfo *tcon = tlink_tcon(cfile->tlink);
|
||||
struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
|
||||
|
||||
xid = GetXid();
|
||||
rc = CIFSSMBQFileInfo(xid, tcon, cfile->netfid, &find_data);
|
||||
@@ -590,7 +595,7 @@ int cifs_get_inode_info(struct inode **pinode,
|
||||
struct super_block *sb, int xid, const __u16 *pfid)
|
||||
{
|
||||
int rc = 0, tmprc;
|
||||
struct cifsTconInfo *pTcon;
|
||||
struct cifs_tcon *pTcon;
|
||||
struct tcon_link *tlink;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
char *buf = NULL;
|
||||
@@ -735,10 +740,10 @@ static const struct inode_operations cifs_ipc_inode_ops = {
|
||||
.lookup = cifs_lookup,
|
||||
};
|
||||
|
||||
char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb,
|
||||
struct cifsTconInfo *tcon)
|
||||
char *cifs_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
|
||||
struct cifs_tcon *tcon)
|
||||
{
|
||||
int pplen = cifs_sb->prepathlen;
|
||||
int pplen = vol->prepath ? strlen(vol->prepath) : 0;
|
||||
int dfsplen;
|
||||
char *full_path = NULL;
|
||||
|
||||
@@ -772,7 +777,7 @@ char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb,
|
||||
}
|
||||
}
|
||||
}
|
||||
strncpy(full_path + dfsplen, cifs_sb->prepath, pplen);
|
||||
strncpy(full_path + dfsplen, vol->prepath, pplen);
|
||||
full_path[dfsplen + pplen] = 0; /* add trailing null */
|
||||
return full_path;
|
||||
}
|
||||
@@ -884,19 +889,13 @@ struct inode *cifs_root_iget(struct super_block *sb)
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
struct inode *inode = NULL;
|
||||
long rc;
|
||||
char *full_path;
|
||||
struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
|
||||
full_path = cifs_build_path_to_root(cifs_sb, tcon);
|
||||
if (full_path == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
|
||||
xid = GetXid();
|
||||
if (tcon->unix_ext)
|
||||
rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
|
||||
rc = cifs_get_inode_info_unix(&inode, "", sb, xid);
|
||||
else
|
||||
rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
|
||||
xid, NULL);
|
||||
rc = cifs_get_inode_info(&inode, "", NULL, sb, xid, NULL);
|
||||
|
||||
if (!inode) {
|
||||
inode = ERR_PTR(rc);
|
||||
@@ -922,7 +921,6 @@ struct inode *cifs_root_iget(struct super_block *sb)
|
||||
}
|
||||
|
||||
out:
|
||||
kfree(full_path);
|
||||
/* can not call macro FreeXid here since in a void func
|
||||
* TODO: This is no longer true
|
||||
*/
|
||||
@@ -943,7 +941,7 @@ cifs_set_file_info(struct inode *inode, struct iattr *attrs, int xid,
|
||||
struct cifsInodeInfo *cifsInode = CIFS_I(inode);
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct tcon_link *tlink = NULL;
|
||||
struct cifsTconInfo *pTcon;
|
||||
struct cifs_tcon *pTcon;
|
||||
FILE_BASIC_INFO info_buf;
|
||||
|
||||
if (attrs == NULL)
|
||||
@@ -1061,7 +1059,7 @@ cifs_rename_pending_delete(char *full_path, struct dentry *dentry, int xid)
|
||||
struct cifsInodeInfo *cifsInode = CIFS_I(inode);
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
__u32 dosattr, origattr;
|
||||
FILE_BASIC_INFO *info_buf = NULL;
|
||||
|
||||
@@ -1179,7 +1177,7 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry)
|
||||
struct super_block *sb = dir->i_sb;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
struct iattr *attrs = NULL;
|
||||
__u32 dosattr = 0, origattr = 0;
|
||||
|
||||
@@ -1277,7 +1275,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
|
||||
int xid;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *pTcon;
|
||||
struct cifs_tcon *pTcon;
|
||||
char *full_path = NULL;
|
||||
struct inode *newinode = NULL;
|
||||
struct cifs_fattr fattr;
|
||||
@@ -1455,7 +1453,7 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
|
||||
int xid;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *pTcon;
|
||||
struct cifs_tcon *pTcon;
|
||||
char *full_path = NULL;
|
||||
struct cifsInodeInfo *cifsInode;
|
||||
|
||||
@@ -1512,7 +1510,7 @@ cifs_do_rename(int xid, struct dentry *from_dentry, const char *fromPath,
|
||||
{
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb);
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *pTcon;
|
||||
struct cifs_tcon *pTcon;
|
||||
__u16 srcfid;
|
||||
int oplock, rc;
|
||||
|
||||
@@ -1564,7 +1562,7 @@ int cifs_rename(struct inode *source_dir, struct dentry *source_dentry,
|
||||
char *toName = NULL;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *tcon;
|
||||
struct cifs_tcon *tcon;
|
||||
FILE_UNIX_BASIC_INFO *info_buf_source = NULL;
|
||||
FILE_UNIX_BASIC_INFO *info_buf_target;
|
||||
int xid, rc, tmprc;
|
||||
@@ -1794,7 +1792,7 @@ int cifs_getattr(struct vfsmount *mnt, struct dentry *dentry,
|
||||
struct kstat *stat)
|
||||
{
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
|
||||
struct cifsTconInfo *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct inode *inode = dentry->d_inode;
|
||||
int rc;
|
||||
|
||||
@@ -1872,7 +1870,8 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs,
|
||||
struct cifsInodeInfo *cifsInode = CIFS_I(inode);
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct tcon_link *tlink = NULL;
|
||||
struct cifsTconInfo *pTcon = NULL;
|
||||
struct cifs_tcon *pTcon = NULL;
|
||||
struct cifs_io_parms io_parms;
|
||||
|
||||
/*
|
||||
* To avoid spurious oplock breaks from server, in the case of
|
||||
@@ -1894,8 +1893,14 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs,
|
||||
cFYI(1, "SetFSize for attrs rc = %d", rc);
|
||||
if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
|
||||
unsigned int bytes_written;
|
||||
rc = CIFSSMBWrite(xid, pTcon, nfid, 0, attrs->ia_size,
|
||||
&bytes_written, NULL, NULL, 1);
|
||||
|
||||
io_parms.netfid = nfid;
|
||||
io_parms.pid = npid;
|
||||
io_parms.tcon = pTcon;
|
||||
io_parms.offset = 0;
|
||||
io_parms.length = attrs->ia_size;
|
||||
rc = CIFSSMBWrite(xid, &io_parms, &bytes_written,
|
||||
NULL, NULL, 1);
|
||||
cFYI(1, "Wrt seteof rc %d", rc);
|
||||
}
|
||||
} else
|
||||
@@ -1930,10 +1935,15 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs,
|
||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
if (rc == 0) {
|
||||
unsigned int bytes_written;
|
||||
rc = CIFSSMBWrite(xid, pTcon, netfid, 0,
|
||||
attrs->ia_size,
|
||||
&bytes_written, NULL,
|
||||
NULL, 1);
|
||||
|
||||
io_parms.netfid = netfid;
|
||||
io_parms.pid = current->tgid;
|
||||
io_parms.tcon = pTcon;
|
||||
io_parms.offset = 0;
|
||||
io_parms.length = attrs->ia_size;
|
||||
rc = CIFSSMBWrite(xid, &io_parms,
|
||||
&bytes_written,
|
||||
NULL, NULL, 1);
|
||||
cFYI(1, "wrt seteof rc %d", rc);
|
||||
CIFSSMBClose(xid, pTcon, netfid);
|
||||
}
|
||||
@@ -1961,7 +1971,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
|
||||
struct cifsInodeInfo *cifsInode = CIFS_I(inode);
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct tcon_link *tlink;
|
||||
struct cifsTconInfo *pTcon;
|
||||
struct cifs_tcon *pTcon;
|
||||
struct cifs_unix_set_info_args *args = NULL;
|
||||
struct cifsFileInfo *open_file;
|
||||
|
||||
@@ -2247,7 +2257,7 @@ cifs_setattr(struct dentry *direntry, struct iattr *attrs)
|
||||
{
|
||||
struct inode *inode = direntry->d_inode;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct cifsTconInfo *pTcon = cifs_sb_master_tcon(cifs_sb);
|
||||
struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb);
|
||||
|
||||
if (pTcon->unix_ext)
|
||||
return cifs_setattr_unix(direntry, attrs);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user