Skip to content
Snippets Groups Projects
Commit 0d8969da authored by komaln's avatar komaln
Browse files

b=11230

r=Nathan, Adilger

Patch to handle symlinks while setting tunables.
parent 4fcb2c2a
No related branches found
No related tags found
No related merge requests found
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <lustre_ver.h> #include <lustre_ver.h>
#include <glob.h> #include <glob.h>
#include <ctype.h> #include <ctype.h>
#include <limits.h>
#define MAX_HW_SECTORS_KB_PATH "queue/max_hw_sectors_kb" #define MAX_HW_SECTORS_KB_PATH "queue/max_hw_sectors_kb"
#define MAX_SECTORS_KB_PATH "queue/max_sectors_kb" #define MAX_SECTORS_KB_PATH "queue/max_sectors_kb"
...@@ -282,21 +283,33 @@ int set_tunables(char *source, int src_len) ...@@ -282,21 +283,33 @@ int set_tunables(char *source, int src_len)
struct stat stat_buf; struct stat stat_buf;
char *chk_major, *chk_minor; char *chk_major, *chk_minor;
char *savept, *dev, *s2 = 0; char *savept, *dev, *s2 = 0;
char buf[PATH_MAX], path[PATH_MAX]; char *ret_path;
char buf[PATH_MAX] = {'\0'}, path[PATH_MAX] = {'\0'};
char real_path[PATH_MAX] = {'\0'};
int i, rc = 0; int i, rc = 0;
int major, minor; int major, minor;
if (!source) if (!source)
return -EINVAL; return -EINVAL;
if (strncmp(source, "/dev/loop", 9) == 0) ret_path = realpath(source, real_path);
if (ret_path == NULL) {
if (verbose)
fprintf(stderr, "warning: %s: cannot resolve: %s",
source, strerror(errno));
return -EINVAL;
}
src_len = sizeof(real_path);
if (strncmp(real_path, "/dev/loop", 9) == 0)
return 0; return 0;
if ((*source != '/') && ((s2 = strpbrk(source, ",:")) != NULL)) if ((real_path[0] != '/') && ((s2 = strpbrk(real_path, ",:")) != NULL))
return 0; return 0;
dev = source + src_len - 1; dev = real_path + src_len - 1;
while (dev > source && (*dev != '/')) { while (dev > real_path && (*dev != '/')) {
if (isdigit(*dev)) if (isdigit(*dev))
*dev = 0; *dev = 0;
dev--; dev--;
...@@ -321,8 +334,8 @@ int set_tunables(char *source, int src_len) ...@@ -321,8 +334,8 @@ int set_tunables(char *source, int src_len)
* match any entry under /sys/block/. In that case we need to * match any entry under /sys/block/. In that case we need to
* match the major/minor number to find the entry under * match the major/minor number to find the entry under
* sys/block corresponding to /dev/X */ * sys/block corresponding to /dev/X */
dev = source + src_len - 1; dev = real_path + src_len - 1;
while (dev > source) { while (dev > real_path) {
if (isdigit(*dev)) if (isdigit(*dev))
*dev = 0; *dev = 0;
dev--; dev--;
...@@ -365,7 +378,7 @@ int set_tunables(char *source, int src_len) ...@@ -365,7 +378,7 @@ int set_tunables(char *source, int src_len)
if (i == glob_info.gl_pathc) { if (i == glob_info.gl_pathc) {
if (verbose) if (verbose)
fprintf(stderr,"warning: device %s does not match any " fprintf(stderr,"warning: device %s does not match any "
"entry under /sys/block\n", source); "entry under /sys/block\n", real_path);
return -EINVAL; return -EINVAL;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment