From: Andreas Dilger Date: Tue, 21 Jan 2020 10:29:36 +0000 (-0700) Subject: LU-930 utils: add --help option to lfs sub-commands X-Git-Tag: 2.14.53~103 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F59%2F34659%2F21;p=fs%2Flustre-release.git LU-930 utils: add --help option to lfs sub-commands Add the "--help" and "-h" options to lfs sub-commands, and print out an error message if an invalid argument is given. Otherwise, it is possible to get a help message but have no idea why the command is failing (e.g. typo in argument name). Format the usage messages consistently, using {} to indicate a choice between multiple required parameters, putting arguments in [] for optional parameters, and using capitalized arguments. Update respective man pages to list "--help|-h" option. Remove the old SETSTRIPE and GETSTRIPE checks from spelling.txt to avoid spurious checkpatch warnings. Test-Parameters: trivial Signed-off-by: Andreas Dilger Change-Id: Ic583c8161d1d5380e353f43a8613dd86c93ebbe5 Reviewed-on: https://review.whamcloud.com/34659 Tested-by: jenkins Reviewed-by: Olaf Faaland-LLNL Tested-by: Maloo Reviewed-by: Arshad Hussain Reviewed-by: Oleg Drokin --- diff --git a/contrib/scripts/spelling.txt b/contrib/scripts/spelling.txt index d04f21b..9c01dc6 100644 --- a/contrib/scripts/spelling.txt +++ b/contrib/scripts/spelling.txt @@ -109,7 +109,6 @@ ERR_PTR.PTR_ERR||ERR_CAST from_timer||cfs_from_timer f_dentry||f_path.dentry [^_]get_seconds||ktime_get_real_seconds -GETSTRIPE||LFS getstripe kmem_cache_alloc.*GFP_ZERO||kmem_cache_zalloc ldebugfs_remove||debugfs_remove_recursive ldlm_appetite_t||enum ldlm_appetite @@ -171,7 +170,6 @@ page_cache_release||put_page PAGE_CACHE_SHIFT||PAGE_SHIFT PAGE_CACHE_SIZE||PAGE_SIZE return seq_printf||seq_printf -SETSTRIPE||LFS setstripe setup_timer||cfs_timer_setup = seq_printf||seq_printf sprintf||snprintf diff --git a/lustre/doc/lfs-find.1 b/lustre/doc/lfs-find.1 index 483227e..5b42ed3 100644 --- a/lustre/doc/lfs-find.1 +++ b/lustre/doc/lfs-find.1 @@ -5,39 +5,39 @@ lfs-find \- Lustre client utility to list files with specific attributes .B lfs find \fR<\fIdirectory\fR|\fIfilename \fR...> [[\fB!\fR] \fB--atime\fR|\fB-A\fR [\fB-+\fR]\fIn[smhdwy]\fR] [[\fB!\fR] \fB--blocks\fR|\fB-b\fR [\fB+-\fR]\fIn\fR] - [[\fB!\fR] \fB--btime\fR|\fB--Btime\fR|\fB-B\fR [\fB+-\fR]\fIn[smhdwy]\fR] - [[\fB!\fR] \fB--ctime\fR|\fB-C\fR [\fB+-\fR]\fIn[smhdwy]\fR] + [[\fB!\fR] \fB--btime\fR|\fB-B\fR [\fB+-\fR]\fIn[smhdwy]\fR] +[[\fB!\fR] \fB--ctime\fR|\fB-C\fR [\fB+-\fR]\fIn[smhdwy]\fR] [[\fB!\fR] \fB--component-count|\fB--comp-count\fR [\fB+-\fR]\fIn\fR] [[\fB!\fR] \fB--component-end|\fB--comp-end\fR|\fB-E\fR [\fB+-\fR]\fIn\fR[\fBKMGTPE\fR]] - [[\fB!\fR] \fB--component-flags|\fB--comp-flags\fR <[^]\fIflag\fB,\fR...>] + [[\fB!\fR] \fB--component-flags|\fB--comp-flags\fR [^]\fIFLAG\fB,\fR...] [[\fB!\fR] \fB--component-start|\fB--comp-start\fR [\fB+-\fR]\fIn\fR[\fBKMGTPE\fR]] [[\fB!\fR] \fB--extension-size|\fB-z\fR [\fB+-\fR]\fIn\fR[\fBKMG\fR]] - [[\fB!\fR] \fB--foreign\fR [<\fItype\fR>]] -[[\fB!\fR] \fB--gid\fR|\fB-g\fR|\fB--group\fR|\fB-G\fR <\fIgname\fR>|<\fIgid\fR>] - [[\fB!\fR] \fB--layout\fR|\fB-L mdt\fR,\fBraid0\fR,\fBreleased\fR] + [[\fB!\fR] \fB--foreign\fR [\fITYPE\fR]] +[[\fB!\fR] \fB--gid\fR|\fB-g\fR|\fB--group\fR|\fB-G\fR \fIGNAME\fR|\fIGID\fR>] + [\fB--help\fR|\fB-h\fR] +[[\fB!\fR] \fB--layout\fR|\fB-L mdt\fR,\fBraid0\fR,\fBreleased\fR] [\fB--lazy\fR] [\fB--maxdepth\fR|\fB-D\fI n\fR] -[[\fB!\fR] \fB--mdt\fR|\fB--mdt-index\fR|\fB-m\fR <\fIuuid\fR|\fIindex\fR,...>] +[[\fB!\fR] \fB--mdt\fR|\fB--mdt-index\fR|\fB-m\fR \fIUUID\fR|\fIINDEX\fR,...] [[\fB!\fR] \fB--mdt-count\fR|\fB-T\fR [\fB+-\fR]\fIn\fR] -[[\fB!\fR] \fB--mdt-hash\fR|\fB-H \fR<[^]\fIhashflag\fR,[^]\fIhashtype\fR,...>] +[[\fB!\fR] \fB--mdt-hash\fR|\fB-H \fR<[^]\fIHASHFLAG\fR,[^]\fIHASHTYPE\fR,...>] [[\fB!\fR] \fB--mirror-count|\fB-N\fR [\fB+-\fR]\fIn\fR] -[[\fB!\fR] \fB--mirror-state\fR <[^]\fIstate\fR>] +[[\fB!\fR] \fB--mirror-state\fR [^]\fISTATE\fR] [[\fB!\fR] \fB--mtime\fR|\fB-M\fR [\fB-+\fR]\fIn[smhdwy]\fR] -[[\fB!\fR] \fB--name\fR|\fB-n <\fIpattern\fR>] - [[\fB!\fR] \fB--newer\fR[\fBXY\fR] <\fIreference\fR>] - [[\fB!\fR] \fB--ost\fR|\fB-O\fR <\fIindex\fR,...>] - [[\fB!\fR] \fB--perm\fR [\fB/-\fR]<\fImode\fR> ] -[[\fB!\fR] \fB--pool\fR <\fIpool\fR>] +[[\fB!\fR] \fB--name\fR|\fB-n \fIPATTERN\fR] + [[\fB!\fR] \fB--newer\fR[\fBXY\fR] \fIREFERENCE\fR] + [[\fB!\fR] \fB--ost\fR|\fB-O\fR \fIINDEX\fR,...] + [[\fB!\fR] \fB--perm\fR [\fB/-\fR]\fIMODE\fR ] +[[\fB!\fR] \fB--pool\fR \fIPOOL\fR] [\fB--print\fR|\fB-P\fR] [\fB--print0\fR|\fB-0\fR] -[[\fB!\fR] \fB--projid\fR |<\fIprojid\fR>] +[[\fB!\fR] \fB--projid\fR \fIPROJID\fR] [[\fB!\fR] \fB--size|\fB-s\fR [\fB-+\fR]\fIn\fR[\fBKMGTPE\fR]] [[\fB!\fR] \fB--stripe-count|\fB-c\fR [\fB+-\fR]\fIn\fR] [[\fB!\fR] \fB--stripe-index|\fB-i\fR \fIn\fR,...] [[\fB!\fR] \fB--stripe-size|\fB-S\fR [\fB+-\fR]\fIn\fR[\fBKMG\fR]] [[\fB!\fR] \fB--type\fR|\fB-t\fR {\fBbcdflps\fR}] -[[\fB!\fR] \fB--uid\fR|\fB-u\fR|\fB--user\fR|\fB-U -<\fIuname\fR>|<\fIuid>\fR] +[[\fB!\fR] \fB--uid\fR|\fB-u\fR|\fB--user\fR|\fB-U \fIUNAME\fR|\fIUID\fR] .SH DESCRIPTION .B lfs find is similar to the standard @@ -127,6 +127,9 @@ File has specified numeric group ID. .BR --group | -G File belongs to specified group, numeric group ID allowed. .TP +.BR --help | -h +Print usage message. +.TP .BR --layout | -L File has a layout of the given type, one of: .RS 1.2i diff --git a/lustre/doc/lfs-flushctx.1 b/lustre/doc/lfs-flushctx.1 index f9cebbd..75e784c 100644 --- a/lustre/doc/lfs-flushctx.1 +++ b/lustre/doc/lfs-flushctx.1 @@ -22,7 +22,7 @@ Proceed to Kerberos credentials cache destroy. Reap revoked keys from the session keyring. .TP .BR -h -Display helper. +Print usage message. .SH EXAMPLES .TP .B $ lfs flushctx -k -r /mnt/lustre diff --git a/lustre/doc/lfs-getdirstripe.1 b/lustre/doc/lfs-getdirstripe.1 index 0636e41..f2a4537 100644 --- a/lustre/doc/lfs-getdirstripe.1 +++ b/lustre/doc/lfs-getdirstripe.1 @@ -2,7 +2,7 @@ .SH NAME lfs getdirstripe \- list the layout pattern of a given directory .SH SYNOPSIS -.BR "lfs getdirstripe" " [" -cDimOrTXy "]... " \fIDIR\fR... +.BR "lfs getdirstripe" " [" -cDhHimOrTXvy "]... " \fIDIR\fR... .SH DESCRIPTION Get the layout pattern of striped directories. This .BR lfs (1) @@ -17,6 +17,9 @@ Only show the number of MDTs the directory is striped across. .BR \-D ", " \-\-default Show the default layout used when creating new subdirectories. .TP +.BR \-h ", " \-\-help +Print usage message. +.TP .BR \-H ", " \-\-mdt-hash Only show the hash function being used for this directory. .TP diff --git a/lustre/doc/lfs-getname.1 b/lustre/doc/lfs-getname.1 index d5974aa..f6ff53e 100644 --- a/lustre/doc/lfs-getname.1 +++ b/lustre/doc/lfs-getname.1 @@ -14,7 +14,7 @@ and instance ID for these mount points. .SH OPTIONS .TP .BR --help | -h -Print the usage message. +Print usage message. .TP .BR --fsname | -n Print only the Lustre filesystem name for each filesystem. If diff --git a/lustre/doc/lfs-getstripe.1 b/lustre/doc/lfs-getstripe.1 index 3dea938..aa3a8df 100644 --- a/lustre/doc/lfs-getstripe.1 +++ b/lustre/doc/lfs-getstripe.1 @@ -12,6 +12,7 @@ lfs getstripe \- Lustre client command to print layout parameters of a file [\fB--directory\fR|\fB-d\fR] [\fB--fid\fR|\fB-F\fR] [\fB--generation\fR|\fB-g\fR] +[\fB--help\fR|\fB-h\fR] [\fB--layout\fR|\fB-L\fR] [\fB--mdt\fR|\fB--mdt-index\fR|\fB-m\fR] [\fB--ost\fR|\fB-O\fR <\fIuuid\fR>] @@ -152,9 +153,12 @@ Get striping information for only the specified directory, like .BR --fid | -F Show only the 128-bit unique Lustre File Identifier (FID). .TP -.B --generation | -g +.BR --generation | -g Print only the layout generation number. .TP +.BR --help | -h +Print usage message. +.TP .BR --layout Show only the file layout, which is one of: .RS 1.2i diff --git a/lustre/doc/lfs-migrate.1 b/lustre/doc/lfs-migrate.1 index b4405e3..0725c1d 100644 --- a/lustre/doc/lfs-migrate.1 +++ b/lustre/doc/lfs-migrate.1 @@ -3,8 +3,8 @@ lfs migrate \- migrate files or directories between MDTs or OSTs. .SH SYNOPSIS .B lfs migrate +.RB [ -h "] [" -v ] .RI [ SETSTRIPE_OPTIONS " ... ]" -.RB [ -v ] .RI < file "> ..." .br .B lfs migrate -m \fIstart_mdt_index @@ -47,6 +47,9 @@ being lost. This should be used if an OST needs to be completely emptied prior to its removal, to ensure all requested files are migrated off the OST. .TP +.BR -h , --help +Print usage message. +.TP .BR -n , --non-block Abort migration if concurrent file access is detected. This can be used with OST space balancing migration to avoid interfering with file diff --git a/lustre/doc/lfs-setdirstripe.1 b/lustre/doc/lfs-setdirstripe.1 index 81d413f..c7a0acc 100644 --- a/lustre/doc/lfs-setdirstripe.1 +++ b/lustre/doc/lfs-setdirstripe.1 @@ -2,7 +2,7 @@ .SH NAME lfs setdirstripe, mkdir \- set striping pattern of a directory. .SH SYNOPSIS -.B lfs setdirstripe [\fR-cdDHioTxX\fR] \fIDIR\fR... +.B lfs setdirstripe [\fR-cdDhHioTxX\fR] \fIDIR\fR... .br .SH DESCRIPTION Create a striped directory with specified striping pattern. This @@ -25,6 +25,9 @@ Stripe the new directory over .I COUNT MDTs. .TP +.BR \-h ", " \-\-help +Print usage message. +.TP .BR \-i ", " \-\-mdt\-index =\fISTART_MDT_INDEX\fR[,\fIMDT_INDEX ...] Use the MDT whose index is .I START_MDT_INDEX diff --git a/lustre/doc/lfs-setquota.1 b/lustre/doc/lfs-setquota.1 index 42542d2..fb9eeb6 100644 --- a/lustre/doc/lfs-setquota.1 +++ b/lustre/doc/lfs-setquota.1 @@ -2,82 +2,88 @@ .SH NAME lfs setquota \- set quota limits or grace time for users, groups or projects. .SH SYNOPSIS -.B lfs setquota {\fB-u|--user|-g|--group|-p|--projid\fR} <\fIuname|uid|gname|gid|projid\fR> - [\fB--pool\fR <\fIpname\fR>] - [\fB--block-softlimit|-b\fR <\fIblock-softlimit\fR>[kMGTPE]] - [\fB--block-hardlimit|-B\fR <\fIblock-hardlimit\fR>[kMGTPE]] - [\fB--inode-softlimit|-i\fR <\fIinode-softlimit\fR>[kMGTPE]] - [\fB--inode-hardlimit|-I\fR <\fIinode-hardlimit\fR>[kMGTPE]] <\fIfilesystem\fR> -.TP -.B lfs setquota \fB-t\fR {\fB-u|-g|-p\fR} - [\fB--pool\fR <\fIpname\fR>] - [\fB--block-grace|-b\fR <\fIblock-grace\fR>] - [\fB--inode-grace|-i\fR <\fIinode-grace\fR>] <\fIfilesystem\fR> -.TP -.B lfs setquota {\fB-u|--user|-g|--group|-p|--projid\fR} <\fIuname|uid|gname|gid|projid\fR> +.BR "lfs setquota " { -u | --user | -g | --group | -p | --projid "} " \fIUID | \fIGID | \fIPROJID + [\fB--pool \fIPOOLNAME ] + [\fB--block-softlimit\fR|\fB-b \fIBLOCK_SOFTLIMIT\fR[\fBkMGTPE\fR]] + [\fB--block-hardlimit\fR|\fB-B \fIBLOCK_HARDLIMIT\fR[\fBkMGTPE\fR]] + [\fB--inode-softlimit\fR|\fB-i \fIINODE_SOFTLIMIT\fR[\fBkMGTPE\fR]] + [\fB--inode-hardlimit\fR|\fB-I \fIINODE_HARDLIMIT\fR[\fBkMGTPE\fR]] <\fIfilesystem\fR> +.TP +.BR "lfs setquota -t " { -h | -u | -g | -p } + [\fB--pool\fR \fIPOOL_NAME\fR] + [\fB--block-grace\fR|\fB-b\fR \fIBLOCK_GRACE_TIME\fR] + [\fB--inode-grace\fR|\fB-i\fR \fIINODE_GRACE_TIME\fR] <\fIfilesystem\fR> +.TP +.BR "lfs setquota " { -u | --user | -g | --group | -p | --projid "} " \fIUID\fR|\fIGID\fR|\fIPROJID\fR [\fB--default|-d\fR] <\fIfilesystem\fR> .TP -.B lfs setquota {\fB-U|--default-usr|-G|--default-grp|-P|--default-prj\fR} - [\fB--block-softlimit|-b\fR <\fIblock-softlimit\fR>[kMGTPE]] - [\fB--block-hardlimit|-B\fR <\fIblock-hardlimit\fR>[kMGTPE]] - [\fB--inode-softlimit|-i\fR <\fIinode-softlimit\fR>[kMGTPE]] - [\fB--inode-hardlimit|-I\fR <\fIinode-hardlimit\fR>[kMGTPE]] <\fIfilesystem\fR> +.BR "lfs setquota " { -U | --default-usr | -G | --default-grp | -P | --default-prj } + [\fB--block-softlimit\fR|\fB-b\fR \fIBLOCK_SOFTLIMIT\fR[\fBkMGTPE\fR]] + [\fB--block-hardlimit\fR|\fB-B\fR \fIBLOCK_HARDLIMIT\fR[\fBkMGTPE\fR]] + [\fB--inode-softlimit\fR|\fB-i\fR \fIINODE_SOFTLIMIT\fR[\fBkMGTPE\fR]] + [\fB--inode-hardlimit\fR|\fB-I\fR \fIINODE_HARDLIMIT\fR[\fBkMGTPE\fR]] <\fIfilesystem\fR> .TP .SH DESCRIPTION -.PP -.BR "lfs setquota " {\fB-u|-g|-p\fR} .TP -Command sets the filesystem quotas for users, groups or projects respectively. \ -Block limits unit is kilobyte (1024) by default and block limits are always \ -kilobyte-grained (even if specified in bytes), block limits can be specified \ -with a \ -.BR k "," M "," G "," T "," P ", or " E \ -suffixes which specify units of 2^10, 2^20, 2^30, 2^40, 2^50 and 2^60 \ +.BR "lfs setquota " {\fB-u|-g|-p\fR} +Command sets the filesystem quotas for users, groups or projects respectively. +Block limits unit is kilobyte (1024) by default and block limits are always +kilobyte-grained (even if specified in bytes), block limits can be specified +with a +.BR k "," M "," G "," T "," P ", or " E +suffixes which specify units of 2^10, 2^20, 2^30, 2^40, 2^50 and 2^60 accordingly. .TP -.B -u|--user <\fIuname|uid\fR> -Set user quota for \fIuname\fR or \fIuid\fR. -.TP -.B -g|--group <\fIgname|gid\fR> -Set group quota for name \fIgname\fR or \fIgid\fR. -.TP -.B -p|--project <\fIprojid\fR> -Set project quota for \fIprojid\fR. +.BR -b | --block-softlimit \fIBLOCK_SOFTLIMIT +Specify block softlimit, zero means unlimited. .TP -.B --pool <\fIpname\fR> -Set quota per OST pool \fIpname\fR. +.BR -B | --block-hardlimit \fIBLOCK_HARDLIMIT +Specify block hardlimit, zero means unlimited. The block hardlimit should be +greater than block softlimit when it's being specified. .TP -.B -d|--default +.BR -d|--default Set user/group/project to use the default quota limits. .TP -.B -b|--block-softlimit <\fIblock-softlimit\fR> -Specify block softlimit, zero means unlimited. +.BR -g | --group \fIGROUPNAME\fR|\fIGID +Set group quota for name \fIGROUPNAME\fR or \fIGID\fR. .TP -.B -B|--block-hardlimit <\fIblock-hardlimit\fR> -Specify block hardlimit, zero means unlimited. The block hardlimit should be \ -greater than block softlimit when it's being specified. +.BR -h | --help +Print usage message. .TP -.B -i|--inode-softlimit <\fIinode-softlimit\fR> +.BR -i | --inode-softlimit \fIINODE_SOFTLIMIT Specify inode softlimit, zero means unlimited. .TP -.B -I|--inode-hardlimit <\fIinode-hardlimit\fR> -Specify inode hardlimit, zero means unlimited. The inode hardlimit should be \ +.B -I|--inode-hardlimit \fIINODE_HARDLIMIT\fR +Specify inode hardlimit, zero means unlimited. The inode hardlimit should be greater than inode softlimit when it's being specified. +.TP +.B -p|--project \fIPROJID\fR +Set project quota for \fIPROJID\fR. +.TP +.B --pool \fIPOOL_NAME\fR +Set quota per OST pool \fIPOOL_NAME\fR. +.TP +.BR -u | --user \fIUSERNAME\fR|\fBUID +Set user quota for \fIUNAME\fR or \fIUID\fR. .PP -.BR "lfs setquota -t " -.TP -Command sets the filesystem quota grace time for users, groups, or projects. \ -This is a global value that can take two forms: an amount of time or the word \ -\'\fBnotify\fR'. Traditionally, this indicates the amount of time in seconds \ -that the soft quota limit can be exceeded before users are prevented from \ -creating new files or consuming more space. This is intended to allow users \ -to exceed the quota limit for a short time to complete their work without \ -having to grant each user a larger hard quota limit. The alternative value of \ -\'\fBnotify\fR' informs users with an '\fB*\fR' in the quota output that they \ -are nearing their hard quota limit but does not block new writes until the hard \ -quota limit is reached. The soft quota state is reset once the user, group, \ -or project reduces their space usage or file count below the soft quota limit. \ -Grace time is specified in "XXwXXdXXhXXmXXs" format or as an integer seconds \ +.TP +.BR "lfs setquota -t " { -h | -u | -g | -p "} " \fIGRACE_TIME +Command sets the filesystem quota grace time for users, groups, or projects. +The +.I GRACE_TIME +is a global value that can take two forms: an amount of time or the word +.BR notify . +Traditionally, this indicates the amount of time in seconds +that the soft quota limit can be exceeded before users are prevented from +creating new files or consuming more space. This is intended to allow users +to exceed the quota limit for a short time to complete their work without +having to grant each user a larger hard quota limit. The alternative value of +.B notify +informs users with an '\fB*\fR' in the quota output that they +are nearing their hard quota limit but does not block new writes until the hard +quota limit is reached. The soft quota state is reset once the user, group, +or project reduces their space usage or file count below the soft quota limit. +Grace time is specified in "XXwXXdXXhXXmXXs" format or as an integer seconds value. The maximum is 2^48 - 1 seconds. .TP .B -t @@ -92,28 +98,27 @@ Set grace time for group. .B -p Set grace time for project. .TP -.B -b|--block-grace 'notify'|<\fIblock-grace\fR> +.BR -b | "--block-grace notify" | \fIBLOCK_GRACE_TIME\fR Specify grace time for block quota. .TP -.B -i|--inode-grace 'notify'|<\fIinode-grace\fR> +.BR -i | "--inode-grace notify" | \fIINODE_GRACE_TIME\fR Specify grace time for inode quota. .TP -.B --pool <\fIpname\fR> -Set grace time for user, group or project per OST pool \fIpname\fR. -.PP -.BR "lfs setquota " {\fB-U|--default-usr|-G|--default-grp|-P|--default-prj\fR} +.B --pool \fIPOOL_NAME\fR +Set grace time for user, group or project per OST pool \fIPOOL_NAME\fR. .TP -Command sets the filesystem default limits for user,group,project quotas, \ -if set, users/groups/projects without specific quota setting will use \ +.BR "lfs setquota " { -U | --default-usr | -G | --default-grp | -P | --default-prj } +Command sets the filesystem default limits for user, group, project quotas, +if set, users/groups/projects without specific quota setting will use default quota limits automatically. .TP -.B -U|--default-usr +.BR -U | --default-usr Set default user quota limit. .TP -.B -G|--default-grp +.BR -G | --default-grp Set default group quota limit. .TP -.B -P|--default-prj +.BR -P | --default-prj Set default project quota limit. .TP .PP @@ -129,7 +134,7 @@ Set quotas of user `bob' to use default quota setting Set system default user quota: 1 GB block softlimit and 2 GB block hardlimit .TP .B $ lfs setquota -t -u --block-grace 1000 --inode-grace 1w4d /mnt/lustre -Set grace times for user quotas: 1000 seconds for block quotas, 1 week and 4 \ +Set grace times for user quotas: 1000 seconds for block quotas, 1 week and 4 days for inode quotas .TP .B $ lfs setquota -u ivan --pool flash_pool -B 1G /mnt/lustre diff --git a/lustre/doc/lfs_migrate.1 b/lustre/doc/lfs_migrate.1 index c706ceb..35358b1 100644 --- a/lustre/doc/lfs_migrate.1 +++ b/lustre/doc/lfs_migrate.1 @@ -92,7 +92,7 @@ set, a default value of 100 is used, limiting the object size to 1% of available space. .TP .B \\--help|-h -Display help information. +Display usage message. .TP .B \\--no-rsync Do not fall back to using rsync if @@ -134,6 +134,7 @@ specified at the same time as the \fB-R \fRoption. .TP .B \\--verbose|-v Show verbose debug messages. +.TP .B \\--max-free|-X \fI When \fB-A \fRis set, \fImax_free \fRis the maximum amount of free space that can be considered available for the migration of the file on each OST. The @@ -147,27 +148,26 @@ Answer 'y' to usage warning without prompting (for scripts, use with caution). Input file names on stdin are separated by a null character. .SH EXAMPLES To rebalance all files within -.I /testfs/jobs/2011 -(which are known not to be modified by in-use programs): +.IR /testfs/jobs/2011 : .IP lfs_migrate /testfs/jobs/2011 .PP To migrate files within the .I /testfs filesystem on OST0004 (perhaps because it is much more full than other OSTs), -larger than 4GB (because it is more efficient to just migrate large files), -and older than two days (to avoid files that are in use, though this is NOT -a guarantee the files are not being modified, that is workload specific) after -disabling file creation on testfs-OST0004 (this is needed on all MDS nodes): +larger than 4GB (because it is more efficient to migrate a few large files than +many small ones), and older than two days (to avoid files that are in use) to +use auto-restriping for these files, after disabling file creation on +testfs-OST0004 (this is needed on all MDS nodes): .IP .nf mds# lctl set_param osp.testfs-OST0004*.max_create_count=0 -client# lfs find /testfs -obd testfs-OST0004 -size +4G -mtime +2d | lfs_migrate -y +client# lfs find /testfs -obd testfs-OST0004 -size +4G -mtime +2d | lfs_migrate -y -A mds# lctl set_param osp.testfs-OST0004*.max_create_count=20000 .fi .PP -To use automatic striping, and limit the object size per OST to 5% of current -free space: +To use automatic restriping, and limit the object size per OST to 5% of +current free space: .IP lfs_migrate -A -C 20 /testfs/jobs/2011 .SH NOTES diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 9afbbc9..53b62f6 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -190,54 +190,54 @@ static inline int lfs_mirror_delete(int argc, char **argv) /* Setstripe and migrate share mostly the same parameters */ #define SSM_CMD_COMMON(cmd) \ - "usage: "cmd" [--component-end|-E ]\n" \ - " [--stripe-count|-c ]\n" \ - " [--overstripe-count|-C ]\n" \ - " [--stripe-index|-i ]\n" \ - " [--stripe-size|-S ]\n" \ - " [--extension-size|--ext-size|-z]\n" \ - " [--layout|-L ]\n" \ - " [--mirror-count|-N[mirror_count]]\n" \ - " [--ost|-o ]\n" \ - " [--pool|-p ]\n" \ - " [--yaml|-y ]\n" \ - " [--copy=]\n" + "usage: "cmd" [--component-end|-E COMP_END]\n" \ + " [--stripe-count|-c STRIPE_COUNT]\n" \ + " [--overstripe-count|-C STRIPE_COUNT]\n" \ + " [--stripe-index|-i START_OST_IDX]\n" \ + " [--stripe-size|-S STRIPE_SIZE]\n" \ + " [--extension-size|--ext-size|-z]\n" \ + " [--help|-h] [--layout|-L PATTERN]\n" \ + " [--mirror_count|-N[MIRROR_COUNT]]\n" \ + " [--ost|-o OST_INDICES]\n" \ + " [--pool|-p POOL_NAME]\n" \ + " [--yaml|-y YAML_TEMPLATE_FILE]\n" \ + " [--copy=LUSTRE_SRC]\n" #define SSM_HELP_COMMON \ - "\tstripe_count: Number of OSTs to stripe on (0=fs default, -1 all)\n" \ + "\tSTRIPE_COUNT: Number of OSTs to stripe on (0=fs default, -1 all)\n" \ "\t Using -C instead of -c allows overstriping, which\n" \ "\t will place more than one stripe per OST if\n" \ "\t stripe_count is greater than the number of OSTs.\n" \ - "\tstart_ost_idx: OST index of first stripe (-1=default round robin)\n"\ - "\tstripe_size: Number of bytes on each OST (0=fs default)\n" \ + "\tSTART_OST_IDX: OST index of first stripe (-1=default round robin)\n"\ + "\tSTRIPE_SIZE: Number of bytes on each OST (0=fs default)\n" \ "\t Optional K, M, or G suffix (for KB, MB, GB\n" \ "\t respectively). Must be a multiple of 64KiB.\n" \ - "\textension_size:\n" \ + "\tEXTENSION_SIZE:\n" \ "\t Number of bytes the previous component is extended\n" \ "\t each time. Optional K, M, or G suffix (for KB,\n" \ "\t MB, GB respectively)\n" \ - "\tpool_name: Name of OST pool to use (default none)\n" \ - "\tlayout: stripe pattern type: raid0, mdt (default raid0)\n" \ - "\tost_indices: List of OST indices, can be repeated multiple times\n"\ + "\tPOOL_NAME: Name of OST pool to use (default none)\n" \ + "\tLAYOUT: stripe pattern type: raid0, mdt (default raid0)\n" \ + "\tOST_INDICES: List of OST indices, can be repeated multiple times\n"\ "\t Indices be specified in a format of:\n" \ - "\t -o ,-,\n" \ + "\t -o OST_1,OST_I-OST_J,OST_N\n" \ "\t Or:\n" \ - "\t -o -o - -o \n" \ + "\t -o OST_1 -o OST_I-OST_J -o OST_N\n" \ "\t If --pool is set with --ost then the OSTs\n" \ "\t must be the members of the pool.\n" \ - "\tcomp_end: Extent end of component, start after previous end.\n" \ + "\tCOMP_END: Extent end of component, start after previous end.\n" \ "\t Optional K, M, or G suffix (for KiB, MiB, GiB), or\n" \ "\t -1 or 'eof' for max file size). Must be a multiple\n" \ "\t of stripe_size and a multiple of 64KiB.\n" \ - "\tyaml_template_file:\n" \ + "\tYAML_TEMPLATE_FILE:\n" \ "\t YAML layout template file, can't be used with -c,\n" \ "\t -i, -S, -p, -o, or -E arguments.\n" \ - "\tlustre_src: Lustre file/dir whose layout info is used to set\n" \ + "\tLUSTRE_SRC: Lustre file/dir whose layout info is used to set\n" \ "\t another lustre file or directory, can't used with\n" \ "\t -c, -i, -S, -p, -o, or -E arguments.\n" #define MIRROR_CREATE_HELP \ - "\tmirror_count: Number of mirrors to be created with the upcoming\n" \ + "\tMIRROR_COUNT: Number of mirrors to be created with the upcoming\n" \ "\t setstripe layout options\n" \ "\t It defaults to 1 if not specified; if specified,\n" \ "\t it must follow the option without a space.\n" \ @@ -247,12 +247,12 @@ static inline int lfs_mirror_delete(int argc, char **argv) "\t It can be a plain layout or a composite layout.\n" \ "\t If not specified, the stripe options inherited\n" \ "\t from the previous component will be used.\n" \ - "\tflags: set flags to the component of the current mirror.\n" \ + "\tFLAGS: set flags to the component of the current mirror.\n" \ "\t Only \"prefer\" flag is supported so far.\n" #define MIRROR_EXTEND_HELP \ MIRROR_CREATE_HELP \ - "\tvictim_file: The layout of victim_file will be split and used\n" \ + "\tVICTIM_FILE: The layout of victim_file will be split and used\n" \ "\t as a mirror added to the mirrored file.\n" \ "\tno-verify: This option indicates not to verify the mirror(s)\n" \ "\t from victim file(s) in case the victim file(s)\n" \ @@ -261,7 +261,7 @@ static inline int lfs_mirror_delete(int argc, char **argv) #define MIRROR_EXTEND_USAGE \ " {--mirror-count|-N[mirror_count]}\n" \ - " [SETSTRIPE_OPTIONS|-f|--file ]\n" \ + " [SETSTRIPE_OPTIONS|-f|--file VICTIM_FILE]\n" \ " [--no-verify]\n" #define SETSTRIPE_USAGE \ @@ -285,11 +285,11 @@ static inline int lfs_mirror_delete(int argc, char **argv) #define SETDIRSTRIPE_USAGE \ " [--mdt-count|-c stripe_count>\n" \ - " [--mdt-hash|-H mdt_hash]\n" \ + " [--help|-h] [--mdt-hash|-H mdt_hash]\n" \ " [--mdt-index|-i mdt_index[,mdt_index,...]\n" \ " [--default|-D] [--mode|-o mode]\n" \ " [--max-inherit|-X max_inherit]\n" \ - " [--max-inherit-rr max_inherit_rr] \n" \ + " [--max-inherit-rr max_inherit_rr] \n" \ "\tstripe_count: stripe count of the striped directory\n" \ "\tmdt_index: MDT index of first stripe\n" \ "\tmdt_hash: hash type of the striped directory. mdt types:\n" \ @@ -298,11 +298,11 @@ static inline int lfs_mirror_delete(int argc, char **argv) " all_char sum of characters % MDT_COUNT (not recommended)\n" \ "\tdefault_stripe: set default dirstripe of the directory\n" \ "\tmode: the file access permission of the directory (octal)\n" \ - "To create dir with a foreign (free format) layout :\n" \ - "setdirstripe|mkdir --foreign[=] -x|-xattr " \ - "[--mode|-o mode] [--flags ] \n" \ - "\tmode: the mode of the directory\n" \ - "\tforeign_type: none or symlink\n" + "To create dir with a foreign (free format) layout :\n" \ + "setdirstripe|mkdir --foreign[=FOREIGN_TYPE] -x|-xattr STRING " \ + "[--mode|-o MODE] [--flags HEX] \n" \ + "\tmode: the file access permissions of the directory\n" \ + "\tforeign_type: none, daos, symlink, or numeric value\n" /** * command_t mirror_cmdlist - lfs mirror commands. @@ -310,56 +310,52 @@ static inline int lfs_mirror_delete(int argc, char **argv) command_t mirror_cmdlist[] = { { .pc_name = "create", .pc_func = lfs_mirror_create, .pc_help = "Create a mirrored file.\n" - "usage: lfs mirror create " - "<--mirror-count|-N[mirror_count]> " - "[SETSTRIPE_OPTIONS] ... ...\n" + "usage: lfs mirror create {--mirror-count|-N[MIRROR_COUNT]}\n" + "\t\t[SETSTRIPE_OPTIONS] ...\n" MIRROR_CREATE_HELP }, { .pc_name = "delete", .pc_func = lfs_mirror_delete, .pc_help = "Delete a mirror from a file.\n" - "usage: lfs mirror delete {--mirror-id |\n" - "\t --component-id|--comp-id|-I |\n" - "\t -p } ...\n" + "usage: lfs mirror delete {--mirror-id MIRROR_ID|-p POOL|\n" + "\t --component-id|--comp-id|-I COMP_ID} \n" }, { .pc_name = "extend", .pc_func = lfs_mirror_extend, .pc_help = "Extend a mirrored file.\n" - "usage: lfs mirror extend " - "<--mirror-count|-N[mirror_count]> [--no-verify] " - "[SETSTRIPE_OPTIONS|-f ] ... ...\n" + "usage: lfs mirror extend {--mirror-count|-N[MIRROR_COUNT]}\n" + "\t\t[--no-verify] [SETSTRIPE_OPTIONS|-f VICTIM_FILE] ... ...\n" MIRROR_EXTEND_HELP }, { .pc_name = "split", .pc_func = lfs_mirror_split, .pc_help = "Split a mirrored file.\n" - "usage: lfs mirror split <--mirror-id |\n" - "\t --component-id|-I |-p > [--destroy|-d]\n" - "\t [-f ] ...\n" - "\tmirror_id: The numerical unique identifier for a mirror. It\n" - "\t can be fetched by lfs getstripe command.\n" - "\tcomp_id: Unique component ID within a mirror.\n" - "\tpool: Components on specified pool.\n" - "\tnew_file: This option indicates the layout of the split\n" - "\t mirror will be stored into. If not specified,\n" - "\t a new file named .mirror~\n" - "\t will be used.\n" }, + "usage: lfs mirror split [--destroy|-d] [-f NEW_FILE] [--help|-h]\n" + "\t\t{--mirror-id MIRROR_ID|--component-id|-I COMP_ID|-p POOL}\n" + "\t\t ...\n" + "\tMIRROR_ID: The numerical unique identifier for a mirror.\n" + "\t It can be fetched by the 'lfs getstripe' command.\n" + "\tCOMP_ID: Unique component ID within a mirror.\n" + "\tPOOL: Components using specified pool.\n" + "\tNEW_FILE: This option indicates the layout of the split\n" + "\t mirror will be stored into. If not specified,\n" + "\t a new file named .mirror~MIRROR_ID\n" + "\t will be used.\n" }, { .pc_name = "read", .pc_func = lfs_mirror_read, .pc_help = "Read the content of a specified mirror of a file.\n" - "usage: lfs mirror read <--mirror-id|-N " - "[--outfile|-o ] \n" }, + "usage: lfs mirror read {--mirror-id|-N MIRROR_ID}\n" + "\t\t[--outfile|-o ] \n" }, { .pc_name = "write", .pc_func = lfs_mirror_write, .pc_help = "Write to a specified mirror of a file.\n" - "usage: lfs mirror write <--mirror-id|-N " - "[--inputfile|-i ] \n" }, + "usage: lfs mirror write {--mirror-id|-N MIRROR_ID}\n" + "\t\t[--inputfile|-i ] \n" }, { .pc_name = "copy", .pc_func = lfs_mirror_copy, .pc_help = "Copy a specified mirror to other mirror(s) of a file.\n" - "usage: lfs mirror copy <--read-mirror|-i > " - "<--write-mirror|-o > \n" }, + "usage: lfs mirror copy {--read-mirror|-i MIRROR_ID0}\n" + "\t\t{--write-mirror|-o MIRROR_ID1[,...]} \n" }, { .pc_name = "resync", .pc_func = lfs_mirror_resync, .pc_help = "Resynchronizes out-of-sync mirrored file(s).\n" - "usage: lfs mirror resync [--only ] " - " [...]\n"}, + "usage: lfs mirror resync [--only MIRROR_ID[,...]>]\n" + "\t\t [...]\n" }, { .pc_name = "verify", .pc_func = lfs_mirror_verify, .pc_help = "Verify mirrored file(s).\n" - "usage: lfs mirror verify " - "[--only ] " - "[--verbose|-v] [ ...]\n"}, + "usage: lfs mirror verify [--only MIRROR_ID[,...]]\n" + "\t\t[--verbose|-v] [ ...]\n" }, { .pc_name = "list-commands", .pc_func = lfs_mirror_list_commands, .pc_help = "list commands supported by lfs mirror"}, { .pc_name = "help", .pc_func = Parser_help, .pc_help = "help" }, @@ -378,8 +374,7 @@ command_t pcc_cmdlist[] = { "\t-i: archive id for RW-PCC\n" }, { .pc_name = "attach_fid", .pc_func = lfs_pcc_attach_fid, .pc_help = "Attach given files into PCC by FID(s).\n" - "usage: lfs pcc attach_id <--id|-i NUM> <--mnt|-m mnt> " - " ...\n" + "usage: lfs pcc attach_id {--id|-i NUM} {--mnt|-m MOUNTPOINT} FID ...\n" "\t-i: archive id for RW-PCC\n" "\t-m: Lustre mount point\n" }, { .pc_name = "state", .pc_func = lfs_pcc_state, @@ -405,7 +400,7 @@ command_t cmdlist[] = { "To create a file with specified striping/composite layout, or\n" "create/replace the default layout on an existing directory:\n" SSM_CMD_COMMON("setstripe") - " [--mode ]\n" + " [--mode MODE]\n" " \n" " or\n" "To add component(s) to an existing composite file:\n" @@ -415,43 +410,43 @@ command_t cmdlist[] = { "usage: setstripe [--delete|-d] \n" " or\n" "To create a mirrored file or set s default mirror layout on a directory:\n" - "usage: setstripe {--mirror-count|-N}[mirror_count] [SETSTRIPE_OPTIONS] \n" + "usage: setstripe {--mirror-count|-N}[MIRROR_COUNT] [SETSTRIPE_OPTIONS] \n" " or\n" "To delete the last component(s) from an existing composite file\n" "(note that this will also delete any data in those components):\n" - "usage: setstripe --component-del [--component-id|-I ]\n" - " [--component-flags|-F ]\n" + "usage: setstripe --component-del [--component-id|-I COMP_ID]\n" + " [--component-flags|-F COMP_FLAGS]\n" " \n" - "\tcomp_id: Unique component ID to delete\n" - "\tcomp_flags: 'init' indicating all instantiated components\n" + "\tCOMP_ID: Unique component ID to delete\n" + "\tCOMP_FLAGS: 'init' indicating all instantiated components\n" "\t '^init' indicating all uninstantiated components\n" "\t-I and -F cannot be specified at the same time\n" " or\n" "To set or clear flags on a specific component\n" "(note that this command can only be applied to mirrored files:\n" - "usage: setstripe --comp-set {-I comp_id|--comp-flags=comp_flags}\n" + "usage: setstripe --comp-set {-I COMP_ID|--comp-flags=COMP_FLAGS}\n" " \n" " or\n" "To create a file with a foreign (free format) layout:\n" - "usage: setstripe --foreign[=]\n" - " --xattr|-x [--flags ]\n" - " [--mode ] \n"}, + "usage: setstripe --foreign[=FOREIGN_TYPE]\n" + " --xattr|-x LAYOUT_STRING [--flags HEX]\n" + " [--mode MODE] \n"}, {"getstripe", lfs_getstripe, 0, "To list the layout pattern for a given file or files in a\n" "directory or recursively for all files in a directory tree.\n" - "usage: getstripe [--ost|-O ] [--quiet|-q] [--verbose|-v]\n" + "usage: getstripe [--ost|-O UUID] [--quiet|-q] [--verbose|-v]\n" " [--stripe-count|-c] [--stripe-index|-i] [--fid|-F]\n" " [--pool|-p] [--stripe-size|-S] [--directory|-d]\n" " [--mdt-index|-m] [--recursive|-r] [--raw|-R]\n" " [--layout|-L] [--generation|-g] [--yaml|-y]\n" - " [--component-id[=comp_id]|-I[comp_id]]\n" - " [--component-flags[=comp_flags]]\n" + " [--help|-h] [--component-id|-I[=COMP_ID]]\n" + " [--component-flags[=COMP_FLAGS]]\n" " [--component-count]\n" " [--extension-size|--ext-size|-z]\n" - " [--component-start[=[+-]comp_start]]\n" - " [--component-end[=[+-]comp_end]|-E[[+-]comp_end]]\n" - " [[!] --mirror-index=[+-] |\n" - " [!] --mirror-id=[+-]] [--mirror-count|-N]\n" + " [--component-start[=[+-]COMP_START]]\n" + " [--component-end[=[+-]COMP_END]|-E[[+-]comp_end]]\n" + " [[!] --mirror-index=[+-]INDEX |\n" + " [!] --mirror-id=[+-]MIRROR_ID] [--mirror-count|-N]\n" " ..."}, {"setdirstripe", lfs_setdirstripe, 0, "Create striped directory on specified MDT, same as mkdir.\n" @@ -462,7 +457,7 @@ command_t cmdlist[] = { "To list the layout pattern info for a given directory\n" "or recursively for all directories in a directory tree.\n" "usage: getdirstripe [--mdt-count|-c] [--mdt-index|-m|-i]\n" - " [--mdt-hash|-H] [--obd|-O ]\n" + " [--help|-h] [--mdt-hash|-H] [--obd|-O UUID]\n" " [--recursive|-r] [--yaml|-y]\n" " [--verbose|-v] [--default|-D]\n" " [--max-inherit|-X]\n" @@ -490,7 +485,7 @@ command_t cmdlist[] = { "usage: find ...\n" " [[!] --atime|-A [+-]N[smhdwy]] [[!] --ctime|-C [+-]N[smhdwy]]\n" " [[!] --mtime|-M [+-]N[smhdwy]]\n" - " [[!] --btime|--Btime|-B [+-]N[smhdwy]]\n" + " [[!] --btime|--Btime|-B [+-]N[smhdwy]] [--help|-h]\n" " [[!] --newer[XY] ] [[!] --blocks|-b N]\n" " [--maxdepth|-D N] [[!] --mdt-index|--mdt|-m ]\n" " [[!] --name|-n ] [[!] --ost|-O ]\n" @@ -521,7 +516,7 @@ command_t cmdlist[] = { {"check", lfs_check, 0, "Display the status of MGTs, MDTs or OSTs (as specified in the command)\n" "or all the servers (MGTs, MDTs and OSTs).\n" - "usage: check "}, + "usage: check {mgts|osts|mdts|all}"}, {"osts", lfs_osts, 0, "list OSTs connected to client " "[for specified path only]\n" "usage: osts [path]"}, {"mdts", lfs_mdts, 0, "list MDTs connected to client " @@ -536,27 +531,27 @@ command_t cmdlist[] = { "Usage: getname [--help|-h] [--instance|-i] [--fsname|-n] [path ...]"}, #ifdef HAVE_SYS_QUOTA_H {"setquota", lfs_setquota, 0, "Set filesystem quotas.\n" - "usage: setquota <-u|-g|-p> ||||\n" - " -b -B \n" - " -i -I \n" - " setquota <-u|--user|-g|--group|-p|--projid> ||||\n" - " [--block-softlimit ]\n" - " [--block-hardlimit ]\n" - " [--inode-softlimit ]\n" - " [--inode-hardlimit ] \n" - " setquota [-t] <-u|--user|-g|--group|-p|--projid>\n" - " [--block-grace 'notify'|]\n" - " [--inode-grace 'notify'|] \n" - " setquota <-U|-G|-P>\n" - " -b -B \n" - " -i -I \n" - " setquota <-U|--default-usr|-G|--default-grp|-P|--default-prj>\n" - " [--block-softlimit ]\n" - " [--block-hardlimit ]\n" - " [--inode-softlimit ]\n" - " [--inode-hardlimit ] \n" - " setquota <-u|-g|-p> ||||\n" - " <-d|--default>\n" + "usage: setquota {-u|-g|-p} UNAME|UID|GNAME|GID|PROJID\n" + " -b BLOCK_SOFTLIMIT -B BLOCK_HARDLIMIT\n" + " -i INODE_SOFTLIMIT -I INODE_HARDLIMIT \n" + " setquota {-u|--user USER|UID|-g|--group GROUP|GID|-p|--projid PROJID}\n" + " [--block-softlimit BLOCK_SOFTLIMIT]\n" + " [--block-hardlimit BLOCK_HARDLIMIT]\n" + " [--inode-softlimit INODE_SOFTLIMIT]\n" + " [--inode-hardlimit INODE_HARDLIMIT] \n" + " setquota [-t] {-h|--help|-u|--user|-g|--group|-p|--projid}\n" + " [--block-grace 'notify'|BLOCK_GRACE]\n" + " [--inode-grace 'notify'|INODE_GRACE] \n" + " setquota {-U|-G|-P}\n" + " -b BLOCK_SOFTLIMIT -B BLOCK_HARDLIMIT\n" + " -i INODE_SOFTLIMIT -I INODE_HARDLIMIT \n" + " setquota {-U|--default-usr|-G|--default-grp|-P|--default-prj}\n" + " [--block-softlimit BLOCK_SOFTLIMIT]\n" + " [--block-hardlimit BLOCK_HARDLIMIT]\n" + " [--inode-softlimit INODE_SOFTLIMIT]\n" + " [--inode-hardlimit INODE_HARDLIMIT] \n" + " setquota {-u|-g|-p} UNAME|UID|GNAME|GID|PROJID\n" + " {-d|--default}\n" " -b can be used instead of --block-softlimit/--block-grace\n" " -B can be used instead of --block-hardlimit\n" " -i can be used instead of --inode-softlimit/--inode-grace\n" @@ -574,11 +569,10 @@ command_t cmdlist[] = { " be notified after the quota is over soft limit but prevents\n" " the soft limit from becoming the hard limit."}, {"quota", lfs_quota, 0, "Display disk usage and limits.\n" - "usage: quota [-q] [-v] [-h] [-o |-i |-I " - "]\n" - " [<-u|-g|-p> ||||] \n" - " quota [-o |-i |-I ] -t <-u|-g|-p> \n" - " quota [-q] [-v] [h] <-U|-G|-P> "}, + "usage: quota [-q] [-v] [-h] [-o OBD_UUID|-i MDT_IDX|-I OST_IDX]\n" + " [{-u|-g|-p} UNAME|UID|GNAME|GID|PROJID] \n" + " quota [-o OBD_UUID|-i MDT_IDX|-I OST_IDX] -t {-u|-g|-p} \n" + " quota [-q] [-v] [h] {-U|-G|-P} "}, {"project", lfs_project, 0, "Change or list project attribute for specified file or directory.\n" "usage: project [-d|-r] \n" @@ -652,11 +646,10 @@ command_t cmdlist[] = { "usage: swap_layouts "}, {"migrate", lfs_setstripe_migrate, 0, "migrate a directory between MDTs.\n" - "usage: migrate [--mdt-count|-c] \n" - " [--mdt-hash|-H] \n" - " [--mdt-index|-m] \n" - " [--verbose|-v]\n" - " \n" + "usage: migrate [--mdt-count|-c STRIPE_COUNT]\n" + " [--mdt-hash|-H HASH_TYPE]\n" + " [--mdt-index|-m START_MDT_INDEX] [--verbose|-v]\n" + " \n" "\tmdt: MDTs to stripe over, if only one MDT is specified\n" " it's the MDT index of first stripe\n" "\tmdt_count: number of MDTs to stripe a directory over\n" @@ -667,21 +660,17 @@ command_t cmdlist[] = { "\n" "migrate file objects from one OST " "layout\nto another (may be not safe with concurent writes).\n" - "usage: migrate " - "[--stripe-count|-c] \n" - "[--overstripe-count|-C] \n" - " [--stripe-index|-i] \n" - " [--stripe-size|-S] \n" - " [--pool|-p] \n" - " [--ost|-o] \n" - " [--block|-b]\n" - " [--non-block|-n]\n" - " [--non-direct|-D]\n" - " \n" - "\tstripe_count: number of OSTs to stripe a file over\n" - "\t Using -C instead of -c allows overstriping, which\n" - "\t will place more than one stripe per OST if\n" - "\t stripe_count is greater than the number of OSTs\n" + "usage: migrate [--stripe-count|-c STRIPE_COUNT]\n" + " [--overstripe-count|-C STRIPE_COUNT]\n" + " [--stripe-index|-i START_OST_INDEX]\n" + " [--stripe-size|-S STRIPE_SIZE]\n" + " [--pool|-p ] [--ost|-o OST_INDICES]\n" + " [--block|-b] [--non-block|-n] [--non-direct|-D]\n" + " \n" + "\tstripe_count: number of OSTs to stripe a file over\n" + "\t Using -C instead of -c allows overstriping, which\n" + "\t will place more than one stripe per OST if\n" + "\t stripe_count is greater than the number of OSTs\n" "\tstripe_ost_index: index of the first OST to stripe a file over\n" "\tstripe_size: number of bytes to store before moving to the next OST\n" "\tpool_name: name of the predefined pool of OSTs\n" @@ -692,13 +681,13 @@ command_t cmdlist[] = { {"mv", lfs_mv, 0, "To move directories between MDTs. This command is deprecated, " "use \"migrate\" instead.\n" - "usage: mv [--mdt-index|-m] " + "usage: mv [--mdt-index|-m MDT_INDEX] " "[--verbose|-v]\n"}, {"ladvise", lfs_ladvise, 0, "Provide servers with advice about access patterns for a file.\n" "usage: ladvise [--advice|-a ADVICE] [--start|-s START[kMGT]]\n" " [--background|-b] [--unset|-u]\n\n" - " {[--end|-e END[kMGT]] | [--length|-l LENGTH[kMGT]]}\n" + " {--end|-e END[kMGT]|--length|-l LENGTH[kMGT]}\n" " {[--mode|-m [READ,WRITE]}\n" " ...\n"}, {"mirror", lfs_mirror, mirror_cmdlist, @@ -3491,7 +3480,7 @@ static int lfs_setstripe_internal(int argc, char **argv, /* find { .val = 'F', .name = "fid", .has_arg = no_argument }, */ /* find { .val = 'g', .name = "gid", .has_arg = no_argument }, */ /* find { .val = 'G', .name = "group", .has_arg = required_argument }*/ -/* find { .val = 'h', .name = "help", .has_arg = no_argument }, */ + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'H', .name = "mdt-hash", .has_arg = required_argument}, { .val = 'i', .name = "stripe-index", .has_arg = required_argument}, { .val = 'i', .name = "stripe_index", .has_arg = required_argument}, @@ -3543,7 +3532,7 @@ static int lfs_setstripe_internal(int argc, char **argv, snprintf(cmd, sizeof(cmd), "%s %s", progname, argv[0]); progname = cmd; while ((c = getopt_long(argc, argv, - "bc:C:dDE:f:H:i:I:m:N::no:p:L:s:S:vx:y:z:", + "bc:C:dDE:f:hH:i:I:m:N::no:p:L:s:S:vx:y:z:", long_opts, NULL)) >= 0) { size_units = 1; switch (c) { @@ -3866,9 +3855,9 @@ static int lfs_setstripe_internal(int argc, char **argv, lsa.lsa_nr_tgts, optarg, NULL); if (lsa.lsa_nr_tgts < 0) { fprintf(stderr, - "%s %s: invalid MDT target(s) '%s'\n", - progname, argv[0], optarg); - return CMD_HELP; + "%s: invalid MDT target(s) '%s'\n", + progname, optarg); + goto usage_error; } lsa.lsa_tgts = tgts; @@ -4019,8 +4008,9 @@ static int lfs_setstripe_internal(int argc, char **argv, lsa.lsa_extension_comp = true; break; default: - fprintf(stderr, "%s %s: unrecognized option '%s'\n", - progname, argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + case 'h': goto usage_error; } } @@ -4364,7 +4354,7 @@ static int lfs_setstripe_internal(int argc, char **argv, } else if (opc == SO_MIRROR_SPLIT || opc == SO_MIRROR_DELETE) { if (!mirror_id && !comp_id && !lsa.lsa_pool_name) { fprintf(stderr, - "%s: no mirror specified to delete from '%s'\n", + "%s: no mirror id, component id, or pool name specified to delete from '%s'\n", progname, fname); goto usage_error; } @@ -4920,6 +4910,7 @@ static int lfs_find(int argc, char **argv) .name = "foreign", .has_arg = optional_argument}, { .val = 'g', .name = "gid", .has_arg = required_argument }, { .val = 'G', .name = "group", .has_arg = required_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'H', .name = "mdt-hash", .has_arg = required_argument }, { .val = 'i', .name = "stripe-index", .has_arg = required_argument }, { .val = 'i', .name = "stripe_index", .has_arg = required_argument }, @@ -4974,7 +4965,7 @@ static int lfs_find(int argc, char **argv) /* when getopt_long_only() hits '!' it returns 1, puts "!" in optarg */ while ((c = getopt_long_only(argc, argv, - "-0A:b:B:c:C:D:E:g:G:H:i:L:m:M:n:N:O:Ppqrs:S:t:T:u:U:vz:", + "-0A:b:B:c:C:D:E:g:G:hH:i:L:m:M:n:N:O:Ppqrs:S:t:T:u:U:vz:", long_opts, &optidx)) >= 0) { xtime = NULL; xsign = NULL; @@ -5644,11 +5635,11 @@ err_free: param.fp_type = S_IFSOCK; break; default: - fprintf(stderr, "error: %s: bad type '%s'\n", - argv[0], optarg); + fprintf(stderr, "%s: bad type '%s'\n", + progname, optarg); ret = CMD_HELP; goto err; - }; + } break; case LFS_FIND_PERM: param.fp_exclude_perm = !!neg_opt; @@ -5711,9 +5702,12 @@ err_free: param.fp_exclude_ext_size = !!neg_opt; break; default: + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + case 'h': ret = CMD_HELP; goto err; - }; + } } if (pathstart == -1) { @@ -5782,6 +5776,7 @@ static int lfs_getstripe_internal(int argc, char **argv, { .val = 'F', .name = "fid", .has_arg = no_argument }, { .val = 'g', .name = "generation", .has_arg = no_argument }, /* find { .val = 'G', .name = "group", .has_arg = required_argument }*/ + { .val = 'h', .name = "help", .has_arg = no_argument }, /* dirstripe { .val = 'H', .name = "mdt-hash", .has_arg = required_argument }*/ { .val = 'i', .name = "stripe-index", .has_arg = no_argument }, { .val = 'i', .name = "stripe_index", .has_arg = no_argument }, @@ -6105,6 +6100,9 @@ static int lfs_getstripe_internal(int argc, char **argv, } break; default: + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + case 'h': return CMD_HELP; } } @@ -6194,6 +6192,7 @@ static int lfs_getdirstripe(int argc, char **argv) struct option long_opts[] = { { .val = 'c', .name = "mdt-count", .has_arg = no_argument }, { .val = 'D', .name = "default", .has_arg = no_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'H', .name = "mdt-hash", .has_arg = no_argument }, { .val = 'i', .name = "mdt-index", .has_arg = no_argument }, { .val = 'm', .name = "mdt-index", .has_arg = no_argument }, @@ -6211,7 +6210,7 @@ static int lfs_getdirstripe(int argc, char **argv) param.fp_get_lmv = 1; while ((c = getopt_long(argc, argv, - "cDHimO:rtTvXy", long_opts, NULL)) != -1) { + "cDhHimO:rtTvXy", long_opts, NULL)) != -1) { switch (c) { case 'c': case 'T': @@ -6220,23 +6219,24 @@ static int lfs_getdirstripe(int argc, char **argv) case 'D': param.fp_get_default_lmv = 1; break; - case 'i': - case 'm': - param.fp_verbose |= VERBOSE_STRIPE_OFFSET; - break; #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) case 't': fprintf(stderr, "warning: '-t' deprecated, use '--mdt-hash' or '-H' instead\n"); + /* fallthrough */ #endif case 'H': param.fp_verbose |= VERBOSE_HASH_TYPE; break; + case 'i': /* fallthrough */ + case 'm': + param.fp_verbose |= VERBOSE_STRIPE_OFFSET; + break; case 'O': if (param.fp_obd_uuid) { fprintf(stderr, - "error: %s: only one obduuid allowed", - argv[0]); + "%s: only one obduuid allowed", + progname); return CMD_HELP; } param.fp_obd_uuid = (struct obd_uuid *)optarg; @@ -6257,8 +6257,10 @@ static int lfs_getdirstripe(int argc, char **argv) param.fp_yaml = 1; break; default: - fprintf(stderr, "%s %s: unrecognized option '%s'\n", - progname, argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -6650,6 +6652,7 @@ static int lfs_setdirstripe(int argc, char **argv) .name = "flags", .has_arg = required_argument }, { .val = LFS_LAYOUT_FOREIGN_OPT, .name = "foreign", .has_arg = optional_argument}, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'H', .name = "mdt-hash", .has_arg = required_argument }, #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 17, 53, 0) { .val = 'i', .name = "mdt-index", .has_arg = required_argument }, @@ -6677,7 +6680,7 @@ static int lfs_setdirstripe(int argc, char **argv) setstripe_args_init(&lsa); - while ((c = getopt_long(argc, argv, "c:dDi:H:m:o:t:T:x:X:", + while ((c = getopt_long(argc, argv, "c:dDi:hH:m:o:t:T:x:X:", long_opts, NULL)) >= 0) { switch (c) { case 0: @@ -6691,8 +6694,8 @@ static int lfs_setdirstripe(int argc, char **argv) lsa.lsa_stripe_count < -1 || lsa.lsa_stripe_count > LOV_MAX_STRIPE_COUNT) { fprintf(stderr, - "%s %s: invalid stripe count '%s'\n", - progname, argv[0], optarg); + "%s: invalid stripe count '%s'\n", + progname, optarg); return CMD_HELP; } break; @@ -6747,6 +6750,7 @@ static int lfs_setdirstripe(int argc, char **argv) case 't': fprintf(stderr, "warning: '--hash-type' and '-t' deprecated, use '--mdt-hash' or '-H' instead\n"); + /* fallthrough */ #endif case 'H': lsa.lsa_pattern = check_hashtype(optarg); @@ -6847,8 +6851,10 @@ static int lfs_setdirstripe(int argc, char **argv) } break; default: - fprintf(stderr, "%s %s: unrecognized option '%s'\n", - progname, argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -7189,13 +7195,15 @@ static int lfs_df(int argc, char **argv) flags |= MNTDF_VERBOSE; break; default: + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); return CMD_HELP; } } if (optind < argc && !realpath(argv[optind], path)) { rc = -errno; - fprintf(stderr, "error: invalid path '%s': %s\n", - argv[optind], strerror(-rc)); + fprintf(stderr, "%s: invalid path '%s': %s\n", + progname, argv[optind], strerror(-rc)); return rc; } @@ -7265,8 +7273,11 @@ static int lfs_getname(int argc, char **argv) case 'n': opt_fsname = true; break; - case 'h': default: + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -7467,6 +7478,7 @@ int lfs_setquota_times(int argc, char **argv, struct if_quotactl *qctl) struct option long_opts[] = { { .val = 'b', .name = "block-grace", .has_arg = required_argument }, { .val = 'g', .name = "group", .has_arg = no_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'i', .name = "inode-grace", .has_arg = required_argument }, { .val = 'p', .name = "projid", .has_arg = no_argument }, { .val = 't', .name = "times", .has_arg = no_argument }, @@ -7479,7 +7491,7 @@ int lfs_setquota_times(int argc, char **argv, struct if_quotactl *qctl) qctl->qc_cmd = LUSTRE_Q_SETINFO; qctl->qc_type = ALLQUOTA; - while ((c = getopt_long(argc, argv, "b:gi:ptu", + while ((c = getopt_long(argc, argv, "b:ghi:ptu", long_opts, NULL)) != -1) { switch (c) { case 'u': @@ -7493,7 +7505,8 @@ int lfs_setquota_times(int argc, char **argv, struct if_quotactl *qctl) quota_type: if (qctl->qc_type != ALLQUOTA) { fprintf(stderr, - "error: -u/g/p can't be used more than once\n"); + "%s: -u/g/p cannot be used more than once\n", + progname); return CMD_HELP; } qctl->qc_type = qtype; @@ -7506,8 +7519,8 @@ quota_type: dqi->dqi_bgrace = str2sec(optarg); if (dqi->dqi_bgrace >= NOTIFY_GRACE_TIME) { fprintf(stderr, - "error: bad block-grace: %s\n", - optarg); + "%s: bad block-grace: %s\n", + progname, optarg); return CMD_HELP; } } @@ -7521,8 +7534,8 @@ quota_type: dqi->dqi_igrace = str2sec(optarg); if (dqi->dqi_igrace >= NOTIFY_GRACE_TIME) { fprintf(stderr, - "error: bad inode-grace: %s\n", - optarg); + "%s: bad inode-grace: %s\n", + progname, optarg); return CMD_HELP; } } @@ -7538,17 +7551,23 @@ quota_type: break; /* getopt prints error message for us when opterr != 0 */ default: + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } if (qctl->qc_type == ALLQUOTA) { - fprintf(stderr, "error: neither -u, -g nor -p specified\n"); + fprintf(stderr, "%s: neither -u, -g nor -p specified\n", + progname); return CMD_HELP; } if (optind != argc - 1) { - fprintf(stderr, "error: unexpected parameters encountered\n"); + fprintf(stderr, "%s: unexpected parameter '%s'\n", + progname, argv[optind + 1]); return CMD_HELP; } @@ -7584,6 +7603,7 @@ int lfs_setquota(int argc, char **argv) { .val = 'd', .name = "default", .has_arg = no_argument }, { .val = 'g', .name = "group", .has_arg = required_argument }, { .val = 'G', .name = "default-grp", .has_arg = no_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'i', .name = "inode-softlimit", .has_arg = required_argument }, { .val = 'I', .name = "inode-hardlimit", @@ -7619,7 +7639,7 @@ int lfs_setquota(int argc, char **argv) * isn't reinitialized from command line */ - while ((c = getopt_long(argc, argv, "b:B:dg:Gi:I:p:Pu:U", + while ((c = getopt_long(argc, argv, "b:B:dg:Ghi:I:p:Pu:U", long_opts, NULL)) != -1) { switch (c) { case 'U': @@ -7742,6 +7762,8 @@ quota_type_def: fprintf(stderr, "%s setquota: unrecognized option '%s'\n", progname, argv[optind - 1]); + /* fallthrough */ + case 'h': rc = CMD_HELP; goto out; } @@ -9331,20 +9353,20 @@ static int lfs_rmfid(int argc, char **argv) static int lfs_data_version(int argc, char **argv) { - char *path; + int data_version_flags = LL_DV_RD_FLUSH; /* Read by default */ __u64 data_version; + char *path; int fd; int rc; int c; - int data_version_flags = LL_DV_RD_FLUSH; /* Read by default */ if (argc < 2) { - fprintf(stderr, "%s data_version: FILE must be specified\n", + fprintf(stderr, "%s: FILE must be specified\n", progname); return CMD_HELP; } - while ((c = getopt(argc, argv, "nrw")) != -1) { + while ((c = getopt(argc, argv, "hnrw")) != -1) { switch (c) { case 'n': data_version_flags = 0; @@ -9359,6 +9381,8 @@ static int lfs_data_version(int argc, char **argv) fprintf(stderr, "%s data_version: unrecognized option '%s'\n", progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -9453,11 +9477,11 @@ static int lfs_hsm_change_flags(int argc, char **argv, int mode) { .val = 'a', .name = "noarchive", .has_arg = no_argument }, { .val = 'd', .name = "dirty", .has_arg = no_argument }, { .val = 'e', .name = "exists", .has_arg = no_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, + { .val = 'i', .name = "archive-id", .has_arg = required_argument }, { .val = 'l', .name = "lost", .has_arg = no_argument }, { .val = 'r', .name = "norelease", .has_arg = no_argument }, - { .val = 'i', .name = "archive-id", .has_arg = required_argument }, { .name = NULL } }; - char short_opts[] = "lraAdei:"; __u64 mask = 0; int c, rc; char *path; @@ -9467,7 +9491,7 @@ static int lfs_hsm_change_flags(int argc, char **argv, int mode) if (argc < 3) return CMD_HELP; - while ((c = getopt_long(argc, argv, short_opts, + while ((c = getopt_long(argc, argv, "aAdehi:lr", long_opts, NULL)) != -1) { switch (c) { case 'l': @@ -9492,16 +9516,17 @@ static int lfs_hsm_change_flags(int argc, char **argv, int mode) errno = 0; archive_id = strtol(optarg, &end, 10); if (errno != 0 || *end != '\0' || archive_id < 0) { - fprintf(stderr, "invalid archive_id: '%s'\n", - end); + fprintf(stderr, + "%s: invalid archive_id: '%s'\n", + progname, end); return CMD_HELP; } break; - case '?': - return CMD_HELP; default: - fprintf(stderr, "error: %s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -9683,11 +9708,11 @@ static int lfs_hsm_request(int argc, char **argv, int action) struct option long_opts[] = { { .val = 'a', .name = "archive", .has_arg = required_argument }, { .val = 'D', .name = "data", .has_arg = required_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'l', .name = "filelist", .has_arg = required_argument }, { .val = 'm', .name = "mntpath", .has_arg = required_argument }, { .name = NULL } }; dev_t last_dev = 0; - char short_opts[] = "l:D:a:m:"; struct hsm_user_request *hur, *oldhur; int c, i; size_t len; @@ -9707,7 +9732,7 @@ static int lfs_hsm_request(int argc, char **argv, int action) if (argc < 2) return CMD_HELP; - while ((c = getopt_long(argc, argv, short_opts, + while ((c = getopt_long(argc, argv, "a:D:hl:m:", long_opts, NULL)) != -1) { switch (c) { case 'l': @@ -9731,11 +9756,11 @@ static int lfs_hsm_request(int argc, char **argv, int action) some_file = strdup(optarg); } break; - case '?': - return CMD_HELP; default: - fprintf(stderr, "error: %s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -9915,7 +9940,7 @@ int lfs_get_mode(const char *string) for (mode = 0; mode < ARRAY_SIZE(lock_mode_names); mode++) { if (lock_mode_names[mode] == NULL) continue; - if (strcmp(string, lock_mode_names[mode]) == 0) + if (strcasecmp(string, lock_mode_names[mode]) == 0) return mode; } @@ -9943,27 +9968,25 @@ static int lfs_ladvise(int argc, char **argv) { .val = 'a', .name = "advice", .has_arg = required_argument }, { .val = 'b', .name = "background", .has_arg = no_argument }, { .val = 'e', .name = "end", .has_arg = required_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'l', .name = "length", .has_arg = required_argument }, { .val = 'm', .name = "mode", .has_arg = required_argument }, { .val = 's', .name = "start", .has_arg = required_argument }, { .val = 'u', .name = "unset", .has_arg = no_argument }, { .name = NULL } }; - char short_opts[] = "a:be:l:m:s:u"; - int c; - int rc = 0; - const char *path; - int fd; - struct llapi_lu_ladvise advice; - enum lu_ladvise_type advice_type = LU_LADVISE_INVALID; - unsigned long long start = 0; - unsigned long long end = LUSTRE_EOF; - unsigned long long length = 0; - unsigned long long size_units; - unsigned long long flags = 0; - int mode = 0; + struct llapi_lu_ladvise advice; + enum lu_ladvise_type advice_type = LU_LADVISE_INVALID; + unsigned long long start = 0; + unsigned long long end = LUSTRE_EOF; + unsigned long long length = 0; + unsigned long long size_units; + unsigned long long flags = 0; + int c, fd, rc = 0; + const char *path; + int mode = 0; optind = 0; - while ((c = getopt_long(argc, argv, short_opts, + while ((c = getopt_long(argc, argv, "a:be:hl:m:s:u", long_opts, NULL)) != -1) { switch (c) { case 'a': @@ -9971,7 +9994,7 @@ static int lfs_ladvise(int argc, char **argv) if (advice_type == LU_LADVISE_INVALID) { fprintf(stderr, "%s: invalid advice type '%s'\n", - argv[0], optarg); + progname, optarg); fprintf(stderr, "Valid types:"); for (advice_type = 0; @@ -10033,11 +10056,11 @@ static int lfs_ladvise(int argc, char **argv) return CMD_HELP; } break; - case '?': - return CMD_HELP; default: - fprintf(stderr, "%s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -10196,6 +10219,7 @@ static int lfs_heat_set(int argc, char **argv) { struct option long_opts[] = { { .val = 'c', .name = "clear", .has_arg = no_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'o', .name = "off", .has_arg = no_argument }, { .val = 'O', .name = "on", .has_arg = no_argument }, { .name = NULL } }; @@ -10209,7 +10233,7 @@ static int lfs_heat_set(int argc, char **argv) return CMD_HELP; optind = 0; - while ((c = getopt_long(argc, argv, "coO", long_opts, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "choO", long_opts, NULL)) != -1) { switch (c) { case 'c': flags |= LU_HEAT_FLAG_CLEAR; @@ -10221,11 +10245,11 @@ static int lfs_heat_set(int argc, char **argv) case 'O': flags &= ~LU_HEAT_FLAG_OFF; break; - case '?': - return CMD_HELP; default: - fprintf(stderr, "%s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -10637,17 +10661,17 @@ error: static inline int lfs_mirror_resync(int argc, char **argv) { + struct option long_opts[] = { + { .val = 'h', .name = "help", .has_arg = no_argument }, + { .val = 'o', .name = "only", .has_arg = required_argument }, + { .name = NULL } }; struct ll_ioc_lease *ioc = NULL; __u16 mirror_ids[128] = { 0 }; int ids_nr = 0; int c; int rc = 0; - struct option long_opts[] = { - { .val = 'o', .name = "only", .has_arg = required_argument }, - { .name = NULL } }; - - while ((c = getopt_long(argc, argv, "o:", long_opts, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "ho:", long_opts, NULL)) >= 0) { switch (c) { case 'o': rc = parse_mirror_ids(mirror_ids, @@ -10662,9 +10686,11 @@ static inline int lfs_mirror_resync(int argc, char **argv) ids_nr = rc; break; default: - fprintf(stderr, "%s: options '%s' unrecognized.\n", - argv[0], argv[optind - 1]); - rc = -EINVAL; + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': + rc = CMD_HELP; goto error; } } @@ -10777,11 +10803,12 @@ static inline int lfs_mirror_read(int argc, char **argv) const size_t buflen = 4 << 20; off_t pos; struct option long_opts[] = { + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'N', .name = "mirror-id", .has_arg = required_argument }, { .val = 'o', .name = "outfile", .has_arg = required_argument }, { .name = NULL } }; - while ((c = getopt_long(argc, argv, "N:o:", long_opts, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hN:o:", long_opts, NULL)) >= 0) { char *end; switch (c) { @@ -10805,9 +10832,11 @@ static inline int lfs_mirror_read(int argc, char **argv) outfile = optarg; break; default: - fprintf(stderr, "%s: option '%s' unrecognized.\n", + fprintf(stderr, "%s: unrecognized option '%s'\n", progname, argv[optind - 1]); - return -EINVAL; + /* fallthrough */ + case 'h': + return CMD_HELP; } } @@ -10938,13 +10967,13 @@ static inline int lfs_mirror_write(int argc, char **argv) off_t pos; size_t page_size = sysconf(_SC_PAGESIZE); struct ll_ioc_lease_id ioc; - struct option long_opts[] = { - { .val = 'N', .name = "mirror-id", .has_arg = required_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'i', .name = "inputfile", .has_arg = required_argument }, + { .val = 'N', .name = "mirror-id", .has_arg = required_argument }, { .name = NULL } }; - while ((c = getopt_long(argc, argv, "N:i:", long_opts, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hi:N:", long_opts, NULL)) >= 0) { char *end; switch (c) { @@ -10968,9 +10997,11 @@ static inline int lfs_mirror_write(int argc, char **argv) inputfile = optarg; break; default: - fprintf(stderr, "%s: option '%s' unrecognized\n", + fprintf(stderr, "%s: unrecognized option '%s'\n", progname, argv[optind - 1]); - return -EINVAL; + /* fallthrough */ + case 'h': + return CMD_HELP; } } @@ -11169,13 +11200,16 @@ static inline int lfs_mirror_copy(int argc, char **argv) ssize_t copied; struct ll_ioc_lease *ioc = NULL; struct ll_ioc_lease_id *resync_ioc; - struct option long_opts[] = { + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'i', .name = "read-mirror", .has_arg = required_argument }, { .val = 'o', .name = "write-mirror", .has_arg = required_argument }, { .name = NULL } }; + char cmd[PATH_MAX]; - while ((c = getopt_long(argc, argv, "i:o:", long_opts, NULL)) >= 0) { + snprintf(cmd, sizeof(cmd), "%s %s", progname, argv[0]); + progname = cmd; + while ((c = getopt_long(argc, argv, "hi:o:", long_opts, NULL)) >= 0) { char *end; switch (c) { @@ -11187,8 +11221,8 @@ static inline int lfs_mirror_copy(int argc, char **argv) if (errno != 0 || *end != '\0' || id == 0 || id > UINT16_MAX) { fprintf(stderr, - "%s %s: invalid read mirror ID '%s'\n", - progname, argv[0], optarg); + "%s: invalid read mirror ID '%s'\n", + progname, optarg); return rc; } @@ -11209,9 +11243,11 @@ static inline int lfs_mirror_copy(int argc, char **argv) } break; default: - fprintf(stderr, "%s: option '%s' unrecognized\n", + fprintf(stderr, "%s: unrecognized option '%s'\n", progname, argv[optind - 1]); - return -EINVAL; + /* fallthrough */ + case 'h': + return CMD_HELP; } } @@ -11940,13 +11976,14 @@ static inline int lfs_mirror_verify(int argc, char **argv) char cmd[PATH_MAX]; struct option long_opts[] = { + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'o', .name = "only", .has_arg = required_argument }, { .val = 'v', .name = "verbose", .has_arg = no_argument }, { .name = NULL } }; snprintf(cmd, sizeof(cmd), "%s %s", progname, argv[0]); progname = cmd; - while ((c = getopt_long(argc, argv, "o:v", long_opts, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "ho:v", long_opts, NULL)) >= 0) { switch (c) { case 'o': rc = parse_mirror_ids(mirror_ids, @@ -11971,9 +12008,11 @@ static inline int lfs_mirror_verify(int argc, char **argv) verbose++; break; default: - fprintf(stderr, "%s: option '%s' unrecognized.\n", + fprintf(stderr, "%s: unrecognized option '%s'\n", progname, argv[optind - 1]); - rc = -EINVAL; + /* fallthrough */ + case 'h': + rc = CMD_HELP; goto error; } } @@ -12064,20 +12103,22 @@ static int lfs_getsom(int argc, char **argv) enum lfs_som_type type = LFS_SOM_ATTR_ALL; int rc = 0, c; - while ((c = getopt(argc, argv, "sbf")) != -1) { + while ((c = getopt(argc, argv, "bfhs")) != -1) { switch (c) { - case 's': - type = LFS_SOM_SIZE; - break; case 'b': type = LFS_SOM_BLOCKS; break; case 'f': type = LFS_SOM_FLAGS; break; + case 's': + type = LFS_SOM_SIZE; + break; default: - fprintf(stderr, "%s: invalid option '%c'\n", - progname, optopt); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -12150,6 +12191,7 @@ static int lfs_mirror_list_commands(int argc, char **argv) static int lfs_pcc_attach(int argc, char **argv) { struct option long_opts[] = { + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'i', .name = "id", .has_arg = required_argument }, { .name = NULL } }; int c; @@ -12161,7 +12203,7 @@ static int lfs_pcc_attach(int argc, char **argv) enum lu_pcc_type type = LU_PCC_READWRITE; optind = 0; - while ((c = getopt_long(argc, argv, "i:", + while ((c = getopt_long(argc, argv, "hi:", long_opts, NULL)) != -1) { switch (c) { case 'i': @@ -12171,15 +12213,15 @@ static int lfs_pcc_attach(int argc, char **argv) archive_id == 0 || archive_id > UINT32_MAX) { fprintf(stderr, "error: %s: bad archive ID '%s'\n", - argv[0], optarg); + progname, optarg); return CMD_HELP; } break; - case '?': - return CMD_HELP; default: - fprintf(stderr, "%s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -12222,20 +12264,20 @@ static int lfs_pcc_attach(int argc, char **argv) static int lfs_pcc_attach_fid(int argc, char **argv) { struct option long_opts[] = { + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'i', .name = "id", .has_arg = required_argument }, { .val = 'm', .name = "mnt", .has_arg = required_argument }, { .name = NULL } }; - char short_opts[] = "i:m:"; - int c; - int rc = 0; - __u32 archive_id = 0; - char *end; - const char *mntpath = NULL; - const char *fidstr; - enum lu_pcc_type type = LU_PCC_READWRITE; + int c; + int rc = 0; + __u32 archive_id = 0; + char *end; + const char *mntpath = NULL; + const char *fidstr; + enum lu_pcc_type type = LU_PCC_READWRITE; optind = 0; - while ((c = getopt_long(argc, argv, short_opts, + while ((c = getopt_long(argc, argv, "hi:m:", long_opts, NULL)) != -1) { switch (c) { case 'i': @@ -12252,11 +12294,11 @@ static int lfs_pcc_attach_fid(int argc, char **argv) case 'm': mntpath = optarg; break; - case '?': - return CMD_HELP; default: - fprintf(stderr, "%s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -12299,27 +12341,27 @@ static int lfs_pcc_attach_fid(int argc, char **argv) static int lfs_pcc_detach(int argc, char **argv) { struct option long_opts[] = { + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'k', .name = "keep", .has_arg = no_argument }, { .name = NULL } }; - char short_opts[] = "k"; - int c; - int rc = 0; - const char *path; - char fullpath[PATH_MAX]; - __u32 detach_opt = PCC_DETACH_OPT_UNCACHE; + int c; + int rc = 0; + const char *path; + char fullpath[PATH_MAX]; + __u32 detach_opt = PCC_DETACH_OPT_UNCACHE; optind = 0; - while ((c = getopt_long(argc, argv, short_opts, + while ((c = getopt_long(argc, argv, "hk", long_opts, NULL)) != -1) { switch (c) { case 'k': detach_opt = PCC_DETACH_OPT_NONE; break; - case '?': - return CMD_HELP; default: - fprintf(stderr, "%s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -12352,27 +12394,27 @@ static int lfs_pcc_detach(int argc, char **argv) static int lfs_pcc_detach_fid(int argc, char **argv) { struct option long_opts[] = { + { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'k', .name = "keep", .has_arg = no_argument }, { .name = NULL } }; - char short_opts[] = "k"; - int c; - int rc = 0; - const char *fid; - const char *mntpath; - __u32 detach_opt = PCC_DETACH_OPT_UNCACHE; + int c; + int rc = 0; + const char *fid; + const char *mntpath; + __u32 detach_opt = PCC_DETACH_OPT_UNCACHE; optind = 0; - while ((c = getopt_long(argc, argv, short_opts, + while ((c = getopt_long(argc, argv, "hk", long_opts, NULL)) != -1) { switch (c) { case 'k': detach_opt = PCC_DETACH_OPT_NONE; break; - case '?': - return CMD_HELP; default: - fprintf(stderr, "%s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + fprintf(stderr, "%s: unrecognized option '%s'\n", + progname, argv[optind - 1]); + /* fallthrough */ + case 'h': return CMD_HELP; } } @@ -12398,16 +12440,16 @@ static int lfs_pcc_detach_fid(int argc, char **argv) static int lfs_pcc_state(int argc, char **argv) { - int rc = 0; - const char *path; - char fullpath[PATH_MAX]; - struct lu_pcc_state state; + int rc = 0; + const char *path; + char fullpath[PATH_MAX]; + struct lu_pcc_state state; optind = 1; if (argc <= 1) { fprintf(stderr, "%s: must specify one or more file names\n", - argv[0]); + progname); return CMD_HELP; }