#include <lustre_ver.h>
#include <glob.h>
#include <ctype.h>
+#include <limits.h>
#define MAX_HW_SECTORS_KB_PATH "queue/max_hw_sectors_kb"
#define MAX_SECTORS_KB_PATH "queue/max_sectors_kb"
{ "nodev", 0, MS_NODEV }, /* don't interpret devices */
{ "sync", 0, MS_SYNCHRONOUS}, /* synchronous I/O */
{ "async", 1, MS_SYNCHRONOUS}, /* asynchronous I/O */
+ { "atime", 1, MS_NOATIME }, /* set file access time on read */
+ { "noatime", 0, MS_NOATIME }, /* do not set file access time on read */
+#ifdef MS_NODIRATIME
+ { "diratime", 1, MS_NODIRATIME }, /* set file access time on read */
+ { "nodiratime",0,MS_NODIRATIME }, /* do not set file access time on read */
+#endif
+#ifdef MS_RELATIME
+ { "relatime", 0, MS_RELATIME }, /* set file access time on read */
+ { "norelatime",1,MS_RELATIME }, /* do not set file access time on read */
+#endif
{ "auto", 0, 0 }, /* Can be mounted using -a */
{ "noauto", 0, 0 }, /* Can only be mounted explicitly */
{ "nousers", 1, 0 }, /* Forbid ordinary user to mount */
{ "nouser", 1, 0 }, /* Forbid ordinary user to mount */
{ "noowner", 1, 0 }, /* Device owner has no special privs */
{ "_netdev", 0, 0 }, /* Device accessible only via network */
+ { "loop", 0, 0 },
{ NULL, 0, 0 }
};
/****************************************************************************/
struct stat stat_buf;
char *chk_major, *chk_minor;
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 major, minor;
if (!source)
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;
- if ((*source != '/') && ((s2 = strpbrk(source, ",:")) != NULL))
+ if ((real_path[0] != '/') && ((s2 = strpbrk(real_path, ",:")) != NULL))
return 0;
- dev = source + src_len - 1;
- while (dev > source && (*dev != '/')) {
+ dev = real_path + src_len - 1;
+ while (dev > real_path && (*dev != '/')) {
if (isdigit(*dev))
*dev = 0;
dev--;
* match any entry under /sys/block/. In that case we need to
* match the major/minor number to find the entry under
* sys/block corresponding to /dev/X */
- dev = source + src_len - 1;
- while (dev > source) {
+ dev = real_path + src_len - 1;
+ while (dev > real_path) {
if (isdigit(*dev))
*dev = 0;
dev--;
if (i == glob_info.gl_pathc) {
if (verbose)
fprintf(stderr,"warning: device %s does not match any "
- "entry under /sys/block\n", source);
- return -EINVAL;
+ "entry under /sys/block\n", real_path);
+ rc = -EINVAL;
+ goto out;
}
snprintf(path, sizeof(path), "%s/%s", glob_info.gl_pathv[i],
if (verbose)
fprintf(stderr, "warning: opening %s: %s\n",
path, strerror(errno));
- return rc;
+ goto out;
}
if (strlen(buf) - 1 > 0) {
fprintf(stderr, "warning: writing to %s: %s\n",
path, strerror(errno));
}
+
+out:
+ globfree(&glob_info);
return rc;
}