dir_create_commit(&doh, fs, dir, name, len,
rr->inode->i_ino,
mode_to_dt(rr->inode->i_mode));
- LAFSI(rr->inode)->md.file.parent = dir->i_ino;
+ switch (LAFSI(rr->inode)->type) {
+ case TypeFile:
+ LAFSI(rr->inode)->md.file.parent = dir->i_ino;
+ break;
+ case TypeInodeFile:
+ LAFSI(rr->inode)->md.fs.parent = dir->i_ino;
+ break;
+ }
if (inode) {
if (S_ISDIR(inode->i_mode))
inode_dec_link_count(inode);
new_dentry->d_name.len,
old_inode->i_ino,
mode_to_dt(old_inode->i_mode));
- LAFSI(old_inode)->md.file.parent = new_dir->i_ino;
+ switch (LAFSI(old_inode)->type) {
+ case TypeFile:
+ LAFSI(old_inode)->md.file.parent = new_dir->i_ino;
+ break;
+ case TypeInodeFile:
+ LAFSI(old_inode)->md.fs.parent = new_dir->i_ino;
+ break;
+ }
if (new_inode) {
if (S_ISDIR(new_inode->i_mode))
inode_dec_link_count(new_inode);
i->blocks_unalloc = 0;
i->creation_age = le64_to_cpu(l->creation_age);
i->inodes_used = le32_to_cpu(l->inodes_used);
+ i->parent = le32_to_cpu(l->parent);
i->quota_inums[0] = le32_to_cpu(l->quota_inodes[0]);
i->quota_inums[1] = le32_to_cpu(l->quota_inodes[1]);
i->quota_inums[2] = le32_to_cpu(l->quota_inodes[2]);
l->blocks_allowed = 0;
l->creation_age = fs->wc[0].cluster_seq;
l->inodes_used = 0;
+ l->parent = 0;
l->quota_inodes[0] = 0;
l->quota_inodes[1] = 0;
l->quota_inodes[2] = 0;
l->blocks_allowed = cpu_to_le64(i->blocks_allowed);
l->creation_age = cpu_to_le64(i->creation_age);
l->inodes_used = cpu_to_le32(i->inodes_used);
+ l->parent = cpu_to_le32(i->parent);
l->quota_inodes[0] = cpu_to_le32(i->quota_inums[0]);
l->quota_inodes[1] = cpu_to_le32(i->quota_inums[1]);
l->quota_inodes[2] = cpu_to_le32(i->quota_inums[2]);
u64 blocks_allowed;
u64 creation_age;
u32 inodes_used;
+ u32 parent; /* Make it easier to look like
+ * a directory */
u32 quota_inodes[3];
u16 snapshot_usage_table;
u16 pad;
u64 blocks_unalloc; /* FIXME what is this for ?? */
u64 creation_age;
+ u32 parent; /* like 'parent' in directory */
u32 inodes_used;
u32 quota_inums[3];
struct inode *quota_inodes[3];
err = lafs_pin_dblock(inodb, ReleaseSpace);
if (!err) {
struct fs_md *md;
+ u32 parent = LAFSI(ino)->md.file.parent;
/* OK, we are good to go making this filesystem */
LAFSI(ino)->type = TypeInodeFile;
LAFSI(ino)->metadata_size = (sizeof(struct la_inode) +
sizeof(struct fs_metadata));
ino->i_op = &lafs_subset_ino_operations;
ino->i_fop = &lafs_subset_file_operations;
- /* FIXME we lose md->parent here - what to do?? */
md = &LAFSI(ino)->md.fs;
md->usagetable = 0;
ino->i_mtime = current_fs_time(sb);
/* FIXME should I be using inode_init here */
md->creation_age = fs->wc[0].cluster_seq;
md->inodes_used = 0;
+ md->parent = parent;
md->quota_inums[0] = 0;
md->quota_inums[1] = 0;
md->quota_inums[2] = 0;
static int subset_readdir(struct file *filp, void *dirent, filldir_t filldir)
{
struct dentry *dentry = filp->f_dentry;
- //struct lafs_inodee *lai = LAFSI(dentry->d_inode);
+ struct lafs_inode *lai = LAFSI(dentry->d_inode);
ino_t ino;
loff_t i = filp->f_pos;
i++;
/* fallthrough */
case 1:
- ino = 2; /* FIXME need parent for subset! */
+ ino = lai->md.fs.parent;
if (filldir(dirent, "..", 2, i, ino, DT_DIR) < 0)
break;
filp->f_pos++;
static struct dentry *lafs_get_parent(struct dentry *child)
{
- ino_t inum = LAFSI(child->d_inode)->md.file.parent;
- struct inode *inode = lafs_iget(LAFSI(child->d_inode)->filesys,
- inum, SYNC);
+ ino_t inum = 0;
+ struct inode *inode;
+ switch(LAFSI(child->d_inode)->type) {
+ case TypeFile:
+ inum = LAFSI(child->d_inode)->md.file.parent;
+ break;
+ case TypeInodeFile:
+ inum = LAFSI(child->d_inode)->md.fs.parent;
+ break;
+ }
+ inode = lafs_iget(LAFSI(child->d_inode)->filesys,
+ inum, SYNC);
if (IS_ERR(inode))
return ERR_CAST(inode);
return d_obtain_alias(inode);