dentry_t* ext2_lookup(struct _fs_instance_t *instance, struct _dentry_t* dentry, const char * name) { int flags = 0; // XXX int inode = getinode_from_name((ext2_fs_instance_t*)instance, dentry->d_inode->i_ino, name); if (inode == -ENOENT && (flags & O_CREAT)) { //inode = ext2_mknod2((ext2_fs_instance_t*)instance, name, 00644 | 0x8000, 0); //FIXME! } else if (inode <= 0) { return NULL; } else if (flags & O_EXCL && flags & O_CREAT) { return NULL; } struct ext2_inode *einode = read_inode((ext2_fs_instance_t*)instance, inode); dentry_t *d =(dentry_t*) kmalloc(sizeof(dentry_t),0); char *n = strdup(name); d->d_name = (const char*)n; d->d_pdentry = dentry; d->d_inode = (inode_t*)kmalloc(sizeof(inode_t),0); ext2inode_2_inode(d->d_inode, instance, inode, einode); d->d_inode->i_count = 0; if (flags & O_TRUNC) { ext2_truncate(d->d_inode, 0); } return d; }
dentry_t* ext2_lookup(struct _fs_instance_t *instance, struct _dentry_t* dentry, const char * name) { int flags = 0; // XXX int inode = getinode_from_name((ext2_fs_instance_t*)instance, dentry->d_inode->i_ino, name); if (inode == -ENOENT && (flags & O_CREAT)) { //inode = ext2_mknod2((ext2_fs_instance_t*)instance, name, 00644 | 0x8000, 0); //FIXME! // Plusieurs choses : getinode_from_name retourne ENOTDIR et pas ENOENT, // flags vaut 0, et ce mknod est réalisé plus haut, peut-être qu'on devrait // supprimer ce cas tout simplement ? } else if (inode <= 0) { return NULL; } else if (flags & O_EXCL && flags & O_CREAT) { return NULL; } struct ext2_inode *einode = read_inode((ext2_fs_instance_t*)instance, inode); dentry_t *d = kmalloc(sizeof(dentry_t)); char *n = strdup(name); d->d_name = (const char*)n; d->d_pdentry = dentry; d->d_inode = kmalloc(sizeof(inode_t)); ext2inode_2_inode(d->d_inode, instance, inode, einode); d->d_inode->i_count = 0; if (flags & O_TRUNC) { ext2_truncate(d->d_inode, 0); } return d; }
int ext2_mknod(inode_t *dir, dentry_t *dentry, mode_t mode, dev_t dev) { int ino = mknod_inode((ext2_fs_instance_t*)dir->i_instance, dir->i_ino, dentry->d_name, mode, dev); if (ino == 0) { return -ENOTDIR; //XXX } struct ext2_inode *einode = read_inode((ext2_fs_instance_t*)dir->i_instance, ino); dentry->d_inode = (inode_t*)kmalloc(sizeof(inode_t),0); ext2inode_2_inode(dentry->d_inode, dir->i_instance, ino, einode); dentry->d_inode->i_count = 0; return 0; }
int ext2_truncate(inode_t *inode, off_t off) { __u32 size = off; ext2_fs_instance_t *instance = (ext2_fs_instance_t*)inode->i_instance; struct ext2_inode *einode = read_inode(instance, inode->i_ino); if (einode) { __u32 n_blk; if (size > 0) { n_blk = (size - 1) / (1024 << instance->superblock.s_log_block_size) + 1; } else { n_blk = 1; } __u32 addr = get_data_block (instance,einode, n_blk);; if (addr) { while (addr) { if (off <= 0) { free_block(instance, addr / (1024 << instance->superblock.s_log_block_size)); } else { off -= 1024 << instance->superblock.s_log_block_size; } n_blk++; addr = get_data_block (instance,einode, n_blk); } } else { while (off > 0) { set_block_inode_data(instance, einode, n_blk, alloc_block(instance)); n_blk++; off -= 1024 << instance->superblock.s_log_block_size; } } einode->i_size = size; write_inode(instance, inode->i_ino, einode); ext2inode_2_inode(inode, inode->i_instance, inode->i_ino, einode); return 0; } return -ENOENT; }
int ext2_truncate(inode_t *inode, off_t off) { uint32_t size = off; ext2_fs_instance_t *instance = (ext2_fs_instance_t*)inode->i_instance; struct ext2_inode *einode = read_inode(instance, inode->i_ino); if (einode) { // TODO vérifier le bon fonctionnement. int n_blk; if (size > 0) { n_blk = (size - 1) / (1024 << instance->superblock.s_log_block_size) + 1; } else { n_blk = 1; } int addr = addr_inode_data2(instance, einode, n_blk); if (addr) { // 1er cas : off est plus petit que la taille du fichier. while (addr) { if (off <= 0) { free_block(instance, addr / (1024 << instance->superblock.s_log_block_size)); } else { off -= 1024 << instance->superblock.s_log_block_size; } n_blk++; addr = addr_inode_data2(instance, einode, n_blk); } } else { // 2er cas : off est plus grand. while (off > 0) { set_block_inode_data(instance, einode, n_blk, alloc_block(instance)); n_blk++; off -= 1024 << instance->superblock.s_log_block_size; } } einode->i_size = size; write_inode(instance, inode->i_ino, einode); ext2inode_2_inode(inode, inode->i_instance, inode->i_ino, einode); return 0; } return -ENOENT; }