CIFS: Move parsing lease buffer to ops struct
authorPavel Shilovsky <pshilovsky@samba.org>
Thu, 5 Sep 2013 16:16:45 +0000 (20:16 +0400)
committerSteve French <smfrench@gmail.com>
Tue, 10 Sep 2013 03:52:11 +0000 (22:52 -0500)
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org>
Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/cifsglob.h
fs/cifs/smb2ops.c
fs/cifs/smb2pdu.c

index cb53e24ae9b2b7ded8a0a1301c9317e56f57f90c..38118938f0b6f0a590e0773e104d86f273858a78 100644 (file)
@@ -376,6 +376,8 @@ struct smb_version_operations {
        void (*set_oplock_level)(struct cifsInodeInfo *, __u32);
        /* create lease context buffer for CREATE request */
        char * (*create_lease_buf)(u8 *, u8);
+       /* parse lease context buffer and return oplock info */
+       __u8 (*parse_lease_buf)(void *);
 };
 
 struct smb_version_values {
index ecff4d6e4b161b7eac43ca77e5339fe18398f4db..0215e60267e20951b3b73c50933a56f47ef7119d 100644 (file)
@@ -748,6 +748,16 @@ smb2_create_lease_buf(u8 *lease_key, u8 oplock)
        return (char *)buf;
 }
 
+static __u8
+smb2_parse_lease_buf(void *buf)
+{
+       struct create_lease *lc = (struct create_lease *)buf;
+
+       if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
+               return SMB2_OPLOCK_LEVEL_NOCHANGE;
+       return le32_to_cpu(lc->lcontext.LeaseState);
+}
+
 struct smb_version_operations smb20_operations = {
        .compare_fids = smb2_compare_fids,
        .setup_request = smb2_setup_request,
@@ -816,6 +826,7 @@ struct smb_version_operations smb20_operations = {
        .is_read_op = smb2_is_read_op,
        .set_oplock_level = smb2_set_oplock_level,
        .create_lease_buf = smb2_create_lease_buf,
+       .parse_lease_buf = smb2_parse_lease_buf,
 };
 
 struct smb_version_operations smb21_operations = {
@@ -886,6 +897,7 @@ struct smb_version_operations smb21_operations = {
        .is_read_op = smb21_is_read_op,
        .set_oplock_level = smb21_set_oplock_level,
        .create_lease_buf = smb2_create_lease_buf,
+       .parse_lease_buf = smb2_parse_lease_buf,
 };
 
 struct smb_version_operations smb30_operations = {
@@ -958,6 +970,7 @@ struct smb_version_operations smb30_operations = {
        .is_read_op = smb21_is_read_op,
        .set_oplock_level = smb21_set_oplock_level,
        .create_lease_buf = smb2_create_lease_buf,
+       .parse_lease_buf = smb2_parse_lease_buf,
 };
 
 struct smb_version_values smb20_values = {
index f5f1f5341f04315abe0589ea94200cc9e37548f8..6eef8b67e7092e36d4b8d6ee56b52eb121a96669 100644 (file)
@@ -903,34 +903,27 @@ create_reconnect_durable_buf(struct cifs_fid *fid)
 }
 
 static __u8
-parse_lease_state(struct smb2_create_rsp *rsp)
+parse_lease_state(struct TCP_Server_Info *server, struct smb2_create_rsp *rsp)
 {
        char *data_offset;
-       struct create_lease *lc;
-       bool found = false;
+       struct create_context *cc;
        unsigned int next = 0;
        char *name;
 
        data_offset = (char *)rsp + 4 + le32_to_cpu(rsp->CreateContextsOffset);
-       lc = (struct create_lease *)data_offset;
+       cc = (struct create_context *)data_offset;
        do {
-               lc = (struct create_lease *)((char *)lc + next);
-               name = le16_to_cpu(lc->ccontext.NameOffset) + (char *)lc;
-               if (le16_to_cpu(lc->ccontext.NameLength) != 4 ||
+               cc = (struct create_context *)((char *)cc + next);
+               name = le16_to_cpu(cc->NameOffset) + (char *)cc;
+               if (le16_to_cpu(cc->NameLength) != 4 ||
                    strncmp(name, "RqLs", 4)) {
-                       next = le32_to_cpu(lc->ccontext.Next);
+                       next = le32_to_cpu(cc->Next);
                        continue;
                }
-               if (lc->lcontext.LeaseFlags & SMB2_LEASE_FLAG_BREAK_IN_PROGRESS)
-                       return SMB2_OPLOCK_LEVEL_NOCHANGE;
-               found = true;
-               break;
+               return server->ops->parse_lease_buf(cc);
        } while (next != 0);
 
-       if (!found)
-               return 0;
-
-       return le32_to_cpu(lc->lcontext.LeaseState);
+       return 0;
 }
 
 static int
@@ -1109,7 +1102,7 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
        }
 
        if (rsp->OplockLevel == SMB2_OPLOCK_LEVEL_LEASE)
-               *oplock = parse_lease_state(rsp);
+               *oplock = parse_lease_state(server, rsp);
        else
                *oplock = rsp->OplockLevel;
 creat_exit: