static void smb_put_inode(struct inode *inode) { struct smb_dirent *finfo = SMB_FINFO(inode); if (finfo->opened != 0) { /* smb_proc_close wants mtime in finfo */ finfo->mtime = inode->i_mtime; if (smb_proc_close(SMB_SERVER(inode), finfo)) { /* We can't do anything but complain. */ printk("smb_put_inode: could not close\n"); } } smb_free_inode_info(SMB_INOP(inode)); if (S_ISDIR(inode->i_mode)) { DDPRINTK("smb_put_inode: put directory %ld\n", inode->i_ino); smb_invalid_dir_cache(inode->i_ino); } clear_inode(inode); }
static struct inode * smb_iget(struct inode *dir, struct smb_inode_info *new_inode_info) { struct inode *inode; struct smb_inode_info *root; if ((dir == NULL) || (new_inode_info == NULL)) { printk("smb_iget: parameter is NULL\n"); return NULL; } new_inode_info->state = SMB_INODE_LOOKED_UP; new_inode_info->nused = 0; new_inode_info->dir = SMB_INOP(dir); SMB_INOP(dir)->nused += 1; /* * We have to link the new inode_info into the doubly linked * list of inode_infos to make a complete linear search possible. */ root = &(SMB_SERVER(dir)->root); new_inode_info->prev = root; new_inode_info->next = root->next; root->next->prev = new_inode_info; root->next = new_inode_info; if (!(inode = iget(dir->i_sb, smb_info_ino(new_inode_info)))) { printk("smb_iget: iget failed!"); /* * If we blocked in iget(), another task may have referenced * the info structure ... clean up with smb_free_inode_info. */ smb_free_inode_info(new_inode_info); return NULL; } return inode; }
void smb_free_all_inodes(struct smb_server *server) { /* Here nothing should be to do. I do not know whether it's better to leave some memory allocated or be stuck in an endless loop */ #if 1 struct smb_inode_info *root = &(server->root); if (root->next != root) { printk("smb_free_all_inodes: INODES LEFT!!!\n"); } while (root->next != root) { printk("smb_free_all_inodes: freeing inode\n"); smb_free_inode_info(root->next); /* In case we have an endless loop.. */ schedule(); } #endif return; }