diff options
Diffstat (limited to 'fs/cifs')
-rw-r--r-- | fs/cifs/cifs_dfs_ref.c | 29 | ||||
-rw-r--r-- | fs/cifs/cifsfs.c | 10 | ||||
-rw-r--r-- | fs/cifs/cifsproto.h | 8 |
3 files changed, 25 insertions, 22 deletions
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index f53f41ff1665..95024c066d89 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
@@ -25,14 +25,26 @@ | |||
25 | 25 | ||
26 | static LIST_HEAD(cifs_dfs_automount_list); | 26 | static LIST_HEAD(cifs_dfs_automount_list); |
27 | 27 | ||
28 | /* | 28 | static void cifs_dfs_expire_automounts(struct work_struct *work); |
29 | * DFS functions | 29 | static DECLARE_DELAYED_WORK(cifs_dfs_automount_task, |
30 | */ | 30 | cifs_dfs_expire_automounts); |
31 | static int cifs_dfs_mountpoint_expiry_timeout = 500 * HZ; | ||
32 | |||
33 | static void cifs_dfs_expire_automounts(struct work_struct *work) | ||
34 | { | ||
35 | struct list_head *list = &cifs_dfs_automount_list; | ||
36 | |||
37 | mark_mounts_for_expiry(list); | ||
38 | if (!list_empty(list)) | ||
39 | schedule_delayed_work(&cifs_dfs_automount_task, | ||
40 | cifs_dfs_mountpoint_expiry_timeout); | ||
41 | } | ||
31 | 42 | ||
32 | void dfs_shrink_umount_helper(struct vfsmount *vfsmnt) | 43 | void cifs_dfs_release_automount_timer(void) |
33 | { | 44 | { |
34 | mark_mounts_for_expiry(&cifs_dfs_automount_list); | 45 | BUG_ON(!list_empty(&cifs_dfs_automount_list)); |
35 | mark_mounts_for_expiry(&cifs_dfs_automount_list); | 46 | cancel_delayed_work(&cifs_dfs_automount_task); |
47 | flush_scheduled_work(); | ||
36 | } | 48 | } |
37 | 49 | ||
38 | /** | 50 | /** |
@@ -261,10 +273,11 @@ static int add_mount_helper(struct vfsmount *newmnt, struct nameidata *nd, | |||
261 | err = do_add_mount(newmnt, nd, nd->path.mnt->mnt_flags, mntlist); | 273 | err = do_add_mount(newmnt, nd, nd->path.mnt->mnt_flags, mntlist); |
262 | switch (err) { | 274 | switch (err) { |
263 | case 0: | 275 | case 0: |
264 | dput(nd->path.dentry); | 276 | path_put(&nd->path); |
265 | mntput(nd->path.mnt); | ||
266 | nd->path.mnt = newmnt; | 277 | nd->path.mnt = newmnt; |
267 | nd->path.dentry = dget(newmnt->mnt_root); | 278 | nd->path.dentry = dget(newmnt->mnt_root); |
279 | schedule_delayed_work(&cifs_dfs_automount_task, | ||
280 | cifs_dfs_mountpoint_expiry_timeout); | ||
268 | break; | 281 | break; |
269 | case -EBUSY: | 282 | case -EBUSY: |
270 | /* someone else made a mount here whilst we were busy */ | 283 | /* someone else made a mount here whilst we were busy */ |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index a04b17e5a9d0..39c2cbdface7 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -466,16 +466,11 @@ static struct quotactl_ops cifs_quotactl_ops = { | |||
466 | }; | 466 | }; |
467 | #endif | 467 | #endif |
468 | 468 | ||
469 | static void cifs_umount_begin(struct vfsmount *vfsmnt, int flags) | 469 | static void cifs_umount_begin(struct super_block *sb) |
470 | { | 470 | { |
471 | struct cifs_sb_info *cifs_sb; | 471 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); |
472 | struct cifsTconInfo *tcon; | 472 | struct cifsTconInfo *tcon; |
473 | 473 | ||
474 | dfs_shrink_umount_helper(vfsmnt); | ||
475 | |||
476 | if (!(flags & MNT_FORCE)) | ||
477 | return; | ||
478 | cifs_sb = CIFS_SB(vfsmnt->mnt_sb); | ||
479 | if (cifs_sb == NULL) | 474 | if (cifs_sb == NULL) |
480 | return; | 475 | return; |
481 | 476 | ||
@@ -1100,6 +1095,7 @@ exit_cifs(void) | |||
1100 | cFYI(DBG2, ("exit_cifs")); | 1095 | cFYI(DBG2, ("exit_cifs")); |
1101 | cifs_proc_clean(); | 1096 | cifs_proc_clean(); |
1102 | #ifdef CONFIG_CIFS_DFS_UPCALL | 1097 | #ifdef CONFIG_CIFS_DFS_UPCALL |
1098 | cifs_dfs_release_automount_timer(); | ||
1103 | unregister_key_type(&key_type_dns_resolver); | 1099 | unregister_key_type(&key_type_dns_resolver); |
1104 | #endif | 1100 | #endif |
1105 | #ifdef CONFIG_CIFS_UPCALL | 1101 | #ifdef CONFIG_CIFS_UPCALL |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 0c83da4a7dab..50f9fdae19b3 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
@@ -104,13 +104,7 @@ extern int mode_to_acl(struct inode *inode, const char *path, __u64); | |||
104 | extern int cifs_mount(struct super_block *, struct cifs_sb_info *, char *, | 104 | extern int cifs_mount(struct super_block *, struct cifs_sb_info *, char *, |
105 | const char *); | 105 | const char *); |
106 | extern int cifs_umount(struct super_block *, struct cifs_sb_info *); | 106 | extern int cifs_umount(struct super_block *, struct cifs_sb_info *); |
107 | #ifdef CONFIG_CIFS_DFS_UPCALL | 107 | extern void cifs_dfs_release_automount_timer(void); |
108 | extern void dfs_shrink_umount_helper(struct vfsmount *vfsmnt); | ||
109 | #else | ||
110 | static inline void dfs_shrink_umount_helper(struct vfsmount *vfsmnt) | ||
111 | { | ||
112 | } | ||
113 | #endif /* DFS_UPCALL */ | ||
114 | void cifs_proc_init(void); | 108 | void cifs_proc_init(void); |
115 | void cifs_proc_clean(void); | 109 | void cifs_proc_clean(void); |
116 | 110 | ||