Re: mids and cifs sendrcv2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2011/4/8 Steve French <smfrench@xxxxxxxxx>:
> Update on cifs vs. smb2 mids, and the smb2 sendrcv2.   Jeff had
> suggested more closely matching the cifs and smb2 mids, in particular
> extending the 16 bit cifs mid (multiplex identifier for inflight
> network requests) to the 64 bit size needed for smb2 (and thus masking
> the mid when used for cifs) and having cifs ignore the various smb2
> unique fields in the mid (which makes the mid larger for cifs).
> Since the smb2 code in cifs-2.6.git (put in February and early March)
> has now been rereviewed, the next step in the smb2 merge is posting
> and reviewing the transport routine for smb2 (smb2_sendrcv2 or reusing
> cifs_sendrcv2) - the latter may make more sense if we go to a common
> mid for cifs and smb2.   At the fs summit, Jeff and Jeremy and I
> talked about this, but Pavel and others may have opinions on this
> topic.   As soon as the cifs merge activity settles down for 2.6.39, I
> plan to post sendrcv2 alternatives and then begin work with Pavel on
> the superblock, file and inode routines and seeing whether for smb2
> they should be smb2 unique (as we originally expected since smb2 is
> handle based, and simpler) and look more like they did in the smb2.ko
> work that Pavel did last summer or should be more common with the cifs
> routines.
>
> --
> Thanks,
>
> Steve
> --
> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

I suggest to make cifs and smb2 protocol mid structures use common
structure that has equals fields for both and then expand this
structure for protocol-dependent things.

It can look like this:

/* one of these for every pending CIFS request to the server */
struct mid_q_entry {
        __u8 protocol_id;
        struct list_head qhead; /* mids waiting on reply from this server */
        int midState;   /* wish this were enum but can not pass to wait_event */
        unsigned long when_alloc;  /* when mid was created */
#ifdef CONFIG_CIFS_STATS2
        unsigned long when_sent; /* time when smb send finished */
        unsigned long when_received; /* when demux complete (taken off wire) */
#endif
        bool largeBuf:1;        /* if valid response, is pointer to large buf */
        void *resp_buf;         /* response buffer */
        mid_callback_t *callback; /* call completion callback */
        void *callback_data;      /* general purpose pointer for callback */
};

struct cifs_mid_q_entry {
        struct mid_q_entry mid_q;
        __u16 mid;              /* multiplex id */
        __u32 sequence_number;  /* for CIFS signing */
        __u8 command;           /* smb command code */
        __u16 pid;              /* process id */
        bool multiRsp:1;        /* multiple trans2 responses for one request  */
        bool multiEnd:1;        /* both received */
};

struct smb2_mid_q_entry {
        struct mid_q_entry mid_q;
        __u64 mid;              /* multiplex id(s), bigger for smb2 */
        __le16 command;         /* smb2 command code */
        __u32 pid;              /* process id - bigger for smb2 than cifs */
};


So, we always work with a pointer to common structure mid_q_entry and
then expand it according to protocol_id filed when we need it:

#define PROTOCOL_ID(mid) (*((__u8 *)mid))

process_mid(struct mid_q_entry *pmid)
{
        if (PROTOCOL_ID(pmid) == SMB2)
                process_smb2_mid((struct smb2_mid_q_entry *)pmid);
        else
                process_cifs_mid((struct cifs_mid_q_entry *)pmid);
}


-- 
Best regards,
Pavel Shilovsky.
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux