diff options
| author | Petr Vandrovec <vandrove@vc.cvut.cz> | 2002-02-11 05:39:50 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-02-11 05:39:50 -0800 |
| commit | f5f896ddebb2e5dc0c5f4d7c9b63091a5f84cb97 (patch) | |
| tree | 4e11375141fddcc768acaf0127ea07b27eaa9ffe | |
| parent | 487841ed9bb8116da3d7d5ef518cfb4e0b760bc3 (diff) | |
[PATCH] 2.5.4-pre5 and ncpfs fill_super changes
* fs/ncpfs/inode.c: Return reasonable error codes instead of universal
-EINVAL. Remove printk() as reasonable code is returned.
Set maximum file size limit on ncpfs to 4GB-1.
* fs/ncpfs/sock.c: Return correct error code when send() fails.
Petr Vandrovec
| -rw-r--r-- | fs/ncpfs/inode.c | 69 | ||||
| -rw-r--r-- | fs/ncpfs/sock.c | 2 |
2 files changed, 28 insertions, 43 deletions
diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index b3882c7d64d1..efe7c89286c6 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c @@ -315,8 +315,9 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) #endif struct ncp_entry_info finfo; + error = -EFAULT; if (raw_data == NULL) - goto out_no_data; + goto out; switch (*(int*)raw_data) { case NCP_MOUNT_VERSION: { @@ -356,23 +357,27 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) } break; default: - goto out_bad_mount; + error = -ECHRNG; + goto out; } + error = -EBADF; ncp_filp = fget(data.ncp_fd); if (!ncp_filp) - goto out_bad_file; + goto out; + error = -ENOTSOCK; sock_inode = ncp_filp->f_dentry->d_inode; if (!S_ISSOCK(sock_inode->i_mode)) - goto out_bad_file2; + goto out_fput; sock = SOCKET_I(sock_inode); if (!sock) - goto out_bad_file2; + goto out_fput; if (sock->type == SOCK_STREAM) - default_bufsize = 61440; + default_bufsize = 0xF000; else default_bufsize = 1024; + sb->s_maxbytes = 0xFFFFFFFFU; sb->s_blocksize = 1024; /* Eh... Is this correct? */ sb->s_blocksize_bits = 10; sb->s_magic = NCP_SUPER_MAGIC; @@ -408,10 +413,8 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) printk(KERN_INFO "You need to recompile your ncpfs utils..\n"); } server->m.time_out = server->m.time_out * HZ / 100; - 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->m.file_mode = (server->m.file_mode & S_IRWXUGO) | S_IFREG; + server->m.dir_mode = (server->m.dir_mode & S_IRWXUGO) | S_IFDIR; #ifdef CONFIG_NCPFS_NLS /* load the default NLS charsets */ @@ -422,19 +425,21 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) server->dentry_ttl = 0; /* no caching */ #undef NCP_PACKET_SIZE -#define NCP_PACKET_SIZE 65536 +#define NCP_PACKET_SIZE 131072 + error = -ENOMEM; server->packet_size = NCP_PACKET_SIZE; server->packet = vmalloc(NCP_PACKET_SIZE); if (server->packet == NULL) - goto out_no_packet; + goto out_nls; ncp_lock_server(server); error = ncp_connect(server); ncp_unlock_server(server); if (error < 0) - goto out_no_connect; + goto out_packet; DPRINTK("ncp_fill_super: NCP_SBP(sb) = %x\n", (int) NCP_SBP(sb)); + error = -EMSGSIZE; /* -EREMOTESIDEINCOMPATIBLE */ #ifdef CONFIG_NCPFS_PACKET_SIGNING if (ncp_negotiate_size_and_options(server, default_bufsize, NCP_DEFAULT_OPTIONS, &(server->buffer_size), &options) == 0) @@ -447,7 +452,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) &(server->buffer_size), &options) != 0) { - goto out_no_bufsize; + goto out_disconnect; } } if (options & 2) @@ -457,7 +462,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) #endif /* CONFIG_NCPFS_PACKET_SIGNING */ if (ncp_negotiate_buffersize(server, default_bufsize, &(server->buffer_size)) != 0) - goto out_no_bufsize; + goto out_disconnect; DPRINTK("ncpfs: bufsize = %d\n", server->buffer_size); memset(&finfo, 0, sizeof(finfo)); @@ -482,9 +487,11 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) finfo.ino = 2; /* tradition */ server->name_space[finfo.i.volNumber] = NW_NS_DOS; + + error = -ENOMEM; root_inode = ncp_iget(sb, &finfo); if (!root_inode) - goto out_no_root; + goto out_disconnect; DPRINTK("ncp_fill_super: root vol=%d\n", NCP_FINFO(root_inode)->volNumber); sb->s_root = d_alloc_root(root_inode); if (!sb->s_root) @@ -493,49 +500,27 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) return 0; out_no_root: - printk(KERN_ERR "ncp_fill_super: get root inode failed\n"); iput(root_inode); - goto out_disconnect; -out_no_bufsize: - printk(KERN_ERR "ncp_fill_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_fill_super: Failed connection, error=%d\n", error); -out_free_packet: +out_packet: vfree(server->packet); - goto out_free_server; -out_no_packet: - printk(KERN_ERR "ncp_fill_super: could not alloc packet\n"); -out_free_server: +out_nls: #ifdef CONFIG_NCPFS_NLS unload_nls(server->nls_io); unload_nls(server->nls_vol); #endif +out_fput: /* 23/12/1998 Marcin Dalecki <dalecki@cs.net.pl>: * * The previously used put_filp(ncp_filp); was bogous, since * it doesn't proper unlocking. */ fput(ncp_filp); - goto out; - -out_bad_file2: - fput(ncp_filp); -out_bad_file: - printk(KERN_ERR "ncp_fill_super: invalid ncp socket\n"); - goto out; -out_bad_mount: - printk(KERN_INFO "ncp_fill_super: kernel requires mount version %d\n", - NCP_MOUNT_VERSION); - goto out; -out_no_data: - printk(KERN_ERR "ncp_fill_super: missing data argument\n"); out: - return -EINVAL; + return error; } static void ncp_put_super(struct super_block *sb) diff --git a/fs/ncpfs/sock.c b/fs/ncpfs/sock.c index a9c4a4c3b653..13697f37d8aa 100644 --- a/fs/ncpfs/sock.c +++ b/fs/ncpfs/sock.c @@ -132,7 +132,7 @@ static int do_ncp_rpc_call(struct ncp_server *server, int size, result = _send(sock, (void *) start, size); if (result < 0) { printk(KERN_ERR "ncp_rpc_call: send error = %d\n", result); - break; + return result; } re_select: poll_initwait(&wait_table); |
