/* all filling in of inodes postponed until lookup */ static void coda_read_inode(struct inode *inode) { struct coda_sb_info *sbi = coda_sbp(inode->i_sb); struct coda_inode_info *cii; if (!sbi) BUG(); #if 0 /* check if the inode is already initialized */ if (inode->u.generic_ip) { printk("coda_read_inode: initialized inode"); return; } inode->u.generic_ip = cii_alloc(); if (!inode->u.generic_ip) { CDEBUG(D_CNODE, "coda_read_inode: failed to allocate inode info\n"); make_bad_inode(inode); return; } memset(inode->u.generic_ip, 0, sizeof(struct coda_inode_info)); #endif cii = ITOC(inode); if (!coda_isnullfid(&cii->c_fid)) { printk("coda_read_inode: initialized inode"); return; } list_add(&cii->c_cilist, &sbi->sbi_cihead); }
struct inode * coda_iget(struct super_block * sb, ViceFid * fid, struct coda_vattr * attr) { struct inode *inode; struct coda_inode_info *cii; ino_t ino = coda_f2i(fid); inode = iget4(sb, ino, coda_inocmp, fid); if ( !inode ) { CDEBUG(D_CNODE, "coda_iget: no inode\n"); return ERR_PTR(-ENOMEM); } /* check if the inode is already initialized */ cii = ITOC(inode); if (coda_isnullfid(&cii->c_fid)) /* new, empty inode found... initializing */ cii->c_fid = *fid; /* we shouldnt see inode collisions anymore */ if (!coda_fideq(fid, &cii->c_fid)) BUG(); /* always replace the attributes, type might have changed */ coda_fill_inode(inode, attr); return inode; }
/* all filling in of inodes postponed until lookup */ static void coda_read_inode(struct inode *inode) { struct coda_sb_info *sbi = coda_sbp(inode->i_sb); struct coda_inode_info *cii; if (!sbi) BUG(); cii = ITOC(inode); if (!coda_isnullfid(&cii->c_fid)) { printk("coda_read_inode: initialized inode"); return; } cii->c_mapcount = 0; list_add(&cii->c_cilist, &sbi->sbi_cihead); }
/* convert a fid to an inode. */ struct inode *coda_fid_to_inode(ViceFid *fid, struct super_block *sb) { ino_t nr; struct inode *inode; struct coda_inode_info *cii; if ( !sb ) { printk("coda_fid_to_inode: no sb!\n"); return NULL; } CDEBUG(D_INODE, "%s\n", coda_f2s(fid)); nr = coda_f2i(fid); inode = iget4(sb, nr, coda_inocmp, fid); if ( !inode ) { printk("coda_fid_to_inode: null from iget, sb %p, nr %ld.\n", sb, (long)nr); return NULL; } cii = ITOC(inode); /* The inode could already be purged due to memory pressure */ if (coda_isnullfid(&cii->c_fid)) { inode->i_nlink = 0; iput(inode); return NULL; } /* we shouldn't see inode collisions anymore */ if ( !coda_fideq(fid, &cii->c_fid) ) BUG(); CDEBUG(D_INODE, "found %ld\n", inode->i_ino); return inode; }