00001
00133 #ifndef __KERNEL__
00134 # define __KERNEL__
00135 #endif
00136
00137
00138 #include <linux/init.h>
00139 #include <linux/kernel.h>
00140 #include <linux/module.h>
00141 #include <linux/version.h>
00142 #include <linux/fs.h>
00143 #include <linux/sched.h>
00144 #include <linux/statfs.h>
00145 #include <linux/mm.h>
00146 #include <asm/uaccess.h>
00147 #include <asm/errno.h>
00148 #include <linux/buffer_head.h>
00149 #include <linux/pagemap.h>
00150 #include <linux/proc_fs.h>
00151 #include <asm/atomic.h>
00152 #include <linux/string.h>
00153
00154
00155 #include "fsc_device.h"
00156 #include "rkfs.h"
00157 #include "parser.h"
00158
00159
00161 int result;
00162
00164 struct_command ret_command;
00165
00167 char out_buf[OUT_BUF_LENGTH];
00168
00169
00185 int query(const char* command, int command_length) {
00186 int result;
00187
00188 FSPDEBUG("query(%s), len=%d\n", command, (int) command_length);
00189 result = fsc_query(command, command_length, out_buf, OUT_BUF_LENGTH);
00190
00191 if (result > 0) {
00192 out_buf[result] = '\0';
00193 parse_message(out_buf, result, &ret_command);
00194 return RKFS_DEF_QUERY_OK;
00195 }
00196
00197 else {
00198 FSPDEBUG("error on query\n");
00199 return RKFS_DEF_QUERY_ERROR;
00200 }
00201
00202 }
00203
00204
00214 void rkfs_deamon_test(void) {
00215
00216
00217 #ifdef TEST_DEAMON
00218
00219 query("MYSQL1.1 TS");
00220 query("MYSQL1.1 RE 1");
00221 query("MYSQL1.1 RE 8");
00222 query("MYSQL1.1 CF 8 hello.txt");
00223 query("MYSQL1.1 CF 1 hello.txt");
00224 query("MYSQL1.1 CF 1 hello.txt");
00225 query("MYSQL1.1 MD 1 novy_adresar");
00226 query("MYSQL1.1 MD 8 jiny_adresar");
00227 query("MYSQL1.1 MD 1 novy_adresar");
00228 query("MYSQL1.1 RF 50");
00229 query("MYSQL1.1 RF 2");
00230 query("MYSQL1.1 CF 1 vypln");
00231 query("MYSQL1.1 RD 1");
00232 query("MYSQL1.1 RD 3");
00233 query("MYSQL1.1 CR 49");
00234 query("MYSQL1.1 CR 7");
00235 query("MYSQL1.1 GB 1 0");
00236 query("MYSQL1.1 GB 1 1000");
00237 query("MYSQL1.1 GB 400 0");
00238 query("MYSQL1.1 GB 8 0");
00239 query("MYSQL1.1 GB 9 0");
00240 query("MYSQL1.1 GB 9 1");
00241 query("MYSQL1.1 AB 8 cd");
00242 query("MYSQL1.1 CR 8");
00243 query("MYSQL1.1 AB 8 ab");
00244 query("MYSQL1.1 AB 500 cd");
00245 query("MYSQL1.1 LU 1 xxxxx");
00246 query("MYSQL1.1 LU 1 todo.txt");
00247 query("MYSQL1.1 LU 1 novy_adresar");
00248 query("MYSQL1.1 LU 800 ahoj");
00249 query("MYSQL1.1 FI 1");
00250 query("MYSQL1.1 FI 2");
00251 query("MYSQL1.1 DI 10001");
00252 query("MYSQL1.1 DI 103485");
00253 query("MYSQL1.1 RI 4");
00254 query("MYSQL1.1 RI 10001");
00255 #endif
00256 }
00257
00258
00260 struct file_system_type rkfs = {
00261 name: "rkfs",
00262 get_sb: rkfs_get_sb,
00263 kill_sb: rkfs_kill_sb,
00264 owner: THIS_MODULE
00265 };
00266
00267
00281 int rkfs_next_data_item(char **com_data_pos, char *ret_buf) {
00282 int len = 0;
00283
00284 while ((**com_data_pos) != '/' && (**com_data_pos) != '\0') {
00285 *(ret_buf++) = *((*com_data_pos)++);
00286 len++;
00287 }
00288
00289 *ret_buf = '\0';
00290 (*com_data_pos)++;
00291
00292 return len;
00293 }
00294
00295
00307 int rkfs_atoi(char* str) {
00308 int result = 0;
00309 char char_num;
00310 int int_num;
00311
00312 while ((*str) != '\0') {
00313 char_num = *(str++);
00314 switch (char_num) {
00315 case '0': int_num = 0; break;
00316 case '1': int_num = 1; break;
00317 case '2': int_num = 2; break;
00318 case '3': int_num = 3; break;
00319 case '4': int_num = 4; break;
00320 case '5': int_num = 5; break;
00321 case '6': int_num = 6; break;
00322 case '7': int_num = 7; break;
00323 case '8': int_num = 8; break;
00324 case '9': int_num = 9; break;
00325 default: int_num = 0; break;
00326 }
00327 result = result*10 + int_num;
00328 }
00329 return result;
00330 }
00331
00342 static int __init
00343 rkfs_init_module(void) {
00344 int result;
00345 create_proc_read_entry("fsc_dev", 0, NULL, fsc_read_procmem, NULL);
00346 result = register_filesystem(&rkfs);
00347
00348 if (result != 0) {
00349 printk(KERN_ERR "RKFS: unable to register RKFS filesystem.\n");
00350 printk(KERN_INFO "RKFS: register_filesystem error = %d.\n", result);
00351 return result;
00352 }
00353
00354 fsc_init();
00355 result = register_chrdev(fsc_major, CHAR_DEVICE_NAME, &fsc_fops);
00356
00357 if (result < 0) {
00358 printk(KERN_ERR "FSC: unable to register RKFSCHAR character device. \n");
00359 printk(KERN_INFO "FSC: register_chrdev error = %d.\n", result);
00360 return result;
00361 }
00362
00363 if (fsc_major == 0) {
00364 fsc_major = result;
00365 printk(KERN_INFO "FSC: char device succesfully loaded.\n");
00366 }
00367
00368 printk(KERN_INFO "RKFS: filesystem succesfully loaded.\n");
00369 return 0;
00370 }
00371
00372
00381 static void rkfs_cleanup_module(void) {
00382 int result;
00383 remove_proc_entry("fsc_dev", NULL);
00384 result = unregister_filesystem(&rkfs);
00385
00386 if (result != 0) {
00387 printk(KERN_ERR "RKFS: cannot be unloaded. \n");
00388 printk(KERN_INFO "RKFS: unregister_filesystem error = %d.\n", result);
00389 }
00390
00391 else {
00392 printk(KERN_INFO "RKFS: filesystem succesfully unloaded. \n");
00393 }
00394
00395 fsc_fini();
00396 result = unregister_chrdev(fsc_major, CHAR_DEVICE_NAME);
00397
00398 if (result != 0) {
00399 printk(KERN_ERR "FSC: cannot be unloaded. \n");
00400 printk(KERN_INFO "FSC: unregister_chrdev error = %d.\n", result);
00401 }
00402
00403 else {
00404 printk(KERN_INFO "FSC: char device succesfully unloaded.\n");
00405 }
00406
00407 }
00408
00409
00411 module_init(rkfs_init_module);
00412
00413
00415 module_exit(rkfs_cleanup_module);
00416
00417