diff --git a/vmblock-only/linux/file.c b/vmblock-only/linux/file.c index d7ac1f6..5499169 100644 --- a/vmblock-only/linux/file.c +++ b/vmblock-only/linux/file.c @@ -38,46 +38,6 @@ typedef u64 inode_num_t; 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 @@ FileOpOpen(struct inode *inode, // IN 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 @@ FileOpReaddir(struct file *file, // IN 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 @@ FileOpRelease(struct inode *inode, // IN struct file_operations RootFileOps = { - .readdir = FileOpReaddir, + .iterate = FileOpReaddir, .open = FileOpOpen, .release = FileOpRelease, };