diff options
author | Ian Kent <raven@themaw.net> | 2009-01-06 17:42:08 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-06 18:59:23 -0500 |
commit | a92daf6ba1f9ace8584edc8eb557a77aa7c2c71d (patch) | |
tree | a4734bb761e762af714710ab53c4b3c3c58516f8 | |
parent | 41cfef2eb87694a8d64105c059b39f7bd6b7d4fe (diff) |
autofs4: make autofs type usage explicit
- the type assigned at mount when no type is given is changed
from 0 to AUTOFS_TYPE_INDIRECT. This was done because 0 and
AUTOFS_TYPE_INDIRECT were being treated implicitly as the same
type.
- previously, an offset mount had it's type set to
AUTOFS_TYPE_DIRECT|AUTOFS_TYPE_OFFSET but the mount control
re-implementation needs to be able distinguish all three types.
So this was changed to make the type setting explicit.
- a type AUTOFS_TYPE_ANY was added for use by the re-implementation
when checking if a given path is a mountpoint. It's not really a
type as we use this to ask if a given path is a mountpoint in the
autofs_dev_ioctl_ismountpoint() function.
- functions to set and test the autofs mount types have been added to
improve readability and make the type usage explicit.
- the mount type is used from user space for the mount control
re-implementtion so, for consistency, all the definitions have
been moved to the user space include file include/linux/auto_fs4.h.
Signed-off-by: Ian Kent <raven@themaw.net>
Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | fs/autofs4/autofs_i.h | 2 | ||||
-rw-r--r-- | fs/autofs4/dev-ioctl.c | 4 | ||||
-rw-r--r-- | fs/autofs4/expire.c | 4 | ||||
-rw-r--r-- | fs/autofs4/inode.c | 14 | ||||
-rw-r--r-- | fs/autofs4/waitq.c | 8 | ||||
-rw-r--r-- | include/linux/auto_fs4.h | 62 |
6 files changed, 73 insertions, 21 deletions
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index e0f16da00e54..a76803108d06 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -25,8 +25,6 @@ | |||
25 | #define AUTOFS_DEV_IOCTL_IOC_FIRST (AUTOFS_DEV_IOCTL_VERSION) | 25 | #define AUTOFS_DEV_IOCTL_IOC_FIRST (AUTOFS_DEV_IOCTL_VERSION) |
26 | #define AUTOFS_DEV_IOCTL_IOC_COUNT (AUTOFS_IOC_COUNT - 11) | 26 | #define AUTOFS_DEV_IOCTL_IOC_COUNT (AUTOFS_IOC_COUNT - 11) |
27 | 27 | ||
28 | #define AUTOFS_TYPE_TRIGGER (AUTOFS_TYPE_DIRECT|AUTOFS_TYPE_OFFSET) | ||
29 | |||
30 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
31 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
32 | #include <linux/time.h> | 30 | #include <linux/time.h> |
diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c index 0566ff8db4cd..aa3f47293bb8 100644 --- a/fs/autofs4/dev-ioctl.c +++ b/fs/autofs4/dev-ioctl.c | |||
@@ -532,7 +532,7 @@ static int autofs_dev_ioctl_expire(struct file *fp, | |||
532 | how = param->expire.how; | 532 | how = param->expire.how; |
533 | mnt = fp->f_path.mnt; | 533 | mnt = fp->f_path.mnt; |
534 | 534 | ||
535 | if (sbi->type & AUTOFS_TYPE_TRIGGER) | 535 | if (autofs_type_trigger(sbi->type)) |
536 | dentry = autofs4_expire_direct(sbi->sb, mnt, sbi, how); | 536 | dentry = autofs4_expire_direct(sbi->sb, mnt, sbi, how); |
537 | else | 537 | else |
538 | dentry = autofs4_expire_indirect(sbi->sb, mnt, sbi, how); | 538 | dentry = autofs4_expire_indirect(sbi->sb, mnt, sbi, how); |
@@ -615,7 +615,7 @@ static int autofs_dev_ioctl_ismountpoint(struct file *fp, | |||
615 | param->ismountpoint.out.magic = magic = 0; | 615 | param->ismountpoint.out.magic = magic = 0; |
616 | 616 | ||
617 | if (!fp || param->ioctlfd == -1) { | 617 | if (!fp || param->ioctlfd == -1) { |
618 | if (type == AUTOFS_TYPE_ANY) { | 618 | if (autofs_type_any(type)) { |
619 | struct super_block *sb; | 619 | struct super_block *sb; |
620 | 620 | ||
621 | err = path_lookup(path, LOOKUP_FOLLOW, &nd); | 621 | err = path_lookup(path, LOOKUP_FOLLOW, &nd); |
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index 4b6fb3f628c0..e3bd50776f9e 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c | |||
@@ -63,7 +63,7 @@ static int autofs4_mount_busy(struct vfsmount *mnt, struct dentry *dentry) | |||
63 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); | 63 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); |
64 | 64 | ||
65 | /* This is an autofs submount, we can't expire it */ | 65 | /* This is an autofs submount, we can't expire it */ |
66 | if (sbi->type == AUTOFS_TYPE_INDIRECT) | 66 | if (autofs_type_indirect(sbi->type)) |
67 | goto done; | 67 | goto done; |
68 | 68 | ||
69 | /* | 69 | /* |
@@ -490,7 +490,7 @@ int autofs4_expire_multi(struct super_block *sb, struct vfsmount *mnt, | |||
490 | if (arg && get_user(do_now, arg)) | 490 | if (arg && get_user(do_now, arg)) |
491 | return -EFAULT; | 491 | return -EFAULT; |
492 | 492 | ||
493 | if (sbi->type & AUTOFS_TYPE_TRIGGER) | 493 | if (autofs_type_trigger(sbi->type)) |
494 | dentry = autofs4_expire_direct(sb, mnt, sbi, do_now); | 494 | dentry = autofs4_expire_direct(sb, mnt, sbi, do_now); |
495 | else | 495 | else |
496 | dentry = autofs4_expire_indirect(sb, mnt, sbi, do_now); | 496 | dentry = autofs4_expire_indirect(sb, mnt, sbi, do_now); |
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index cfc23e53b6f4..716e12b627b2 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
@@ -197,9 +197,9 @@ static int autofs4_show_options(struct seq_file *m, struct vfsmount *mnt) | |||
197 | seq_printf(m, ",minproto=%d", sbi->min_proto); | 197 | seq_printf(m, ",minproto=%d", sbi->min_proto); |
198 | seq_printf(m, ",maxproto=%d", sbi->max_proto); | 198 | seq_printf(m, ",maxproto=%d", sbi->max_proto); |
199 | 199 | ||
200 | if (sbi->type & AUTOFS_TYPE_OFFSET) | 200 | if (autofs_type_offset(sbi->type)) |
201 | seq_printf(m, ",offset"); | 201 | seq_printf(m, ",offset"); |
202 | else if (sbi->type & AUTOFS_TYPE_DIRECT) | 202 | else if (autofs_type_direct(sbi->type)) |
203 | seq_printf(m, ",direct"); | 203 | seq_printf(m, ",direct"); |
204 | else | 204 | else |
205 | seq_printf(m, ",indirect"); | 205 | seq_printf(m, ",indirect"); |
@@ -284,13 +284,13 @@ static int parse_options(char *options, int *pipefd, uid_t *uid, gid_t *gid, | |||
284 | *maxproto = option; | 284 | *maxproto = option; |
285 | break; | 285 | break; |
286 | case Opt_indirect: | 286 | case Opt_indirect: |
287 | *type = AUTOFS_TYPE_INDIRECT; | 287 | set_autofs_type_indirect(type); |
288 | break; | 288 | break; |
289 | case Opt_direct: | 289 | case Opt_direct: |
290 | *type = AUTOFS_TYPE_DIRECT; | 290 | set_autofs_type_direct(type); |
291 | break; | 291 | break; |
292 | case Opt_offset: | 292 | case Opt_offset: |
293 | *type = AUTOFS_TYPE_OFFSET; | 293 | set_autofs_type_offset(type); |
294 | break; | 294 | break; |
295 | default: | 295 | default: |
296 | return 1; | 296 | return 1; |
@@ -338,7 +338,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
338 | sbi->sb = s; | 338 | sbi->sb = s; |
339 | sbi->version = 0; | 339 | sbi->version = 0; |
340 | sbi->sub_version = 0; | 340 | sbi->sub_version = 0; |
341 | sbi->type = AUTOFS_TYPE_INDIRECT; | 341 | set_autofs_type_indirect(&sbi->type); |
342 | sbi->min_proto = 0; | 342 | sbi->min_proto = 0; |
343 | sbi->max_proto = 0; | 343 | sbi->max_proto = 0; |
344 | mutex_init(&sbi->wq_mutex); | 344 | mutex_init(&sbi->wq_mutex); |
@@ -380,7 +380,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
380 | } | 380 | } |
381 | 381 | ||
382 | root_inode->i_fop = &autofs4_root_operations; | 382 | root_inode->i_fop = &autofs4_root_operations; |
383 | root_inode->i_op = sbi->type & AUTOFS_TYPE_TRIGGER ? | 383 | root_inode->i_op = autofs_type_trigger(sbi->type) ? |
384 | &autofs4_direct_root_inode_operations : | 384 | &autofs4_direct_root_inode_operations : |
385 | &autofs4_indirect_root_inode_operations; | 385 | &autofs4_indirect_root_inode_operations; |
386 | 386 | ||
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index e02cc8ae5eb3..eeb246845909 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c | |||
@@ -337,7 +337,7 @@ int autofs4_wait(struct autofs_sb_info *sbi, struct dentry *dentry, | |||
337 | * is very similar for indirect mounts except only dentrys | 337 | * is very similar for indirect mounts except only dentrys |
338 | * in the root of the autofs file system may be negative. | 338 | * in the root of the autofs file system may be negative. |
339 | */ | 339 | */ |
340 | if (sbi->type & AUTOFS_TYPE_TRIGGER) | 340 | if (autofs_type_trigger(sbi->type)) |
341 | return -ENOENT; | 341 | return -ENOENT; |
342 | else if (!IS_ROOT(dentry->d_parent)) | 342 | else if (!IS_ROOT(dentry->d_parent)) |
343 | return -ENOENT; | 343 | return -ENOENT; |
@@ -348,7 +348,7 @@ int autofs4_wait(struct autofs_sb_info *sbi, struct dentry *dentry, | |||
348 | return -ENOMEM; | 348 | return -ENOMEM; |
349 | 349 | ||
350 | /* If this is a direct mount request create a dummy name */ | 350 | /* If this is a direct mount request create a dummy name */ |
351 | if (IS_ROOT(dentry) && sbi->type & AUTOFS_TYPE_TRIGGER) | 351 | if (IS_ROOT(dentry) && autofs_type_trigger(sbi->type)) |
352 | qstr.len = sprintf(name, "%p", dentry); | 352 | qstr.len = sprintf(name, "%p", dentry); |
353 | else { | 353 | else { |
354 | qstr.len = autofs4_getpath(sbi, dentry, &name); | 354 | qstr.len = autofs4_getpath(sbi, dentry, &name); |
@@ -406,11 +406,11 @@ int autofs4_wait(struct autofs_sb_info *sbi, struct dentry *dentry, | |||
406 | type = autofs_ptype_expire_multi; | 406 | type = autofs_ptype_expire_multi; |
407 | } else { | 407 | } else { |
408 | if (notify == NFY_MOUNT) | 408 | if (notify == NFY_MOUNT) |
409 | type = (sbi->type & AUTOFS_TYPE_TRIGGER) ? | 409 | type = autofs_type_trigger(sbi->type) ? |
410 | autofs_ptype_missing_direct : | 410 | autofs_ptype_missing_direct : |
411 | autofs_ptype_missing_indirect; | 411 | autofs_ptype_missing_indirect; |
412 | else | 412 | else |
413 | type = (sbi->type & AUTOFS_TYPE_TRIGGER) ? | 413 | type = autofs_type_trigger(sbi->type) ? |
414 | autofs_ptype_expire_direct : | 414 | autofs_ptype_expire_direct : |
415 | autofs_ptype_expire_indirect; | 415 | autofs_ptype_expire_indirect; |
416 | } | 416 | } |
diff --git a/include/linux/auto_fs4.h b/include/linux/auto_fs4.h index 2253716d4b92..55fa478bd639 100644 --- a/include/linux/auto_fs4.h +++ b/include/linux/auto_fs4.h | |||
@@ -29,10 +29,64 @@ | |||
29 | #define AUTOFS_EXP_IMMEDIATE 1 | 29 | #define AUTOFS_EXP_IMMEDIATE 1 |
30 | #define AUTOFS_EXP_LEAVES 2 | 30 | #define AUTOFS_EXP_LEAVES 2 |
31 | 31 | ||
32 | #define AUTOFS_TYPE_ANY 0x0000 | 32 | #define AUTOFS_TYPE_ANY 0U |
33 | #define AUTOFS_TYPE_INDIRECT 0x0001 | 33 | #define AUTOFS_TYPE_INDIRECT 1U |
34 | #define AUTOFS_TYPE_DIRECT 0x0002 | 34 | #define AUTOFS_TYPE_DIRECT 2U |
35 | #define AUTOFS_TYPE_OFFSET 0x0004 | 35 | #define AUTOFS_TYPE_OFFSET 4U |
36 | |||
37 | static inline void set_autofs_type_indirect(unsigned int *type) | ||
38 | { | ||
39 | *type = AUTOFS_TYPE_INDIRECT; | ||
40 | return; | ||
41 | } | ||
42 | |||
43 | static inline unsigned int autofs_type_indirect(unsigned int type) | ||
44 | { | ||
45 | return (type == AUTOFS_TYPE_INDIRECT); | ||
46 | } | ||
47 | |||
48 | static inline void set_autofs_type_direct(unsigned int *type) | ||
49 | { | ||
50 | *type = AUTOFS_TYPE_DIRECT; | ||
51 | return; | ||
52 | } | ||
53 | |||
54 | static inline unsigned int autofs_type_direct(unsigned int type) | ||
55 | { | ||
56 | return (type == AUTOFS_TYPE_DIRECT); | ||
57 | } | ||
58 | |||
59 | static inline void set_autofs_type_offset(unsigned int *type) | ||
60 | { | ||
61 | *type = AUTOFS_TYPE_OFFSET; | ||
62 | return; | ||
63 | } | ||
64 | |||
65 | static inline unsigned int autofs_type_offset(unsigned int type) | ||
66 | { | ||
67 | return (type == AUTOFS_TYPE_OFFSET); | ||
68 | } | ||
69 | |||
70 | static inline unsigned int autofs_type_trigger(unsigned int type) | ||
71 | { | ||
72 | return (type == AUTOFS_TYPE_DIRECT || type == AUTOFS_TYPE_OFFSET); | ||
73 | } | ||
74 | |||
75 | /* | ||
76 | * This isn't really a type as we use it to say "no type set" to | ||
77 | * indicate we want to search for "any" mount in the | ||
78 | * autofs_dev_ioctl_ismountpoint() device ioctl function. | ||
79 | */ | ||
80 | static inline void set_autofs_type_any(unsigned int *type) | ||
81 | { | ||
82 | *type = AUTOFS_TYPE_ANY; | ||
83 | return; | ||
84 | } | ||
85 | |||
86 | static inline unsigned int autofs_type_any(unsigned int type) | ||
87 | { | ||
88 | return (type == AUTOFS_TYPE_ANY); | ||
89 | } | ||
36 | 90 | ||
37 | /* Daemon notification packet types */ | 91 | /* Daemon notification packet types */ |
38 | enum autofs_notify { | 92 | enum autofs_notify { |