diff options
Diffstat (limited to 'fs/cifs/misc.c')
| -rw-r--r-- | fs/cifs/misc.c | 68 | 
1 files changed, 52 insertions, 16 deletions
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index 8a41f4eba726..bee203055b30 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c @@ -111,21 +111,27 @@ struct cifs_tcon *  tconInfoAlloc(void)  {  	struct cifs_tcon *ret_buf; -	ret_buf = kzalloc(sizeof(struct cifs_tcon), GFP_KERNEL); -	if (ret_buf) { -		atomic_inc(&tconInfoAllocCount); -		ret_buf->tidStatus = CifsNew; -		++ret_buf->tc_count; -		INIT_LIST_HEAD(&ret_buf->openFileList); -		INIT_LIST_HEAD(&ret_buf->tcon_list); -		spin_lock_init(&ret_buf->open_file_lock); -		mutex_init(&ret_buf->crfid.fid_mutex); -		ret_buf->crfid.fid = kzalloc(sizeof(struct cifs_fid), -					     GFP_KERNEL); -		spin_lock_init(&ret_buf->stat_lock); -		atomic_set(&ret_buf->num_local_opens, 0); -		atomic_set(&ret_buf->num_remote_opens, 0); + +	ret_buf = kzalloc(sizeof(*ret_buf), GFP_KERNEL); +	if (!ret_buf) +		return NULL; +	ret_buf->crfid.fid = kzalloc(sizeof(*ret_buf->crfid.fid), GFP_KERNEL); +	if (!ret_buf->crfid.fid) { +		kfree(ret_buf); +		return NULL;  	} + +	atomic_inc(&tconInfoAllocCount); +	ret_buf->tidStatus = CifsNew; +	++ret_buf->tc_count; +	INIT_LIST_HEAD(&ret_buf->openFileList); +	INIT_LIST_HEAD(&ret_buf->tcon_list); +	spin_lock_init(&ret_buf->open_file_lock); +	mutex_init(&ret_buf->crfid.fid_mutex); +	spin_lock_init(&ret_buf->stat_lock); +	atomic_set(&ret_buf->num_local_opens, 0); +	atomic_set(&ret_buf->num_remote_opens, 0); +  	return ret_buf;  } @@ -140,6 +146,9 @@ tconInfoFree(struct cifs_tcon *buf_to_free)  	kfree(buf_to_free->nativeFileSystem);  	kzfree(buf_to_free->password);  	kfree(buf_to_free->crfid.fid); +#ifdef CONFIG_CIFS_DFS_UPCALL +	kfree(buf_to_free->dfs_path); +#endif  	kfree(buf_to_free);  } @@ -525,9 +534,17 @@ void  cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb)  {  	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { +		struct cifs_tcon *tcon = NULL; + +		if (cifs_sb->master_tlink) +			tcon = cifs_sb_master_tcon(cifs_sb); +  		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM; -		cifs_dbg(VFS, "Autodisabling the use of server inode numbers on %s. This server doesn't seem to support them properly. Hardlinks will not be recognized on this mount. Consider mounting with the \"noserverino\" option to silence this message.\n", -			 cifs_sb_master_tcon(cifs_sb)->treeName); +		cifs_dbg(VFS, "Autodisabling the use of server inode numbers on %s.\n", +			 tcon ? tcon->treeName : "new server"); +		cifs_dbg(VFS, "The server doesn't seem to support them properly or the files might be on different servers (DFS).\n"); +		cifs_dbg(VFS, "Hardlinks will not be recognized on this mount. Consider mounting with the \"noserverino\" option to silence this message.\n"); +  	}  } @@ -732,6 +749,8 @@ parse_dfs_referrals(struct get_dfs_referral_rsp *rsp, u32 rsp_size,  			goto parse_DFS_referrals_exit;  		} +		node->ttl = le32_to_cpu(ref->TimeToLive); +  		ref++;  	} @@ -933,3 +952,20 @@ void rqst_page_get_length(struct smb_rqst *rqst, unsigned int page,  	else if (page == 0)  		*len = rqst->rq_pagesz - rqst->rq_offset;  } + +void extract_unc_hostname(const char *unc, const char **h, size_t *len) +{ +	const char *end; + +	/* skip initial slashes */ +	while (*unc && (*unc == '\\' || *unc == '/')) +		unc++; + +	end = unc; + +	while (*end && !(*end == '\\' || *end == '/')) +		end++; + +	*h = unc; +	*len = end - unc; +}  | 
