--- a/linux/control.c 2013-10-18 19:56:11.000000000 +0200 +++ b/linux/control.c 2014-02-14 16:20:18.667236035 +0100 @@ -208,17 +208,18 @@ VMBlockSetProcEntryOwner(controlProcMountpoint); /* Create /proc/fs/vmblock/dev */ - controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME, + /* controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME, VMBLOCK_CONTROL_MODE, - controlProcDirEntry); - if (!controlProcEntry) { + controlProcDirEntry);*/ + controlProcEntry = proc_create(VMBLOCK_CONTROL_DEVNAME, VMBLOCK_CONTROL_MODE, controlProcDirEntry, &ControlFileOps); + if (controlProcEntry == NULL) { Warning("SetupProcDevice: could not create " VMBLOCK_DEVICE "\n"); remove_proc_entry(VMBLOCK_CONTROL_MOUNTPOINT, controlProcDirEntry); remove_proc_entry(VMBLOCK_CONTROL_PROC_DIRNAME, NULL); return -EINVAL; } - controlProcEntry->proc_fops = &ControlFileOps; + /*controlProcEntry->proc_fops = &ControlFileOps;*/ return 0; } @@ -293,7 +294,7 @@ retval = i < 0 ? -EINVAL : blockOp(name, blocker); - putname(name); + __putname(name); return retval; } --- a/linux/file.c 2013-10-18 19:56:11.000000000 +0200 +++ b/linux/file.c 2014-02-14 16:20:21.455236098 +0100 @@ -38,46 +38,6 @@ typedef ino_t inode_num_t; #endif -/* Specifically for our filldir_t callback */ -typedef struct FilldirInfo { - filldir_t filldir; - void *dirent; -} FilldirInfo; - - -/* - *---------------------------------------------------------------------------- - * - * Filldir -- - * - * Callback function for readdir that we use in place of the one provided. - * This allows us to specify that each dentry is a symlink, but pass through - * everything else to the original filldir function. - * - * Results: - * Original filldir's return value. - * - * Side effects: - * Directory information gets copied to user's buffer. - * - *---------------------------------------------------------------------------- - */ - -static int -Filldir(void *buf, // IN: Dirent buffer passed from FileOpReaddir - const char *name, // IN: Dirent name - int namelen, // IN: len of dirent's name - loff_t offset, // IN: Offset - inode_num_t ino, // IN: Inode number of dirent - unsigned int d_type) // IN: Type of file -{ - FilldirInfo *info = buf; - - /* Specify DT_LNK regardless */ - return info->filldir(info->dirent, name, namelen, offset, ino, DT_LNK); -} - - /* File operations */ /* @@ -166,11 +126,10 @@ static int FileOpReaddir(struct file *file, // IN - void *dirent, // IN - filldir_t filldir) // IN + struct dir_context *ctx) // IN { int ret; - FilldirInfo info; + struct file *actualFile; if (!file) { @@ -184,12 +143,10 @@ return -EINVAL; } - info.filldir = filldir; - info.dirent = dirent; - - actualFile->f_pos = file->f_pos; - ret = vfs_readdir(actualFile, Filldir, &info); - file->f_pos = actualFile->f_pos; + /* Ricky Wong Yung Fei: + * Manipulation of pos is now handled internally by iterate_dir(). + */ + ret = iterate_dir(actualFile, ctx); return ret; } @@ -237,7 +194,7 @@ struct file_operations RootFileOps = { - .readdir = FileOpReaddir, + .iterate = FileOpReaddir, .open = FileOpOpen, .release = FileOpRelease, };