On 9/15/16 10:29 AM, Bill O'Donnell wrote:
> Commits b20b6c2 and 29647c8 modified xfs_quota for use on
> non-XFS filesystems. Modifications to fs_initialise_mounts
> (paths.c) resulted in an xfstest fail (xfs/261), due to foreign
> fs paths being picked up first from the fs table. The xfs_quota
> print command then complained about not being able to print the
> foreign paths, instead of previous behavior (quiet).
>
> This patch restores correct behavior, sorting the table so that
> xfs entries are first, followed by foreign fs entries. The patch
> maintains the order of xfs entries and foreign entries in the
> same order as mtab entries. Then, in functions which print all
> paths we can simply break at the first foreign path if the -f
> switch is not specified.
>
> Signed-off-by: Bill O'Donnell <billodo@xxxxxxxxxx>
worksforme, thanks
Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx>
> ---
> include/path.h | 1 +
> libxcmd/paths.c | 12 +++++++++++-
> quota/path.c | 24 ++++++++++++++++++------
> 3 files changed, 30 insertions(+), 7 deletions(-)
>
> diff --git a/include/path.h b/include/path.h
> index 39c1a95..d077bac 100644
> --- a/include/path.h
> +++ b/include/path.h
> @@ -44,6 +44,7 @@ typedef struct fs_path {
> } fs_path_t;
>
> extern int fs_count; /* number of entries in fs table */
> +extern int xfs_fs_count; /* number of xfs entries in fs table */
> extern fs_path_t *fs_table; /* array of entries in fs table */
> extern fs_path_t *fs_path; /* current entry in the fs table */
> extern char *mtab_file;
> diff --git a/libxcmd/paths.c b/libxcmd/paths.c
> index 4158688..3455217 100644
> --- a/libxcmd/paths.c
> +++ b/libxcmd/paths.c
> @@ -32,6 +32,7 @@
> extern char *progname;
>
> int fs_count;
> +int xfs_fs_count;
> struct fs_path *fs_table;
> struct fs_path *fs_path;
>
> @@ -138,7 +139,16 @@ fs_table_insert(
> goto out_norealloc;
> fs_table = tmp_fs_table;
>
> - fs_path = &fs_table[fs_count];
> + /* Put foreign filesystems at the end, xfs filesystems at the front */
> + if (flags & FS_FOREIGN || fs_count == 0) {
> + fs_path = &fs_table[fs_count];
> + } else {
> + /* move foreign fs entries down, insert new one just before */
> + memmove(&fs_table[xfs_fs_count + 1], &fs_table[xfs_fs_count],
> + sizeof(fs_path_t)*(fs_count - xfs_fs_count));
> + fs_path = &fs_table[xfs_fs_count];
> + xfs_fs_count++;
> + }
> fs_path->fs_dir = dir;
> fs_path->fs_prid = prid;
> fs_path->fs_flags = flags;
> diff --git a/quota/path.c b/quota/path.c
> index a623d25..01ccab4 100644
> --- a/quota/path.c
> +++ b/quota/path.c
> @@ -75,9 +75,15 @@ static int
> pathlist_f(void)
> {
> int i;
> + struct fs_path *path;
>
> - for (i = 0; i < fs_count; i++)
> - printpath(&fs_table[i], i, 1, &fs_table[i] == fs_path);
> + for (i = 0; i < fs_count; i++) {
> + path = &fs_table[i];
> + /* Table is ordered xfs first, then foreign */
> + if (path->fs_flags & FS_FOREIGN && !foreign_allowed)
> + break;
> + printpath(path, i, 1, path == fs_path);
> + }
> return 0;
> }
>
> @@ -87,9 +93,14 @@ print_f(
> char **argv)
> {
> int i;
> + struct fs_path *path;
>
> - for (i = 0; i < fs_count; i++)
> - printpath(&fs_table[i], i, 0, 0);
> + for (i = 0; i < fs_count; i++) {
> + path = &fs_table[i];
> + if (path->fs_flags & FS_FOREIGN && !foreign_allowed)
> + break;
> + printpath(path, i, 0, 0);
> + }
> return 0;
> }
>
> @@ -99,6 +110,7 @@ path_f(
> char **argv)
> {
> int i;
> + int max = foreign_allowed ? fs_count : xfs_fs_count;
>
> if (fs_count == 0) {
> printf(_("No paths are available\n"));
> @@ -109,9 +121,9 @@ path_f(
> return pathlist_f();
>
> i = atoi(argv[1]);
> - if (i < 0 || i >= fs_count) {
> + if (i < 0 || i >= max) {
> printf(_("value %d is out of range (0-%d)\n"),
> - i, fs_count-1);
> + i, max - 1);
> } else {
> fs_path = &fs_table[i];
> pathlist_f();
>
|