Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
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;
}
Exemplo n.º 5
0
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;
}