X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fmount_utils.c;h=2f6f24c6dd7e0300df9a9947cb8149f1c3b60529;hb=af347df97192108c52af0fb254ace3e7ffaac67d;hp=0ee497432f90b0fbb18acf5a319abfe1d53df836;hpb=c1a4af4abc5e313fe364f8d1f2b58e89679d2b8b;p=fs%2Flustre-release.git diff --git a/lustre/utils/mount_utils.c b/lustre/utils/mount_utils.c index 0ee4974..2f6f24c 100644 --- a/lustre/utils/mount_utils.c +++ b/lustre/utils/mount_utils.c @@ -1,3 +1,43 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + #include #include #include @@ -78,8 +118,8 @@ int get_mountdata(char *dev, struct lustre_disk_data *mo_ldd) return errno; } - snprintf(cmd, cmdsz, "/sbin/debugfs -c -R 'dump /%s %s/mountdata' %s", - MOUNT_DATA_FILE, tmpdir, dev); + snprintf(cmd, cmdsz, "%s -c -R 'dump /%s %s/mountdata' %s", + DEBUGFS, MOUNT_DATA_FILE, tmpdir, dev); ret = run_command(cmd, cmdsz); if (ret) { @@ -91,13 +131,19 @@ int get_mountdata(char *dev, struct lustre_disk_data *mo_ldd) sprintf(filepnm, "%s/mountdata", tmpdir); filep = fopen(filepnm, "r"); if (filep) { + size_t num_read; vprint("Reading %s\n", MOUNT_DATA_FILE); - fread(mo_ldd, sizeof(*mo_ldd), 1, filep); - } else { + num_read = fread(mo_ldd, sizeof(*mo_ldd), 1, filep); + if (num_read < 1 && ferror(filep)) { + fprintf(stderr, "%s: Unable to read from file (%s): %s\n", + progname, filepnm, strerror(errno)); + goto out_close; + } + } else { verrprint("%s: Unable to read %d.%d config %s.\n", progname, LUSTRE_MAJOR, LUSTRE_MINOR, filepnm); goto out_close; - } + } out_close: fclose(filep); @@ -107,11 +153,11 @@ out_rmdir: ret2 = run_command(cmd, cmdsz); if (ret2) { verrprint("Failed to remove temp dir %s (%d)\n", tmpdir, ret2); - /* failure return from run_command() is more important + /* failure return from run_command() is more important * than the failure to remove a dir */ - if (!ret) - ret = ret2; - } + if (!ret) + ret = ret2; + } return ret; } @@ -138,7 +184,7 @@ static int stclient(char *type, char *arch) urn = OSS_URN; snprintf(product, 64, "Lustre %s %d.%d.%d", type, LUSTRE_MAJOR, - LUSTRE_MINOR, LUSTRE_PATCH); + LUSTRE_MINOR, LUSTRE_PATCH); /* need to see if the entry exists first */ snprintf(cmd, 1024, @@ -163,9 +209,9 @@ static int stclient(char *type, char *arch) pclose(fp); snprintf(cmd, 1024, "/opt/sun/servicetag/bin/stclient -a -p '%s' " - "-e %d.%d.%d -t '%s' -S mount -F '%s' -P '%s' -m SUN " - "-A %s -z global", product, LUSTRE_MAJOR, LUSTRE_MINOR, - LUSTRE_PATCH, urn, PARENT_URN, PARENT_PRODUCT, arch); + "-e %d.%d.%d -t '%s' -S mount -F '%s' -P '%s' -m SUN " + "-A %s -z global", product, LUSTRE_MAJOR, LUSTRE_MINOR, + LUSTRE_PATCH, urn, PARENT_URN, PARENT_PRODUCT, arch); return(run_command(cmd, sizeof(cmd))); } @@ -180,50 +226,50 @@ void register_service_tags(char *usource, char *source, char *target) rc = stat(stclient_loc, &stat_buf); - if (rc == 0) { - /* call the service tags stclient to show that we use Lustre on - this system */ - - rc = uname(&utsname_buf); - if (rc) { - if (verbose) - fprintf(stderr, - "%s: trying to get uname failed: %s, " - "inventory tags will not be created\n", - progname, strerror(errno)); - } else { - - /* client or server? */ - if (strchr(usource, ':')) { - stclient("Client", utsname_buf.machine); - } else { - /* first figure what type of device it is */ - rc = get_mountdata(source, &mo_ldd); - if (rc) { - if (verbose) - fprintf(stderr, - "%s: trying to read mountdata from %s " - "failed: %s, inventory tags will not " - "be created\n", - progname, target, strerror(errno)); - } else { - - if (IS_MDT(&mo_ldd)) - stclient("MDS", utsname_buf.machine); - - if (IS_MGS(&mo_ldd)) - stclient("MGS", utsname_buf.machine); - - if (IS_OST(&mo_ldd)) - stclient("OSS", utsname_buf.machine); - } - } - } - } else { + if (rc) { if (errno != ENOENT && verbose) { fprintf(stderr, "%s: trying to stat stclient failed: %s\n", progname, strerror(errno)); } + + return; + } + + /* call service tags stclient to show Lustre is in use on this system */ + rc = uname(&utsname_buf); + if (rc) { + if (verbose) + fprintf(stderr, + "%s: trying to get uname failed: %s, " + "inventory tags will not be created\n", + progname, strerror(errno)); + return; + } + + /* client or server? */ + if (strchr(usource, ':')) { + stclient("Client", utsname_buf.machine); + } else { + /* first figure what type of device it is */ + rc = get_mountdata(source, &mo_ldd); + if (rc) { + if (verbose) + fprintf(stderr, + "%s: trying to read mountdata from %s " + "failed: %s, inventory tags will not " + "be created\n", + progname, target, strerror(errno)); + return; + } + + if (IS_MDT(&mo_ldd)) + stclient("MDS", utsname_buf.machine); + + if (IS_MGS(&mo_ldd)) + stclient("MGS", utsname_buf.machine); + + if (IS_OST(&mo_ldd)) + stclient("OSS", utsname_buf.machine); } }