#include "emuld.h"
#define CMD_BUF 1024
+#define OPT_SIZE 64
+#define P9_FCALL_SIZE 20
+#define DEFAULT_PAYLOAD_SIZE 8192
+#define MAX_PAYLOAD_SIZE 65536
+#define MKDIR_MODE (S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
+
+unsigned int msize = MAX_PAYLOAD_SIZE;
void add_vconf_map_common(void)
{
int try_mount(char* tag, char* path)
{
int ret = 0;
+ char mount_opt[OPT_SIZE] = {0, };
+
+ snprintf(mount_opt, sizeof(mount_opt), "trans=virtio,version=9p2000.L,msize=%u", msize - P9_FCALL_SIZE);
+
+
+ ret = mount(tag, path, "9p", 0, mount_opt);
- ret = mount(tag, path, "9p", 0,
- "trans=virtio,version=9p2000.L,msize=65536");
if (ret == -1)
+ {
+ if (errno == ENOMEM && msize > DEFAULT_PAYLOAD_SIZE)
+ {
+ LOGWARN("Mount failed with ENOMEM. Payload size (%u)", msize);
+ msize = msize >> 1;
+ LOGWARN("Shrink payload size (%u)", msize);
+ }
return errno;
+ }
+ msize = MAX_PAYLOAD_SIZE;
return ret;
}
if (*p == '/')
{
*p = 0;
- if (mkdir(tmp, 0644) == -1 && errno != EEXIST)
+ if (mkdir(tmp, MKDIR_MODE) == -1 && errno != EEXIST)
return -1;
*p = '/';
}
}
- return mkdir(tmp, 0644);
+ return mkdir(tmp, MKDIR_MODE);
}
bool valid_hds_path(char* path) {