Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e2ce4da authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6:
  [CIFS] CIFS should honour umask
  [CIFS] Missing flag on negprot needed for some servers to force packet signing
  [CIFS] whitespace cleanup part 2
  [CIFS] whitespace cleanup
  [CIFS] fix mempool destroy done in wrong order in cifs error path
  [CIFS] typo in previous patch
  [CIFS] Fix oops on failed cifs mount (in kthread_stop)
parents 3334500b 3ce53fc4
Loading
Loading
Loading
Loading
+129 −123
Original line number Original line Diff line number Diff line
@@ -101,7 +101,6 @@ void cifs_dump_mids(struct TCP_Server_Info * server)
					mid_entry->resp_buf,
					mid_entry->resp_buf,
					62 /* fixme */);
					62 /* fixme */);
			}
			}
			
		}
		}
	}
	}
	spin_unlock(&GlobalMid_Lock);
	spin_unlock(&GlobalMid_Lock);
@@ -131,7 +130,8 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
	buf += length;
	buf += length;
	length = sprintf(buf, "CIFS Version %s\n", CIFS_VERSION);
	length = sprintf(buf, "CIFS Version %s\n", CIFS_VERSION);
	buf += length;
	buf += length;
	length = sprintf(buf,"Active VFS Requests: %d\n", GlobalTotalActiveXid);
	length = sprintf(buf,
		"Active VFS Requests: %d\n", GlobalTotalActiveXid);
	buf += length;
	buf += length;
	length = sprintf(buf, "Servers:");
	length = sprintf(buf, "Servers:");
	buf += length;
	buf += length;
