forked from luck/tmp_suning_uos_patched
Merge branch 'for-next' of git://git.samba.org/sfrench/cifs-2.6
Pull cifs fixes from Steve French: "A set of minor cifs fixes" * 'for-next' of git://git.samba.org/sfrench/cifs-2.6: [CIFS] Minor cleanup of xattr query function fs: cifs: transport: Use time_after for time comparison SMB2: Fix share type handling cifs: cifsacl: Use a temporary ops variable to reduce code length Don't delay freeing mids when blocked on slow socket write of request CIFS: silence lockdep splat in cifs_relock_file()
This commit is contained in:
commit
1319a2856d
|
@ -1135,20 +1135,19 @@ cifs_acl_to_fattr(struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr,
|
|||
u32 acllen = 0;
|
||||
int rc = 0;
|
||||
struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
|
||||
struct cifs_tcon *tcon;
|
||||
struct smb_version_operations *ops;
|
||||
|
||||
cifs_dbg(NOISY, "converting ACL to mode for %s\n", path);
|
||||
|
||||
if (IS_ERR(tlink))
|
||||
return PTR_ERR(tlink);
|
||||
tcon = tlink_tcon(tlink);
|
||||
|
||||
if (pfid && (tcon->ses->server->ops->get_acl_by_fid))
|
||||
pntsd = tcon->ses->server->ops->get_acl_by_fid(cifs_sb, pfid,
|
||||
&acllen);
|
||||
else if (tcon->ses->server->ops->get_acl)
|
||||
pntsd = tcon->ses->server->ops->get_acl(cifs_sb, inode, path,
|
||||
&acllen);
|
||||
ops = tlink_tcon(tlink)->ses->server->ops;
|
||||
|
||||
if (pfid && (ops->get_acl_by_fid))
|
||||
pntsd = ops->get_acl_by_fid(cifs_sb, pfid, &acllen);
|
||||
else if (ops->get_acl)
|
||||
pntsd = ops->get_acl(cifs_sb, inode, path, &acllen);
|
||||
else {
|
||||
cifs_put_tlink(tlink);
|
||||
return -EOPNOTSUPP;
|
||||
|
@ -1181,23 +1180,23 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 nmode,
|
|||
struct cifs_ntsd *pnntsd = NULL; /* modified acl to be sent to server */
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
|
||||
struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
|
||||
struct cifs_tcon *tcon;
|
||||
struct smb_version_operations *ops;
|
||||
|
||||
if (IS_ERR(tlink))
|
||||
return PTR_ERR(tlink);
|
||||
tcon = tlink_tcon(tlink);
|
||||
|
||||
ops = tlink_tcon(tlink)->ses->server->ops;
|
||||
|
||||
cifs_dbg(NOISY, "set ACL from mode for %s\n", path);
|
||||
|
||||
/* Get the security descriptor */
|
||||
|
||||
if (tcon->ses->server->ops->get_acl == NULL) {
|
||||
if (ops->get_acl == NULL) {
|
||||
cifs_put_tlink(tlink);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
pntsd = tcon->ses->server->ops->get_acl(cifs_sb, inode, path,
|
||||
&secdesclen);
|
||||
pntsd = ops->get_acl(cifs_sb, inode, path, &secdesclen);
|
||||
if (IS_ERR(pntsd)) {
|
||||
rc = PTR_ERR(pntsd);
|
||||
cifs_dbg(VFS, "%s: error %d getting sec desc\n", __func__, rc);
|
||||
|
@ -1224,13 +1223,12 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 nmode,
|
|||
|
||||
cifs_dbg(NOISY, "build_sec_desc rc: %d\n", rc);
|
||||
|
||||
if (tcon->ses->server->ops->set_acl == NULL)
|
||||
if (ops->set_acl == NULL)
|
||||
rc = -EOPNOTSUPP;
|
||||
|
||||
if (!rc) {
|
||||
/* Set the security descriptor */
|
||||
rc = tcon->ses->server->ops->set_acl(pnntsd, secdesclen, inode,
|
||||
path, aclflag);
|
||||
rc = ops->set_acl(pnntsd, secdesclen, inode, path, aclflag);
|
||||
cifs_dbg(NOISY, "set_cifs_acl rc: %d\n", rc);
|
||||
}
|
||||
cifs_put_tlink(tlink);
|
||||
|
|
|
@ -418,7 +418,7 @@ struct smb_version_operations {
|
|||
int (*validate_negotiate)(const unsigned int, struct cifs_tcon *);
|
||||
ssize_t (*query_all_EAs)(const unsigned int, struct cifs_tcon *,
|
||||
const unsigned char *, const unsigned char *, char *,
|
||||
size_t, const struct nls_table *, int);
|
||||
size_t, struct cifs_sb_info *);
|
||||
int (*set_EA)(const unsigned int, struct cifs_tcon *, const char *,
|
||||
const char *, const void *, const __u16,
|
||||
const struct nls_table *, int);
|
||||
|
|
|
@ -480,8 +480,7 @@ extern int CIFSSMBCopy(unsigned int xid,
|
|||
extern ssize_t CIFSSMBQAllEAs(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName,
|
||||
const unsigned char *ea_name, char *EAData,
|
||||
size_t bufsize, const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
size_t bufsize, struct cifs_sb_info *cifs_sb);
|
||||
extern int CIFSSMBSetEA(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
const char *fileName, const char *ea_name,
|
||||
const void *ea_value, const __u16 ea_value_len,
|
||||
|
|
|
@ -697,9 +697,7 @@ cifs_echo_callback(struct mid_q_entry *mid)
|
|||
{
|
||||
struct TCP_Server_Info *server = mid->callback_data;
|
||||
|
||||
mutex_lock(&server->srv_mutex);
|
||||
DeleteMidQEntry(mid);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
add_credits(server, 1, CIFS_ECHO_OP);
|
||||
}
|
||||
|
||||
|
@ -1599,9 +1597,7 @@ cifs_readv_callback(struct mid_q_entry *mid)
|
|||
}
|
||||
|
||||
queue_work(cifsiod_wq, &rdata->work);
|
||||
mutex_lock(&server->srv_mutex);
|
||||
DeleteMidQEntry(mid);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
add_credits(server, 1, 0);
|
||||
}
|
||||
|
||||
|
@ -2058,7 +2054,6 @@ cifs_writev_callback(struct mid_q_entry *mid)
|
|||
{
|
||||
struct cifs_writedata *wdata = mid->callback_data;
|
||||
struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
|
||||
struct TCP_Server_Info *server = tcon->ses->server;
|
||||
unsigned int written;
|
||||
WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf;
|
||||
|
||||
|
@ -2095,9 +2090,7 @@ cifs_writev_callback(struct mid_q_entry *mid)
|
|||
}
|
||||
|
||||
queue_work(cifsiod_wq, &wdata->work);
|
||||
mutex_lock(&server->srv_mutex);
|
||||
DeleteMidQEntry(mid);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
add_credits(tcon->ses->server, 1, 0);
|
||||
}
|
||||
|
||||
|
@ -6076,11 +6069,13 @@ ssize_t
|
|||
CIFSSMBQAllEAs(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
const unsigned char *searchName, const unsigned char *ea_name,
|
||||
char *EAData, size_t buf_size,
|
||||
const struct nls_table *nls_codepage, int remap)
|
||||
struct cifs_sb_info *cifs_sb)
|
||||
{
|
||||
/* BB assumes one setup word */
|
||||
TRANSACTION2_QPI_REQ *pSMB = NULL;
|
||||
TRANSACTION2_QPI_RSP *pSMBr = NULL;
|
||||
int remap = cifs_remap(cifs_sb);
|
||||
struct nls_table *nls_codepage = cifs_sb->local_nls;
|
||||
int rc = 0;
|
||||
int bytes_returned;
|
||||
int list_len;
|
||||
|
|
|
@ -582,7 +582,7 @@ cifs_relock_file(struct cifsFileInfo *cfile)
|
|||
struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
|
||||
int rc = 0;
|
||||
|
||||
down_read(&cinode->lock_sem);
|
||||
down_read_nested(&cinode->lock_sem, SINGLE_DEPTH_NESTING);
|
||||
if (cinode->can_cache_brlcks) {
|
||||
/* can cache locks - no need to relock */
|
||||
up_read(&cinode->lock_sem);
|
||||
|
|
|
@ -563,8 +563,7 @@ static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
|
|||
|
||||
rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
|
||||
"SETFILEBITS", ea_value, 4 /* size of buf */,
|
||||
cifs_sb->local_nls,
|
||||
cifs_remap(cifs_sb));
|
||||
cifs_sb);
|
||||
cifs_put_tlink(tlink);
|
||||
if (rc < 0)
|
||||
return (int)rc;
|
||||
|
|
|
@ -1240,15 +1240,19 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
|
|||
goto tcon_exit;
|
||||
}
|
||||
|
||||
if (rsp->ShareType & SMB2_SHARE_TYPE_DISK)
|
||||
switch (rsp->ShareType) {
|
||||
case SMB2_SHARE_TYPE_DISK:
|
||||
cifs_dbg(FYI, "connection to disk share\n");
|
||||
else if (rsp->ShareType & SMB2_SHARE_TYPE_PIPE) {
|
||||
break;
|
||||
case SMB2_SHARE_TYPE_PIPE:
|
||||
tcon->ipc = true;
|
||||
cifs_dbg(FYI, "connection to pipe share\n");
|
||||
} else if (rsp->ShareType & SMB2_SHARE_TYPE_PRINT) {
|
||||
tcon->print = true;
|
||||
break;
|
||||
case SMB2_SHARE_TYPE_PRINT:
|
||||
tcon->ipc = true;
|
||||
cifs_dbg(FYI, "connection to printer\n");
|
||||
} else {
|
||||
break;
|
||||
default:
|
||||
cifs_dbg(VFS, "unknown share type %d\n", rsp->ShareType);
|
||||
rc = -EOPNOTSUPP;
|
||||
goto tcon_error_exit;
|
||||
|
@ -2173,9 +2177,7 @@ smb2_echo_callback(struct mid_q_entry *mid)
|
|||
if (mid->mid_state == MID_RESPONSE_RECEIVED)
|
||||
credits_received = le16_to_cpu(rsp->hdr.sync_hdr.CreditRequest);
|
||||
|
||||
mutex_lock(&server->srv_mutex);
|
||||
DeleteMidQEntry(mid);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
add_credits(server, credits_received, CIFS_ECHO_OP);
|
||||
}
|
||||
|
||||
|
@ -2433,9 +2435,7 @@ smb2_readv_callback(struct mid_q_entry *mid)
|
|||
cifs_stats_fail_inc(tcon, SMB2_READ_HE);
|
||||
|
||||
queue_work(cifsiod_wq, &rdata->work);
|
||||
mutex_lock(&server->srv_mutex);
|
||||
DeleteMidQEntry(mid);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
add_credits(server, credits_received, 0);
|
||||
}
|
||||
|
||||
|
@ -2594,7 +2594,6 @@ smb2_writev_callback(struct mid_q_entry *mid)
|
|||
{
|
||||
struct cifs_writedata *wdata = mid->callback_data;
|
||||
struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
|
||||
struct TCP_Server_Info *server = tcon->ses->server;
|
||||
unsigned int written;
|
||||
struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf;
|
||||
unsigned int credits_received = 1;
|
||||
|
@ -2634,9 +2633,7 @@ smb2_writev_callback(struct mid_q_entry *mid)
|
|||
cifs_stats_fail_inc(tcon, SMB2_WRITE_HE);
|
||||
|
||||
queue_work(cifsiod_wq, &wdata->work);
|
||||
mutex_lock(&server->srv_mutex);
|
||||
DeleteMidQEntry(mid);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
add_credits(tcon->ses->server, credits_received, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ DeleteMidQEntry(struct mid_q_entry *midEntry)
|
|||
now = jiffies;
|
||||
/* commands taking longer than one second are indications that
|
||||
something is wrong, unless it is quite a slow link or server */
|
||||
if ((now - midEntry->when_alloc) > HZ) {
|
||||
if (time_after(now, midEntry->when_alloc + HZ)) {
|
||||
if ((cifsFYI & CIFS_TIMER) && (midEntry->command != command)) {
|
||||
pr_debug(" CIFS slow rsp: cmd %d mid %llu",
|
||||
midEntry->command, midEntry->mid);
|
||||
|
@ -613,9 +613,7 @@ cifs_sync_mid_result(struct mid_q_entry *mid, struct TCP_Server_Info *server)
|
|||
}
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
|
||||
mutex_lock(&server->srv_mutex);
|
||||
DeleteMidQEntry(mid);
|
||||
mutex_unlock(&server->srv_mutex);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
@ -235,8 +235,7 @@ static int cifs_xattr_get(const struct xattr_handler *handler,
|
|||
|
||||
if (pTcon->ses->server->ops->query_all_EAs)
|
||||
rc = pTcon->ses->server->ops->query_all_EAs(xid, pTcon,
|
||||
full_path, name, value, size,
|
||||
cifs_sb->local_nls, cifs_remap(cifs_sb));
|
||||
full_path, name, value, size, cifs_sb);
|
||||
break;
|
||||
|
||||
case XATTR_CIFS_ACL: {
|
||||
|
@ -336,8 +335,7 @@ ssize_t cifs_listxattr(struct dentry *direntry, char *data, size_t buf_size)
|
|||
|
||||
if (pTcon->ses->server->ops->query_all_EAs)
|
||||
rc = pTcon->ses->server->ops->query_all_EAs(xid, pTcon,
|
||||
full_path, NULL, data, buf_size,
|
||||
cifs_sb->local_nls, cifs_remap(cifs_sb));
|
||||
full_path, NULL, data, buf_size, cifs_sb);
|
||||
list_ea_exit:
|
||||
kfree(full_path);
|
||||
free_xid(xid);
|
||||
|
|
Loading…
Reference in New Issue
Block a user