4 * Copyright (C) 1995, 1996 by Volker Lendecke
5 * Modified for big endian by J.F. Chadima and David S. Miller
6 * Modified 1997 Peter Waltenberg, Bill Hawes, David Woodhouse for 2.1 dcache
7 * Modified 1998 Wolfram Pienkoss for NLS
8 * Modified 2000 Ben Harris, University of Cambridge for NFS NS meta-info
12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14 #include <linux/module.h>
16 #include <asm/uaccess.h>
17 #include <asm/byteorder.h>
19 #include <linux/time.h>
20 #include <linux/kernel.h>
22 #include <linux/string.h>
23 #include <linux/stat.h>
24 #include <linux/errno.h>
25 #include <linux/file.h>
26 #include <linux/fcntl.h>
27 #include <linux/slab.h>
28 #include <linux/vmalloc.h>
29 #include <linux/init.h>
30 #include <linux/vfs.h>
31 #include <linux/mount.h>
32 #include <linux/seq_file.h>
33 #include <linux/namei.h>
40 #define NCP_DEFAULT_FILE_MODE 0600
41 #define NCP_DEFAULT_DIR_MODE 0700
42 #define NCP_DEFAULT_TIME_OUT 10
43 #define NCP_DEFAULT_RETRY_COUNT 20
45 static void ncp_evict_inode(struct inode
*);
46 static void ncp_put_super(struct super_block
*);
47 static int ncp_statfs(struct dentry
*, struct kstatfs
*);
48 static int ncp_show_options(struct seq_file
*, struct dentry
*);
50 static struct kmem_cache
* ncp_inode_cachep
;
52 static struct inode
*ncp_alloc_inode(struct super_block
*sb
)
54 struct ncp_inode_info
*ei
;
55 ei
= (struct ncp_inode_info
*)kmem_cache_alloc(ncp_inode_cachep
, GFP_KERNEL
);
58 return &ei
->vfs_inode
;
61 static void ncp_i_callback(struct rcu_head
*head
)
63 struct inode
*inode
= container_of(head
, struct inode
, i_rcu
);
64 kmem_cache_free(ncp_inode_cachep
, NCP_FINFO(inode
));
67 static void ncp_destroy_inode(struct inode
*inode
)
69 call_rcu(&inode
->i_rcu
, ncp_i_callback
);
72 static void init_once(void *foo
)
74 struct ncp_inode_info
*ei
= (struct ncp_inode_info
*) foo
;
76 mutex_init(&ei
->open_mutex
);
77 inode_init_once(&ei
->vfs_inode
);
80 static int init_inodecache(void)
82 ncp_inode_cachep
= kmem_cache_create("ncp_inode_cache",
83 sizeof(struct ncp_inode_info
),
84 0, (SLAB_RECLAIM_ACCOUNT
|
87 if (ncp_inode_cachep
== NULL
)
92 static void destroy_inodecache(void)
95 * Make sure all delayed rcu free inodes are flushed before we
99 kmem_cache_destroy(ncp_inode_cachep
);
102 static int ncp_remount(struct super_block
*sb
, int *flags
, char* data
)
105 *flags
|= MS_NODIRATIME
;
109 static const struct super_operations ncp_sops
=
111 .alloc_inode
= ncp_alloc_inode
,
112 .destroy_inode
= ncp_destroy_inode
,
113 .drop_inode
= generic_delete_inode
,
114 .evict_inode
= ncp_evict_inode
,
115 .put_super
= ncp_put_super
,
116 .statfs
= ncp_statfs
,
117 .remount_fs
= ncp_remount
,
118 .show_options
= ncp_show_options
,
122 * Fill in the ncpfs-specific information in the inode.
124 static void ncp_update_dirent(struct inode
*inode
, struct ncp_entry_info
*nwinfo
)
126 NCP_FINFO(inode
)->DosDirNum
= nwinfo
->i
.DosDirNum
;
127 NCP_FINFO(inode
)->dirEntNum
= nwinfo
->i
.dirEntNum
;
128 NCP_FINFO(inode
)->volNumber
= nwinfo
->volume
;
131 void ncp_update_inode(struct inode
*inode
, struct ncp_entry_info
*nwinfo
)
133 ncp_update_dirent(inode
, nwinfo
);
134 NCP_FINFO(inode
)->nwattr
= nwinfo
->i
.attributes
;
135 NCP_FINFO(inode
)->access
= nwinfo
->access
;
136 memcpy(NCP_FINFO(inode
)->file_handle
, nwinfo
->file_handle
,
137 sizeof(nwinfo
->file_handle
));
138 ncp_dbg(1, "updated %s, volnum=%d, dirent=%u\n",
139 nwinfo
->i
.entryName
, NCP_FINFO(inode
)->volNumber
,
140 NCP_FINFO(inode
)->dirEntNum
);
143 static void ncp_update_dates(struct inode
*inode
, struct nw_info_struct
*nwi
)
145 /* NFS namespace mode overrides others if it's set. */
146 ncp_dbg(1, "(%s) nfs.mode=0%o\n", nwi
->entryName
, nwi
->nfs
.mode
);
149 inode
->i_mode
= nwi
->nfs
.mode
;
152 inode
->i_blocks
= (i_size_read(inode
) + NCP_BLOCK_SIZE
- 1) >> NCP_BLOCK_SHIFT
;
154 inode
->i_mtime
.tv_sec
= ncp_date_dos2unix(nwi
->modifyTime
, nwi
->modifyDate
);
155 inode
->i_ctime
.tv_sec
= ncp_date_dos2unix(nwi
->creationTime
, nwi
->creationDate
);
156 inode
->i_atime
.tv_sec
= ncp_date_dos2unix(0, nwi
->lastAccessDate
);
157 inode
->i_atime
.tv_nsec
= 0;
158 inode
->i_mtime
.tv_nsec
= 0;
159 inode
->i_ctime
.tv_nsec
= 0;
162 static void ncp_update_attrs(struct inode
*inode
, struct ncp_entry_info
*nwinfo
)
164 struct nw_info_struct
*nwi
= &nwinfo
->i
;
165 struct ncp_server
*server
= NCP_SERVER(inode
);
167 if (nwi
->attributes
& aDIR
) {
168 inode
->i_mode
= server
->m
.dir_mode
;
169 /* for directories dataStreamSize seems to be some
171 i_size_write(inode
, NCP_BLOCK_SIZE
);
175 inode
->i_mode
= server
->m
.file_mode
;
176 size
= le32_to_cpu(nwi
->dataStreamSize
);
177 i_size_write(inode
, size
);
178 #ifdef CONFIG_NCPFS_EXTRAS
179 if ((server
->m
.flags
& (NCP_MOUNT_EXTRAS
|NCP_MOUNT_SYMLINKS
))
180 && (nwi
->attributes
& aSHARED
)) {
181 switch (nwi
->attributes
& (aHIDDEN
|aSYSTEM
)) {
183 if (server
->m
.flags
& NCP_MOUNT_SYMLINKS
) {
184 if (/* (size >= NCP_MIN_SYMLINK_SIZE)
185 && */ (size
<= NCP_MAX_SYMLINK_SIZE
)) {
186 inode
->i_mode
= (inode
->i_mode
& ~S_IFMT
) | S_IFLNK
;
187 NCP_FINFO(inode
)->flags
|= NCPI_KLUDGE_SYMLINK
;
193 if (server
->m
.flags
& NCP_MOUNT_EXTRAS
)
194 inode
->i_mode
|= S_IRUGO
;
197 if (server
->m
.flags
& NCP_MOUNT_EXTRAS
)
198 inode
->i_mode
|= (inode
->i_mode
>> 2) & S_IXUGO
;
200 /* case aSYSTEM|aHIDDEN: */
202 /* reserved combination */
208 if (nwi
->attributes
& aRONLY
) inode
->i_mode
&= ~S_IWUGO
;
211 void ncp_update_inode2(struct inode
* inode
, struct ncp_entry_info
*nwinfo
)
213 NCP_FINFO(inode
)->flags
= 0;
214 if (!atomic_read(&NCP_FINFO(inode
)->opened
)) {
215 NCP_FINFO(inode
)->nwattr
= nwinfo
->i
.attributes
;
216 ncp_update_attrs(inode
, nwinfo
);
219 ncp_update_dates(inode
, &nwinfo
->i
);
220 ncp_update_dirent(inode
, nwinfo
);
224 * Fill in the inode based on the ncp_entry_info structure. Used only for brand new inodes.
226 static void ncp_set_attr(struct inode
*inode
, struct ncp_entry_info
*nwinfo
)
228 struct ncp_server
*server
= NCP_SERVER(inode
);
230 NCP_FINFO(inode
)->flags
= 0;
232 ncp_update_attrs(inode
, nwinfo
);
234 ncp_dbg(2, "inode->i_mode = %u\n", inode
->i_mode
);
237 inode
->i_uid
= server
->m
.uid
;
238 inode
->i_gid
= server
->m
.gid
;
240 ncp_update_dates(inode
, &nwinfo
->i
);
241 ncp_update_inode(inode
, nwinfo
);
244 #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS)
245 static const struct inode_operations ncp_symlink_inode_operations
= {
246 .readlink
= generic_readlink
,
247 .follow_link
= page_follow_link_light
,
248 .put_link
= page_put_link
,
249 .setattr
= ncp_notify_change
,
257 ncp_iget(struct super_block
*sb
, struct ncp_entry_info
*info
)
262 pr_err("%s: info is NULL\n", __func__
);
266 inode
= new_inode(sb
);
268 atomic_set(&NCP_FINFO(inode
)->opened
, info
->opened
);
270 inode
->i_mapping
->backing_dev_info
= sb
->s_bdi
;
271 inode
->i_ino
= info
->ino
;
272 ncp_set_attr(inode
, info
);
273 if (S_ISREG(inode
->i_mode
)) {
274 inode
->i_op
= &ncp_file_inode_operations
;
275 inode
->i_fop
= &ncp_file_operations
;
276 } else if (S_ISDIR(inode
->i_mode
)) {
277 inode
->i_op
= &ncp_dir_inode_operations
;
278 inode
->i_fop
= &ncp_dir_operations
;
279 #ifdef CONFIG_NCPFS_NFS_NS
280 } else if (S_ISCHR(inode
->i_mode
) || S_ISBLK(inode
->i_mode
) || S_ISFIFO(inode
->i_mode
) || S_ISSOCK(inode
->i_mode
)) {
281 init_special_inode(inode
, inode
->i_mode
,
282 new_decode_dev(info
->i
.nfs
.rdev
));
284 #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS)
285 } else if (S_ISLNK(inode
->i_mode
)) {
286 inode
->i_op
= &ncp_symlink_inode_operations
;
287 inode
->i_data
.a_ops
= &ncp_symlink_aops
;
290 make_bad_inode(inode
);
292 insert_inode_hash(inode
);
294 pr_err("%s: iget failed!\n", __func__
);
299 ncp_evict_inode(struct inode
*inode
)
301 truncate_inode_pages_final(&inode
->i_data
);
304 if (S_ISDIR(inode
->i_mode
)) {
305 ncp_dbg(2, "put directory %ld\n", inode
->i_ino
);
308 if (ncp_make_closed(inode
) != 0) {
309 /* We can't do anything but complain. */
310 pr_err("%s: could not close\n", __func__
);
314 static void ncp_stop_tasks(struct ncp_server
*server
) {
315 struct sock
* sk
= server
->ncp_sock
->sk
;
318 sk
->sk_error_report
= server
->error_report
;
319 sk
->sk_data_ready
= server
->data_ready
;
320 sk
->sk_write_space
= server
->write_space
;
322 del_timer_sync(&server
->timeout_tm
);
324 flush_work(&server
->rcv
.tq
);
325 if (sk
->sk_socket
->type
== SOCK_STREAM
)
326 flush_work(&server
->tx
.tq
);
328 flush_work(&server
->timeout_tq
);
331 static int ncp_show_options(struct seq_file
*seq
, struct dentry
*root
)
333 struct ncp_server
*server
= NCP_SBP(root
->d_sb
);
336 if (!uid_eq(server
->m
.uid
, GLOBAL_ROOT_UID
))
337 seq_printf(seq
, ",uid=%u",
338 from_kuid_munged(&init_user_ns
, server
->m
.uid
));
339 if (!gid_eq(server
->m
.gid
, GLOBAL_ROOT_GID
))
340 seq_printf(seq
, ",gid=%u",
341 from_kgid_munged(&init_user_ns
, server
->m
.gid
));
342 if (!uid_eq(server
->m
.mounted_uid
, GLOBAL_ROOT_UID
))
343 seq_printf(seq
, ",owner=%u",
344 from_kuid_munged(&init_user_ns
, server
->m
.mounted_uid
));
345 tmp
= server
->m
.file_mode
& S_IALLUGO
;
346 if (tmp
!= NCP_DEFAULT_FILE_MODE
)
347 seq_printf(seq
, ",mode=0%o", tmp
);
348 tmp
= server
->m
.dir_mode
& S_IALLUGO
;
349 if (tmp
!= NCP_DEFAULT_DIR_MODE
)
350 seq_printf(seq
, ",dirmode=0%o", tmp
);
351 if (server
->m
.time_out
!= NCP_DEFAULT_TIME_OUT
* HZ
/ 100) {
352 tmp
= server
->m
.time_out
* 100 / HZ
;
353 seq_printf(seq
, ",timeout=%u", tmp
);
355 if (server
->m
.retry_count
!= NCP_DEFAULT_RETRY_COUNT
)
356 seq_printf(seq
, ",retry=%u", server
->m
.retry_count
);
357 if (server
->m
.flags
!= 0)
358 seq_printf(seq
, ",flags=%lu", server
->m
.flags
);
359 if (server
->m
.wdog_pid
!= NULL
)
360 seq_printf(seq
, ",wdogpid=%u", pid_vnr(server
->m
.wdog_pid
));
365 static const struct ncp_option ncp_opts
[] = {
366 { "uid", OPT_INT
, 'u' },
367 { "gid", OPT_INT
, 'g' },
368 { "owner", OPT_INT
, 'o' },
369 { "mode", OPT_INT
, 'm' },
370 { "dirmode", OPT_INT
, 'd' },
371 { "timeout", OPT_INT
, 't' },
372 { "retry", OPT_INT
, 'r' },
373 { "flags", OPT_INT
, 'f' },
374 { "wdogpid", OPT_INT
, 'w' },
375 { "ncpfd", OPT_INT
, 'n' },
376 { "infofd", OPT_INT
, 'i' }, /* v5 */
377 { "version", OPT_INT
, 'v' },
380 static int ncp_parse_options(struct ncp_mount_data_kernel
*data
, char *options
) {
383 unsigned long optint
;
389 data
->mounted_uid
= GLOBAL_ROOT_UID
;
390 data
->wdog_pid
= NULL
;
392 data
->time_out
= NCP_DEFAULT_TIME_OUT
;
393 data
->retry_count
= NCP_DEFAULT_RETRY_COUNT
;
394 data
->uid
= GLOBAL_ROOT_UID
;
395 data
->gid
= GLOBAL_ROOT_GID
;
396 data
->file_mode
= NCP_DEFAULT_FILE_MODE
;
397 data
->dir_mode
= NCP_DEFAULT_DIR_MODE
;
399 data
->mounted_vol
[0] = 0;
401 while ((optval
= ncp_getopt("ncpfs", &options
, ncp_opts
, NULL
, &optarg
, &optint
)) != 0) {
407 data
->uid
= make_kuid(current_user_ns(), optint
);
408 if (!uid_valid(data
->uid
)) {
414 data
->gid
= make_kgid(current_user_ns(), optint
);
415 if (!gid_valid(data
->gid
)) {
421 data
->mounted_uid
= make_kuid(current_user_ns(), optint
);
422 if (!uid_valid(data
->mounted_uid
)) {
428 data
->file_mode
= optint
;
431 data
->dir_mode
= optint
;
434 data
->time_out
= optint
;
437 data
->retry_count
= optint
;
440 data
->flags
= optint
;
443 data
->wdog_pid
= find_get_pid(optint
);
446 data
->ncp_fd
= optint
;
449 data
->info_fd
= optint
;
453 if (optint
< NCP_MOUNT_VERSION_V4
)
455 if (optint
> NCP_MOUNT_VERSION_V5
)
464 put_pid(data
->wdog_pid
);
465 data
->wdog_pid
= NULL
;
469 static int ncp_fill_super(struct super_block
*sb
, void *raw_data
, int silent
)
471 struct ncp_mount_data_kernel data
;
472 struct ncp_server
*server
;
473 struct file
*ncp_filp
;
474 struct inode
*root_inode
;
475 struct inode
*sock_inode
;
479 #ifdef CONFIG_NCPFS_PACKET_SIGNING
482 struct ncp_entry_info finfo
;
484 memset(&data
, 0, sizeof(data
));
485 server
= kzalloc(sizeof(struct ncp_server
), GFP_KERNEL
);
488 sb
->s_fs_info
= server
;
491 if (raw_data
== NULL
)
493 switch (*(int*)raw_data
) {
494 case NCP_MOUNT_VERSION
:
496 struct ncp_mount_data
* md
= (struct ncp_mount_data
*)raw_data
;
498 data
.flags
= md
->flags
;
499 data
.int_flags
= NCP_IMOUNT_LOGGEDIN_POSSIBLE
;
500 data
.mounted_uid
= make_kuid(current_user_ns(), md
->mounted_uid
);
501 data
.wdog_pid
= find_get_pid(md
->wdog_pid
);
502 data
.ncp_fd
= md
->ncp_fd
;
503 data
.time_out
= md
->time_out
;
504 data
.retry_count
= md
->retry_count
;
505 data
.uid
= make_kuid(current_user_ns(), md
->uid
);
506 data
.gid
= make_kgid(current_user_ns(), md
->gid
);
507 data
.file_mode
= md
->file_mode
;
508 data
.dir_mode
= md
->dir_mode
;
510 memcpy(data
.mounted_vol
, md
->mounted_vol
,
514 case NCP_MOUNT_VERSION_V4
:
516 struct ncp_mount_data_v4
* md
= (struct ncp_mount_data_v4
*)raw_data
;
518 data
.flags
= md
->flags
;
519 data
.mounted_uid
= make_kuid(current_user_ns(), md
->mounted_uid
);
520 data
.wdog_pid
= find_get_pid(md
->wdog_pid
);
521 data
.ncp_fd
= md
->ncp_fd
;
522 data
.time_out
= md
->time_out
;
523 data
.retry_count
= md
->retry_count
;
524 data
.uid
= make_kuid(current_user_ns(), md
->uid
);
525 data
.gid
= make_kgid(current_user_ns(), md
->gid
);
526 data
.file_mode
= md
->file_mode
;
527 data
.dir_mode
= md
->dir_mode
;
533 if (memcmp(raw_data
, "vers", 4) == 0) {
534 error
= ncp_parse_options(&data
, raw_data
);
541 if (!uid_valid(data
.mounted_uid
) || !uid_valid(data
.uid
) ||
542 !gid_valid(data
.gid
))
545 ncp_filp
= fget(data
.ncp_fd
);
549 sock_inode
= file_inode(ncp_filp
);
550 if (!S_ISSOCK(sock_inode
->i_mode
))
552 sock
= SOCKET_I(sock_inode
);
556 if (sock
->type
== SOCK_STREAM
)
557 default_bufsize
= 0xF000;
559 default_bufsize
= 1024;
561 sb
->s_flags
|= MS_NODIRATIME
; /* probably even noatime */
562 sb
->s_maxbytes
= 0xFFFFFFFFU
;
563 sb
->s_blocksize
= 1024; /* Eh... Is this correct? */
564 sb
->s_blocksize_bits
= 10;
565 sb
->s_magic
= NCP_SUPER_MAGIC
;
566 sb
->s_op
= &ncp_sops
;
567 sb
->s_d_op
= &ncp_dentry_operations
;
568 sb
->s_bdi
= &server
->bdi
;
570 server
= NCP_SBP(sb
);
571 memset(server
, 0, sizeof(*server
));
573 error
= bdi_setup_and_register(&server
->bdi
, "ncpfs", BDI_CAP_MAP_COPY
);
577 server
->ncp_filp
= ncp_filp
;
578 server
->ncp_sock
= sock
;
580 if (data
.info_fd
!= -1) {
581 struct socket
*info_sock
;
584 server
->info_filp
= fget(data
.info_fd
);
585 if (!server
->info_filp
)
588 sock_inode
= file_inode(server
->info_filp
);
589 if (!S_ISSOCK(sock_inode
->i_mode
))
591 info_sock
= SOCKET_I(sock_inode
);
595 if (info_sock
->type
!= SOCK_STREAM
)
597 server
->info_sock
= info_sock
;
600 /* server->lock = 0; */
601 mutex_init(&server
->mutex
);
602 server
->packet
= NULL
;
603 /* server->buffer_size = 0; */
604 /* server->conn_status = 0; */
605 /* server->root_dentry = NULL; */
606 /* server->root_setuped = 0; */
607 mutex_init(&server
->root_setup_lock
);
608 #ifdef CONFIG_NCPFS_PACKET_SIGNING
609 /* server->sign_wanted = 0; */
610 /* server->sign_active = 0; */
612 init_rwsem(&server
->auth_rwsem
);
613 server
->auth
.auth_type
= NCP_AUTH_NONE
;
614 /* server->auth.object_name_len = 0; */
615 /* server->auth.object_name = NULL; */
616 /* server->auth.object_type = 0; */
617 /* server->priv.len = 0; */
618 /* server->priv.data = NULL; */
621 /* Although anything producing this is buggy, it happens
622 now because of PATH_MAX changes.. */
623 if (server
->m
.time_out
< 1) {
624 server
->m
.time_out
= 10;
625 pr_info("You need to recompile your ncpfs utils..\n");
627 server
->m
.time_out
= server
->m
.time_out
* HZ
/ 100;
628 server
->m
.file_mode
= (server
->m
.file_mode
& S_IRWXUGO
) | S_IFREG
;
629 server
->m
.dir_mode
= (server
->m
.dir_mode
& S_IRWXUGO
) | S_IFDIR
;
631 #ifdef CONFIG_NCPFS_NLS
632 /* load the default NLS charsets */
633 server
->nls_vol
= load_nls_default();
634 server
->nls_io
= load_nls_default();
635 #endif /* CONFIG_NCPFS_NLS */
637 atomic_set(&server
->dentry_ttl
, 0); /* no caching */
639 INIT_LIST_HEAD(&server
->tx
.requests
);
640 mutex_init(&server
->rcv
.creq_mutex
);
641 server
->tx
.creq
= NULL
;
642 server
->rcv
.creq
= NULL
;
644 init_timer(&server
->timeout_tm
);
645 #undef NCP_PACKET_SIZE
646 #define NCP_PACKET_SIZE 131072
648 server
->packet_size
= NCP_PACKET_SIZE
;
649 server
->packet
= vmalloc(NCP_PACKET_SIZE
);
650 if (server
->packet
== NULL
)
652 server
->txbuf
= vmalloc(NCP_PACKET_SIZE
);
653 if (server
->txbuf
== NULL
)
655 server
->rxbuf
= vmalloc(NCP_PACKET_SIZE
);
656 if (server
->rxbuf
== NULL
)
660 server
->data_ready
= sock
->sk
->sk_data_ready
;
661 server
->write_space
= sock
->sk
->sk_write_space
;
662 server
->error_report
= sock
->sk
->sk_error_report
;
663 sock
->sk
->sk_user_data
= server
;
664 sock
->sk
->sk_data_ready
= ncp_tcp_data_ready
;
665 sock
->sk
->sk_error_report
= ncp_tcp_error_report
;
666 if (sock
->type
== SOCK_STREAM
) {
667 server
->rcv
.ptr
= (unsigned char*)&server
->rcv
.buf
;
668 server
->rcv
.len
= 10;
669 server
->rcv
.state
= 0;
670 INIT_WORK(&server
->rcv
.tq
, ncp_tcp_rcv_proc
);
671 INIT_WORK(&server
->tx
.tq
, ncp_tcp_tx_proc
);
672 sock
->sk
->sk_write_space
= ncp_tcp_write_space
;
674 INIT_WORK(&server
->rcv
.tq
, ncpdgram_rcv_proc
);
675 INIT_WORK(&server
->timeout_tq
, ncpdgram_timeout_proc
);
676 server
->timeout_tm
.data
= (unsigned long)server
;
677 server
->timeout_tm
.function
= ncpdgram_timeout_call
;
679 release_sock(sock
->sk
);
681 ncp_lock_server(server
);
682 error
= ncp_connect(server
);
683 ncp_unlock_server(server
);
686 ncp_dbg(1, "NCP_SBP(sb) = %p\n", NCP_SBP(sb
));
688 error
= -EMSGSIZE
; /* -EREMOTESIDEINCOMPATIBLE */
689 #ifdef CONFIG_NCPFS_PACKET_SIGNING
690 if (ncp_negotiate_size_and_options(server
, default_bufsize
,
691 NCP_DEFAULT_OPTIONS
, &(server
->buffer_size
), &options
) == 0)
693 if (options
!= NCP_DEFAULT_OPTIONS
)
695 if (ncp_negotiate_size_and_options(server
,
698 &(server
->buffer_size
), &options
) != 0)
704 ncp_lock_server(server
);
706 server
->sign_wanted
= 1;
707 ncp_unlock_server(server
);
710 #endif /* CONFIG_NCPFS_PACKET_SIGNING */
711 if (ncp_negotiate_buffersize(server
, default_bufsize
,
712 &(server
->buffer_size
)) != 0)
714 ncp_dbg(1, "bufsize = %d\n", server
->buffer_size
);
716 memset(&finfo
, 0, sizeof(finfo
));
717 finfo
.i
.attributes
= aDIR
;
718 finfo
.i
.dataStreamSize
= 0; /* ignored */
719 finfo
.i
.dirEntNum
= 0;
720 finfo
.i
.DosDirNum
= 0;
721 #ifdef CONFIG_NCPFS_SMALLDOS
722 finfo
.i
.NSCreator
= NW_NS_DOS
;
724 finfo
.volume
= NCP_NUMBER_OF_VOLUMES
;
725 /* set dates of mountpoint to Jan 1, 1986; 00:00 */
726 finfo
.i
.creationTime
= finfo
.i
.modifyTime
727 = cpu_to_le16(0x0000);
728 finfo
.i
.creationDate
= finfo
.i
.modifyDate
729 = finfo
.i
.lastAccessDate
730 = cpu_to_le16(0x0C21);
732 finfo
.i
.entryName
[0] = '\0';
735 finfo
.ino
= 2; /* tradition */
737 server
->name_space
[finfo
.volume
] = NW_NS_DOS
;
740 root_inode
= ncp_iget(sb
, &finfo
);
743 ncp_dbg(1, "root vol=%d\n", NCP_FINFO(root_inode
)->volNumber
);
744 sb
->s_root
= d_make_root(root_inode
);
750 ncp_lock_server(server
);
751 ncp_disconnect(server
);
752 ncp_unlock_server(server
);
754 ncp_stop_tasks(server
);
755 vfree(server
->rxbuf
);
757 vfree(server
->txbuf
);
759 vfree(server
->packet
);
761 #ifdef CONFIG_NCPFS_NLS
762 unload_nls(server
->nls_io
);
763 unload_nls(server
->nls_vol
);
765 mutex_destroy(&server
->rcv
.creq_mutex
);
766 mutex_destroy(&server
->root_setup_lock
);
767 mutex_destroy(&server
->mutex
);
769 if (server
->info_filp
)
770 fput(server
->info_filp
);
772 bdi_destroy(&server
->bdi
);
774 /* 23/12/1998 Marcin Dalecki <dalecki@cs.net.pl>:
776 * The previously used put_filp(ncp_filp); was bogus, since
777 * it doesn't perform proper unlocking.
781 put_pid(data
.wdog_pid
);
782 sb
->s_fs_info
= NULL
;
787 static void delayed_free(struct rcu_head
*p
)
789 struct ncp_server
*server
= container_of(p
, struct ncp_server
, rcu
);
790 #ifdef CONFIG_NCPFS_NLS
791 /* unload the NLS charsets */
792 unload_nls(server
->nls_vol
);
793 unload_nls(server
->nls_io
);
794 #endif /* CONFIG_NCPFS_NLS */
798 static void ncp_put_super(struct super_block
*sb
)
800 struct ncp_server
*server
= NCP_SBP(sb
);
802 ncp_lock_server(server
);
803 ncp_disconnect(server
);
804 ncp_unlock_server(server
);
806 ncp_stop_tasks(server
);
808 mutex_destroy(&server
->rcv
.creq_mutex
);
809 mutex_destroy(&server
->root_setup_lock
);
810 mutex_destroy(&server
->mutex
);
812 if (server
->info_filp
)
813 fput(server
->info_filp
);
814 fput(server
->ncp_filp
);
815 kill_pid(server
->m
.wdog_pid
, SIGTERM
, 1);
816 put_pid(server
->m
.wdog_pid
);
818 bdi_destroy(&server
->bdi
);
819 kfree(server
->priv
.data
);
820 kfree(server
->auth
.object_name
);
821 vfree(server
->rxbuf
);
822 vfree(server
->txbuf
);
823 vfree(server
->packet
);
824 call_rcu(&server
->rcu
, delayed_free
);
827 static int ncp_statfs(struct dentry
*dentry
, struct kstatfs
*buf
)
831 struct ncp_inode_info
* ni
;
832 struct ncp_server
* s
;
833 struct ncp_volume_info vi
;
834 struct super_block
*sb
= dentry
->d_sb
;
854 if (!s
->m
.mounted_vol
[0]) {
858 err
= ncp_dirhandle_alloc(s
, ni
->volNumber
, ni
->DosDirNum
, &dh
);
862 err
= ncp_get_directory_info(s
, dh
, &vi
);
863 ncp_dirhandle_free(s
, dh
);
867 buf
->f_type
= NCP_SUPER_MAGIC
;
868 buf
->f_bsize
= vi
.sectors_per_block
* 512;
869 buf
->f_blocks
= vi
.total_blocks
;
870 buf
->f_bfree
= vi
.free_blocks
;
871 buf
->f_bavail
= vi
.free_blocks
;
872 buf
->f_files
= vi
.total_dir_entries
;
873 buf
->f_ffree
= vi
.available_dir_entries
;
877 /* We cannot say how much disk space is left on a mounted
878 NetWare Server, because free space is distributed over
879 volumes, and the current user might have disk quotas. So
880 free space is not that simple to determine. Our decision
881 here is to err conservatively. */
884 buf
->f_type
= NCP_SUPER_MAGIC
;
885 buf
->f_bsize
= NCP_BLOCK_SIZE
;
893 int ncp_notify_change(struct dentry
*dentry
, struct iattr
*attr
)
895 struct inode
*inode
= dentry
->d_inode
;
898 struct nw_modify_dos_info info
;
899 struct ncp_server
*server
;
903 server
= NCP_SERVER(inode
);
904 if (!server
) /* How this could happen? */
908 if (IS_DEADDIR(dentry
->d_inode
))
911 /* ageing the dentry to force validation */
912 ncp_age_dentry(server
, dentry
);
914 result
= inode_change_ok(inode
, attr
);
919 if ((attr
->ia_valid
& ATTR_UID
) && !uid_eq(attr
->ia_uid
, server
->m
.uid
))
922 if ((attr
->ia_valid
& ATTR_GID
) && !gid_eq(attr
->ia_gid
, server
->m
.gid
))
925 if (((attr
->ia_valid
& ATTR_MODE
) &&
927 ~(S_IFREG
| S_IFDIR
| S_IRWXUGO
))))
931 memset(&info
, 0, sizeof(info
));
934 if ((attr
->ia_valid
& ATTR_MODE
) != 0)
936 umode_t newmode
= attr
->ia_mode
;
938 info_mask
|= DM_ATTRIBUTES
;
940 if (S_ISDIR(inode
->i_mode
)) {
941 newmode
&= server
->m
.dir_mode
;
943 #ifdef CONFIG_NCPFS_EXTRAS
944 if (server
->m
.flags
& NCP_MOUNT_EXTRAS
) {
945 /* any non-default execute bit set */
946 if (newmode
& ~server
->m
.file_mode
& S_IXUGO
)
947 info
.attributes
|= aSHARED
| aSYSTEM
;
948 /* read for group/world and not in default file_mode */
949 else if (newmode
& ~server
->m
.file_mode
& S_IRUGO
)
950 info
.attributes
|= aSHARED
;
953 newmode
&= server
->m
.file_mode
;
955 if (newmode
& S_IWUGO
)
956 info
.attributes
&= ~(aRONLY
|aRENAMEINHIBIT
|aDELETEINHIBIT
);
958 info
.attributes
|= (aRONLY
|aRENAMEINHIBIT
|aDELETEINHIBIT
);
960 #ifdef CONFIG_NCPFS_NFS_NS
961 if (ncp_is_nfs_extras(server
, NCP_FINFO(inode
)->volNumber
)) {
962 result
= ncp_modify_nfs_info(server
,
963 NCP_FINFO(inode
)->volNumber
,
964 NCP_FINFO(inode
)->dirEntNum
,
968 info
.attributes
&= ~(aSHARED
| aSYSTEM
);
970 /* mark partial success */
971 struct iattr tmpattr
;
973 tmpattr
.ia_valid
= ATTR_MODE
;
974 tmpattr
.ia_mode
= attr
->ia_mode
;
976 setattr_copy(inode
, &tmpattr
);
977 mark_inode_dirty(inode
);
984 /* Do SIZE before attributes, otherwise mtime together with size does not work...
986 if ((attr
->ia_valid
& ATTR_SIZE
) != 0) {
989 ncp_dbg(1, "trying to change size to %llu\n", attr
->ia_size
);
991 if ((result
= ncp_make_open(inode
, O_WRONLY
)) < 0) {
995 ncp_write_kernel(NCP_SERVER(inode
), NCP_FINFO(inode
)->file_handle
,
996 attr
->ia_size
, 0, "", &written
);
998 /* According to ndir, the changes only take effect after
1000 ncp_inode_close(inode
);
1001 result
= ncp_make_closed(inode
);
1005 if (attr
->ia_size
!= i_size_read(inode
)) {
1006 truncate_setsize(inode
, attr
->ia_size
);
1007 mark_inode_dirty(inode
);
1010 if ((attr
->ia_valid
& ATTR_CTIME
) != 0) {
1011 info_mask
|= (DM_CREATE_TIME
| DM_CREATE_DATE
);
1012 ncp_date_unix2dos(attr
->ia_ctime
.tv_sec
,
1013 &info
.creationTime
, &info
.creationDate
);
1015 if ((attr
->ia_valid
& ATTR_MTIME
) != 0) {
1016 info_mask
|= (DM_MODIFY_TIME
| DM_MODIFY_DATE
);
1017 ncp_date_unix2dos(attr
->ia_mtime
.tv_sec
,
1018 &info
.modifyTime
, &info
.modifyDate
);
1020 if ((attr
->ia_valid
& ATTR_ATIME
) != 0) {
1022 info_mask
|= (DM_LAST_ACCESS_DATE
);
1023 ncp_date_unix2dos(attr
->ia_atime
.tv_sec
,
1024 &dummy
, &info
.lastAccessDate
);
1026 if (info_mask
!= 0) {
1027 result
= ncp_modify_file_or_subdir_dos_info(NCP_SERVER(inode
),
1028 inode
, info_mask
, &info
);
1030 if (info_mask
== (DM_CREATE_TIME
| DM_CREATE_DATE
)) {
1031 /* NetWare seems not to allow this. I
1032 do not know why. So, just tell the
1033 user everything went fine. This is
1034 a terrible hack, but I do not know
1035 how to do this correctly. */
1040 #ifdef CONFIG_NCPFS_STRONG
1041 if ((!result
) && (info_mask
& DM_ATTRIBUTES
))
1042 NCP_FINFO(inode
)->nwattr
= info
.attributes
;
1048 setattr_copy(inode
, attr
);
1049 mark_inode_dirty(inode
);
1057 static struct dentry
*ncp_mount(struct file_system_type
*fs_type
,
1058 int flags
, const char *dev_name
, void *data
)
1060 return mount_nodev(fs_type
, flags
, data
, ncp_fill_super
);
1063 static struct file_system_type ncp_fs_type
= {
1064 .owner
= THIS_MODULE
,
1067 .kill_sb
= kill_anon_super
,
1068 .fs_flags
= FS_BINARY_MOUNTDATA
,
1070 MODULE_ALIAS_FS("ncpfs");
1072 static int __init
init_ncp_fs(void)
1075 ncp_dbg(1, "called\n");
1077 err
= init_inodecache();
1080 err
= register_filesystem(&ncp_fs_type
);
1085 destroy_inodecache();
1090 static void __exit
exit_ncp_fs(void)
1092 ncp_dbg(1, "called\n");
1093 unregister_filesystem(&ncp_fs_type
);
1094 destroy_inodecache();
1097 module_init(init_ncp_fs
)
1098 module_exit(exit_ncp_fs
)
1099 MODULE_LICENSE("GPL");