Exemple #1
0
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);
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}