next up previous
Next: Objetos do sistema Up: proposta Previous: Dificuldades no Cliente

Virtual File System Layer

O VFS7 é uma camada abstrata existente em diversos núcleos Unix que pretende fornecer uma interface bem definida para implementação de sistemas de arquivos. A interface do VFS é estruturada em cima de tipos de objetos genéricos, e uma série de métodos que são chamados a partir desses objetos.

Dessa maneira é mais fácil implementar um sistema de arquivos para esses Unices, bastando fornecer uma implementação para os métodos dos objetos do VFS para a criação de um sistema de arquivos novo. Os objetos básicos conhecidos pelo VFS são: arquivos, sistemas de arquivos, inodes, e nomes de inodes. Cada um desses objetos possuem um conjunto de métodos especificados nas estruturas super_operations (para o sistema de arquivos), file_operations (para arquivos), inode_operations para inodes, e dentry_operations para nomes dos arquivos.

A seguir são apresentados os métodos necessários para implementar um sistema de arquivos usando o VFS do Linux. Note que nem todos esses métodos precisam ser implementados necessariamente, o Linux fornece alguns métodos genéricos para uso geral. As estruturas foram retirados da versão 2.4.19-pre2 do núcleo do Linux, mas não devem apresentar muitas diferenças entre versões. Os argumentos dos métodos foram removidos para deixá-los mais simples e claros. Esses métodos são extremamente importantes para podermos definir objetos e interfaces CORBA consistentes com as necessidades do VFS.

struct super_operations {
  void (*read_inode) ();
  void (*dirty_inode) ();
  void (*write_inode) ();
  void (*put_inode) ();
  void (*delete_inode) ();
  void (*put_super) ();
  void (*write_super) ();
  void (*write_super_lockfs) ();
  void (*unlockfs) ();
  int (*statfs) ();
  int (*remount_fs) ();
  void (*clear_inode) ();
  void (*umount_begin) ();
};

struct file_operations {
  struct module *owner;
  loff_t (*llseek) ();
  ssize_t (*read) ();
  ssize_t (*write) ();
  int (*readdir) ();
  unsigned int (*poll) ();
  int (*ioctl) ();
  int (*mmap) ();
  int (*open) ();
  int (*flush) ();
  int (*release) ();
  int (*fsync) ();
  int (*fasync) ();
  int (*lock) ();
  ssize_t (*readv) ();
  ssize_t (*writev) ();
  ssize_t (*sendpage) ();
};

struct inode_operations {
  int (*create) ();
  struct dentry * (*lookup) ();
  int (*link) ();
  int (*unlink) ();
  int (*symlink) ();
  int (*mkdir) ();
  int (*rmdir) ();
  int (*mknod) ();
  int (*rename) ();
  int (*readlink) ();
  int (*follow_link) ();
  void (*truncate) ();
  int (*permission) ();
  int (*revalidate) ();
  int (*setattr) ();
  int (*getattr) ();
};

struct dentry_operations {
  int (*d_revalidate) ();
  int (*d_hash) ();
  int (*d_compare) ();
  int (*d_delete) ();
  void (*d_release) ();
  void (*d_iput) ();
};


next up previous
Next: Objetos do sistema Up: proposta Previous: Dificuldades no Cliente
Livio Baldini Soares 2002-07-08