/* Find free atom */ static int get_freeatom(struct inode *atable, atom_t *atom) { if(DEBUG_MODE_K==1) { printf("\t\t\t\t%25s[K] %25s %4d #in\n",__FILE__,__func__,__LINE__); } struct sb *sb = tux_sb(atable->i_sb); atom_t freeatom = sb->freeatom; if (!freeatom) { *atom = sb->atomgen++; return 0; } loff_t next = unatom_dict_read(atable, freeatom); if (next < 0) return next; if (!is_free_unatom(next)) { tux3_fs_error(sb, "something horrible happened"); return -EIO; } *atom = freeatom; sb->freeatom = next & ~UNATOM_FREE_MASK; return 0; }
/* Convert atom to name */ static int unatom(struct inode *atable, atom_t atom, char *name, unsigned size) { if(DEBUG_MODE_K==1) { printf("\t\t\t\t%25s[K] %25s %4d #in\n",__FILE__,__func__,__LINE__); } struct sb *sb = tux_sb(atable->i_sb); struct buffer_head *buffer; int err; loff_t where = unatom_dict_read(atable, atom); if (where < 0) { err = where; goto error; } buffer = blockread(mapping(atable), where >> sb->blockbits); if (!buffer) { err = -EIO; goto error; } tux_dirent *entry = bufdata(buffer) + (where & sb->blockmask); if (entry_atom(entry) != atom) { tux3_fs_error(sb, "atom %x reverse entry broken", atom); err = -EIO; goto error_blockput; } unsigned len = entry->name_len; if (size) { if (len > size) { err = -ERANGE; goto error_blockput; } memcpy(name, entry->name, len); } blockput(buffer); return len; error_blockput: blockput(buffer); error: return err; }
/* Find free atom */ static int get_freeatom(struct inode *atable, atom_t *atom) { struct sb *sb = tux_sb(atable->i_sb); atom_t freeatom = sb->freeatom; if (!freeatom) { *atom = sb->atomgen++; return 0; } loff_t next = unatom_dict_read(atable, freeatom); if (next < 0) return next; if (!is_free_unatom(next)) { tux3_fs_error(sb, "something horrible happened"); return -EIO; } *atom = freeatom; sb->freeatom = next & ~UNATOM_FREE_MASK; return 0; }