#define isprint(a) ((a >= ' ') && (a <= '~'))
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0)
+#define PAL_VFS_GETATTR(path, kstat) vfs_getattr((path)->mnt, (path)->dentry, kstat)
+#else
+#define PAL_VFS_GETATTR(path, kstat) vfs_getattr(path, kstat)
+#endif
+
struct palacios_file {
struct file * filp;
}
memset(tmp_str, 0, strlen(path) + 1);
+ // will terminate tmp_str
strncpy(tmp_str, path, strlen(path));
dirname_ptr = tmp_str;
/* It only exists to provide version compatibility */
struct path tmp_path;
#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,41)
+ struct nameidata nd;
+#endif
struct path * path_ptr = NULL;
struct dentry * dentry;
/* Before Linux 3.1 this was somewhat more difficult */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,41)
{
- struct nameidata nd;
-
// I'm not 100% sure about the version here, but it was around this time that the API changed
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)
ret = kern_path_parent(pathname, &nd);
{
dentry = kern_path_create(AT_FDCWD, pathname, &tmp_path, 1);
- if (IS_ERR(dentry)) {
+ if (!dentry || IS_ERR(dentry)) {
return 0;
}
#endif
- if (!IS_ERR(dentry)) {
+ if (!(!dentry || IS_ERR(dentry))) {
ret = vfs_mkdir(path_ptr->dentry->d_inode, dentry, perms);
}
pfile->mode |= O_LARGEFILE;
- pfile->filp = filp_open(path, pfile->mode, 0);
+ pfile->filp = filp_open(path, pfile->mode, 0600); // rw------- to start
- if (IS_ERR(pfile->filp)) {
+ if (!pfile->filp || IS_ERR(pfile->filp)) {
ERROR("Cannot open file: %s\n", path);
palacios_free(pfile);
return NULL;
}
- pfile->path = palacios_alloc(strlen(path));
+ pfile->path = palacios_alloc(strlen(path) + 1);
if (!pfile->path) {
ERROR("Cannot allocate in file open\n");
palacios_free(pfile);
return NULL;
}
- strncpy(pfile->path, path, strlen(path));
+ strncpy(pfile->path, path, strlen(path)); // will terminate pfile->path
pfile->guest = guest;
palacios_spinlock_init(&(pfile->lock));
struct kstat s;
int ret;
- ret = vfs_getattr(filp->f_path.mnt, filp->f_path.dentry, &s);
+ ret = PAL_VFS_GETATTR(&(filp->f_path), &s);
if (ret != 0) {
ERROR("Failed to fstat file\n");