Whamcloud - gitweb
LU-17482 llite: short read could mess up next read offset
[fs/lustre-release.git] / lustre / include / upcall_cache.h
index 46cfe65..fa2c590 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, 2014, Intel Corporation.
+ * Copyright (c) 2012, 2016, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  */
 
 #ifndef _UPCALL_CACHE_H
 #define _UPCALL_CACHE_H
 
 #include <libcfs/libcfs.h>
-#include <lnet/types.h>
+#include <uapi/linux/lnet/lnet-types.h>
+#include <uapi/linux/lustre/lustre_disk.h>
+#include <obd.h>
+#include <lustre_sec.h>
 
 /** \defgroup ucache ucache
  *
@@ -70,7 +68,7 @@
 struct upcall_cache_entry;
 
 struct md_perm {
-       lnet_nid_t      mp_nid;
+       struct lnet_nid mp_nid;
        uint32_t        mp_perm;
 };
 
@@ -83,21 +81,42 @@ struct md_identity {
        struct md_perm            *mi_perms;
 };
 
+struct gss_rsi {
+       struct upcall_cache_entry *si_uc_entry;
+       lnet_nid_t                 si_nid4; /* FIXME Support larger NID */
+       char                       si_nm_name[LUSTRE_NODEMAP_NAME_LENGTH + 1];
+       __u32                      si_lustre_svc;
+       rawobj_t                   si_in_handle;
+       rawobj_t                   si_in_token;
+       rawobj_t                   si_out_handle;
+       rawobj_t                   si_out_token;
+       int                        si_major_status;
+       int                        si_minor_status;
+};
+
+struct gss_rsc {
+       struct upcall_cache_entry *sc_uc_entry;
+       struct obd_device         *sc_target;
+       rawobj_t                   sc_handle;
+       struct gss_svc_ctx         sc_ctx;
+};
+
 struct upcall_cache_entry {
        struct list_head        ue_hash;
        uint64_t                ue_key;
        atomic_t                ue_refcount;
        int                     ue_flags;
        wait_queue_head_t       ue_waitq;
-       cfs_time_t              ue_acquire_expire;
-       cfs_time_t              ue_expire;
+       time64_t                ue_acquire_expire;
+       time64_t                ue_expire;
        union {
                struct md_identity      identity;
+               struct gss_rsi          rsi;
+               struct gss_rsc          rsc;
        } u;
 };
 
-#define UC_CACHE_HASH_SIZE        (128)
-#define UC_CACHE_HASH_INDEX(id)   ((id) & (UC_CACHE_HASH_SIZE - 1))
+#define UC_CACHE_HASH_INDEX(id, size)   ((id) & ((size) - 1))
 #define UC_CACHE_UPCALL_MAXPATH   (1024UL)
 
 struct upcall_cache;
@@ -119,19 +138,25 @@ struct upcall_cache_ops {
 };
 
 struct upcall_cache {
-       struct list_head        uc_hashtable[UC_CACHE_HASH_SIZE];
-       spinlock_t              uc_lock;
-       rwlock_t                uc_upcall_rwlock;
+       struct list_head        *uc_hashtable;
+       int                     uc_hashsize;
+       rwlock_t                uc_lock;
+       struct rw_semaphore     uc_upcall_rwsem;
 
        char                    uc_name[40];            /* for upcall */
        char                    uc_upcall[UC_CACHE_UPCALL_MAXPATH];
-       int                     uc_acquire_expire;      /* seconds */
-       int                     uc_entry_expire;        /* seconds */
+       bool                    uc_acquire_replay;
+       time64_t                uc_acquire_expire;      /* seconds */
+       time64_t                uc_entry_expire;        /* seconds */
        struct upcall_cache_ops *uc_ops;
 };
 
 struct upcall_cache_entry *upcall_cache_get_entry(struct upcall_cache *cache,
                                                  __u64 key, void *args);
+void upcall_cache_get_entry_raw(struct upcall_cache_entry *entry);
+void upcall_cache_update_entry(struct upcall_cache *cache,
+                              struct upcall_cache_entry *entry,
+                              time64_t expire, int state);
 void upcall_cache_put_entry(struct upcall_cache *cache,
                            struct upcall_cache_entry *entry);
 int upcall_cache_downcall(struct upcall_cache *cache, __u32 err, __u64 key,
@@ -150,6 +175,8 @@ static inline void upcall_cache_flush_all(struct upcall_cache *cache)
 
 void upcall_cache_flush_one(struct upcall_cache *cache, __u64 key, void *args);
 struct upcall_cache *upcall_cache_init(const char *name, const char *upcall,
+                                      int hashsz, time64_t entry_expire,
+                                      time64_t acquire_expire, bool replayable,
                                       struct upcall_cache_ops *ops);
 void upcall_cache_cleanup(struct upcall_cache *cache);