|
@@ -285,21 +285,41 @@ static int shm_release(struct inode *ino, struct file *file)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-#ifndef CONFIG_MMU
|
|
|
|
|
|
+static int shm_fsync(struct file *file, struct dentry *dentry, int datasync)
|
|
|
|
+{
|
|
|
|
+ int (*fsync) (struct file *, struct dentry *, int datasync);
|
|
|
|
+ struct shm_file_data *sfd = shm_file_data(file);
|
|
|
|
+ int ret = -EINVAL;
|
|
|
|
+
|
|
|
|
+ fsync = sfd->file->f_op->fsync;
|
|
|
|
+ if (fsync)
|
|
|
|
+ ret = fsync(sfd->file, sfd->file->f_path.dentry, datasync);
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
static unsigned long shm_get_unmapped_area(struct file *file,
|
|
static unsigned long shm_get_unmapped_area(struct file *file,
|
|
unsigned long addr, unsigned long len, unsigned long pgoff,
|
|
unsigned long addr, unsigned long len, unsigned long pgoff,
|
|
unsigned long flags)
|
|
unsigned long flags)
|
|
{
|
|
{
|
|
struct shm_file_data *sfd = shm_file_data(file);
|
|
struct shm_file_data *sfd = shm_file_data(file);
|
|
- return sfd->file->f_op->get_unmapped_area(sfd->file, addr, len, pgoff,
|
|
|
|
- flags);
|
|
|
|
|
|
+ return get_unmapped_area(sfd->file, addr, len, pgoff, flags);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int is_file_shm_hugepages(struct file *file)
|
|
|
|
+{
|
|
|
|
+ int ret = 0;
|
|
|
|
+
|
|
|
|
+ if (file->f_op == &shm_file_operations) {
|
|
|
|
+ struct shm_file_data *sfd;
|
|
|
|
+ sfd = shm_file_data(file);
|
|
|
|
+ ret = is_file_hugepages(sfd->file);
|
|
|
|
+ }
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
-#else
|
|
|
|
-#define shm_get_unmapped_area NULL
|
|
|
|
-#endif
|
|
|
|
|
|
|
|
static const struct file_operations shm_file_operations = {
|
|
static const struct file_operations shm_file_operations = {
|
|
.mmap = shm_mmap,
|
|
.mmap = shm_mmap,
|
|
|
|
+ .fsync = shm_fsync,
|
|
.release = shm_release,
|
|
.release = shm_release,
|
|
.get_unmapped_area = shm_get_unmapped_area,
|
|
.get_unmapped_area = shm_get_unmapped_area,
|
|
};
|
|
};
|