Whamcloud - gitweb
LU-7030 security: put imp_sec after all requests drained off 71/16071/2
authorNiu Yawei <yawei.niu@intel.com>
Tue, 25 Aug 2015 03:07:34 +0000 (23:07 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 13 Dec 2015 20:57:04 +0000 (20:57 +0000)
imp_sec should be put after all requests being drained off.

Signed-off-by: Niu Yawei <yawei.niu@intel.com>
Change-Id: I35f572fcc79b2bd1991db14577226a3ea735630d
Reviewed-on: http://review.whamcloud.com/16071
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Sebastien Buisson <sebastien.buisson@bull.net>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/obd_class.h
lustre/ldlm/ldlm_lib.c
lustre/obdclass/genops.c
lustre/ptlrpc/ptlrpc_module.c
lustre/ptlrpc/sec.c

index 9033e79..be9849d 100644 (file)
@@ -1686,6 +1686,7 @@ struct lwp_register_item {
  * <shaver> // XXX do not look into _superhack with remaining eye
  * <shaver> // XXX if this were any uglier, I'd get my own show on MTV */
 extern int (*ptlrpc_put_connection_superhack)(struct ptlrpc_connection *c);
  * <shaver> // XXX do not look into _superhack with remaining eye
  * <shaver> // XXX if this were any uglier, I'd get my own show on MTV */
 extern int (*ptlrpc_put_connection_superhack)(struct ptlrpc_connection *c);
+extern void (*sptlrpc_sec_put_superhack)(struct obd_import *imp);
 
 /* obd_mount.c */
 #ifdef HAVE_SERVER_SUPPORT
 
 /* obd_mount.c */
 #ifdef HAVE_SERVER_SUPPORT
index 0ded843..dd518e5 100644 (file)
@@ -219,11 +219,8 @@ EXPORT_SYMBOL(client_import_find_conn);
 
 void client_destroy_import(struct obd_import *imp)
 {
 
 void client_destroy_import(struct obd_import *imp)
 {
-       /* Drop security policy instance after all RPCs have finished/aborted
-        * to let all busy contexts be released. */
         class_import_get(imp);
         class_destroy_import(imp);
         class_import_get(imp);
         class_destroy_import(imp);
-        sptlrpc_import_sec_put(imp);
         class_import_put(imp);
 }
 EXPORT_SYMBOL(client_destroy_import);
         class_import_put(imp);
 }
 EXPORT_SYMBOL(client_destroy_import);
index 7ca03f0..2cc5e04 100644 (file)
@@ -70,6 +70,8 @@ atomic_t         obd_stale_export_num;
 
 int (*ptlrpc_put_connection_superhack)(struct ptlrpc_connection *c);
 EXPORT_SYMBOL(ptlrpc_put_connection_superhack);
 
 int (*ptlrpc_put_connection_superhack)(struct ptlrpc_connection *c);
 EXPORT_SYMBOL(ptlrpc_put_connection_superhack);
+void (*sptlrpc_sec_put_superhack)(struct obd_import *imp);
+EXPORT_SYMBOL(sptlrpc_sec_put_superhack);
 
 /*
  * support functions: we could use inter-module communication, but this
 
 /*
  * support functions: we could use inter-module communication, but this
@@ -1025,6 +1027,10 @@ void class_import_put(struct obd_import *imp)
 
        if (atomic_dec_and_test(&imp->imp_refcount)) {
                 CDEBUG(D_INFO, "final put import %p\n", imp);
 
        if (atomic_dec_and_test(&imp->imp_refcount)) {
                 CDEBUG(D_INFO, "final put import %p\n", imp);
+               /* Drop security policy instance after all RPCs have
+                * finished/aborted to let all busy contexts be released. */
+               sptlrpc_sec_put_superhack(imp);
+
                 obd_zombie_import_add(imp);
         }
 
                 obd_zombie_import_add(imp);
         }
 
index d6a58a0..1038b24 100644 (file)
@@ -90,6 +90,7 @@ static __init int ptlrpc_init(void)
                GOTO(err_portals, rc);
 
        ptlrpc_put_connection_superhack = ptlrpc_connection_put;
                GOTO(err_portals, rc);
 
        ptlrpc_put_connection_superhack = ptlrpc_connection_put;
+       sptlrpc_sec_put_superhack = sptlrpc_import_sec_put;
 
        rc = ptlrpc_start_pinger();
        if (rc)
 
        rc = ptlrpc_start_pinger();
        if (rc)
index 254aed5..94ae681 100644 (file)
@@ -398,11 +398,9 @@ static int import_sec_validate_get(struct obd_import *imp,
        }
 
        *sec = sptlrpc_import_sec_ref(imp);
        }
 
        *sec = sptlrpc_import_sec_ref(imp);
-       /* Only output an error when the import is still active */
        if (*sec == NULL) {
        if (*sec == NULL) {
-               if (list_empty(&imp->imp_zombie_chain))
-                       CERROR("import %p (%s) with no sec\n",
-                               imp, ptlrpc_import_state_name(imp->imp_state));
+               CERROR("import %p (%s) with no sec\n",
+                      imp, ptlrpc_import_state_name(imp->imp_state));
                return -EACCES;
        }
 
                return -EACCES;
        }