@@ -149,7 +149,9 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
		} else {
		} else {
			length =
			length =
			    sprintf(buf,
			    sprintf(buf,
				    "\n%d) Name: %s  Domain: %s Mounts: %d OS: %s  \n\tNOS: %s\tCapability: 0x%x\n\tSMB session status: %d\t",
				    "\n%d) Name: %s  Domain: %s Mounts: %d OS:"
				    " %s  \n\tNOS: %s\tCapability: 0x%x\n\tSMB"
				    " session status: %d\t",
				i, ses->serverName, ses->serverDomain,
				i, ses->serverName, ses->serverDomain,
				atomic_read(&ses->inUse),
				atomic_read(&ses->inUse),
				ses->serverOS, ses->serverNOS,
				ses->serverOS, ses->serverNOS,
@@ -157,7 +159,8 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
			buf += length;
			buf += length;
		}
		}
		if (ses->server) {
		if (ses->server) {
			buf += sprintf(buf, "TCP status: %d\n\tLocal Users To Server: %d SecMode: 0x%x Req On Wire: %d",
			buf += sprintf(buf, "TCP status: %d\n\tLocal Users To "
				    "Server: %d SecMode: 0x%x Req On Wire: %d",
				ses->server->tcpStatus,
				ses->server->tcpStatus,
				atomic_read(&ses->server->socketUseCount),
				atomic_read(&ses->server->socketUseCount),
				ses->server->secMode,
				ses->server->secMode,
@@ -178,7 +181,9 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
					mid_q_entry,
					mid_q_entry,
					qhead);
					qhead);
				if (mid_entry) {
				if (mid_entry) {
					length = sprintf(buf,"State: %d com: %d pid: %d tsk: %p mid %d\n",
					length = sprintf(buf,
							"State: %d com: %d pid:"
							" %d tsk: %p mid %d\n",
							mid_entry->midState,
							mid_entry->midState,
							(int)mid_entry->command,
							(int)mid_entry->command,
							mid_entry->pid,
							mid_entry->pid,
@@ -207,7 +212,8 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
		dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
		dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
		length =
		length =
		    sprintf(buf,
		    sprintf(buf,
			    "\n%d) %s Uses: %d Type: %s DevInfo: 0x%x Attributes: 0x%x\nPathComponentMax: %d Status: %d",
			    "\n%d) %s Uses: %d Type: %s DevInfo: 0x%x "
			    "Attributes: 0x%x\nPathComponentMax: %d Status: %d",
			    i, tcon->treeName,
			    i, tcon->treeName,
			    atomic_read(&tcon->useCount),
			    atomic_read(&tcon->useCount),
			    tcon->nativeFileSystem,
			    tcon->nativeFileSystem,
+1 −1
Original line number Original line Diff line number Diff line
@@ -825,8 +825,8 @@ cifs_init_mids(void)
				sizeof (struct oplock_q_entry), 0,
				sizeof (struct oplock_q_entry), 0,
				SLAB_HWCACHE_ALIGN, NULL, NULL);
				SLAB_HWCACHE_ALIGN, NULL, NULL);
	if (cifs_oplock_cachep == NULL) {
	if (cifs_oplock_cachep == NULL) {
		kmem_cache_destroy(cifs_mid_cachep);
		mempool_destroy(cifs_mid_poolp);
		mempool_destroy(cifs_mid_poolp);
		kmem_cache_destroy(cifs_mid_cachep);
		return -ENOMEM;
		return -ENOMEM;
	}
	}


+2 −2
Original line number Original line Diff line number Diff line
@@ -433,7 +433,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
	cFYI(1,("secFlags 0x%x",secFlags));
	cFYI(1,("secFlags 0x%x",secFlags));


	pSMB->hdr.Mid = GetNextMid(server);
	pSMB->hdr.Mid = GetNextMid(server);
	pSMB->hdr.Flags2 |= SMBFLG2_UNICODE;
	pSMB->hdr.Flags2 |= (SMBFLG2_UNICODE | SMBFLG2_ERR_STATUS);
	if ((secFlags & CIFSSEC_MUST_KRB5) == CIFSSEC_MUST_KRB5)
	if ((secFlags & CIFSSEC_MUST_KRB5) == CIFSSEC_MUST_KRB5)
		pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC;
		pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC;
	
	
+13 −3
Original line number Original line Diff line number Diff line
@@ -2069,8 +2069,15 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
			srvTcp->tcpStatus = CifsExiting;
			srvTcp->tcpStatus = CifsExiting;
			spin_unlock(&GlobalMid_Lock);
			spin_unlock(&GlobalMid_Lock);
			if (srvTcp->tsk) {
			if (srvTcp->tsk) {
				struct task_struct *tsk;
				/* If we could verify that kthread_stop would
				   always wake up processes blocked in
				   tcp in recv_mesg then we could remove the
				   send_sig call */
				send_sig(SIGKILL,srvTcp->tsk,1);
				send_sig(SIGKILL,srvTcp->tsk,1);
				kthread_stop(srvTcp->tsk);
				tsk = srvTcp->tsk;
				if(tsk)
					kthread_stop(tsk);
			}
			}
		}
		}
		 /* If find_unc succeeded then rc == 0 so we can not end */
		 /* If find_unc succeeded then rc == 0 so we can not end */
@@ -2085,8 +2092,11 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
					/* if the socketUseCount is now zero */
					/* if the socketUseCount is now zero */
					if ((temp_rc == -ESHUTDOWN) &&
					if ((temp_rc == -ESHUTDOWN) &&
					   (pSesInfo->server) && (pSesInfo->server->tsk)) {
					   (pSesInfo->server) && (pSesInfo->server->tsk)) {
						struct task_struct *tsk;
						send_sig(SIGKILL,pSesInfo->server->tsk,1);
						send_sig(SIGKILL,pSesInfo->server->tsk,1);
						kthread_stop(pSesInfo->server->tsk);
						tsk = pSesInfo->server->tsk;
						if (tsk)
							kthread_stop(tsk);
					}
					}
				} else
				} else
					cFYI(1, ("No session or bad tcon"));
					cFYI(1, ("No session or bad tcon"));
+94 −90
Original line number Original line Diff line number Diff line
@@ -34,7 +34,8 @@
static void
static void
renew_parental_timestamps(struct dentry *direntry)
renew_parental_timestamps(struct dentry *direntry)
{
{
	/* BB check if there is a way to get the kernel to do this or if we really need this */
	/* BB check if there is a way to get the kernel to do this or if we
	   really need this */
	do {
	do {
		direntry->d_time = jiffies;
		direntry->d_time = jiffies;
		direntry = direntry->d_parent;
		direntry = direntry->d_parent;
@@ -175,7 +176,8 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
		}
		}
	}
	}


	/* BB add processing to set equivalent of mode - e.g. via CreateX with ACLs */
	/* BB add processing to set equivalent of mode - e.g. via CreateX with
	   ACLs */
	if (oplockEnabled)
	if (oplockEnabled)
		oplock = REQ_OPLOCK;
		oplock = REQ_OPLOCK;


@@ -206,7 +208,8 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
		/* If Open reported that we actually created a file
		/* If Open reported that we actually created a file
		then we now have to set the mode if possible */
		then we now have to set the mode if possible */
		if ((cifs_sb->tcon->ses->capabilities & CAP_UNIX) &&
		if ((cifs_sb->tcon->ses->capabilities & CAP_UNIX) &&
			(oplock & CIFS_CREATE_ACTION))
			(oplock & CIFS_CREATE_ACTION)) {
			mode &= ~current->fs->umask;
			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
			if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
				CIFSSMBUnixSetPerms(xid, pTcon, full_path, mode,
				CIFSSMBUnixSetPerms(xid, pTcon, full_path, mode,
					(__u64)current->fsuid,
					(__u64)current->fsuid,
@@ -224,10 +227,12 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
					cifs_sb->mnt_cifs_flags &
					cifs_sb->mnt_cifs_flags &
						CIFS_MOUNT_MAP_SPECIAL_CHR);
						CIFS_MOUNT_MAP_SPECIAL_CHR);
			}
			}
		else {
		} else {
			/* BB implement mode setting via Windows security descriptors */
			/* BB implement mode setting via Windows security
			/* eg CIFSSMBWinSetPerms(xid,pTcon,full_path,mode,-1,-1,local_nls);*/
			   descriptors e.g. */
			/* could set r/o dos attribute if mode & 0222 == 0 */
			/* CIFSSMBWinSetPerms(xid,pTcon,path,mode,-1,-1,nls);*/

			/* Could set r/o dos attribute if mode & 0222 == 0 */
		}
		}


	/* BB server might mask mode so we have to query for Unix case*/
	/* BB server might mask mode so we have to query for Unix case*/
@@ -295,7 +300,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
				if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
				if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
					pCifsInode->clientCanCacheAll = TRUE;
					pCifsInode->clientCanCacheAll = TRUE;
					pCifsInode->clientCanCacheRead = TRUE;
					pCifsInode->clientCanCacheRead = TRUE;
					cFYI(1,("Exclusive Oplock for inode %p",
					cFYI(1, ("Exclusive Oplock inode %p",
						newinode));
						newinode));
				} else if ((oplock & 0xF) == OPLOCK_READ)
				} else if ((oplock & 0xF) == OPLOCK_READ)
					pCifsInode->clientCanCacheRead = TRUE;
					pCifsInode->clientCanCacheRead = TRUE;
