Commit 43f63c87 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.samba.org/sfrench/cifs-2.6

Pull CIFS fixes from Steve French.

* git://git.samba.org/sfrench/cifs-2.6:
  Fix UNC parsing on mount
  Remove unnecessary check for NULL in password parser
  CIFS: Fix VFS lock usage for oplocked files
  Revert "CIFS: Fix VFS lock usage for oplocked files"
  cifs: writing past end of struct in cifs_convert_address()
  cifs: silence compiler warnings showing up with gcc-4.7.0
  CIFS: Fix VFS lock usage for oplocked files
parents 6c216ec6 e4b41fb9
...@@ -3892,13 +3892,12 @@ CIFSSMBSetCIFSACL(const int xid, struct cifs_tcon *tcon, __u16 fid, ...@@ -3892,13 +3892,12 @@ CIFSSMBSetCIFSACL(const int xid, struct cifs_tcon *tcon, __u16 fid,
int rc = 0; int rc = 0;
int bytes_returned = 0; int bytes_returned = 0;
SET_SEC_DESC_REQ *pSMB = NULL; SET_SEC_DESC_REQ *pSMB = NULL;
NTRANSACT_RSP *pSMBr = NULL; void *pSMBr;
setCifsAclRetry: setCifsAclRetry:
rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, &pSMBr);
(void **) &pSMBr);
if (rc) if (rc)
return (rc); return rc;
pSMB->MaxSetupCount = 0; pSMB->MaxSetupCount = 0;
pSMB->Reserved = 0; pSMB->Reserved = 0;
...@@ -3926,9 +3925,8 @@ CIFSSMBSetCIFSACL(const int xid, struct cifs_tcon *tcon, __u16 fid, ...@@ -3926,9 +3925,8 @@ CIFSSMBSetCIFSACL(const int xid, struct cifs_tcon *tcon, __u16 fid,
pSMB->AclFlags = cpu_to_le32(aclflag); pSMB->AclFlags = cpu_to_le32(aclflag);
if (pntsd && acllen) { if (pntsd && acllen) {
memcpy((char *) &pSMBr->hdr.Protocol + data_offset, memcpy((char *)pSMBr + offsetof(struct smb_hdr, Protocol) +
(char *) pntsd, data_offset, pntsd, acllen);
acllen);
inc_rfc1001_len(pSMB, byte_count + data_count); inc_rfc1001_len(pSMB, byte_count + data_count);
} else } else
inc_rfc1001_len(pSMB, byte_count); inc_rfc1001_len(pSMB, byte_count);
...@@ -5708,7 +5706,8 @@ CIFSSMBSetFileInfo(const int xid, struct cifs_tcon *tcon, ...@@ -5708,7 +5706,8 @@ CIFSSMBSetFileInfo(const int xid, struct cifs_tcon *tcon,
param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4;
offset = param_offset + params; offset = param_offset + params;
data_offset = (char *) (&pSMB->hdr.Protocol) + offset; data_offset = (char *)pSMB +
offsetof(struct smb_hdr, Protocol) + offset;
count = sizeof(FILE_BASIC_INFO); count = sizeof(FILE_BASIC_INFO);
pSMB->MaxParameterCount = cpu_to_le16(2); pSMB->MaxParameterCount = cpu_to_le16(2);
...@@ -5977,7 +5976,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, ...@@ -5977,7 +5976,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon,
u16 fid, u32 pid_of_opener) u16 fid, u32 pid_of_opener)
{ {
struct smb_com_transaction2_sfi_req *pSMB = NULL; struct smb_com_transaction2_sfi_req *pSMB = NULL;
FILE_UNIX_BASIC_INFO *data_offset; char *data_offset;
int rc = 0; int rc = 0;
u16 params, param_offset, offset, byte_count, count; u16 params, param_offset, offset, byte_count, count;
...@@ -5999,8 +5998,9 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, ...@@ -5999,8 +5998,9 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon,
param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4;
offset = param_offset + params; offset = param_offset + params;
data_offset = (FILE_UNIX_BASIC_INFO *) data_offset = (char *)pSMB +
((char *)(&pSMB->hdr.Protocol) + offset); offsetof(struct smb_hdr, Protocol) + offset;
count = sizeof(FILE_UNIX_BASIC_INFO); count = sizeof(FILE_UNIX_BASIC_INFO);
pSMB->MaxParameterCount = cpu_to_le16(2); pSMB->MaxParameterCount = cpu_to_le16(2);
...@@ -6022,7 +6022,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, ...@@ -6022,7 +6022,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon,
inc_rfc1001_len(pSMB, byte_count); inc_rfc1001_len(pSMB, byte_count);
pSMB->ByteCount = cpu_to_le16(byte_count); pSMB->ByteCount = cpu_to_le16(byte_count);
cifs_fill_unix_set_info(data_offset, args); cifs_fill_unix_set_info((FILE_UNIX_BASIC_INFO *)data_offset, args);
rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0);
if (rc) if (rc)
......
...@@ -1565,8 +1565,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, ...@@ -1565,8 +1565,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
/* Obtain the value string */ /* Obtain the value string */
value = strchr(data, '='); value = strchr(data, '=');
if (value != NULL) value++;
*value++ = '\0';
/* Set tmp_end to end of the string */ /* Set tmp_end to end of the string */
tmp_end = (char *) value + strlen(value); tmp_end = (char *) value + strlen(value);
...@@ -1649,6 +1648,13 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, ...@@ -1649,6 +1648,13 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
goto cifs_parse_mount_err; goto cifs_parse_mount_err;
} }
vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
if (vol->UNC == NULL) {
printk(KERN_WARNING "CIFS: no memory for UNC\n");
goto cifs_parse_mount_err;
}
strcpy(vol->UNC, string);
if (strncmp(string, "//", 2) == 0) { if (strncmp(string, "//", 2) == 0) {
vol->UNC[0] = '\\'; vol->UNC[0] = '\\';
vol->UNC[1] = '\\'; vol->UNC[1] = '\\';
...@@ -1658,13 +1664,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, ...@@ -1658,13 +1664,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
goto cifs_parse_mount_err; goto cifs_parse_mount_err;
} }
vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
if (vol->UNC == NULL) {
printk(KERN_WARNING "CIFS: no memory "
"for UNC\n");
goto cifs_parse_mount_err;
}
strcpy(vol->UNC, string);
break; break;
case Opt_domain: case Opt_domain:
string = match_strdup(args); string = match_strdup(args);
......
...@@ -835,13 +835,21 @@ cifs_posix_lock_set(struct file *file, struct file_lock *flock) ...@@ -835,13 +835,21 @@ cifs_posix_lock_set(struct file *file, struct file_lock *flock)
if ((flock->fl_flags & FL_POSIX) == 0) if ((flock->fl_flags & FL_POSIX) == 0)
return rc; return rc;
try_again:
mutex_lock(&cinode->lock_mutex); mutex_lock(&cinode->lock_mutex);
if (!cinode->can_cache_brlcks) { if (!cinode->can_cache_brlcks) {
mutex_unlock(&cinode->lock_mutex); mutex_unlock(&cinode->lock_mutex);
return rc; return rc;
} }
rc = posix_lock_file_wait(file, flock);
rc = posix_lock_file(file, flock, NULL);
mutex_unlock(&cinode->lock_mutex); mutex_unlock(&cinode->lock_mutex);
if (rc == FILE_LOCK_DEFERRED) {
rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next);
if (!rc)
goto try_again;
locks_delete_block(flock);
}
return rc; return rc;
} }
......
...@@ -197,8 +197,7 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len) ...@@ -197,8 +197,7 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len)
memcpy(scope_id, pct + 1, slen); memcpy(scope_id, pct + 1, slen);
scope_id[slen] = '\0'; scope_id[slen] = '\0';
rc = strict_strtoul(scope_id, 0, rc = kstrtouint(scope_id, 0, &s6->sin6_scope_id);
(unsigned long *)&s6->sin6_scope_id);
rc = (rc == 0) ? 1 : 0; rc = (rc == 0) ? 1 : 0;
} }
......
...@@ -510,12 +510,13 @@ static void __locks_delete_block(struct file_lock *waiter) ...@@ -510,12 +510,13 @@ static void __locks_delete_block(struct file_lock *waiter)
/* /*
*/ */
static void locks_delete_block(struct file_lock *waiter) void locks_delete_block(struct file_lock *waiter)
{ {
lock_flocks(); lock_flocks();
__locks_delete_block(waiter); __locks_delete_block(waiter);
unlock_flocks(); unlock_flocks();
} }
EXPORT_SYMBOL(locks_delete_block);
/* Insert waiter into blocker's block list. /* Insert waiter into blocker's block list.
* We use a circular list so that processes can be easily woken up in * We use a circular list so that processes can be easily woken up in
......
...@@ -1215,6 +1215,7 @@ extern int vfs_setlease(struct file *, long, struct file_lock **); ...@@ -1215,6 +1215,7 @@ extern int vfs_setlease(struct file *, long, struct file_lock **);
extern int lease_modify(struct file_lock **, int); extern int lease_modify(struct file_lock **, int);
extern int lock_may_read(struct inode *, loff_t start, unsigned long count); extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
extern int lock_may_write(struct inode *, loff_t start, unsigned long count); extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
extern void locks_delete_block(struct file_lock *waiter);
extern void lock_flocks(void); extern void lock_flocks(void);
extern void unlock_flocks(void); extern void unlock_flocks(void);
#else /* !CONFIG_FILE_LOCKING */ #else /* !CONFIG_FILE_LOCKING */
...@@ -1359,6 +1360,10 @@ static inline int lock_may_write(struct inode *inode, loff_t start, ...@@ -1359,6 +1360,10 @@ static inline int lock_may_write(struct inode *inode, loff_t start,
return 1; return 1;
} }
static inline void locks_delete_block(struct file_lock *waiter)
{
}
static inline void lock_flocks(void) static inline void lock_flocks(void)
{ {
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment