*
* 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.
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* GPL HEADER END
*/
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, 2015, Intel Corporation.
+ * Copyright (c) 2012, 2016, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
-#include "mount_utils.h"
-#include <stdlib.h>
+#include <stdarg.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
#include <unistd.h>
#include <fcntl.h>
-#include <stdarg.h>
#include <mntent.h>
#include <glob.h>
#include <selinux/selinux.h>
#endif
+#include "mount_utils.h"
+
#define MAX_HW_SECTORS_KB_PATH "queue/max_hw_sectors_kb"
#define MAX_SECTORS_KB_PATH "queue/max_sectors_kb"
#define SCHEDULER_PATH "queue/scheduler"
fclose(filep);
goto out_umnt;
}
+ fsync(filep->_fileno);
fclose(filep);
out_umnt:
strscat(buf, key, maxbuflen);
if (val != NULL) {
- strscat(buf, "=", maxbuflen);
+ strscat(buf, "=\"", maxbuflen);
strscat(buf, val, maxbuflen);
+ strscat(buf, "\"", maxbuflen);
}
}
}
{
if (IS_OST(&mop->mo_ldd)) {
append_unique(anchor, user_spec ? "," : " -O ",
- "extents", NULL, sizeof(mop->mo_mkfsopts));
+ "extents", NULL, maxbuflen);
append_unique(anchor, ",", "uninit_bg", NULL, maxbuflen);
} else if (IS_MDT(&mop->mo_ldd)) {
append_unique(anchor, user_spec ? "," : " -O ",
* descriptor blocks, but leave one block for the superblock.
* Only useful for filesystems with < 2^32 blocks due to resize
* limitations. */
- if (IS_OST(&mop->mo_ldd) && mop->mo_device_kb > 100 * 1024 &&
+ if (strstr(mop->mo_mkfsopts, "meta_bg") == NULL &&
+ IS_OST(&mop->mo_ldd) && mop->mo_device_kb > 100 * 1024 &&
mop->mo_device_kb * 1024 / L_BLOCK_SIZE <= 0xffffffffULL) {
unsigned group_blocks = L_BLOCK_SIZE * 8;
unsigned desc_per_block = L_BLOCK_SIZE / 32;
return rc;
}
- snprintf(real_path, sizeof(real_path), "%s/%s", path,
- MAX_HW_SECTORS_KB_PATH);
- rc = read_file(real_path, buf, sizeof(buf));
- if (rc) {
- if (verbose)
- fprintf(stderr, "warning: opening %s: %s\n",
- real_path, strerror(errno));
- /* No MAX_HW_SECTORS_KB_PATH isn't necessary an
- * error for some device. */
- goto subdevs;
+ if (mop->mo_max_sectors_kb >= 0) {
+ snprintf(buf, sizeof(buf), "%d", mop->mo_max_sectors_kb);
+ } else {
+ snprintf(real_path, sizeof(real_path), "%s/%s", path,
+ MAX_HW_SECTORS_KB_PATH);
+ rc = read_file(real_path, buf, sizeof(buf));
+ if (rc) {
+ if (verbose)
+ fprintf(stderr, "warning: opening %s: %s\n",
+ real_path, strerror(errno));
+ /* No MAX_HW_SECTORS_KB_PATH isn't necessary an
+ * error for some device. */
+ goto subdevs;
+ }
}
if (strlen(buf) - 1 > 0) {
* PTLRPC_MAX_BRW_SIZE, but that isn't in a public header.
* Note that even though the block layer allows larger values,
* setting max_sectors_kb = 32768 causes crashes (LU-6974). */
- if (newval > 16 * 1024) {
+ if (mop->mo_max_sectors_kb < 0 && newval > 16 * 1024) {
newval = 16 * 1024;
snprintf(buf, sizeof(buf), "%llu", newval);
}
oldval = strtoull(oldbuf, &end, 0);
/* Don't shrink the current limit. */
- if (oldval != ULLONG_MAX && newval <= oldval)
+ if (mop->mo_max_sectors_kb < 0 && oldval != ULLONG_MAX &&
+ newval <= oldval)
goto subdevs;
rc = write_file(real_path, buf);