mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 04:06:22 +00:00
[CIFS] DFS build fixes
Also includes a few minor changes suggested by Christoph Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
6d5ae0deb1
commit
366781c196
6 changed files with 61 additions and 31 deletions
|
@ -3,8 +3,9 @@
|
||||||
* traversal via DFS junction point
|
* traversal via DFS junction point
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007 Igor Mammedov
|
* Copyright (c) 2007 Igor Mammedov
|
||||||
|
* Copyright (C) International Business Machines Corp., 2008
|
||||||
* Author(s): Igor Mammedov (niallain@gmail.com)
|
* Author(s): Igor Mammedov (niallain@gmail.com)
|
||||||
*
|
* Steve French (sfrench@us.ibm.com)
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version
|
* as published by the Free Software Foundation; either version
|
||||||
|
@ -107,8 +108,9 @@ static char *cifs_get_share_name(const char *node_name)
|
||||||
* Returns: pointer to new mount options or ERR_PTR.
|
* Returns: pointer to new mount options or ERR_PTR.
|
||||||
* Caller is responcible for freeing retunrned value if it is not error.
|
* Caller is responcible for freeing retunrned value if it is not error.
|
||||||
*/
|
*/
|
||||||
char *compose_mount_options(const char *sb_mountdata, const char *ref_unc,
|
static char *compose_mount_options(const char *sb_mountdata,
|
||||||
char **devname)
|
const char *ref_unc,
|
||||||
|
char **devname)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
char *mountdata;
|
char *mountdata;
|
||||||
|
@ -188,13 +190,13 @@ compose_mount_options_out:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct vfsmount *cifs_dfs_do_refmount(const struct vfsmount *mnt_parent,
|
static struct vfsmount *cifs_dfs_do_refmount(const struct vfsmount *mnt_parent,
|
||||||
struct dentry *dentry, char *ref_unc)
|
struct dentry *dentry, char *ref_unc)
|
||||||
{
|
{
|
||||||
struct cifs_sb_info *cifs_sb;
|
struct cifs_sb_info *cifs_sb;
|
||||||
struct vfsmount *mnt;
|
struct vfsmount *mnt;
|
||||||
char *mountdata;
|
char *mountdata;
|
||||||
char *devname;
|
char *devname = NULL;
|
||||||
|
|
||||||
cifs_sb = CIFS_SB(dentry->d_inode->i_sb);
|
cifs_sb = CIFS_SB(dentry->d_inode->i_sb);
|
||||||
mountdata = compose_mount_options(cifs_sb->mountdata,
|
mountdata = compose_mount_options(cifs_sb->mountdata,
|
||||||
|
@ -278,7 +280,7 @@ static int add_mount_helper(struct vfsmount *newmnt, struct nameidata *nd,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_referral(const struct dfs_info3_param *ref)
|
static void dump_referral(const struct dfs_info3_param *ref)
|
||||||
{
|
{
|
||||||
cFYI(1, ("DFS: ref path: %s", ref->path_name));
|
cFYI(1, ("DFS: ref path: %s", ref->path_name));
|
||||||
cFYI(1, ("DFS: node path: %s", ref->node_name));
|
cFYI(1, ("DFS: node path: %s", ref->node_name));
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* fs/cifs/cifsglob.h
|
* fs/cifs/cifsglob.h
|
||||||
*
|
*
|
||||||
* Copyright (C) International Business Machines Corp., 2002,2007
|
* Copyright (C) International Business Machines Corp., 2002,2008
|
||||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||||
* Jeremy Allison (jra@samba.org)
|
* Jeremy Allison (jra@samba.org)
|
||||||
*
|
*
|
||||||
|
@ -69,14 +69,6 @@
|
||||||
#define XATTR_DOS_ATTRIB "user.DOSATTRIB"
|
#define XATTR_DOS_ATTRIB "user.DOSATTRIB"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* This information is kept on every Server we know about.
|
|
||||||
*
|
|
||||||
* Some things to note:
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CIFS vfs client Status information (based on what we know.)
|
* CIFS vfs client Status information (based on what we know.)
|
||||||
*/
|
*/
|
||||||
|
@ -460,6 +452,37 @@ struct dir_notify_req {
|
||||||
struct file *pfile;
|
struct file *pfile;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct dfs_info3_param {
|
||||||
|
int flags; /* DFSREF_REFERRAL_SERVER, DFSREF_STORAGE_SERVER*/
|
||||||
|
int PathConsumed;
|
||||||
|
int server_type;
|
||||||
|
int ref_flag;
|
||||||
|
char *path_name;
|
||||||
|
char *node_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void free_dfs_info_param(struct dfs_info3_param *param)
|
||||||
|
{
|
||||||
|
if (param) {
|
||||||
|
kfree(param->path_name);
|
||||||
|
kfree(param->node_name);
|
||||||
|
kfree(param);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void free_dfs_info_array(struct dfs_info3_param *param,
|
||||||
|
int number_of_items)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if ((number_of_items == 0) || (param == NULL))
|
||||||
|
return;
|
||||||
|
for (i = 0; i < number_of_items; i++) {
|
||||||
|
kfree(param[i].path_name);
|
||||||
|
kfree(param[i].node_name);
|
||||||
|
}
|
||||||
|
kfree(param);
|
||||||
|
}
|
||||||
|
|
||||||
#define MID_FREE 0
|
#define MID_FREE 0
|
||||||
#define MID_REQUEST_ALLOCATED 1
|
#define MID_REQUEST_ALLOCATED 1
|
||||||
#define MID_REQUEST_SUBMITTED 2
|
#define MID_REQUEST_SUBMITTED 2
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* fs/cifs/cifsproto.h
|
* fs/cifs/cifsproto.h
|
||||||
*
|
*
|
||||||
* Copyright (c) International Business Machines Corp., 2002,2007
|
* Copyright (c) International Business Machines Corp., 2002,2008
|
||||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
|
@ -156,7 +156,7 @@ extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
|
||||||
const char *old_path,
|
const char *old_path,
|
||||||
const struct nls_table *nls_codepage,
|
const struct nls_table *nls_codepage,
|
||||||
unsigned int *pnum_referrals,
|
unsigned int *pnum_referrals,
|
||||||
unsigned char **preferrals,
|
struct dfs_info3_param **preferrals,
|
||||||
int remap);
|
int remap);
|
||||||
extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
|
extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
|
||||||
struct super_block *sb, struct smb_vol *vol);
|
struct super_block *sb, struct smb_vol *vol);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* fs/cifs/connect.c
|
* fs/cifs/connect.c
|
||||||
*
|
*
|
||||||
* Copyright (C) International Business Machines Corp., 2002,2007
|
* Copyright (C) International Business Machines Corp., 2002,2008
|
||||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
|
@ -1410,7 +1410,7 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
|
||||||
const char *old_path, const struct nls_table *nls_codepage,
|
const char *old_path, const struct nls_table *nls_codepage,
|
||||||
int remap)
|
int remap)
|
||||||
{
|
{
|
||||||
unsigned char *referrals = NULL;
|
struct dfs_info3_param *referrals = NULL;
|
||||||
unsigned int num_referrals;
|
unsigned int num_referrals;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
@ -1429,12 +1429,14 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
|
||||||
int
|
int
|
||||||
get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
|
get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
|
||||||
const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
|
const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
|
||||||
unsigned char **preferrals, int remap)
|
struct dfs_info3_param **preferrals, int remap)
|
||||||
{
|
{
|
||||||
char *temp_unc;
|
char *temp_unc;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
unsigned char *targetUNCs;
|
||||||
|
|
||||||
*pnum_referrals = 0;
|
*pnum_referrals = 0;
|
||||||
|
*preferrals = NULL;
|
||||||
|
|
||||||
if (pSesInfo->ipc_tid == 0) {
|
if (pSesInfo->ipc_tid == 0) {
|
||||||
temp_unc = kmalloc(2 /* for slashes */ +
|
temp_unc = kmalloc(2 /* for slashes */ +
|
||||||
|
@ -1454,8 +1456,10 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
|
||||||
kfree(temp_unc);
|
kfree(temp_unc);
|
||||||
}
|
}
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, preferrals,
|
rc = CIFSGetDFSRefer(xid, pSesInfo, old_path, &targetUNCs,
|
||||||
pnum_referrals, nls_codepage, remap);
|
pnum_referrals, nls_codepage, remap);
|
||||||
|
/* BB map targetUNCs to dfs_info3 structures, here or
|
||||||
|
in CIFSGetDFSRefer BB */
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,13 +64,14 @@ struct key_type key_type_dns_resolver = {
|
||||||
* return 0 on success
|
* return 0 on success
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) {
|
dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
|
||||||
|
{
|
||||||
int rc = -EAGAIN;
|
int rc = -EAGAIN;
|
||||||
struct key *rkey;
|
struct key *rkey;
|
||||||
char *name;
|
char *name;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if ((!ip_addr) || (!unc))
|
if (!ip_addr || !unc)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* search for server name delimiter */
|
/* search for server name delimiter */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* fs/cifs/link.c
|
* fs/cifs/link.c
|
||||||
*
|
*
|
||||||
* Copyright (C) International Business Machines Corp., 2002,2003
|
* Copyright (C) International Business Machines Corp., 2002,2008
|
||||||
* Author(s): Steve French (sfrench@us.ibm.com)
|
* Author(s): Steve French (sfrench@us.ibm.com)
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or modify
|
* This library is free software; you can redistribute it and/or modify
|
||||||
|
@ -236,8 +236,6 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
|
||||||
char *full_path = NULL;
|
char *full_path = NULL;
|
||||||
char *tmp_path = NULL;
|
char *tmp_path = NULL;
|
||||||
char *tmpbuffer;
|
char *tmpbuffer;
|
||||||
unsigned char *referrals = NULL;
|
|
||||||
unsigned int num_referrals = 0;
|
|
||||||
int len;
|
int len;
|
||||||
__u16 fid;
|
__u16 fid;
|
||||||
|
|
||||||
|
@ -297,8 +295,11 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
|
||||||
cFYI(1, ("Error closing junction point "
|
cFYI(1, ("Error closing junction point "
|
||||||
"(open for ioctl)"));
|
"(open for ioctl)"));
|
||||||
}
|
}
|
||||||
|
/* BB unwind this long, nested function, or remove BB */
|
||||||
if (rc == -EIO) {
|
if (rc == -EIO) {
|
||||||
/* Query if DFS Junction */
|
/* Query if DFS Junction */
|
||||||
|
unsigned int num_referrals = 0;
|
||||||
|
struct dfs_info3_param *refs = NULL;
|
||||||
tmp_path =
|
tmp_path =
|
||||||
kmalloc(MAX_TREE_SIZE + MAX_PATHCONF + 1,
|
kmalloc(MAX_TREE_SIZE + MAX_PATHCONF + 1,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
@ -310,7 +311,7 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
|
||||||
rc = get_dfs_path(xid, pTcon->ses,
|
rc = get_dfs_path(xid, pTcon->ses,
|
||||||
tmp_path,
|
tmp_path,
|
||||||
cifs_sb->local_nls,
|
cifs_sb->local_nls,
|
||||||
&num_referrals, &referrals,
|
&num_referrals, &refs,
|
||||||
cifs_sb->mnt_cifs_flags &
|
cifs_sb->mnt_cifs_flags &
|
||||||
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||||
cFYI(1, ("Get DFS for %s rc = %d ",
|
cFYI(1, ("Get DFS for %s rc = %d ",
|
||||||
|
@ -320,14 +321,13 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
|
||||||
else {
|
else {
|
||||||
cFYI(1, ("num referral: %d",
|
cFYI(1, ("num referral: %d",
|
||||||
num_referrals));
|
num_referrals));
|
||||||
if (referrals) {
|
if (refs && refs->path_name) {
|
||||||
cFYI(1,("referral string: %s", referrals));
|
|
||||||
strncpy(tmpbuffer,
|
strncpy(tmpbuffer,
|
||||||
referrals,
|
refs->path_name,
|
||||||
len-1);
|
len-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
kfree(referrals);
|
kfree(refs);
|
||||||
kfree(tmp_path);
|
kfree(tmp_path);
|
||||||
}
|
}
|
||||||
/* BB add code like else decode referrals
|
/* BB add code like else decode referrals
|
||||||
|
|
Loading…
Reference in a new issue