wire up ->open for directories
PATCH 1/2 wire up ->open for directories
Currently there's no ->open method set for directories on XFS. That means we don't perform any check for opening too large directories without O_LARGEFILE, we don't check for shut down filesystems, and we don't actually do the readahead for the first block in the directory.
Instead of just setting the directories open routine to xfs_file_open we merge the shutdown check directly into xfs_file_open and create a new xfs_dir_open that first calls xfs_file_open and then performs the readahead for block 0.
(First sent on September 29th)
fs/xfs/linux-2.6/xfs_file.c +31 -3
@@ -38,6 +38,7 @@#include "xfs_rw.h" #include "xfs_ioctl32.h" #include "xfs_vnodeops.h" +#include "xfs_da_btree.h" #include <linux/dcache.h> #include <linux/smp_lock.h>
@@ -172,11 +173,37 @@ xfs_file_splice_write_invis( STATIC intxfs_file_open (struct inode *inode, -struct file *filp) +struct file *file) { -if (!(filp->f_flags &O_LARGEFILE ) &&i_size_read (inode) >MAX_NON_LFS ) +if (!(file->f_flags &O_LARGEFILE ) &&i_size_read (inode) >MAX_NON_LFS )return -EFBIG ; -return -xfs_open (XFS_I (inode)); +if (XFS_FORCED_SHUTDOWN (XFS_M (inode->i_sb))) +return -EIO ; +return 0 ; +} + +STATIC int +xfs_dir_open ( +struct inode *inode, +struct file *file) +{ +struct xfs_inode *ip =XFS_I (inode); +int mode; +int error; + + error =xfs_file_open (inode, file); +if (error) +return error; + +/* +* If there are any blocks, read-ahead block 0 as we're almost +* certain to have the next operation be a read there. +*/ + mode =xfs_ilock_map_shared (ip); +if (ip->i_d.di_nextents >0 ) +xfs_da_reada_buf (NULL , ip,0 ,XFS_DATA_FORK ); +xfs_iunlock (ip, mode); +return 0 ; }STATIC int
@@ -533,6 +560,7 @@ const struct file_operations xfs_invis_fconst struct file_operations xfs_dir_file_operations = { + .open = xfs_dir_open, .read = generic_read_dir, .readdir = xfs_file_readdir, .unlocked_ioctl = xfs_file_ioctl,
fs/xfs/xfs_vnodeops.c +0 -22
@@ -54,28 +54,6 @@#include "xfs_vnodeops.h" int -xfs_open ( -xfs_inode_t *ip) -{ -int mode; - -if (XFS_FORCED_SHUTDOWN (ip->i_mount)) -return XFS_ERROR (EIO ); - -/* -* If it's a directory with any blocks, read-ahead block 0 -* as we're almost certain to have the next operation be a read there. -*/ -if (S_ISDIR (ip->i_d.di_mode) && ip->i_d.di_nextents >0 ) { - mode =xfs_ilock_map_shared (ip); -if (ip->i_d.di_nextents >0 ) - (void )xfs_da_reada_buf (NULL , ip,0 ,XFS_DATA_FORK ); -xfs_iunlock (ip, mode); - } -return 0 ; -} - -int xfs_setattr( struct xfs_inode *ip, struct iattr *iattr,
fs/xfs/xfs_vnodeops.h +0 -1
@@ -14,7 +14,6 @@ struct xfs_inode;struct xfs_iomap ; -int xfs_open (struct xfs_inode *ip);int xfs_setattr (struct xfs_inode *ip,struct iattr *vap,int flags,struct cred *credp);#define XFS_ATTR_DMI 0x01/* invocation from a DMI function */
Quoted 10 lines · Christoph Hellwig
Currently there's no ->open method set for directories on XFS. That means we don't perform any check for opening too large directories without
O_LARGEFILE, we don't check for shut down filesystems, and we don't actually do the readahead for the first block in the directory.Instead of just setting the directories open routine to
xfs_file_openwe merge the shutdown check directly intoxfs_file_openand create a newxfs_dir_openthat first callsxfs_file_openand then performs the readahead for block 0.
Quoted 4 lines
(First sent on September 29th)
Signed-off-by Christoph Hellwig <[email protected]>
Reviewed-by; Dave Chinner <[email protected]>
Signature · 2 lines
Dave Chinner [email protected]