LCOV - code coverage report
Current view: top level - net/9p - mod.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 13 51 25.5 %
Date: 2021-04-22 12:43:58 Functions: 2 7 28.6 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-only
       2             : /*
       3             :  *  net/9p/9p.c
       4             :  *
       5             :  *  9P entry point
       6             :  *
       7             :  *  Copyright (C) 2007 by Latchesar Ionkov <lucho@ionkov.net>
       8             :  *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
       9             :  *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
      10             :  */
      11             : 
      12             : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      13             : 
      14             : #include <linux/module.h>
      15             : #include <linux/errno.h>
      16             : #include <linux/sched.h>
      17             : #include <linux/moduleparam.h>
      18             : #include <net/9p/9p.h>
      19             : #include <linux/fs.h>
      20             : #include <linux/parser.h>
      21             : #include <net/9p/client.h>
      22             : #include <net/9p/transport.h>
      23             : #include <linux/list.h>
      24             : #include <linux/spinlock.h>
      25             : 
      26             : #ifdef CONFIG_NET_9P_DEBUG
      27             : unsigned int p9_debug_level = 0;        /* feature-rific global debug level  */
      28             : EXPORT_SYMBOL(p9_debug_level);
      29             : module_param_named(debug, p9_debug_level, uint, 0);
      30             : MODULE_PARM_DESC(debug, "9P debugging level");
      31             : 
      32             : void _p9_debug(enum p9_debug_flags level, const char *func,
      33             :                 const char *fmt, ...)
      34             : {
      35             :         struct va_format vaf;
      36             :         va_list args;
      37             : 
      38             :         if ((p9_debug_level & level) != level)
      39             :                 return;
      40             : 
      41             :         va_start(args, fmt);
      42             : 
      43             :         vaf.fmt = fmt;
      44             :         vaf.va = &args;
      45             : 
      46             :         if (level == P9_DEBUG_9P)
      47             :                 pr_notice("(%8.8d) %pV", task_pid_nr(current), &vaf);
      48             :         else
      49             :                 pr_notice("-- %s (%d): %pV", func, task_pid_nr(current), &vaf);
      50             : 
      51             :         va_end(args);
      52             : }
      53             : EXPORT_SYMBOL(_p9_debug);
      54             : #endif
      55             : 
      56             : /*
      57             :  * Dynamic Transport Registration Routines
      58             :  *
      59             :  */
      60             : 
      61             : static DEFINE_SPINLOCK(v9fs_trans_lock);
      62             : static LIST_HEAD(v9fs_trans_list);
      63             : 
      64             : /**
      65             :  * v9fs_register_trans - register a new transport with 9p
      66             :  * @m: structure describing the transport module and entry points
      67             :  *
      68             :  */
      69           4 : void v9fs_register_trans(struct p9_trans_module *m)
      70             : {
      71           4 :         spin_lock(&v9fs_trans_lock);
      72           4 :         list_add_tail(&m->list, &v9fs_trans_list);
      73           4 :         spin_unlock(&v9fs_trans_lock);
      74           4 : }
      75             : EXPORT_SYMBOL(v9fs_register_trans);
      76             : 
      77             : /**
      78             :  * v9fs_unregister_trans - unregister a 9p transport
      79             :  * @m: the transport to remove
      80             :  *
      81             :  */
      82           0 : void v9fs_unregister_trans(struct p9_trans_module *m)
      83             : {
      84           0 :         spin_lock(&v9fs_trans_lock);
      85           0 :         list_del_init(&m->list);
      86           0 :         spin_unlock(&v9fs_trans_lock);
      87           0 : }
      88             : EXPORT_SYMBOL(v9fs_unregister_trans);
      89             : 
      90             : /**
      91             :  * v9fs_get_trans_by_name - get transport with the matching name
      92             :  * @s: string identifying transport
      93             :  *
      94             :  */
      95           0 : struct p9_trans_module *v9fs_get_trans_by_name(char *s)
      96             : {
      97           0 :         struct p9_trans_module *t, *found = NULL;
      98             : 
      99           0 :         spin_lock(&v9fs_trans_lock);
     100             : 
     101           0 :         list_for_each_entry(t, &v9fs_trans_list, list)
     102           0 :                 if (strcmp(t->name, s) == 0 &&
     103           0 :                     try_module_get(t->owner)) {
     104           0 :                         found = t;
     105           0 :                         break;
     106             :                 }
     107             : 
     108           0 :         spin_unlock(&v9fs_trans_lock);
     109           0 :         return found;
     110             : }
     111             : EXPORT_SYMBOL(v9fs_get_trans_by_name);
     112             : 
     113             : /**
     114             :  * v9fs_get_default_trans - get the default transport
     115             :  *
     116             :  */
     117             : 
     118           0 : struct p9_trans_module *v9fs_get_default_trans(void)
     119             : {
     120           0 :         struct p9_trans_module *t, *found = NULL;
     121             : 
     122           0 :         spin_lock(&v9fs_trans_lock);
     123             : 
     124           0 :         list_for_each_entry(t, &v9fs_trans_list, list)
     125           0 :                 if (t->def && try_module_get(t->owner)) {
     126           0 :                         found = t;
     127           0 :                         break;
     128             :                 }
     129             : 
     130           0 :         if (!found)
     131           0 :                 list_for_each_entry(t, &v9fs_trans_list, list)
     132           0 :                         if (try_module_get(t->owner)) {
     133           0 :                                 found = t;
     134           0 :                                 break;
     135             :                         }
     136             : 
     137           0 :         spin_unlock(&v9fs_trans_lock);
     138           0 :         return found;
     139             : }
     140             : EXPORT_SYMBOL(v9fs_get_default_trans);
     141             : 
     142             : /**
     143             :  * v9fs_put_trans - put trans
     144             :  * @m: transport to put
     145             :  *
     146             :  */
     147           0 : void v9fs_put_trans(struct p9_trans_module *m)
     148             : {
     149           0 :         if (m)
     150           0 :                 module_put(m->owner);
     151           0 : }
     152             : 
     153             : /**
     154             :  * init_p9 - Initialize module
     155             :  *
     156             :  */
     157           1 : static int __init init_p9(void)
     158             : {
     159           1 :         int ret;
     160             : 
     161           1 :         ret = p9_client_init();
     162           1 :         if (ret)
     163             :                 return ret;
     164             : 
     165           1 :         p9_error_init();
     166           1 :         pr_info("Installing 9P2000 support\n");
     167           1 :         p9_trans_fd_init();
     168             : 
     169           1 :         return ret;
     170             : }
     171             : 
     172             : /**
     173             :  * exit_p9 - shutdown module
     174             :  *
     175             :  */
     176             : 
     177           0 : static void __exit exit_p9(void)
     178             : {
     179           0 :         pr_info("Unloading 9P2000 support\n");
     180             : 
     181           0 :         p9_trans_fd_exit();
     182           0 :         p9_client_exit();
     183           0 : }
     184             : 
     185             : module_init(init_p9)
     186             : module_exit(exit_p9)
     187             : 
     188             : MODULE_AUTHOR("Latchesar Ionkov <lucho@ionkov.net>");
     189             : MODULE_AUTHOR("Eric Van Hensbergen <ericvh@gmail.com>");
     190             : MODULE_AUTHOR("Ron Minnich <rminnich@lanl.gov>");
     191             : MODULE_LICENSE("GPL");
     192             : MODULE_DESCRIPTION("Plan 9 Resource Sharing Support (9P2000)");

Generated by: LCOV version 1.14