Home | History | Annotate | Download | only in include
      1 /*
      2  *
      3  *   Copyright (c) International Business Machines  Corp., 2001
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  *
     19 
     20  * This test is meant to hit
     21  * many of the inline functions
     22  * in various include files.
     23  *
     24  * Author: David Cruz <cruzd (at) us.ibm.com>
     25  * Module: includeTest
     26  *
     27  */
     28 
     29 #include <linux/types.h>
     30 #include <linux/kernel.h>
     31 #include <linux/fs.h>
     32 #include <linux/ioctl.h>
     33 #include <linux/module.h>
     34 #include <linux/init.h>
     35 #include <linux/pm.h>
     36 #include <linux/genhd.h>
     37 #include <linux/in.h>
     38 #include <asm/types.h>
     39 #include <linux/lockd/bind.h>
     40 #include <acpi/acpi_drivers.h>
     41 #include <linux/nfsd/nfsfh.h>
     42 #include <linux/sunrpc/auth.h>
     43 #include <linux/sunrpc/cache.h>
     44 #include <linux/sunrpc/svc.h>
     45 #include <linux/sunrpc/xdr.h>
     46 #include <linux/sunrpc/timer.h>
     47 #include <video/vga.h>
     48 #include <linux/errno.h>
     49 #include <linux/string.h>
     50 #include <linux/mm.h>
     51 #include <linux/slab.h>
     52 #include <linux/lockd/lockd.h>
     53 #include <linux/lockd/nlm.h>
     54 #include <linux/nfsd/export.h>
     55 #include <asm/uaccess.h>
     56 #include "includeTest.h"
     57 
     58 MODULE_AUTHOR("David Cruz <cruzd (at) us.ibm.com>");
     59 MODULE_DESCRIPTION(TEST_DRIVER_NAME);
     60 MODULE_LICENSE("GPL");
     61 
     62 static int test_ioctl(struct inode *, struct file *, unsigned int,
     63 		      unsigned long);
     64 static int test_open(struct inode *, struct file *);
     65 static int test_close(struct inode *, struct file *);
     66 static void test_acpi(void);
     67 static void test_vga(void);
     68 static void test_sunrpc_auth(void);
     69 static void test_nfsfh(void);
     70 static void test_lockd(void);
     71 static void test_sunrpc_cache(void);
     72 static void test_sunrpc_svc(void);
     73 static void test_sunrpc_timer(void);
     74 
     75 static int Major = 0;
     76 
     77 static struct block_device_operations bdops = {
     78 open:	test_open,
     79 release:test_close,
     80 ioctl:	test_ioctl,
     81 };
     82 
     83 static char genhd_flags = 0;
     84 static struct gendisk *gd_ptr;
     85 static struct pm_dev *ltp_pm_dev = NULL;
     86 
     87 static int test_open(struct inode *ino, struct file *f)
     88 {
     89 	printk("device open\n");
     90 	return 0;
     91 }
     92 
     93 static int test_close(struct inode *ino, struct file *f)
     94 {
     95 	printk("device closed\n");
     96 	return 0;
     97 }
     98 
     99 static int test_ioctl(struct inode *ino, struct file *f, unsigned int cmd,
    100 		      unsigned long l)
    101 {
    102 
    103 	int rc = 0;		//return code
    104 	int arg;
    105 
    106 	printk("Entered the ioctl call.\n");
    107 
    108 	if (copy_from_user(&arg, (void *)l, sizeof(int))) {
    109 		//bad address
    110 		return (-EFAULT);
    111 	}
    112 
    113 	switch (cmd) {
    114 
    115 	case OPTION1:
    116 		option1();
    117 		break;
    118 	default:
    119 		printk("Mismatching ioctl command\n");
    120 		break;
    121 	}
    122 
    123 	//0 by default
    124 	return rc;
    125 }
    126 
    127 static void option1(void)
    128 {
    129 	printk("Module option 1 chosen\n");
    130 }
    131 
    132 static int ltp_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
    133 {
    134 	return 0;
    135 }
    136 
    137 static int test_init_module(void)
    138 {
    139 
    140 	int rc;
    141 
    142 	printk("starting module\n");
    143 
    144 	ltp_pm_dev = pm_register(PM_UNKNOWN_DEV, 0, ltp_pm_callback);
    145 	rc = register_blkdev(INCLUDEMAJOR, DEVICE_NAME);
    146 
    147 	printk("BLK INC - result =%d major %d\n", rc, INCLUDEMAJOR);
    148 
    149 	if (rc < 0) {
    150 		printk("Failed to register device.\n");
    151 		return rc;
    152 	}
    153 
    154 	gd_ptr = kmalloc(sizeof(struct gendisk *), GFP_KERNEL);
    155 	if (!gd_ptr) {
    156 		printk(KERN_ALERT "ERROR getting memory !!!\n");
    157 		return 0;
    158 	}
    159 
    160 	printk("major = %d\n", Major);
    161 	gd_ptr = alloc_disk(1);
    162 	printk(KERN_ALERT "gd_ptr after alloc = %p \n", gd_ptr);
    163 	gd_ptr->major = INCLUDEMAJOR;
    164 	gd_ptr->first_minor = 0;
    165 	gd_ptr->fops = &bdops;
    166 //      gd_ptr->minor_shift= MINOR_SHIFT_BITS;
    167 	gd_ptr->driverfs_dev = NULL;
    168 	gd_ptr->capacity = MAX_NUM_DISKS;
    169 //      gd_ptr->disk_de = NULL;
    170 	gd_ptr->flags = genhd_flags;
    171 
    172 	sprintf(gd_ptr->disk_name, DEVICE_NAME);
    173 	add_disk(gd_ptr);
    174 
    175 	printk("major = %d\n", Major);
    176 
    177 	test_acpi();
    178 	test_vga();
    179 	test_lockd();
    180 	test_sunrpc_auth();
    181 	test_nfsfh();
    182 	test_sunrpc_cache();
    183 	test_sunrpc_svc();
    184 	test_sunrpc_timer();
    185 	printk("finished module\n");
    186 
    187 	return 0;
    188 }
    189 
    190 static void test_exit_module(void)
    191 {
    192 
    193 	int rc;
    194 
    195 	pm_unregister(ltp_pm_dev);
    196 	put_disk(gd_ptr);
    197 	del_gendisk(gd_ptr);
    198 
    199 	rc = unregister_blkdev(INCLUDEMAJOR, DEVICE_NAME);
    200 
    201 	if (rc < 0) {
    202 		printk("unregister failed %d\n", rc);
    203 	} else {
    204 		printk("unregister success\n");
    205 	}
    206 }
    207 
    208 static void test_acpi(void)
    209 {
    210 	u32 flag;
    211 
    212 	for (flag = 0; flag <= 4; flag++)
    213 		acpi_set_debug(flag);
    214 
    215 	printk("finished acpi test\n");
    216 }
    217 
    218 static void test_sunrpc_auth(void)
    219 {
    220 	struct rpc_cred cred;
    221 
    222 	atomic_set(&(cred.cr_count), 0);
    223 	get_rpccred(&cred);
    224 	printk("finished auth test\n");
    225 }
    226 
    227 static void test_vga(void)
    228 {
    229 
    230 	unsigned short vgaS = 0;
    231 	int i = 0;
    232 	vga_r((caddr_t) i, vgaS);
    233 	printk("finished vga test\n");
    234 }
    235 
    236 static void test_nfsfh(void)
    237 {
    238 	dev_t dev = 0;
    239 	u32 unfs = 0, u32ptr[2];
    240 	ino_t ino = 0;
    241 	struct svc_fh A1;
    242 	int i = 20;
    243 
    244 	u32_to_dev_t((__u32) unfs);
    245 	ino_t_to_u32(ino);
    246 	u32_to_ino_t((__u32) unfs);
    247 	mk_fsid_v0(u32ptr, dev, ino);
    248 	mk_fsid_v1(u32ptr, unfs);
    249 	SVCFH_fmt(&A1);
    250 	fh_init(&A1, i);
    251 	fh_lock(&A1);
    252 	fh_unlock(&A1);
    253 	printk("finished nfsfh test\n");
    254 }
    255 
    256 static void test_lockd(void)
    257 {
    258 
    259 	struct nlm_file file;
    260 	struct sockaddr_in sin1, sin2;
    261 	struct file_lock fl1, fl2;
    262 
    263 	nlm_compare_locks(&fl1, &fl2);
    264 	nlm_cmp_addr(&sin1, &sin2);
    265 	nlmsvc_file_inode(&file);
    266 	printk("finished lockd test\n");
    267 }
    268 
    269 static void test_sunrpc_cache(void)
    270 {
    271 	struct cache_head head;
    272 	struct cache_detail detail;
    273 
    274 	cache_get(&head);
    275 	cache_put(&head, &detail);
    276 	printk("finished cache test\n");
    277 }
    278 
    279 static void test_sunrpc_svc(void)
    280 {
    281 	u32 val;
    282 	struct svc_rqst rqstp;
    283 	char name[50];
    284 	struct iovec iov;
    285 	int bits = 0, bits2 = 0;
    286 	rqstp.rq_resused = 1;
    287 
    288 	svc_getu32(&iov);
    289 //      svc_putu32(&iov, val);
    290 
    291 	xdr_argsize_check(&rqstp, &val);
    292 	xdr_ressize_check(&rqstp, &val);
    293 	svc_take_page(&rqstp);
    294 	svc_pushback_allpages(&rqstp);
    295 	svc_pushback_unused_pages(&rqstp);
    296 	svc_free_allpages(&rqstp);
    297 	hash_str(name, bits);
    298 	hash_mem(name, bits, bits2);
    299 	printk("finished svc test\n");
    300 
    301 }
    302 
    303 static void test_sunrpc_timer()
    304 {
    305 	struct rpc_rtt rt;
    306 
    307 	rpc_inc_timeo(&rt);
    308 	rpc_clear_timeo(&rt);
    309 	rpc_ntimeo(&rt);
    310 	printk("finished timer test\n");
    311 }
    312 
    313 module_init(test_init_module)
    314     module_exit(test_exit_module)
    315