GOTO(cleanup, rc);
}
+ /* no data in mount object? */
+ if (rc == 0) {
+ CERROR("mount object %*s/%*s is empty?\n",
+ (int)dentry->d_name.len, dentry->d_name.name,
+ strlen(sbi->ll_gns_oname), sbi->ll_gns_oname);
+ GOTO(cleanup, rc);
+ }
+
datapage[rc] = '\0';
fput(mntinfo_fd);
mntinfo_fd = NULL;
sbi->ll_gns_oname[strlen(sbi->ll_gns_oname)] = '\0';
/* this later may be reset via /proc/fs/... */
- memset(sbi->ll_gns_upcall, 0, sizeof(sbi->ll_gns_upcall));
+ memcpy(sbi->ll_gns_upcall, "/usr/sbin/gns_upcall",
+ strlen("/usr/sbin/gns_upcall"));
+ sbi->ll_gns_upcall[strlen(sbi->ll_gns_upcall)] = '\0';
/* default values, may be changed via /proc/fs/... */
sbi->ll_gns_state = LL_GNS_IDLE;
struct ll_sb_info *sbi = ll_s2sbi(sb);
down(&sbi->ll_gns_sem);
- snprintf(sbi->ll_gns_upcall, count, "%s", buffer);
- up(&sbi->ll_gns_sem);
+
+ /*
+ * upcall should not be the same as object name, check for possible
+ * overflow.
+ */
+ if (count < sizeof(sbi->ll_gns_upcall) &&
+ (strlen(sbi->ll_gns_oname) != count ||
+ strncmp(sbi->ll_gns_oname, buffer, count)))
+ snprintf(sbi->ll_gns_upcall, count, "%s", buffer);
+ up(&sbi->ll_gns_sem);
return count;
}
}
down(&sbi->ll_gns_sem);
- snprintf(sbi->ll_gns_oname, count, "%s", buffer);
+
+ /*
+ * upcall should not be the same as object name, check for possible
+ * overflow.
+ */
+ if (count < sizeof(sbi->ll_gns_oname) &&
+ (strlen(sbi->ll_gns_upcall) != count ||
+ strncmp(sbi->ll_gns_upcall, buffer, count)))
+ snprintf(sbi->ll_gns_oname, count, "%s", buffer);
+
up(&sbi->ll_gns_sem);
-
return count;
}
return rc;
down(&sbi->ll_gns_sem);
- sbi->ll_gns_timeout = val;
+ if (val > sbi->ll_gns_tick)
+ sbi->ll_gns_timeout = val;
up(&sbi->ll_gns_sem);
return count;
return rc;
down(&sbi->ll_gns_sem);
- if (sbi->ll_gns_tick < sbi->ll_gns_timeout)
+ if (val < sbi->ll_gns_timeout)
sbi->ll_gns_tick = val;
up(&sbi->ll_gns_sem);
return count;
}
+
static struct lprocfs_vars lprocfs_obd_vars[] = {
{ "uuid", ll_rd_sb_uuid, 0, 0 },
//{ "mntpt_path", ll_rd_path, 0, 0 },