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
This commit is contained in:
commit
43f63c8711
|
@ -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 @@ setCifsAclRetry:
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
/* 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,
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*/
|
*/
|
||||||
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 **);
|
||||||
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,
|
||||||
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue