-.TH LFS-PROJECT 1 2025-01-24 "Lustre" "Lustre User Utilities"
+.TH LFS-PROJECT 1 2025-04-23 "Lustre" "Lustre User Utilities"
.SH NAME
lfs-project \- Change or list project attribute for specified file or directory.
.SH SYNOPSIS
.SY "lfs project"
-.RB [ -d | -r ]
-.IR FILE | DIRECTORY ...
-.SY "lfs project"
-.RB { -p
-.I ID
-.RB | -s }
-.RB [ -r ]
+.RB [ -p | --proj-inherit | --inherit
+.IR ID ]
+.RB [ -d | --directory ]
+.RB [ -r | --recursive ]
+.RB [ -s | --set-inherit ]
.IR FILE | DIRECTORY ...
.SY "lfs project"
-.B -c
-.RB [ -d | -r
-.RB [ -p
+.BR -c | --check
+.RB [ -0 | --print0 ]]
+.RB [ -d | --directory ]
+.RB [ -p | --proj-inherit | --inherit
.IR ID ]
-.RB [ -0 ]]
+.RB [ -r | --recursive ]
.IR FILE | DIRECTORY ...
.SY "lfs project"
-.B -C
-.RB [ -d | -r ]
-.RB [ -k ]
+.BR -C | --clear
+.RB [ -d | --directory ]
+.RB [ -k | --keep ]
+.RB [ -r | --recursive ]
.IR FILE | DIRECTORY ...
.YS
.SH DESCRIPTION
-.BR "lfs project"
-.RB [ -d | -r ]
-.IR FILE | DIRECTORY ...
+.B lfs project
+lists the project ID and flags on
+.IR FILE "(s) or " DIRECTORIES .
+.SH OPTIONS
+.TP
+.BR -0 ", " --print0
+Print pathnames returned by -c with a trailing NUL, suitable for use by
+.B 'xargs -0 lfs project -p'.
.TP
-List project ID and flags on file(s) or directories.
+.BR -c ", " --check
+Check project ID and inherit flag on specified
+.IR FILE "(s) or " DIRECTORY .
+If
+.BR -p | --proj-inherit | --inherit
+is not given, then use the project ID on the top-level directory,
+otherwise use the specified
+.IR ID .
+If checking a directory and/or recursively, print only files that do not match
+.IR ID .
+.TP
+.BR -C ", " --clear
+Clear inherit attribute and reset project
+.I ID
+to 0 for
+.IR FILE " or " DIRECTORY .
+If the
+.BR -d | --directory
+option is set, then clear only the directory itself.
.TP
-.B -d
+.BR -d ", " --directory
Show the directory's own project ID and flags, override
-.B -r
+.BR -r | --recursive
option.
.TP
-.B -r
-Recursively list all descendants'(of the directory) project attribute.
-.PP
-.BR "lfs project"
-.BR { -p
-.I ID
-.RB | -s }
-.RB [ -r ]
-.IR FILE | DIRECTORY ...
+.BR -k ", " --keep
+Keep the project ID unchanged.
+Can only be specified with
+.BR -C | --clear .
.TP
-Set project ID and/or inherit flag for specified file(s) or directories.
+.BR -p ", " --proj-inherit | --inherit
+Set project ID and inherit flag on the
+.IR FILE "(s) or " DIRECTORIES.
+Set project ID with given value for the specified
+.IR FILE " or " DIRECTORY .
.TP
-.BI -p \ ID
-Set project
-.I ID
-with given value for the specified file or directory
+.B -r ", " --recursive
+Recursively apply lfs project on all descendants of the
+.IR DIRECTORY .
.TP
-.B -s
+.BR -s ", " --set-inherit
Set the
.B PROJID_INHERIT
attribute on directories, so that new files and subdirectories created
therein will inherit the project ID and attribute from the parent.
-.TP
-.B -r
-Set project
-.I ID
-with the directory's project ID for all its descendants (with
-.B -p
-specified). For descendant directories, also set
-inherit flag (if
-.B -s
-specified).
-.PP
-.BR "lfs project"
-.B -c
-.RB [ -d | -r [ -p
-.IR ID ]
-.RB [ -0 ]]
-.IR FILE | DIRECTORY ...
-.PP
-Check project ID and flags on file(s) or directories, print outliers.
-.TP
-.B -c
-Check project ID and inherit flag on specified file(s) or directory. If
-.B -p
-is not given, then use the project ID on the top-level directory,
-otherwise use the ID specified with
-.BR -p .
-if checking a directory and or recursively, print only files that do not match.
-.TP
-.B -0
-Print pathnames returned by -c with a trailing NUL, suitable for use by
-.B 'xargs -0 lfs project -p'.
-.PP
-.BR "lfs project"
-.B -C
-.RB [ -d | -r ]
-.RB [ -k ]
-.IR FILE | DIRECTORY ...
-.PP
-Clear the project inherit flag and ID on the file(s) or directories
-.TP
-.B -C
-Clear inherit attribute and reset project ID to 0 for file or directory.
-.TP
-.B -d
-Clear only the directory itself.
-.TP
-.B -r
-Clear the directory and all its descendants recursively. If neither
-.B -d
-nor
-.B -r
-is specified, clear the directory and its
-immediate children.
-.TP
-.B -k
-Keep the project ID unchanged.
.SH EXAMPLES
set directory quota on
.BR /mnt/lustre/dir1,
" quota -a {-u|-g|-p} [-s START_QID] [-e END_QID] [MOUNT_POINT ...]\n"},
{"project", lfs_project, 0,
"Change or list project attribute for specified file or directory.\n"
- "usage: project [-d|-r] <file|directory...>\n"
+ "usage: project [-d|--directory] [-r|--recursive] FILE|DIRECTORY...\n"
" list project ID and flags on file(s) or directories\n"
- " project [-p id] [-s] [-r] <file|directory...>\n"
+ " project [-p|--proj-inherit|--inherit ID] [-s|--set-inherit]\n"
+ " [-d|--directory] [-r|--recursive] FILE|DIRECTORY...\n"
" set project ID and/or inherit flag for specified file(s) or directories\n"
- " project -c [-d|-r [-p id] [-0]] <file|directory...>\n"
+ " project -c|--check [-p|--proj-inherit|--inherit ID]\n"
+ " [-0|--print0] [-d|--directory] [-r|--recursive]\n"
+ " FILE|DIRECTORY...\n"
" check project ID and flags on file(s) or directories, print outliers\n"
- " project -C [-d|-r] [-k] <file|directory...>\n"
+ " project -C|--clear [-k|--keep] [-d|--directory]\n"
+ " [-r|--recursive] FILE|DIRECTORY...\n"
" clear the project inherit flag and ID on the file or directory\n"
},
#endif
int ret = 0, err = 0, c, i;
struct project_handle_control phc = { 0 };
enum lfs_project_ops_t op;
+ struct option long_opts[] = {
+ { .val = '0', .name = "print0", .has_arg = no_argument },
+ { .val = 'c', .name = "check", .has_arg = no_argument },
+ { .val = 'C', .name = "clear", .has_arg = no_argument },
+ { .val = 'd', .name = "directory", .has_arg = no_argument },
+ { .val = 'k', .name = "keep", .has_arg = no_argument },
+ { .val = 'p', .name = "proj-inherit", .has_arg = required_argument },
+ { .val = 'r', .name = "recursive", .has_arg = no_argument },
+ { .val = 's', .name = "set-inherit", .has_arg = no_argument },
+ { .val = 's', .name = "inherit", .has_arg = no_argument },
+ };
phc.newline = true;
phc.assign_projid = false;
/* default action */
op = LFS_PROJECT_LIST;
- while ((c = getopt(argc, argv, "p:cCsdkr0")) != -1) {
+ while ((c = getopt_long(argc, argv, "0cCdkp:rs",
+ long_opts, NULL)) != -1) {
switch (c) {
+ case '0':
+ phc.newline = false;
+ break;
case 'c':
if (op != LFS_PROJECT_LIST) {
fprintf(stderr,
op = LFS_PROJECT_CLEAR;
break;
- case 's':
- if (op != LFS_PROJECT_LIST) {
- fprintf(stderr,
- "%s: cannot specify '-c' '-C' '-s' together\n",
- progname);
- return CMD_HELP;
- }
-
- phc.set_inherit = true;
- op = LFS_PROJECT_SET;
- break;
case 'd':
phc.dironly = true;
break;
case 'k':
phc.keep_projid = true;
break;
- case 'r':
- phc.recursive = true;
- break;
case 'p':
if (str2quotaid(&phc.projid, optarg)) {
fprintf(stderr,
phc.assign_projid = true;
break;
- case '0':
- phc.newline = false;
+ case 'r':
+ phc.recursive = true;
+ break;
+ case 's':
+ if (op != LFS_PROJECT_LIST) {
+ fprintf(stderr,
+ "%s: cannot specify '-c' '-C' '-s' together\n",
+ progname);
+ return CMD_HELP;
+ }
+
+ phc.set_inherit = true;
+ op = LFS_PROJECT_SET;
break;
default:
fprintf(stderr, "%s: invalid option '%c'\n",