static void ncp_put_super(struct super_block *sb) { struct ncp_server *server = NCP_SBP(sb); lock_super(sb); ncp_lock_server(server); ncp_disconnect(server); ncp_unlock_server(server); close_fp(server->ncp_filp); ncp_dont_catch_watchdog(server); close_fp(server->wdog_filp); close_fp(server->msg_filp); ncp_free_all_inodes(server); ncp_kfree_s(server->packet, server->packet_size); sb->s_dev = 0; ncp_kfree_s(NCP_SBP(sb), sizeof(struct ncp_server)); NCP_SBP(sb) = NULL; unlock_super(sb); MOD_DEC_USE_COUNT; }
static void ncp_put_super(struct super_block *sb) { struct ncp_server *server = NCP_SBP(sb); ncp_lock_server(server); ncp_disconnect(server); ncp_unlock_server(server); fput(server->ncp_filp); kill_proc(server->m.wdog_pid, SIGTERM, 1); if (server->priv.data) ncp_kfree_s(server->priv.data, server->priv.len); if (server->auth.object_name) ncp_kfree_s(server->auth.object_name, server->auth.object_name_len); ncp_kfree_s(server->packet, server->packet_size); ncp_kfree_s(NCP_SBP(sb), sizeof(struct ncp_server)); MOD_DEC_USE_COUNT; }
struct super_block * ncp_read_super(struct super_block *sb, void *raw_data, int silent) { struct ncp_mount_data *data = (struct ncp_mount_data *) raw_data; struct ncp_server *server; struct file *ncp_filp; struct file *wdog_filp; struct file *msg_filp; kdev_t dev = sb->s_dev; int error; if (data == NULL) { printk("ncp_read_super: missing data argument\n"); sb->s_dev = 0; return NULL; } if (data->version != NCP_MOUNT_VERSION) { printk("ncp warning: mount version %s than kernel\n", (data->version < NCP_MOUNT_VERSION) ? "older" : "newer"); sb->s_dev = 0; return NULL; } if ( (data->ncp_fd >= NR_OPEN) || ((ncp_filp = current->files->fd[data->ncp_fd]) == NULL) || (!S_ISSOCK(ncp_filp->f_inode->i_mode))) { printk("ncp_read_super: invalid ncp socket\n"); sb->s_dev = 0; return NULL; } if ( (data->wdog_fd >= NR_OPEN) || ((wdog_filp = current->files->fd[data->wdog_fd]) == NULL) || (!S_ISSOCK(wdog_filp->f_inode->i_mode))) { printk("ncp_read_super: invalid wdog socket\n"); sb->s_dev = 0; return NULL; } if ( (data->message_fd >= NR_OPEN) || ((msg_filp = current->files->fd[data->message_fd]) == NULL) || (!S_ISSOCK(msg_filp->f_inode->i_mode))) { printk("ncp_read_super: invalid wdog socket\n"); sb->s_dev = 0; return NULL; } /* We must malloc our own super-block info */ server = (struct ncp_server *)ncp_kmalloc(sizeof(struct ncp_server), GFP_KERNEL); if (server == NULL) { printk("ncp_read_super: could not alloc ncp_server\n"); return NULL; } ncp_filp->f_count += 1; wdog_filp->f_count += 1; msg_filp->f_count += 1; lock_super(sb); NCP_SBP(sb) = server; sb->s_blocksize = 1024; /* Eh... Is this correct? */ sb->s_blocksize_bits = 10; sb->s_magic = NCP_SUPER_MAGIC; sb->s_dev = dev; sb->s_op = &ncp_sops; server->ncp_filp = ncp_filp; server->wdog_filp = wdog_filp; server->msg_filp = msg_filp; server->lock = 0; server->wait = NULL; server->packet = NULL; server->buffer_size = 0; server->conn_status = 0; server->m = *data; server->m.file_mode = (server->m.file_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) | S_IFREG; server->m.dir_mode = (server->m.dir_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) | S_IFDIR; /* protect against invalid mount points */ server->m.mount_point[sizeof(server->m.mount_point)-1] = '\0'; server->packet_size = NCP_PACKET_SIZE; server->packet = ncp_kmalloc(NCP_PACKET_SIZE, GFP_KERNEL); if (server->packet == NULL) { printk("ncpfs: could not alloc packet\n"); error = -ENOMEM; unlock_super(sb); goto fail; } /* * Make the connection to the server */ if (ncp_catch_watchdog(server) != 0) { printk("ncp_read_super: Could not catch watchdog\n"); error = -EINVAL; unlock_super(sb); goto fail; } if (ncp_catch_message(server) != 0) { printk("ncp_read_super: Could not catch messages\n"); ncp_dont_catch_watchdog(server); error = -EINVAL; unlock_super(sb); goto fail; } ncp_lock_server(server); error = ncp_connect(server); ncp_unlock_server(server); unlock_super(sb); if (error < 0) { sb->s_dev = 0; printk("ncp_read_super: Failed connection, bailing out " "(error = %d).\n", -error); ncp_kfree_s(server->packet, server->packet_size); ncp_dont_catch_watchdog(server); goto fail; } DPRINTK("ncp_read_super: NCP_SBP(sb) = %x\n", (int)NCP_SBP(sb)); ncp_init_root(server); if (!(sb->s_mounted = iget(sb, ncp_info_ino(server, &(server->root))))) { sb->s_dev = 0; printk("ncp_read_super: get root inode failed\n"); goto disconnect; } if (ncp_negotiate_buffersize(server, NCP_DEFAULT_BUFSIZE, &(server->buffer_size)) != 0) { sb->s_dev = 0; printk("ncp_read_super: could not get bufsize\n"); goto disconnect; } DPRINTK("ncpfs: bufsize = %d\n", server->buffer_size); MOD_INC_USE_COUNT; return sb; disconnect: ncp_lock_server(server); ncp_disconnect(server); ncp_unlock_server(server); ncp_kfree_s(server->packet, server->packet_size); ncp_dont_catch_watchdog(server); fail: ncp_filp->f_count -= 1; wdog_filp->f_count -= 1; msg_filp->f_count -= 1; ncp_kfree_s(NCP_SBP(sb), sizeof(struct ncp_server)); return NULL; }
struct super_block * ncp_read_super(struct super_block *sb, void *raw_data, int silent) { struct ncp_mount_data *data = (struct ncp_mount_data *) raw_data; struct ncp_server *server; struct file *ncp_filp; struct inode *root_inode; kdev_t dev = sb->s_dev; int error; #ifdef CONFIG_NCPFS_PACKET_SIGNING int options; #endif struct ncpfs_inode_info finfo; MOD_INC_USE_COUNT; if (data == NULL) goto out_no_data; if (data->version != NCP_MOUNT_VERSION) goto out_bad_mount; ncp_filp = fget(data->ncp_fd); if (!ncp_filp) goto out_bad_file; if (!S_ISSOCK(ncp_filp->f_dentry->d_inode->i_mode)) goto out_bad_file2; lock_super(sb); sb->s_blocksize = 1024; /* Eh... Is this correct? */ sb->s_blocksize_bits = 10; sb->s_magic = NCP_SUPER_MAGIC; sb->s_dev = dev; sb->s_op = &ncp_sops; /* We must malloc our own super-block info */ server = (struct ncp_server *) ncp_kmalloc(sizeof(struct ncp_server), GFP_KERNEL); if (server == NULL) goto out_no_server; NCP_SBP(sb) = server; server->ncp_filp = ncp_filp; server->lock = 0; server->wait = NULL; server->packet = NULL; server->buffer_size = 0; server->conn_status = 0; server->root_dentry = NULL; server->root_setuped = 0; #ifdef CONFIG_NCPFS_PACKET_SIGNING server->sign_wanted = 0; server->sign_active = 0; #endif server->auth.auth_type = NCP_AUTH_NONE; server->auth.object_name_len = 0; server->auth.object_name = NULL; server->auth.object_type = 0; server->priv.len = 0; server->priv.data = NULL; server->m = *data; /* Althought anything producing this is buggy, it happens now because of PATH_MAX changes.. */ if (server->m.time_out < 10) { server->m.time_out = 10; printk(KERN_INFO "You need to recompile your ncpfs utils..\n"); } server->m.file_mode = (server->m.file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG; server->m.dir_mode = (server->m.dir_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFDIR; server->packet_size = NCP_PACKET_SIZE; server->packet = ncp_kmalloc(NCP_PACKET_SIZE, GFP_KERNEL); if (server->packet == NULL) goto out_no_packet; ncp_lock_server(server); error = ncp_connect(server); ncp_unlock_server(server); if (error < 0) goto out_no_connect; DPRINTK(KERN_DEBUG "ncp_read_super: NCP_SBP(sb) = %x\n", (int) NCP_SBP(sb)); #ifdef CONFIG_NCPFS_PACKET_SIGNING if (ncp_negotiate_size_and_options(server, NCP_DEFAULT_BUFSIZE, NCP_DEFAULT_OPTIONS, &(server->buffer_size), &options) == 0) { if (options != NCP_DEFAULT_OPTIONS) { if (ncp_negotiate_size_and_options(server, NCP_DEFAULT_BUFSIZE, options & 2, &(server->buffer_size), &options) != 0) { goto out_no_bufsize; } } if (options & 2) server->sign_wanted = 1; } else #endif /* CONFIG_NCPFS_PACKET_SIGNING */ if (ncp_negotiate_buffersize(server, NCP_DEFAULT_BUFSIZE, &(server->buffer_size)) != 0) goto out_no_bufsize; DPRINTK(KERN_DEBUG "ncpfs: bufsize = %d\n", server->buffer_size); ncp_init_root(server, &finfo); server->name_space[finfo.nw_info.i.volNumber] = NW_NS_DOS; root_inode = ncp_iget(sb, &finfo); if (!root_inode) goto out_no_root; DPRINTK(KERN_DEBUG "ncp_read_super: root vol=%d\n", NCP_FINFO(root_inode)->volNumber); server->root_dentry = sb->s_root = d_alloc_root(root_inode, NULL); if (!sb->s_root) goto out_no_root; server->root_dentry->d_op = &ncp_dentry_operations; unlock_super(sb); return sb; out_no_root: printk(KERN_ERR "ncp_read_super: get root inode failed\n"); iput(root_inode); goto out_disconnect; out_no_bufsize: printk(KERN_ERR "ncp_read_super: could not get bufsize\n"); out_disconnect: ncp_lock_server(server); ncp_disconnect(server); ncp_unlock_server(server); goto out_free_packet; out_no_connect: printk(KERN_ERR "ncp_read_super: Failed connection, error=%d\n", error); out_free_packet: ncp_kfree_s(server->packet, server->packet_size); goto out_free_server; out_no_packet: printk(KERN_ERR "ncp_read_super: could not alloc packet\n"); out_free_server: ncp_kfree_s(NCP_SBP(sb), sizeof(struct ncp_server)); goto out_unlock; out_no_server: printk(KERN_ERR "ncp_read_super: could not alloc ncp_server\n"); out_unlock: /* 23/12/1998 Marcin Dalecki <*****@*****.**>: * * The previously used put_filp(ncp_filp); was bogous, since * it doesn't proper unlocking. */ fput(ncp_filp); unlock_super(sb); goto out; out_bad_file2: fput(ncp_filp); out_bad_file: printk(KERN_ERR "ncp_read_super: invalid ncp socket\n"); goto out; out_bad_mount: printk(KERN_INFO "ncp_read_super: kernel requires mount version %d\n", NCP_MOUNT_VERSION); goto out; out_no_data: printk(KERN_ERR "ncp_read_super: missing data argument\n"); out: sb->s_dev = 0; MOD_DEC_USE_COUNT; return NULL; }