@@ -332,9 +337,11 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
	if (full_path == NULL)
	if (full_path == NULL)
		rc = -ENOMEM;
		rc = -ENOMEM;
	else if (pTcon->ses->capabilities & CAP_UNIX) {
	else if (pTcon->ses->capabilities & CAP_UNIX) {
		mode &= ~current->fs->umask;
		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
			rc = CIFSSMBUnixSetPerms(xid, pTcon, full_path,
			rc = CIFSSMBUnixSetPerms(xid, pTcon, full_path,
				mode,(__u64)current->fsuid,(__u64)current->fsgid,
				mode, (__u64)current->fsuid,
				(__u64)current->fsgid,
				device_number, cifs_sb->local_nls,
				device_number, cifs_sb->local_nls,
				cifs_sb->mnt_cifs_flags &
				cifs_sb->mnt_cifs_flags &
					CIFS_MOUNT_MAP_SPECIAL_CHR);
					CIFS_MOUNT_MAP_SPECIAL_CHR);
@@ -385,8 +392,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,


			/* BB FIXME - add handling for backlevel servers
			/* BB FIXME - add handling for backlevel servers
			   which need legacy open and check for all
			   which need legacy open and check for all
			   calls to SMBOpen for fallback to 
			   calls to SMBOpen for fallback to SMBLeagcyOpen */
			   SMBLeagcyOpen */
			if (!rc) {
			if (!rc) {
				/* BB Do not bother to decode buf since no
				/* BB Do not bother to decode buf since no
				   local inode yet to put timestamps in,
				   local inode yet to put timestamps in,
@@ -432,7 +438,8 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,




struct dentry *
struct dentry *
cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, struct nameidata *nd)
cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
	    struct nameidata *nd)
{
{
	int xid;
	int xid;
	int rc = 0; /* to get around spurious gcc warning, set to zero here */
	int rc = 0; /* to get around spurious gcc warning, set to zero here */
@@ -447,8 +454,6 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, struct name
	     (" parent inode = 0x%p name is: %s and dentry = 0x%p",
	     (" parent inode = 0x%p name is: %s and dentry = 0x%p",
	      parent_dir_inode, direntry->d_name.name, direntry));
	      parent_dir_inode, direntry->d_name.name, direntry));


	/* BB Add check of incoming data - e.g. frame not longer than maximum SMB - let server check the namelen BB */

	/* check whether path exists */
	/* check whether path exists */


	cifs_sb = CIFS_SB(parent_dir_inode->i_sb);
	cifs_sb = CIFS_SB(parent_dir_inode->i_sb);
@@ -560,7 +565,6 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd)
struct dentry_operations cifs_dentry_ops = {
struct dentry_operations cifs_dentry_ops = {
	.d_revalidate = cifs_d_revalidate,
	.d_revalidate = cifs_d_revalidate,
/* d_delete:       cifs_d_delete,      */ /* not needed except for debugging */
/* d_delete:       cifs_d_delete,      */ /* not needed except for debugging */
	/* no need for d_hash, d_compare, d_release, d_iput ... yet. BB confirm this BB */
};
};


static int cifs_ci_hash(struct dentry *dentry, struct qstr *q)
static int cifs_ci_hash(struct dentry *dentry, struct qstr *q)
Loading