linux/fs/nfs/nfs4session.h
<<
>>
Prefs
   1/*
   2 * fs/nfs/nfs4session.h
   3 *
   4 * Copyright (c) 2012 Trond Myklebust <Trond.Myklebust@netapp.com>
   5 *
   6 */
   7#ifndef __LINUX_FS_NFS_NFS4SESSION_H
   8#define __LINUX_FS_NFS_NFS4SESSION_H
   9
  10/* maximum number of slots to use */
  11#define NFS4_DEF_SLOT_TABLE_SIZE (16U)
  12#define NFS4_MAX_SLOT_TABLE (1024U)
  13#define NFS4_NO_SLOT ((u32)-1)
  14
  15#if IS_ENABLED(CONFIG_NFS_V4)
  16
  17/* Sessions slot seqid */
  18struct nfs4_slot {
  19        struct nfs4_slot_table  *table;
  20        struct nfs4_slot        *next;
  21        unsigned long           generation;
  22        u32                     slot_nr;
  23        u32                     seq_nr;
  24        unsigned int            interrupted : 1;
  25};
  26
  27/* Sessions */
  28#define SLOT_TABLE_SZ DIV_ROUND_UP(NFS4_MAX_SLOT_TABLE, 8*sizeof(long))
  29struct nfs4_slot_table {
  30        struct nfs4_session *session;           /* Parent session */
  31        struct nfs4_slot *slots;                /* seqid per slot */
  32        unsigned long   used_slots[SLOT_TABLE_SZ]; /* used/unused bitmap */
  33        spinlock_t      slot_tbl_lock;
  34        struct rpc_wait_queue   slot_tbl_waitq; /* allocators may wait here */
  35        u32             max_slots;              /* # slots in table */
  36        u32             max_slotid;             /* Max allowed slotid value */
  37        u32             highest_used_slotid;    /* sent to server on each SEQ.
  38                                                 * op for dynamic resizing */
  39        u32             target_highest_slotid;  /* Server max_slot target */
  40        u32             server_highest_slotid;  /* Server highest slotid */
  41        s32             d_target_highest_slotid; /* Derivative */
  42        s32             d2_target_highest_slotid; /* 2nd derivative */
  43        unsigned long   generation;             /* Generation counter for
  44                                                   target_highest_slotid */
  45        struct completion complete;
  46};
  47
  48/*
  49 * Session related parameters
  50 */
  51struct nfs4_session {
  52        struct nfs4_sessionid           sess_id;
  53        u32                             flags;
  54        unsigned long                   session_state;
  55        u32                             hash_alg;
  56        u32                             ssv_len;
  57
  58        /* The fore and back channel */
  59        struct nfs4_channel_attrs       fc_attrs;
  60        struct nfs4_slot_table          fc_slot_table;
  61        struct nfs4_channel_attrs       bc_attrs;
  62        struct nfs4_slot_table          bc_slot_table;
  63        struct nfs_client               *clp;
  64        /* Create session arguments */
  65        unsigned int                    fc_target_max_rqst_sz;
  66        unsigned int                    fc_target_max_resp_sz;
  67};
  68
  69enum nfs4_session_state {
  70        NFS4_SESSION_INITING,
  71        NFS4_SESSION_DRAINING,
  72};
  73
  74#if defined(CONFIG_NFS_V4_1)
  75extern struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl);
  76extern void nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *slot);
  77
  78extern void nfs41_set_target_slotid(struct nfs4_slot_table *tbl,
  79                u32 target_highest_slotid);
  80extern void nfs41_update_target_slotid(struct nfs4_slot_table *tbl,
  81                struct nfs4_slot *slot,
  82                struct nfs4_sequence_res *res);
  83
  84extern int nfs4_setup_session_slot_tables(struct nfs4_session *ses);
  85
  86extern struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp);
  87extern void nfs4_destroy_session(struct nfs4_session *session);
  88extern int nfs4_init_session(struct nfs_server *server);
  89extern int nfs4_init_ds_session(struct nfs_client *, unsigned long);
  90
  91extern void nfs4_session_drain_complete(struct nfs4_session *session,
  92                struct nfs4_slot_table *tbl);
  93
  94static inline bool nfs4_session_draining(struct nfs4_session *session)
  95{
  96        return !!test_bit(NFS4_SESSION_DRAINING, &session->session_state);
  97}
  98
  99bool nfs41_wake_and_assign_slot(struct nfs4_slot_table *tbl,
 100                struct nfs4_slot *slot);
 101void nfs41_wake_slot_table(struct nfs4_slot_table *tbl);
 102
 103/*
 104 * Determine if sessions are in use.
 105 */
 106static inline int nfs4_has_session(const struct nfs_client *clp)
 107{
 108        if (clp->cl_session)
 109                return 1;
 110        return 0;
 111}
 112
 113static inline int nfs4_has_persistent_session(const struct nfs_client *clp)
 114{
 115        if (nfs4_has_session(clp))
 116                return (clp->cl_session->flags & SESSION4_PERSIST);
 117        return 0;
 118}
 119
 120#else /* defined(CONFIG_NFS_V4_1) */
 121
 122static inline int nfs4_init_session(struct nfs_server *server)
 123{
 124        return 0;
 125}
 126
 127/*
 128 * Determine if sessions are in use.
 129 */
 130static inline int nfs4_has_session(const struct nfs_client *clp)
 131{
 132        return 0;
 133}
 134
 135static inline int nfs4_has_persistent_session(const struct nfs_client *clp)
 136{
 137        return 0;
 138}
 139
 140#endif /* defined(CONFIG_NFS_V4_1) */
 141#endif /* IS_ENABLED(CONFIG_NFS_V4) */
 142#endif /* __LINUX_FS_NFS_NFS4SESSION_H */
 143