diff options
author | Pavel Shilovsky <piastry@etersoft.ru> | 2011-10-22 07:33:31 -0400 |
---|---|---|
committer | Steve French <smfrench@gmail.com> | 2011-10-24 14:11:52 -0400 |
commit | 9ee305b70e09f5132c9723780ce10e69710b8bca (patch) | |
tree | d739e9ba99cc523235404b7f5e38828ea6ed9536 /fs/cifs/cifssmb.c | |
parent | 4f6bcec910d45e4f46b1514977caa529bc69e645 (diff) |
CIFS: Send as many mandatory unlock ranges at once as possible
that reduces a traffic and increases a performance.
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <smfrench@gmail.com>
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r-- | fs/cifs/cifssmb.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 6a45a1769388..6600aa2d2ef3 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -2320,6 +2320,46 @@ CIFSSMBWrite2(const int xid, struct cifs_io_parms *io_parms, | |||
2320 | return rc; | 2320 | return rc; |
2321 | } | 2321 | } |
2322 | 2322 | ||
2323 | int cifs_lockv(const int xid, struct cifs_tcon *tcon, const __u16 netfid, | ||
2324 | const __u8 lock_type, const __u32 num_unlock, | ||
2325 | const __u32 num_lock, LOCKING_ANDX_RANGE *buf) | ||
2326 | { | ||
2327 | int rc = 0; | ||
2328 | LOCK_REQ *pSMB = NULL; | ||
2329 | struct kvec iov[2]; | ||
2330 | int resp_buf_type; | ||
2331 | __u16 count; | ||
2332 | |||
2333 | cFYI(1, "cifs_lockv num lock %d num unlock %d", num_lock, num_unlock); | ||
2334 | |||
2335 | rc = small_smb_init(SMB_COM_LOCKING_ANDX, 8, tcon, (void **) &pSMB); | ||
2336 | if (rc) | ||
2337 | return rc; | ||
2338 | |||
2339 | pSMB->Timeout = 0; | ||
2340 | pSMB->NumberOfLocks = cpu_to_le16(num_lock); | ||
2341 | pSMB->NumberOfUnlocks = cpu_to_le16(num_unlock); | ||
2342 | pSMB->LockType = lock_type; | ||
2343 | pSMB->AndXCommand = 0xFF; /* none */ | ||
2344 | pSMB->Fid = netfid; /* netfid stays le */ | ||
2345 | |||
2346 | count = (num_unlock + num_lock) * sizeof(LOCKING_ANDX_RANGE); | ||
2347 | inc_rfc1001_len(pSMB, count); | ||
2348 | pSMB->ByteCount = cpu_to_le16(count); | ||
2349 | |||
2350 | iov[0].iov_base = (char *)pSMB; | ||
2351 | iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4 - | ||
2352 | (num_unlock + num_lock) * sizeof(LOCKING_ANDX_RANGE); | ||
2353 | iov[1].iov_base = (char *)buf; | ||
2354 | iov[1].iov_len = (num_unlock + num_lock) * sizeof(LOCKING_ANDX_RANGE); | ||
2355 | |||
2356 | cifs_stats_inc(&tcon->num_locks); | ||
2357 | rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, CIFS_NO_RESP); | ||
2358 | if (rc) | ||
2359 | cFYI(1, "Send error in cifs_lockv = %d", rc); | ||
2360 | |||
2361 | return rc; | ||
2362 | } | ||
2323 | 2363 | ||
2324 | int | 2364 | int |
2325 | CIFSSMBLock(const int xid, struct cifs_tcon *tcon, | 2365 | CIFSSMBLock(const int xid, struct cifs_tcon *tcon, |