jos/inc/fs.h
Anish Athalye c67463e23c Lab 5
2018-10-24 20:44:45 -04:00

117 lines
2.6 KiB
C

// See COPYRIGHT for copyright information.
#ifndef JOS_INC_FS_H
#define JOS_INC_FS_H
#include <inc/types.h>
#include <inc/mmu.h>
// File nodes (both in-memory and on-disk)
// Bytes per file system block - same as page size
#define BLKSIZE PGSIZE
#define BLKBITSIZE (BLKSIZE * 8)
// Maximum size of a filename (a single path component), including null
// Must be a multiple of 4
#define MAXNAMELEN 128
// Maximum size of a complete pathname, including null
#define MAXPATHLEN 1024
// Number of block pointers in a File descriptor
#define NDIRECT 10
// Number of direct block pointers in an indirect block
#define NINDIRECT (BLKSIZE / 4)
#define MAXFILESIZE ((NDIRECT + NINDIRECT) * BLKSIZE)
struct File {
char f_name[MAXNAMELEN]; // filename
off_t f_size; // file size in bytes
uint32_t f_type; // file type
// Block pointers.
// A block is allocated iff its value is != 0.
uint32_t f_direct[NDIRECT]; // direct blocks
uint32_t f_indirect; // indirect block
// Pad out to 256 bytes; must do arithmetic in case we're compiling
// fsformat on a 64-bit machine.
uint8_t f_pad[256 - MAXNAMELEN - 8 - 4*NDIRECT - 4];
} __attribute__((packed)); // required only on some 64-bit machines
// An inode block contains exactly BLKFILES 'struct File's
#define BLKFILES (BLKSIZE / sizeof(struct File))
// File types
#define FTYPE_REG 0 // Regular file
#define FTYPE_DIR 1 // Directory
// File system super-block (both in-memory and on-disk)
#define FS_MAGIC 0x4A0530AE // related vaguely to 'J\0S!'
struct Super {
uint32_t s_magic; // Magic number: FS_MAGIC
uint32_t s_nblocks; // Total number of blocks on disk
struct File s_root; // Root directory node
};
// Definitions for requests from clients to file system
enum {
FSREQ_OPEN = 1,
FSREQ_SET_SIZE,
// Read returns a Fsret_read on the request page
FSREQ_READ,
FSREQ_WRITE,
// Stat returns a Fsret_stat on the request page
FSREQ_STAT,
FSREQ_FLUSH,
FSREQ_REMOVE,
FSREQ_SYNC
};
union Fsipc {
struct Fsreq_open {
char req_path[MAXPATHLEN];
int req_omode;
} open;
struct Fsreq_set_size {
int req_fileid;
off_t req_size;
} set_size;
struct Fsreq_read {
int req_fileid;
size_t req_n;
} read;
struct Fsret_read {
char ret_buf[PGSIZE];
} readRet;
struct Fsreq_write {
int req_fileid;
size_t req_n;
char req_buf[PGSIZE - (sizeof(int) + sizeof(size_t))];
} write;
struct Fsreq_stat {
int req_fileid;
} stat;
struct Fsret_stat {
char ret_name[MAXNAMELEN];
off_t ret_size;
int ret_isdir;
} statRet;
struct Fsreq_flush {
int req_fileid;
} flush;
struct Fsreq_remove {
char req_path[MAXPATHLEN];
} remove;
// Ensure Fsipc is one page
char _pad[PGSIZE];
};
#endif /* !JOS_INC_FS_H */