Esempio n. 1
0
static void file_unlink(struct dir_entry_info *entry)
{
	struct file_info *file = entry->entry.file;
	char *path;

	path = dir_path(entry->parent, entry->name);

	/* Remove file entry from parent directory */
	remove_dir_entry(entry);

	/* Unlink the file */
	CHECK(unlink(path) != -1);
	free(path);

	/* Free struct file_info if file is not open and not linked */
	if (!file->fds && !file->links) {
		struct write_info *w, *next;

		free(file->name);
		w = file->writes;
		while (w) {
			next = w->next;
			free(w);
			w = next;
		}
		free(file);
	} else if (!file->links)
		file->deleted = 1;
}
Esempio n. 2
0
static void dir_remove(struct dir_info *dir)
{
	char *path;

	/* Remove directory contents */
	while (dir->first) {
		struct dir_entry_info *entry;

		entry = dir->first;
		if (entry->type == 'd')
			dir_remove(entry->entry.dir);
		else if (entry->type == 'f')
			file_unlink(entry);
		else if (entry->type == 's')
			symlink_remove(entry->entry.symlink);
		else
			CHECK(0); /* Invalid struct dir_entry_info */
	}
	/* Remove entry from parent directory */
	remove_dir_entry(dir->entry);
	/* Remove directory itself */
	path = dir_path(dir->parent, dir->name);
	CHECK(rmdir(path) != -1);
	free(dir);
}
Esempio n. 3
0
int ext2_rename(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry) {
        // Remove inode from parent dir.
        remove_dir_entry((ext2_fs_instance_t*)old_dir->i_instance, old_dir->i_ino, old_dentry->d_name);

        add_dir_entry((ext2_fs_instance_t*)new_dir->i_instance, new_dir->i_ino, new_dentry->d_name, EXT2_FT_REG_FILE, old_dentry->d_inode->i_ino); //XXX

        return 0;
}
Esempio n. 4
0
int ext2_rmdir(inode_t *dir, dentry_t *dentry) {
        if (S_ISDIR(dentry->d_inode->i_mode)) {
                remove_dir_entry((ext2_fs_instance_t*)dir->i_instance, dir->i_ino, dentry->d_name);
                return 0;
        } else {
                return -ENOTDIR;
        }


}
Esempio n. 5
0
File: name-hash.c Progetto: 0369/git
void remove_name_hash(struct index_state *istate, struct cache_entry *ce)
{
	if (!istate->name_hash_initialized || !(ce->ce_flags & CE_HASHED))
		return;
	ce->ce_flags &= ~CE_HASHED;
	hashmap_remove(&istate->name_hash, ce, ce);

	if (ignore_case)
		remove_dir_entry(istate, ce);
}
Esempio n. 6
0
static void symlink_remove(struct symlink_info *symlink)
{
	char *path;

	path = dir_path(symlink->entry->parent, symlink->entry->name);

	remove_dir_entry(symlink->entry);

	CHECK(unlink(path) != -1);
	free(path);
}
Esempio n. 7
0
int ext2_rmdir(inode_t *dir, dentry_t *dentry) {
	if (S_ISDIR(dentry->d_inode->i_mode)) {
		remove_dir_entry((ext2_fs_instance_t*)dir->i_instance, dir->i_ino, dentry->d_name);
		free_inode((ext2_fs_instance_t*)dir->i_instance, dentry->d_inode->i_ino);
		return 0;
	} else {
		return -ENOTDIR;
	}


	// TODO: Check is empty.
	// TODO: Call rmdir_inode!
	// décompter link!
}
Esempio n. 8
0
static BOOL do_unlink(MESSAGE *message){
    int inode_index,flags,sector_index,sector_length;
    const char *path;
    char dir_name[MAX_FILENAME_LENGTH]={0};
    char file_name[MAX_FILENAME_LENGTH]={0};
    INODE inode;

    flags=message->flags;
    path=message->arg_pointer;
    //分离父目录路径和文件名
    if(!strip_path(path,dir_name,file_name)){
        return FALSE;
    }
    
    //1.get inode_index,and remove the dir_entry
    inode_index=search_file(dir_name,file_name,GET_FILE_TYPE(flags));
#ifdef DEBUG_FS
    printl("inode_index=%d(in do_unlink)\n",inode_index);
#endif
    if(inode_index<0){
        set_error_index(FILE_NOT_EXIST);
        return FALSE;
    }
    if(!remove_dir_entry(dir_name,inode_index)){
        set_error_index(FILE_NOT_EXIST);
        return FALSE;
    }
    //2.get file inode by inode_index
    get_inode_by_index(inode_index,&inode);
    
    //3.clear imap by inode_index
    free_imap_bit(inode_index);
    
    //4.clear smap inode
    sector_index=inode.i_start_sector_index-get_data_block_first_index(super_block);
    sector_length=inode.i_sectors_length;
    /* printl("sector_index=%d sector_length=%d data_first_index=%d\n",inode.i_start_sector_index,sector_length,get_data_block_first_index(super_block)); */
    free_smap_bit(sector_index,sector_length);
    
    return TRUE;
}
Esempio n. 9
0
int ext2_unlink(inode_t *dir, dentry_t *dentry) {
        remove_dir_entry((ext2_fs_instance_t*)dir->i_instance, dir->i_ino, dentry->d_name);
        // TODO: nlink--
        return 0;
}
Esempio n. 10
0
static void rename_entry(struct dir_entry_info *entry)
{
	struct dir_entry_info *rename_entry = NULL;
	struct dir_info *parent;
	char *path, *to, *name;
	int ret, isdir, retry;

	if (!entry->parent)
		return;

	for (retry = 0; retry < 3; retry++) {
		path = dir_path(entry->parent, entry->name);
		isdir = entry->type == 'd' ? 1 : 0;
		name = pick_rename_name(&parent, &rename_entry, isdir);
		to = dir_path(parent, name);
		/*
		 * Check we are not trying to move a directory to a subdirectory
		 * of itself.
		 */
		if (isdir) {
			struct dir_info *p;

			for (p = parent; p; p = p->parent)
				if (p == entry->entry.dir)
					break;
			if (p == entry->entry.dir) {
				free(path);
				free(name);
				free(to);
				path = NULL;
				continue;
			}
		}
		break;
	}

	if (!path)
		return;

	ret = rename(path, to);
	if (ret == -1) {
		if (errno == ENOSPC)
			full = 1;
		CHECK(errno == ENOSPC || errno == EBUSY);
		free(path);
		free(name);
		free(to);
		return;
	}

	free(path);
	free(to);

	if (rename_entry && rename_entry->type == entry->type &&
	    rename_entry->entry.target == entry->entry.target) {
		free(name);
		return;
	}

	add_dir_entry(parent, entry->type, name, entry->entry.target);
	if (rename_entry)
		remove_dir_entry(rename_entry);
	remove_dir_entry(entry);
	free(name);
}