On Thu, Apr 02, 2009 at 09:54:02AM +0100, Eric B Munson wrote: > Currently hugeadm will happily remount hugetlbfs to the same directory > if --create-*-mounts is specified more than once with the same arguments. > This is a problem because the newest mount of a directory will mask the > previous one(s) causing confusion when applications attempt tp share > segements. This patch makes all the --create-*-mounts switches check > to see if the requested directory is already mounted and if so skip > the mount request. > > Signed-off-by: Eric B Munson <ebmun...@us.ibm.com> > --- > Changes from V2: > Removed extra check of list pointer from mount_dir > > Changes from V1: > Free list of mounts after mounted check fails > > hugeadm.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++---------- > 1 files changed, 56 insertions(+), 12 deletions(-) > > diff --git a/hugeadm.c b/hugeadm.c > index 22f47a4..87ff62d 100644 > --- a/hugeadm.c > +++ b/hugeadm.c > @@ -181,11 +181,12 @@ void print_mounts(struct mount_list *current, int > longest) > } > } > > -void mounts_list_all(void) > +/* Caller is expected to free the list of mounts */ > +struct mount_list * collect_mounts(int *longest)
Minor - unnecessary whitespace between * and collect_mounts. checkpatch complains about it. No comment giving a hint as to what collect_mounts() actually does. It needs a one-line description because "collect" doesn't really tell me anything until I read the function itself in detail. Because longest is a return parameter, it might even need a longer description. > { > FILE *mounts; > struct mount_list *list, *current, *previous = NULL; > - int length, longest = MIN_COL; > + int length; > > /* First try /proc/mounts, then /etc/mtab */ > mounts = setmntent(PROCMOUNTS, "r"); > @@ -209,8 +210,8 @@ void mounts_list_all(void) > while (getmntent_r(mounts, &(current->entry), current->data, > MAX_SIZE_MNTENT)) { > if (strcasecmp(current->entry.mnt_type, FS_NAME) == 0) { > length = strlen(current->entry.mnt_dir); > - if (length > longest) > - longest = length; > + if (length > *longest) > + *longest = length; > > current->next = malloc(sizeof(struct mount_list)); > if (!current->next) { > @@ -228,16 +229,29 @@ void mounts_list_all(void) > if (previous) { > free(previous->next); > previous->next = NULL; > - print_mounts(list, longest); > - } else { > - /* No hugetlbfs mounts were found */ > - printf("No hugetlbfs mount point found.\n"); > + return list; > } > > - current = list; > - while (current) { > - previous = current; > - current = current->next; > + return NULL; > +} > + Whitespace at end of line there. > +void mounts_list_all(void) > +{ > + struct mount_list *list, *previous; > + int longest = MIN_COL; > + > + list = collect_mounts(&longest); > + > + if (!list) { > + ERROR("No hugetlbfs mount point found.\n"); > + return; > + } > + > + print_mounts(list, longest); > + > + while (list) { > + previous = list; > + list = list->next; > free(previous); > } > } Overall, it feels like the patch up until here deserves to be a separate patch and this split into two. > @@ -315,12 +329,42 @@ int ensure_dir(char *path, mode_t mode, uid_t uid, > gid_t gid) > return 0; > } > > +int check_mount(struct mount_list *list, char *path) > +{ > + while (list) { > + if (!strcmp(list->entry.mnt_dir, path)) > + return 1; > + list = list->next; > + } > + return 0; > +} Either a better function name or a one-line description. check_if_already_mounted() would be a more descriptive name otherwise a reader will think "check mount for what?" > + > int mount_dir(char *path, char *options, mode_t mode, uid_t uid, gid_t gid) > { > struct passwd *pwd; > struct group *grp; > struct mntent entry; > FILE *mounts; > + struct mount_list *list, *previous; > + int dummy = 0; > + > + list = collect_mounts(&dummy); > + > + if (list && check_mount(list, path)) { > + INFO("Directory %s is already mounted\n", path); I think this should be a warning. Otherwise without increasing the verbosity, this will be easily missed. > + while (list) { > + previous = list; > + list = list->next; > + free(previous); > + } > + return 0; > + } > + > + while (list) { > + previous = list; > + list = list->next; > + free(previous); > + } > > if (opt_dry_run) { > pwd = getpwuid(uid); Functionally, the patch seems fine though. -- Mel Gorman Part-time Phd Student Linux Technology Center University of Limerick IBM Dublin Software Lab ------------------------------------------------------------------------------ _______________________________________________ Libhugetlbfs-devel mailing list Libhugetlbfs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel