X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fxfs%2Flinux-2.6%2Fxfs_iops.c;h=a9a289b254b4434ff4e8df08475212a3ab21ef6e;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=1e7ec5df3e482ce1d0a613b79303f48c20f06b5a;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 1e7ec5df3..a9a289b25 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c @@ -23,6 +23,7 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" +#include "xfs_dir.h" #include "xfs_dir2.h" #include "xfs_alloc.h" #include "xfs_dmapi.h" @@ -31,6 +32,7 @@ #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" +#include "xfs_dir_sf.h" #include "xfs_dir2_sf.h" #include "xfs_attr_sf.h" #include "xfs_dinode.h" @@ -60,7 +62,7 @@ */ xfs_inode_t * xfs_vtoi( - bhv_vnode_t *vp) + struct vnode *vp) { bhv_desc_t *bdp; @@ -79,7 +81,7 @@ void xfs_synchronize_atime( xfs_inode_t *ip) { - bhv_vnode_t *vp; + vnode_t *vp; vp = XFS_ITOV_NULL(ip); if (vp) { @@ -199,10 +201,14 @@ xfs_ichgtime_fast( STATIC void xfs_validate_fields( struct inode *ip, - bhv_vattr_t *vattr) + struct vattr *vattr) { + vnode_t *vp = vn_from_inode(ip); + int error; + vattr->va_mask = XFS_AT_NLINK|XFS_AT_SIZE|XFS_AT_NBLOCKS; - if (!bhv_vop_getattr(vn_from_inode(ip), vattr, ATTR_LAZY, NULL)) { + VOP_GETATTR(vp, vattr, ATTR_LAZY, NULL, error); + if (likely(!error)) { ip->i_nlink = vattr->va_nlink; ip->i_blocks = vattr->va_nblocks; @@ -220,7 +226,7 @@ xfs_validate_fields( */ STATIC int xfs_init_security( - bhv_vnode_t *vp, + struct vnode *vp, struct inode *dir) { struct inode *ip = vn_to_inode(vp); @@ -236,7 +242,7 @@ xfs_init_security( return -error; } - error = bhv_vop_attr_set(vp, name, value, length, ATTR_SECURE, NULL); + VOP_ATTR_SET(vp, name, value, length, ATTR_SECURE, NULL, error); if (!error) VMODIFY(vp); @@ -259,12 +265,13 @@ xfs_has_fs_struct(struct task_struct *task) STATIC inline void xfs_cleanup_inode( - bhv_vnode_t *dvp, - bhv_vnode_t *vp, + vnode_t *dvp, + vnode_t *vp, struct dentry *dentry, int mode) { struct dentry teardown = {}; + int error; /* Oh, the horror. * If we can't add the ACL or we fail in @@ -275,9 +282,9 @@ xfs_cleanup_inode( teardown.d_name = dentry->d_name; if (S_ISDIR(mode)) - bhv_vop_rmdir(dvp, &teardown, NULL); + VOP_RMDIR(dvp, &teardown, NULL, error); else - bhv_vop_remove(dvp, &teardown, NULL); + VOP_REMOVE(dvp, &teardown, NULL, error); VN_RELE(vp); } @@ -289,8 +296,8 @@ xfs_vn_mknod( dev_t rdev) { struct inode *ip; - bhv_vattr_t vattr = { 0 }; - bhv_vnode_t *vp = NULL, *dvp = vn_from_inode(dir); + vattr_t vattr = { 0 }; + vnode_t *vp = NULL, *dvp = vn_from_inode(dir); xfs_acl_t *default_acl = NULL; attrexists_t test_default_acl = _ACL_DEFAULT_EXISTS; int error; @@ -324,10 +331,10 @@ xfs_vn_mknod( vattr.va_mask |= XFS_AT_RDEV; /*FALLTHROUGH*/ case S_IFREG: - error = bhv_vop_create(dvp, dentry, &vattr, &vp, NULL); + VOP_CREATE(dvp, dentry, &vattr, &vp, NULL, error); break; case S_IFDIR: - error = bhv_vop_mkdir(dvp, dentry, &vattr, &vp, NULL); + VOP_MKDIR(dvp, dentry, &vattr, &vp, NULL, error); break; default: error = EINVAL; @@ -390,14 +397,14 @@ xfs_vn_lookup( struct dentry *dentry, struct nameidata *nd) { - bhv_vnode_t *vp = vn_from_inode(dir), *cvp; + struct vnode *vp = vn_from_inode(dir), *cvp; int error; if (dentry->d_name.len >= MAXNAMELEN) return ERR_PTR(-ENAMETOOLONG); - error = bhv_vop_lookup(vp, dentry, &cvp, 0, NULL, NULL); - if (unlikely(error)) { + VOP_LOOKUP(vp, dentry, &cvp, 0, NULL, NULL, error); + if (error) { if (unlikely(error != ENOENT)) return ERR_PTR(-error); d_add(dentry, NULL); @@ -415,21 +422,22 @@ xfs_vn_link( struct dentry *dentry) { struct inode *ip; /* inode of guy being linked to */ - bhv_vnode_t *tdvp; /* target directory for new name/link */ - bhv_vnode_t *vp; /* vp of name being linked */ - bhv_vattr_t vattr; + vnode_t *tdvp; /* target directory for new name/link */ + vnode_t *vp; /* vp of name being linked */ + vattr_t vattr; int error; ip = old_dentry->d_inode; /* inode being linked to */ + if (S_ISDIR(ip->i_mode)) + return -EPERM; + tdvp = vn_from_inode(dir); vp = vn_from_inode(ip); - VN_HOLD(vp); - error = bhv_vop_link(tdvp, vp, dentry, NULL); - if (unlikely(error)) { - VN_RELE(vp); - } else { + VOP_LINK(tdvp, vp, dentry, NULL, error); + if (likely(!error)) { VMODIFY(tdvp); + VN_HOLD(vp); xfs_validate_fields(ip, &vattr); d_instantiate(dentry, ip); } @@ -442,14 +450,14 @@ xfs_vn_unlink( struct dentry *dentry) { struct inode *inode; - bhv_vnode_t *dvp; /* directory containing name to remove */ - bhv_vattr_t vattr; + vnode_t *dvp; /* directory containing name to remove */ + vattr_t vattr; int error; inode = dentry->d_inode; dvp = vn_from_inode(dir); - error = bhv_vop_remove(dvp, dentry, NULL); + VOP_REMOVE(dvp, dentry, NULL, error); if (likely(!error)) { xfs_validate_fields(dir, &vattr); /* size needs update */ xfs_validate_fields(inode, &vattr); @@ -464,26 +472,27 @@ xfs_vn_symlink( const char *symname) { struct inode *ip; - bhv_vattr_t va = { 0 }; - bhv_vnode_t *dvp; /* directory containing name of symlink */ - bhv_vnode_t *cvp; /* used to lookup symlink to put in dentry */ + vattr_t vattr = { 0 }; + vnode_t *dvp; /* directory containing name of symlink */ + vnode_t *cvp; /* used to lookup symlink to put in dentry */ int error; dvp = vn_from_inode(dir); cvp = NULL; - va.va_mode = S_IFLNK | + vattr.va_mode = S_IFLNK | (irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO); - va.va_mask = XFS_AT_TYPE|XFS_AT_MODE; + vattr.va_mask = XFS_AT_TYPE|XFS_AT_MODE; - error = bhv_vop_symlink(dvp, dentry, &va, (char *)symname, &cvp, NULL); + error = 0; + VOP_SYMLINK(dvp, dentry, &vattr, (char *)symname, &cvp, NULL, error); if (likely(!error && cvp)) { error = xfs_init_security(cvp, dir); if (likely(!error)) { ip = vn_to_inode(cvp); d_instantiate(dentry, ip); - xfs_validate_fields(dir, &va); - xfs_validate_fields(ip, &va); + xfs_validate_fields(dir, &vattr); + xfs_validate_fields(ip, &vattr); } else { xfs_cleanup_inode(dvp, cvp, dentry, 0); } @@ -497,11 +506,11 @@ xfs_vn_rmdir( struct dentry *dentry) { struct inode *inode = dentry->d_inode; - bhv_vnode_t *dvp = vn_from_inode(dir); - bhv_vattr_t vattr; + vnode_t *dvp = vn_from_inode(dir); + vattr_t vattr; int error; - error = bhv_vop_rmdir(dvp, dentry, NULL); + VOP_RMDIR(dvp, dentry, NULL, error); if (likely(!error)) { xfs_validate_fields(inode, &vattr); xfs_validate_fields(dir, &vattr); @@ -517,15 +526,15 @@ xfs_vn_rename( struct dentry *ndentry) { struct inode *new_inode = ndentry->d_inode; - bhv_vnode_t *fvp; /* from directory */ - bhv_vnode_t *tvp; /* target directory */ - bhv_vattr_t vattr; + vnode_t *fvp; /* from directory */ + vnode_t *tvp; /* target directory */ + vattr_t vattr; int error; fvp = vn_from_inode(odir); tvp = vn_from_inode(ndir); - error = bhv_vop_rename(fvp, odentry, tvp, ndentry, NULL); + VOP_RENAME(fvp, odentry, tvp, ndentry, NULL, error); if (likely(!error)) { if (new_inode) xfs_validate_fields(new_inode, &vattr); @@ -546,7 +555,7 @@ xfs_vn_follow_link( struct dentry *dentry, struct nameidata *nd) { - bhv_vnode_t *vp; + vnode_t *vp; uio_t *uio; iovec_t iov; int error; @@ -579,8 +588,8 @@ xfs_vn_follow_link( uio->uio_resid = MAXPATHLEN; uio->uio_iovcnt = 1; - error = bhv_vop_readlink(vp, uio, 0, NULL); - if (unlikely(error)) { + VOP_READLINK(vp, uio, 0, NULL, error); + if (error) { kfree(link); link = ERR_PTR(-error); } else { @@ -611,7 +620,12 @@ xfs_vn_permission( int mode, struct nameidata *nd) { - return -bhv_vop_access(vn_from_inode(inode), mode << 6, NULL); + vnode_t *vp = vn_from_inode(inode); + int error; + + mode <<= 6; /* convert from linux to vnode access bits */ + VOP_ACCESS(vp, mode, NULL, error); + return -error; } #else #define xfs_vn_permission NULL @@ -624,29 +638,14 @@ xfs_vn_getattr( struct kstat *stat) { struct inode *inode = dentry->d_inode; - bhv_vnode_t *vp = vn_from_inode(inode); - bhv_vattr_t vattr = { .va_mask = XFS_AT_STAT }; - int error; + vnode_t *vp = vn_from_inode(inode); + int error = 0; - error = bhv_vop_getattr(vp, &vattr, ATTR_LAZY, NULL); - if (likely(!error)) { - stat->size = i_size_read(inode); - stat->dev = inode->i_sb->s_dev; - stat->rdev = (vattr.va_rdev == 0) ? 0 : - MKDEV(sysv_major(vattr.va_rdev) & 0x1ff, - sysv_minor(vattr.va_rdev)); - stat->mode = vattr.va_mode; - stat->nlink = vattr.va_nlink; - stat->uid = vattr.va_uid; - stat->gid = vattr.va_gid; - stat->ino = vattr.va_nodeid; - stat->atime = vattr.va_atime; - stat->mtime = vattr.va_mtime; - stat->ctime = vattr.va_ctime; - stat->blocks = vattr.va_nblocks; - stat->blksize = vattr.va_blocksize; - } - return -error; + if (unlikely(vp->v_flag & VMODIFIED)) + error = vn_revalidate(vp); + if (!error) + generic_fillattr(inode, stat); + return 0; } STATIC int @@ -656,8 +655,8 @@ xfs_vn_setattr( { struct inode *inode = dentry->d_inode; unsigned int ia_valid = attr->ia_valid; - bhv_vnode_t *vp = vn_from_inode(inode); - bhv_vattr_t vattr = { 0 }; + vnode_t *vp = vn_from_inode(inode); + vattr_t vattr = { 0 }; int flags = 0; int error; @@ -708,7 +707,7 @@ xfs_vn_setattr( flags |= ATTR_NONBLOCK; #endif - error = bhv_vop_setattr(vp, &vattr, flags, NULL); + VOP_SETATTR(vp, &vattr, flags, NULL, error); if (likely(!error)) __vn_revalidate(vp, &vattr); return -error; @@ -725,16 +724,15 @@ STATIC int xfs_vn_sync_flags(struct inode *inode) { unsigned int oldflags, newflags; + vattr_t vattr; int flags = 0; int error; - bhv_vattr_t vattr; - bhv_vnode_t *vp = vn_from_inode(inode); + vnode_t *vp = vn_from_inode(inode); - memset(&vattr, 0, sizeof vattr); + memset(&vattr, 0, sizeof(vattr_t)); vattr.va_mask = XFS_AT_XFLAGS; - error = bhv_vop_getattr(vp, &vattr, 0, NULL); - + VOP_GETATTR(vp, &vattr, 0, NULL, error); if (error) return error; oldflags = vattr.va_xflags; @@ -751,7 +749,7 @@ xfs_vn_sync_flags(struct inode *inode) if (oldflags ^ newflags) { vattr.va_xflags = newflags; vattr.va_mask |= XFS_AT_XFLAGS; - error = bhv_vop_setattr(vp, &vattr, flags, NULL); + VOP_SETATTR(vp, &vattr, flags, NULL, error); } vn_revalidate(vp); return error; @@ -765,7 +763,7 @@ xfs_vn_setxattr( size_t size, int flags) { - bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); + vnode_t *vp = vn_from_inode(dentry->d_inode); char *attr = (char *)name; attrnames_t *namesp; int xflags = 0; @@ -795,7 +793,7 @@ xfs_vn_getxattr( void *data, size_t size) { - bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); + vnode_t *vp = vn_from_inode(dentry->d_inode); char *attr = (char *)name; attrnames_t *namesp; int xflags = 0; @@ -824,7 +822,7 @@ xfs_vn_listxattr( char *data, size_t size) { - bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); + vnode_t *vp = vn_from_inode(dentry->d_inode); int error, xflags = ATTR_KERNAMELS; ssize_t result; @@ -843,7 +841,7 @@ xfs_vn_removexattr( struct dentry *dentry, const char *name) { - bhv_vnode_t *vp = vn_from_inode(dentry->d_inode); + vnode_t *vp = vn_from_inode(dentry->d_inode); char *attr = (char *)name; attrnames_t *namesp; int xflags = 0;