diff options
Diffstat (limited to 'fs/cifs/cifsfs.c')
| -rw-r--r-- | fs/cifs/cifsfs.c | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index d4b713e5affb..c262d8874ce9 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/vfs.h> | 33 | #include <linux/vfs.h> |
| 34 | #include <linux/mempool.h> | 34 | #include <linux/mempool.h> |
| 35 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
| 36 | #include <linux/kthread.h> | ||
| 36 | #include "cifsfs.h" | 37 | #include "cifsfs.h" |
| 37 | #include "cifspdu.h" | 38 | #include "cifspdu.h" |
| 38 | #define DECLARE_GLOBALS_HERE | 39 | #define DECLARE_GLOBALS_HERE |
| @@ -75,9 +76,6 @@ unsigned int cifs_max_pending = CIFS_MAX_REQ; | |||
| 75 | module_param(cifs_max_pending, int, 0); | 76 | module_param(cifs_max_pending, int, 0); |
| 76 | MODULE_PARM_DESC(cifs_max_pending,"Simultaneous requests to server. Default: 50 Range: 2 to 256"); | 77 | MODULE_PARM_DESC(cifs_max_pending,"Simultaneous requests to server. Default: 50 Range: 2 to 256"); |
| 77 | 78 | ||
| 78 | static DECLARE_COMPLETION(cifs_oplock_exited); | ||
| 79 | static DECLARE_COMPLETION(cifs_dnotify_exited); | ||
| 80 | |||
| 81 | extern mempool_t *cifs_sm_req_poolp; | 79 | extern mempool_t *cifs_sm_req_poolp; |
| 82 | extern mempool_t *cifs_req_poolp; | 80 | extern mempool_t *cifs_req_poolp; |
| 83 | extern mempool_t *cifs_mid_poolp; | 81 | extern mempool_t *cifs_mid_poolp; |
| @@ -841,10 +839,6 @@ static int cifs_oplock_thread(void * dummyarg) | |||
| 841 | __u16 netfid; | 839 | __u16 netfid; |
| 842 | int rc; | 840 | int rc; |
| 843 | 841 | ||
| 844 | daemonize("cifsoplockd"); | ||
| 845 | allow_signal(SIGTERM); | ||
| 846 | |||
| 847 | oplockThread = current; | ||
| 848 | do { | 842 | do { |
| 849 | if (try_to_freeze()) | 843 | if (try_to_freeze()) |
| 850 | continue; | 844 | continue; |
| @@ -900,9 +894,9 @@ static int cifs_oplock_thread(void * dummyarg) | |||
| 900 | set_current_state(TASK_INTERRUPTIBLE); | 894 | set_current_state(TASK_INTERRUPTIBLE); |
| 901 | schedule_timeout(1); /* yield in case q were corrupt */ | 895 | schedule_timeout(1); /* yield in case q were corrupt */ |
| 902 | } | 896 | } |
| 903 | } while(!signal_pending(current)); | 897 | } while (!kthread_should_stop()); |
| 904 | oplockThread = NULL; | 898 | |
| 905 | complete_and_exit (&cifs_oplock_exited, 0); | 899 | return 0; |
| 906 | } | 900 | } |
| 907 | 901 | ||
| 908 | static int cifs_dnotify_thread(void * dummyarg) | 902 | static int cifs_dnotify_thread(void * dummyarg) |
| @@ -910,10 +904,6 @@ static int cifs_dnotify_thread(void * dummyarg) | |||
| 910 | struct list_head *tmp; | 904 | struct list_head *tmp; |
| 911 | struct cifsSesInfo *ses; | 905 | struct cifsSesInfo *ses; |
| 912 | 906 | ||
| 913 | daemonize("cifsdnotifyd"); | ||
| 914 | allow_signal(SIGTERM); | ||
| 915 | |||
| 916 | dnotifyThread = current; | ||
| 917 | do { | 907 | do { |
| 918 | if(try_to_freeze()) | 908 | if(try_to_freeze()) |
| 919 | continue; | 909 | continue; |
| @@ -931,8 +921,9 @@ static int cifs_dnotify_thread(void * dummyarg) | |||
| 931 | wake_up_all(&ses->server->response_q); | 921 | wake_up_all(&ses->server->response_q); |
| 932 | } | 922 | } |
| 933 | read_unlock(&GlobalSMBSeslock); | 923 | read_unlock(&GlobalSMBSeslock); |
| 934 | } while(!signal_pending(current)); | 924 | } while (!kthread_should_stop()); |
| 935 | complete_and_exit (&cifs_dnotify_exited, 0); | 925 | |
| 926 | return 0; | ||
| 936 | } | 927 | } |
| 937 | 928 | ||
| 938 | static int __init | 929 | static int __init |
| @@ -982,32 +973,48 @@ init_cifs(void) | |||
| 982 | } | 973 | } |
| 983 | 974 | ||
| 984 | rc = cifs_init_inodecache(); | 975 | rc = cifs_init_inodecache(); |
| 985 | if (!rc) { | 976 | if (rc) |
| 986 | rc = cifs_init_mids(); | 977 | goto out_clean_proc; |
| 987 | if (!rc) { | 978 | |
| 988 | rc = cifs_init_request_bufs(); | 979 | rc = cifs_init_mids(); |
| 989 | if (!rc) { | 980 | if (rc) |
| 990 | rc = register_filesystem(&cifs_fs_type); | 981 | goto out_destroy_inodecache; |
| 991 | if (!rc) { | 982 | |
| 992 | rc = (int)kernel_thread(cifs_oplock_thread, NULL, | 983 | rc = cifs_init_request_bufs(); |
| 993 | CLONE_FS | CLONE_FILES | CLONE_VM); | 984 | if (rc) |
| 994 | if(rc > 0) { | 985 | goto out_destroy_mids; |
| 995 | rc = (int)kernel_thread(cifs_dnotify_thread, NULL, | 986 | |
| 996 | CLONE_FS | CLONE_FILES | CLONE_VM); | 987 | rc = register_filesystem(&cifs_fs_type); |
| 997 | if(rc > 0) | 988 | if (rc) |
| 998 | return 0; | 989 | goto out_destroy_request_bufs; |
| 999 | else | 990 | |
| 1000 | cERROR(1,("error %d create dnotify thread", rc)); | 991 | oplockThread = kthread_run(cifs_oplock_thread, NULL, "cifsoplockd"); |
| 1001 | } else { | 992 | if (IS_ERR(oplockThread)) { |
| 1002 | cERROR(1,("error %d create oplock thread",rc)); | 993 | rc = PTR_ERR(oplockThread); |
| 1003 | } | 994 | cERROR(1,("error %d create oplock thread", rc)); |
| 1004 | } | 995 | goto out_unregister_filesystem; |
| 1005 | cifs_destroy_request_bufs(); | ||
| 1006 | } | ||
| 1007 | cifs_destroy_mids(); | ||
| 1008 | } | ||
| 1009 | cifs_destroy_inodecache(); | ||
| 1010 | } | 996 | } |
| 997 | |||
| 998 | dnotifyThread = kthread_run(cifs_dnotify_thread, NULL, "cifsdnotifyd"); | ||
| 999 | if (IS_ERR(dnotifyThread)) { | ||
| 1000 | rc = PTR_ERR(dnotifyThread); | ||
| 1001 | cERROR(1,("error %d create dnotify thread", rc)); | ||
| 1002 | goto out_stop_oplock_thread; | ||
| 1003 | } | ||
| 1004 | |||
| 1005 | return 0; | ||
| 1006 | |||
| 1007 | out_stop_oplock_thread: | ||
| 1008 | kthread_stop(oplockThread); | ||
| 1009 | out_unregister_filesystem: | ||
| 1010 | unregister_filesystem(&cifs_fs_type); | ||
| 1011 | out_destroy_request_bufs: | ||
| 1012 | cifs_destroy_request_bufs(); | ||
| 1013 | out_destroy_mids: | ||
| 1014 | cifs_destroy_mids(); | ||
| 1015 | out_destroy_inodecache: | ||
| 1016 | cifs_destroy_inodecache(); | ||
| 1017 | out_clean_proc: | ||
| 1011 | #ifdef CONFIG_PROC_FS | 1018 | #ifdef CONFIG_PROC_FS |
| 1012 | cifs_proc_clean(); | 1019 | cifs_proc_clean(); |
| 1013 | #endif | 1020 | #endif |
| @@ -1025,14 +1032,8 @@ exit_cifs(void) | |||
| 1025 | cifs_destroy_inodecache(); | 1032 | cifs_destroy_inodecache(); |
| 1026 | cifs_destroy_mids(); | 1033 | cifs_destroy_mids(); |
| 1027 | cifs_destroy_request_bufs(); | 1034 | cifs_destroy_request_bufs(); |
| 1028 | if(oplockThread) { | 1035 | kthread_stop(oplockThread); |
| 1029 | send_sig(SIGTERM, oplockThread, 1); | 1036 | kthread_stop(dnotifyThread); |
| 1030 | wait_for_completion(&cifs_oplock_exited); | ||
| 1031 | } | ||
| 1032 | if(dnotifyThread) { | ||
| 1033 | send_sig(SIGTERM, dnotifyThread, 1); | ||
| 1034 | wait_for_completion(&cifs_dnotify_exited); | ||
| 1035 | } | ||
| 1036 | } | 1037 | } |
| 1037 | 1038 | ||
| 1038 | MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>"); | 1039 | MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>"); |
