Skocz do zawartości

Vfs - Jak To Zrobić


wklaczynski

Rekomendowane odpowiedzi

Mam mały problemik, chcę zrobić sobie systemik plików do mojej komórki, mam wszystkie biblioteki aby z niej czytać, ale mam problem od strony VFS, mimo wszystkich opisów i nawet próbowałem jakieś przykłady, a poniższy kod jest także ściągawką jakiegoś przykładu aby tylko jakoś ruszyć, mam problem, po wykonaniu opisanych czynności, mimo że moduł daje się zamontować za pomocą modprobe nie mam mojego systemu plików, mount -t siemens siemens /tmp/siemens wrzeszczy o braku systemu plików, co robi nie tak, examples był identyczny tylko nazwa inna i także nic nie dawał.

 

mój sposób na instalacje w makefile

ARGET = siemens
OBJS = siemens.o
MDIR = fs/

EXTRA_CFLAGS = -DEXPORT_SYMTAB
CURRENT = $(shell uname -r)
KDIR = /lib/modules/$(CURRENT)/build
PWD = $(shell pwd)
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR) 
ifneq (,$(findstring 2.4.,$(CURRENT)))
install:
   su -c "cp -v $(TARGET).o $(DEST) && /sbin/depmod -a && modprobe siemens"
else
install:
   su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a && modprobe siemens"
endif 

montowanie dysku

mount -t siemens siemens /tmp/siemens 

plik sismens.c

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/mount.h>
#include <linux/list.h>

MODULE_DESCRIPTION("System plików SIEMENS");
MODULE_AUTHOR("Waldemat Kłaczyński ([email protected])");
MODULE_LICENSE("$LICENSE$");

/* do nothing */
struct inode_operations siemens_iops = { NULL, };
struct file_operations  siemens_fops = { NULL, };

/* This is called at mount time */
struct inode *siemens_get_inode(struct super_block *sb, int mode, dev_t dev)
{
       struct inode * inode;

   /* only succeed for the root dir */
   if ((mode & S_IFMT) != S_IFDIR) return NULL;
   if (!(inode = new_inode(sb))) return NULL;
   inode->i_mode = mode;
   inode->i_op = &siemens_iops;
   inode->i_fop = &siemens_fops;
   inode->i_nlink++; /* dirs have nlink >= 2 minimum */
       return inode;
}

static struct super_operations siemens_ops = {
       .statfs         = simple_statfs,
       .drop_inode     = generic_delete_inode,
};

int siemens_fill_sb(struct super_block * sb, void * data, int silent)
{
       struct inode * inode;
       struct dentry * root;

       sb->s_op = &siemens_ops;
       inode = siemens_get_inode(sb, S_IFDIR | 0755, 0);
       root = d_alloc_root(inode);
       if (!root) {
               iput(inode);
               return -ENOMEM;
       }
       sb->s_root = root;
       return 0;
}

struct super_block *siefs_get_sb(struct file_system_type *fs_type,
       int flags, const char *dev_name, void *data) {
       return get_sb_nodev(fs_type, flags, data, siemens_fill_sb);
}

static struct file_system_type siemens_fs_type = {
       "siemens",
       FS_REQUIRES_DEV /* | FS_IBASKET */,     /* ibaskets have unresolved bugs */
       siefs_get_sb,
       NULL
};

int __init init_siefs_fs(void)
{
   int err;
       err = register_filesystem(&siemens_fs_type);
   if (err) printk("siemens: failed to register filesystem\n");
   else {
   }
   return err;

}

EXPORT_NO_SYMBOLS;
static int siemens_init_module(void)
{
   printk( KERN_DEBUG "Module siemens init\n" );
       return init_siefs_fs();
}

static void siemens_exit_module(void)
{
   printk( KERN_DEBUG "Module siemens exit\n" );
   unregister_filesystem(&siemens_fs_type);
}

module_init(siemens_init_module);
module_exit(siemens_exit_module); 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...