autofs-5.0.9 - amd lookup add ufs fs type From: Ian Kent Completely overlooked mount type ufs, which should be the system default filesystem. There's no simple way to determine what the system default filesystem is and am-utils needs to be continually updated to do this and can easily get it wrong anyway. A better approach is to use a configuration entry and set it to be what it usually is in am-utils, allowing the user to set it to what they would like it to be. --- include/defaults.h | 2 ++ include/parse_amd.h | 9 +++++---- lib/defaults.c | 10 ++++++++++ man/autofs.conf.5.in | 9 +++++++++ modules/amd_parse.y | 3 +++ modules/amd_tok.l | 2 +- modules/parse_amd.c | 21 +++++++++++++++++++++ redhat/autofs.conf.default.in | 9 +++++++++ samples/autofs.conf.default.in | 9 +++++++++ 9 files changed, 69 insertions(+), 5 deletions(-) diff --git a/include/defaults.h b/include/defaults.h index 033acaf..6ca20d0 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -130,6 +130,7 @@ #define DEFAULT_AMD_UMOUNT_ON_EXIT "yes" #define DEFAULT_AMD_USE_TCPWRAPPERS DEFAULT_AMD_NULL_VALUE #define DEFAULT_AMD_VENDOR "unknown" +#define DEFAULT_AMD_LINUX_UFS_MOUNT_TYPE "ext3" #ifdef WITH_LDAP struct ldap_schema; @@ -184,6 +185,7 @@ char *conf_amd_get_map_defaults(const char *); char *conf_amd_get_map_type(const char *); char *conf_amd_get_search_path(const char *); unsigned int conf_amd_get_dismount_interval(const char *); +char *conf_amd_get_linux_ufs_mount_type(void); unsigned long conf_amd_get_flags(const char *); #endif diff --git a/include/parse_amd.h b/include/parse_amd.h index 401aadb..313edd5 100644 --- a/include/parse_amd.h +++ b/include/parse_amd.h @@ -25,10 +25,11 @@ #define AMD_MOUNT_TYPE_LINKX 0x00000040 #define AMD_MOUNT_TYPE_LOFS 0x00000080 #define AMD_MOUNT_TYPE_EXT 0x00000100 -#define AMD_MOUNT_TYPE_XFS 0x00000200 -#define AMD_MOUNT_TYPE_JFS 0x00000400 -#define AMD_MOUNT_TYPE_CACHEFS 0x00000800 -#define AMD_MOUNT_TYPE_CDFS 0x00001000 +#define AMD_MOUNT_TYPE_UFS 0x00000200 +#define AMD_MOUNT_TYPE_XFS 0x00000400 +#define AMD_MOUNT_TYPE_JFS 0x00000800 +#define AMD_MOUNT_TYPE_CACHEFS 0x00001000 +#define AMD_MOUNT_TYPE_CDFS 0x00002000 #define AMD_MOUNT_TYPE_MASK 0x0000ffff #define AMD_ENTRY_CUT 0x00010000 diff --git a/lib/defaults.c b/lib/defaults.c index bdaba67..3fa2216 100644 --- a/lib/defaults.c +++ b/lib/defaults.c @@ -136,6 +136,7 @@ #define NAME_AMD_UMOUNT_ON_EXIT "unmount_on_exit" #define NAME_AMD_USE_TCPWRAPPERS "use_tcpwrappers" #define NAME_AMD_VENDOR "vendor" +#define NAME_AMD_LINUX_UFS_MOUNT_TYPE "linux_ufs_mount_type" /* Status returns */ #define CFG_OK 0x0000 @@ -543,6 +544,10 @@ static int conf_load_amd_defaults(void) if (ret == CFG_FAIL) goto error; + ret = conf_update(sec, NAME_AMD_LINUX_UFS_MOUNT_TYPE, + DEFAULT_AMD_LINUX_UFS_MOUNT_TYPE, CONF_NONE); + if (ret == CFG_FAIL) + goto error; return 1; error: @@ -1706,6 +1711,11 @@ unsigned int conf_amd_get_dismount_interval(const char *section) return (unsigned int) tmp; } +char *conf_amd_get_linux_ufs_mount_type(void) +{ + return conf_get_string(amd_gbl_sec, NAME_AMD_LINUX_UFS_MOUNT_TYPE); +} + unsigned long conf_amd_get_flags(const char *section) { const char *amd = amd_gbl_sec; diff --git a/man/autofs.conf.5.in b/man/autofs.conf.5.in index f25a918..c959b52 100644 --- a/man/autofs.conf.5.in +++ b/man/autofs.conf.5.in @@ -390,6 +390,15 @@ LDAP URIs. .B hesiod_base .br Sets the base name used for hesiod map sources. +.TP +.B linux_ufs_mount_type +.br +This is an aditional configuration option for the autofs amd format +parser implementation. + +There's no simple way to determine what the system default filesystem +is and am-utils needs to be continually updated to do this and can +easily get it wrong ayway. So allow it to be set in the configuration. .SH EXAMPLE .sp .RS +.2i diff --git a/modules/amd_parse.y b/modules/amd_parse.y index 87e3309..8174fb2 100644 --- a/modules/amd_parse.y +++ b/modules/amd_parse.y @@ -269,6 +269,9 @@ option_assignment: MAP_OPTION OPTION_ASSIGN FS_TYPE !strcmp($3, "ext4")) { entry.flags |= AMD_MOUNT_TYPE_EXT; entry.type = amd_strdup($3); + } else if (!strcmp($3, "ufs")) { + entry.flags |= AMD_MOUNT_TYPE_UFS; + entry.type = conf_amd_get_linux_ufs_mount_type(); } else if (!strcmp($3, "cdfs")) { entry.flags |= AMD_MOUNT_TYPE_CDFS; entry.type = amd_strdup("iso9660"); diff --git a/modules/amd_tok.l b/modules/amd_tok.l index 10b1963..618bc91 100644 --- a/modules/amd_tok.l +++ b/modules/amd_tok.l @@ -99,7 +99,7 @@ MNTOPT (opts|addopts|remopts) FSOPTS (rhost|rfs|dev|cachedir|mount|unmount|umount|delay) CHEOPT (mapdefault|none|inc|re|regexp|all) MAPTYPE (file|nis|nisplus|ldap|hesiod|exec|ndbm|passwd|union) -FSTYPE_LOCAL (link|linkx|lofs|ext2|ext3|ext4|xfs|jfs|cdfs|cachefs) +FSTYPE_LOCAL (link|linkx|lofs|ufs|ext2|ext3|ext4|xfs|jfs|cdfs|cachefs) FSTYPE_NET (nfs|nfsx|nfsl|host) FSTYPE (auto|program|direct|lustre|{FSTYPE_LOCAL}|{FSTYPE_NET}) diff --git a/modules/parse_amd.c b/modules/parse_amd.c index 790f25e..0c708e6 100644 --- a/modules/parse_amd.c +++ b/modules/parse_amd.c @@ -1245,6 +1245,22 @@ static unsigned int validate_generic_options(unsigned int logopt, return 1; } +static unsigned int validate_ufs_fstype(unsigned int logopt, + struct amd_entry *entry) +{ + const char *type = (const char *) entry->type; + + if (strcmp(type, "ext") && strcmp(type, "ext2") && + strcmp(type, "ext3") && strcmp(type, "ext4") && + strcmp(type, "xfs") && strcmp(type, "jfs")) { + error(logopt, MODPREFIX + "%s: mount type %s not valid as ufs mount type on Linux", + type); + return 0; + } + return 1; +} + static unsigned int validate_host_options(unsigned int logopt, struct amd_entry *entry) { @@ -1282,6 +1298,11 @@ static int amd_mount(struct autofs_point *ap, const char *name, ret = do_generic_mount(ap, name, entry, entry->rfs, flags); break; + case AMD_MOUNT_TYPE_UFS: + if (!validate_ufs_fstype(ap->logopt, entry)) + return 1; + /* fall through to validate generic options */ + case AMD_MOUNT_TYPE_EXT: case AMD_MOUNT_TYPE_XFS: case AMD_MOUNT_TYPE_CDFS: diff --git a/redhat/autofs.conf.default.in b/redhat/autofs.conf.default.in index 1fa951b..8ccd5d6 100644 --- a/redhat/autofs.conf.default.in +++ b/redhat/autofs.conf.default.in @@ -306,6 +306,15 @@ mount_nfs_default_protocol = 4 # # hesiod_base - the base name used for hesiod map sources. # +# Additional configuration options added: +# +# linux_ufs_mount_type - set the default system filesystem type that's +# used for mount type ufs. There's no simple way to determine +# what the system default filesystem is and am-utils needs to +# be continually updated to do this and can easily get it wrong +# anyway. +# +# # Define global options for the amd parser within autofs. # [ amd ] diff --git a/samples/autofs.conf.default.in b/samples/autofs.conf.default.in index 7a84566..934e411 100644 --- a/samples/autofs.conf.default.in +++ b/samples/autofs.conf.default.in @@ -305,6 +305,15 @@ browse_mode = no # # hesiod_base - the base name used for hesiod map sources. # +# Additional configuration options added: +# +# linux_ufs_mount_type - set the default system filesystem type that's +# used for mount type ufs. There's no simple way to determine +# what the system default filesystem is and am-utils needs to +# be continually updated to do this and can easily get it wrong +# anyway. +# +# # Define global options for the amd parser within autofs. # [ amd ]