* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, Whamcloud, Inc.
+ * Copyright (c) 2012, 2013, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#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"
#define STRIPE_CACHE_SIZE "md/stripe_cache_size"
+#define DEFAULT_SCHEDULER "deadline"
+
extern char *progname;
#define L_BLOCK_SIZE 4096
if (num_read < 1 && ferror(filep)) {
fprintf(stderr, "%s: Unable to read from file %s: %s\n",
progname, filepnm, strerror(errno));
- goto out_close;
}
+ fclose(filep);
}
-out_close:
- fclose(filep);
snprintf(cmd, cmdsz, "rm -rf %s", tmpdir);
run_command(cmd, cmdsz);
pclose(fp);
return 1;
}
- i = fread(debugfs_cmd, 1, sizeof(debugfs_cmd), fp);
+ i = fread(debugfs_cmd, 1, sizeof(debugfs_cmd) - 1, fp);
if (i) {
debugfs_cmd[i] = 0;
fprintf(stderr, "%s", debugfs_cmd);
fprintf(stderr, "%s: %s\n", progname, strerror(errno));
return 0;
}
- ret = fread(supp_features, 1, sizeof(supp_features), fp);
+ ret = fread(supp_features, 1, sizeof(supp_features) - 1, fp);
+ supp_features[ret] = '\0';
fclose(fp);
}
if (ret > 0 && strstr(supp_features,
return 0;
}
-int read_file(char *path, char *buf, int size)
+int read_file(const char *path, char *buf, int size)
{
FILE *fd;
return 0;
}
-int write_file(char *path, char *buf)
+int write_file(const char *path, const char *buf)
{
FILE *fd;
return 0;
}
+int set_blockdev_scheduler(const char *path, const char *scheduler)
+{
+ char buf[PATH_MAX], *c;
+ int rc;
+
+ /* Before setting the scheduler, we need to check to see if it's
+ * already set to "noop". If it is, we don't want to override
+ * that setting. If it's set to anything other than "noop", set
+ * the scheduler to what has been passed in. */
+
+ rc = read_file(path, buf, sizeof(buf));
+ if (rc) {
+ if (verbose)
+ fprintf(stderr, "%s: cannot open '%s': %s\n",
+ progname, path, strerror(errno));
+ return rc;
+ }
+
+ /* The expected format of buf: noop anticipatory deadline [cfq] */
+ c = strchr(buf, '[');
+
+ /* If c is NULL, the format is not what we expect. Play it safe
+ * and error out. */
+ if (c == NULL) {
+ if (verbose)
+ fprintf(stderr, "%s: cannot parse scheduler "
+ "options for '%s'\n", progname, path);
+ return -EINVAL;
+ }
+
+ if (strncmp(c+1, "noop", 4) == 0)
+ return 0;
+
+ rc = write_file(path, scheduler);
+ if (rc) {
+ if (verbose)
+ fprintf(stderr, "%s: cannot set scheduler on "
+ "'%s': %s\n", progname, path,
+ strerror(errno));
+ return rc;
+ }
+
+ return rc;
+}
+
/* This is to tune the kernel for good SCSI performance.
* For that we set the value of /sys/block/{dev}/queue/max_sectors_kb
* to the value of /sys/block/{dev}/queue/max_hw_sectors_kb */
}
}
+ /* Purposely ignore errors reported from set_blockdev_scheduler.
+ * The worst that will happen is a block device with an "incorrect"
+ * scheduler. */
+ snprintf(real_path, sizeof(real_path), "%s/%s", path, SCHEDULER_PATH);
+ set_blockdev_scheduler(real_path, DEFAULT_SCHEDULER);
+
if (fan_out) {
char *slave = NULL;
glob_info.gl_pathc = 0;
char label_cmd[PATH_MAX];
int rc;
- snprintf(label_cmd, sizeof(label_cmd), E2LABEL" %s %s",
- mop->mo_source, mop->mo_ldd.ldd_svname);
+ snprintf(label_cmd, sizeof(label_cmd),
+ TUNE2FS" -f -L '%s' '%s' >/dev/null 2>&1",
+ mop->mo_ldd.ldd_svname, mop->mo_source);
rc = run_command(label_cmd, sizeof(label_cmd));
return rc;
char cmd[PATH_MAX];
FILE *fp;
char enabled_features[4096] = "";
+ int ret = 1;
snprintf(cmd, sizeof(cmd), "%s -R features %s 2>&1",
DEBUGFS, devpath);
return 0;
}
- fread(enabled_features, 1, sizeof(enabled_features), fp);
+ ret = fread(enabled_features, 1, sizeof(enabled_features) - 1, fp);
+ enabled_features[ret] = '\0';
fclose(fp);
if (strstr(enabled_features, feature))