diff options
| author | Christoph Hellwig <hch@infradead.org> | 2007-08-28 02:12:30 -0400 |
|---|---|---|
| committer | Tim Shimmin <tes@chook.melbourne.sgi.com> | 2007-10-15 02:54:29 -0400 |
| commit | 993386c19afa53fa54d00c7721e56ba820b3400d (patch) | |
| tree | 1715fdeb9cc5ea99466e179b54e84b168fd5e127 | |
| parent | b93bd20cd59eb7ec172f95d08b100fea688d8bcf (diff) | |
[XFS] decontaminate vnode operations from behavior details
All vnode ops now take struct xfs_inode pointers and the behaviour related
glue is split out into methods of it's own. This required fixing
xfs_create/mkdir/symlink to not mess with the inode pointer but rather use
a separate boolean for error handling. Thanks to Dave Chinner for that
fix.
SGI-PV: 969608
SGI-Modid: xfs-linux-melb:xfs-kern:29492a
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Tim Shimmin <tes@sgi.com>
| -rw-r--r-- | fs/xfs/Makefile-linux-2.6 | 1 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_fs_subr.c | 48 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_fs_subr.h | 4 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 48 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.h | 2 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 64 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.h | 14 | ||||
| -rw-r--r-- | fs/xfs/xfs_attr.c | 40 | ||||
| -rw-r--r-- | fs/xfs/xfs_attr.h | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_bmap.c | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_bmap.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2.c | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_rename.c | 18 | ||||
| -rw-r--r-- | fs/xfs/xfs_rw.h | 8 | ||||
| -rw-r--r-- | fs/xfs/xfs_utils.c | 9 | ||||
| -rw-r--r-- | fs/xfs/xfs_utils.h | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 427 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.h | 86 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops_bhv.c | 438 |
20 files changed, 765 insertions, 466 deletions
diff --git a/fs/xfs/Makefile-linux-2.6 b/fs/xfs/Makefile-linux-2.6 index 6d48a5ed38f3..8ed1f0475778 100644 --- a/fs/xfs/Makefile-linux-2.6 +++ b/fs/xfs/Makefile-linux-2.6 | |||
| @@ -89,6 +89,7 @@ xfs-y += xfs_alloc.o \ | |||
| 89 | xfs_utils.o \ | 89 | xfs_utils.o \ |
| 90 | xfs_vfsops.o \ | 90 | xfs_vfsops.o \ |
| 91 | xfs_vnodeops.o \ | 91 | xfs_vnodeops.o \ |
| 92 | xfs_vnodeops_bhv.o \ | ||
| 92 | xfs_rw.o \ | 93 | xfs_rw.o \ |
| 93 | xfs_dmops.o \ | 94 | xfs_dmops.o \ |
| 94 | xfs_qmops.o | 95 | xfs_qmops.o |
diff --git a/fs/xfs/linux-2.6/xfs_fs_subr.c b/fs/xfs/linux-2.6/xfs_fs_subr.c index 2eb87cd082af..e2897912fec7 100644 --- a/fs/xfs/linux-2.6/xfs_fs_subr.c +++ b/fs/xfs/linux-2.6/xfs_fs_subr.c | |||
| @@ -16,66 +16,80 @@ | |||
| 16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 17 | */ | 17 | */ |
| 18 | #include "xfs.h" | 18 | #include "xfs.h" |
| 19 | #include "xfs_vnodeops.h" | ||
| 20 | |||
| 21 | /* | ||
| 22 | * The following six includes are needed so that we can include | ||
| 23 | * xfs_inode.h. What a mess.. | ||
| 24 | */ | ||
| 25 | #include "xfs_bmap_btree.h" | ||
| 26 | #include "xfs_inum.h" | ||
| 27 | #include "xfs_dir2.h" | ||
| 28 | #include "xfs_dir2_sf.h" | ||
| 29 | #include "xfs_attr_sf.h" | ||
| 30 | #include "xfs_dinode.h" | ||
| 31 | |||
| 32 | #include "xfs_inode.h" | ||
| 19 | 33 | ||
| 20 | int fs_noerr(void) { return 0; } | 34 | int fs_noerr(void) { return 0; } |
| 21 | int fs_nosys(void) { return ENOSYS; } | 35 | int fs_nosys(void) { return ENOSYS; } |
| 22 | void fs_noval(void) { return; } | 36 | void fs_noval(void) { return; } |
| 23 | 37 | ||
| 24 | void | 38 | void |
| 25 | fs_tosspages( | 39 | xfs_tosspages( |
| 26 | bhv_desc_t *bdp, | 40 | xfs_inode_t *ip, |
| 27 | xfs_off_t first, | 41 | xfs_off_t first, |
| 28 | xfs_off_t last, | 42 | xfs_off_t last, |
| 29 | int fiopt) | 43 | int fiopt) |
| 30 | { | 44 | { |
| 31 | bhv_vnode_t *vp = BHV_TO_VNODE(bdp); | 45 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 32 | struct inode *ip = vn_to_inode(vp); | 46 | struct inode *inode = vn_to_inode(vp); |
| 33 | 47 | ||
| 34 | if (VN_CACHED(vp)) | 48 | if (VN_CACHED(vp)) |
| 35 | truncate_inode_pages(ip->i_mapping, first); | 49 | truncate_inode_pages(inode->i_mapping, first); |
| 36 | } | 50 | } |
| 37 | 51 | ||
| 38 | int | 52 | int |
| 39 | fs_flushinval_pages( | 53 | xfs_flushinval_pages( |
| 40 | bhv_desc_t *bdp, | 54 | xfs_inode_t *ip, |
| 41 | xfs_off_t first, | 55 | xfs_off_t first, |
| 42 | xfs_off_t last, | 56 | xfs_off_t last, |
| 43 | int fiopt) | 57 | int fiopt) |
| 44 | { | 58 | { |
| 45 | bhv_vnode_t *vp = BHV_TO_VNODE(bdp); | 59 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 46 | struct inode *ip = vn_to_inode(vp); | 60 | struct inode *inode = vn_to_inode(vp); |
| 47 | int ret = 0; | 61 | int ret = 0; |
| 48 | 62 | ||
| 49 | if (VN_CACHED(vp)) { | 63 | if (VN_CACHED(vp)) { |
| 50 | if (VN_TRUNC(vp)) | 64 | if (VN_TRUNC(vp)) |
| 51 | VUNTRUNCATE(vp); | 65 | VUNTRUNCATE(vp); |
| 52 | ret = filemap_write_and_wait(ip->i_mapping); | 66 | ret = filemap_write_and_wait(inode->i_mapping); |
| 53 | if (!ret) | 67 | if (!ret) |
| 54 | truncate_inode_pages(ip->i_mapping, first); | 68 | truncate_inode_pages(inode->i_mapping, first); |
| 55 | } | 69 | } |
| 56 | return ret; | 70 | return ret; |
| 57 | } | 71 | } |
| 58 | 72 | ||
| 59 | int | 73 | int |
| 60 | fs_flush_pages( | 74 | xfs_flush_pages( |
| 61 | bhv_desc_t *bdp, | 75 | xfs_inode_t *ip, |
| 62 | xfs_off_t first, | 76 | xfs_off_t first, |
| 63 | xfs_off_t last, | 77 | xfs_off_t last, |
| 64 | uint64_t flags, | 78 | uint64_t flags, |
| 65 | int fiopt) | 79 | int fiopt) |
| 66 | { | 80 | { |
| 67 | bhv_vnode_t *vp = BHV_TO_VNODE(bdp); | 81 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 68 | struct inode *ip = vn_to_inode(vp); | 82 | struct inode *inode = vn_to_inode(vp); |
| 69 | int ret = 0; | 83 | int ret = 0; |
| 70 | int ret2; | 84 | int ret2; |
| 71 | 85 | ||
| 72 | if (VN_DIRTY(vp)) { | 86 | if (VN_DIRTY(vp)) { |
| 73 | if (VN_TRUNC(vp)) | 87 | if (VN_TRUNC(vp)) |
| 74 | VUNTRUNCATE(vp); | 88 | VUNTRUNCATE(vp); |
| 75 | ret = filemap_fdatawrite(ip->i_mapping); | 89 | ret = filemap_fdatawrite(inode->i_mapping); |
| 76 | if (flags & XFS_B_ASYNC) | 90 | if (flags & XFS_B_ASYNC) |
| 77 | return ret; | 91 | return ret; |
| 78 | ret2 = filemap_fdatawait(ip->i_mapping); | 92 | ret2 = filemap_fdatawait(inode->i_mapping); |
| 79 | if (!ret) | 93 | if (!ret) |
| 80 | ret = ret2; | 94 | ret = ret2; |
| 81 | } | 95 | } |
diff --git a/fs/xfs/linux-2.6/xfs_fs_subr.h b/fs/xfs/linux-2.6/xfs_fs_subr.h index c1b53118a303..82bb19b2599e 100644 --- a/fs/xfs/linux-2.6/xfs_fs_subr.h +++ b/fs/xfs/linux-2.6/xfs_fs_subr.h | |||
| @@ -18,12 +18,8 @@ | |||
| 18 | #ifndef __XFS_FS_SUBR_H__ | 18 | #ifndef __XFS_FS_SUBR_H__ |
| 19 | #define __XFS_FS_SUBR_H__ | 19 | #define __XFS_FS_SUBR_H__ |
| 20 | 20 | ||
| 21 | struct cred; | ||
| 22 | extern int fs_noerr(void); | 21 | extern int fs_noerr(void); |
| 23 | extern int fs_nosys(void); | 22 | extern int fs_nosys(void); |
| 24 | extern void fs_noval(void); | 23 | extern void fs_noval(void); |
| 25 | extern void fs_tosspages(bhv_desc_t *, xfs_off_t, xfs_off_t, int); | ||
| 26 | extern int fs_flushinval_pages(bhv_desc_t *, xfs_off_t, xfs_off_t, int); | ||
| 27 | extern int fs_flush_pages(bhv_desc_t *, xfs_off_t, xfs_off_t, uint64_t, int); | ||
| 28 | 24 | ||
| 29 | #endif /* __XFS_FS_SUBR_H__ */ | 25 | #endif /* __XFS_FS_SUBR_H__ */ |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 47cfde6cfae2..f36902fa714d 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include "xfs_utils.h" | 47 | #include "xfs_utils.h" |
| 48 | #include "xfs_dfrag.h" | 48 | #include "xfs_dfrag.h" |
| 49 | #include "xfs_fsops.h" | 49 | #include "xfs_fsops.h" |
| 50 | #include "xfs_vnodeops.h" | ||
| 50 | 51 | ||
| 51 | #include <linux/capability.h> | 52 | #include <linux/capability.h> |
| 52 | #include <linux/dcache.h> | 53 | #include <linux/dcache.h> |
| @@ -436,7 +437,6 @@ xfs_fssetdm_by_handle( | |||
| 436 | struct fsdmidata fsd; | 437 | struct fsdmidata fsd; |
| 437 | xfs_fsop_setdm_handlereq_t dmhreq; | 438 | xfs_fsop_setdm_handlereq_t dmhreq; |
| 438 | struct inode *inode; | 439 | struct inode *inode; |
| 439 | bhv_desc_t *bdp; | ||
| 440 | bhv_vnode_t *vp; | 440 | bhv_vnode_t *vp; |
| 441 | 441 | ||
| 442 | if (!capable(CAP_MKNOD)) | 442 | if (!capable(CAP_MKNOD)) |
| @@ -458,8 +458,8 @@ xfs_fssetdm_by_handle( | |||
| 458 | return -XFS_ERROR(EFAULT); | 458 | return -XFS_ERROR(EFAULT); |
| 459 | } | 459 | } |
| 460 | 460 | ||
| 461 | bdp = bhv_base_unlocked(VN_BHV_HEAD(vp)); | 461 | error = xfs_set_dmattrs(xfs_vtoi(vp), |
| 462 | error = xfs_set_dmattrs(bdp, fsd.fsd_dmevmask, fsd.fsd_dmstate, NULL); | 462 | fsd.fsd_dmevmask, fsd.fsd_dmstate); |
| 463 | 463 | ||
| 464 | VN_RELE(vp); | 464 | VN_RELE(vp); |
| 465 | if (error) | 465 | if (error) |
| @@ -676,7 +676,7 @@ xfs_attrmulti_by_handle( | |||
| 676 | 676 | ||
| 677 | STATIC int | 677 | STATIC int |
| 678 | xfs_ioc_space( | 678 | xfs_ioc_space( |
| 679 | bhv_desc_t *bdp, | 679 | struct xfs_inode *ip, |
| 680 | struct inode *inode, | 680 | struct inode *inode, |
| 681 | struct file *filp, | 681 | struct file *filp, |
| 682 | int flags, | 682 | int flags, |
| @@ -709,37 +709,31 @@ xfs_ioc_xattr( | |||
| 709 | 709 | ||
| 710 | STATIC int | 710 | STATIC int |
| 711 | xfs_ioc_getbmap( | 711 | xfs_ioc_getbmap( |
| 712 | bhv_desc_t *bdp, | 712 | struct xfs_inode *ip, |
| 713 | int flags, | 713 | int flags, |
| 714 | unsigned int cmd, | 714 | unsigned int cmd, |
| 715 | void __user *arg); | 715 | void __user *arg); |
| 716 | 716 | ||
| 717 | STATIC int | 717 | STATIC int |
| 718 | xfs_ioc_getbmapx( | 718 | xfs_ioc_getbmapx( |
| 719 | bhv_desc_t *bdp, | 719 | struct xfs_inode *ip, |
| 720 | void __user *arg); | 720 | void __user *arg); |
| 721 | 721 | ||
| 722 | int | 722 | int |
| 723 | xfs_ioctl( | 723 | xfs_ioctl( |
| 724 | bhv_desc_t *bdp, | 724 | xfs_inode_t *ip, |
| 725 | struct inode *inode, | ||
| 726 | struct file *filp, | 725 | struct file *filp, |
| 727 | int ioflags, | 726 | int ioflags, |
| 728 | unsigned int cmd, | 727 | unsigned int cmd, |
| 729 | void __user *arg) | 728 | void __user *arg) |
| 730 | { | 729 | { |
| 730 | struct inode *inode = filp->f_path.dentry->d_inode; | ||
| 731 | bhv_vnode_t *vp = vn_from_inode(inode); | ||
| 732 | xfs_mount_t *mp = ip->i_mount; | ||
| 731 | int error; | 733 | int error; |
| 732 | bhv_vnode_t *vp; | ||
| 733 | xfs_inode_t *ip; | ||
| 734 | xfs_mount_t *mp; | ||
| 735 | |||
| 736 | vp = vn_from_inode(inode); | ||
| 737 | 734 | ||
| 738 | vn_trace_entry(vp, "xfs_ioctl", (inst_t *)__return_address); | 735 | vn_trace_entry(vp, "xfs_ioctl", (inst_t *)__return_address); |
| 739 | 736 | ||
| 740 | ip = XFS_BHVTOI(bdp); | ||
| 741 | mp = ip->i_mount; | ||
| 742 | |||
| 743 | switch (cmd) { | 737 | switch (cmd) { |
| 744 | 738 | ||
| 745 | case XFS_IOC_ALLOCSP: | 739 | case XFS_IOC_ALLOCSP: |
| @@ -758,7 +752,7 @@ xfs_ioctl( | |||
| 758 | !capable(CAP_SYS_ADMIN)) | 752 | !capable(CAP_SYS_ADMIN)) |
| 759 | return -EPERM; | 753 | return -EPERM; |
| 760 | 754 | ||
| 761 | return xfs_ioc_space(bdp, inode, filp, ioflags, cmd, arg); | 755 | return xfs_ioc_space(ip, inode, filp, ioflags, cmd, arg); |
| 762 | 756 | ||
| 763 | case XFS_IOC_DIOINFO: { | 757 | case XFS_IOC_DIOINFO: { |
| 764 | struct dioattr da; | 758 | struct dioattr da; |
| @@ -801,17 +795,17 @@ xfs_ioctl( | |||
| 801 | if (copy_from_user(&dmi, arg, sizeof(dmi))) | 795 | if (copy_from_user(&dmi, arg, sizeof(dmi))) |
| 802 | return -XFS_ERROR(EFAULT); | 796 | return -XFS_ERROR(EFAULT); |
| 803 | 797 | ||
| 804 | error = xfs_set_dmattrs(bdp, dmi.fsd_dmevmask, dmi.fsd_dmstate, | 798 | error = xfs_set_dmattrs(ip, dmi.fsd_dmevmask, |
| 805 | NULL); | 799 | dmi.fsd_dmstate); |
| 806 | return -error; | 800 | return -error; |
| 807 | } | 801 | } |
| 808 | 802 | ||
| 809 | case XFS_IOC_GETBMAP: | 803 | case XFS_IOC_GETBMAP: |
| 810 | case XFS_IOC_GETBMAPA: | 804 | case XFS_IOC_GETBMAPA: |
| 811 | return xfs_ioc_getbmap(bdp, ioflags, cmd, arg); | 805 | return xfs_ioc_getbmap(ip, ioflags, cmd, arg); |
| 812 | 806 | ||
| 813 | case XFS_IOC_GETBMAPX: | 807 | case XFS_IOC_GETBMAPX: |
| 814 | return xfs_ioc_getbmapx(bdp, arg); | 808 | return xfs_ioc_getbmapx(ip, arg); |
| 815 | 809 | ||
| 816 | case XFS_IOC_FD_TO_HANDLE: | 810 | case XFS_IOC_FD_TO_HANDLE: |
| 817 | case XFS_IOC_PATH_TO_HANDLE: | 811 | case XFS_IOC_PATH_TO_HANDLE: |
| @@ -981,7 +975,7 @@ xfs_ioctl( | |||
| 981 | 975 | ||
| 982 | STATIC int | 976 | STATIC int |
| 983 | xfs_ioc_space( | 977 | xfs_ioc_space( |
| 984 | bhv_desc_t *bdp, | 978 | struct xfs_inode *ip, |
| 985 | struct inode *inode, | 979 | struct inode *inode, |
| 986 | struct file *filp, | 980 | struct file *filp, |
| 987 | int ioflags, | 981 | int ioflags, |
| @@ -1009,7 +1003,7 @@ xfs_ioc_space( | |||
| 1009 | if (ioflags & IO_INVIS) | 1003 | if (ioflags & IO_INVIS) |
| 1010 | attr_flags |= ATTR_DMI; | 1004 | attr_flags |= ATTR_DMI; |
| 1011 | 1005 | ||
| 1012 | error = xfs_change_file_space(bdp, cmd, &bf, filp->f_pos, | 1006 | error = xfs_change_file_space(ip, cmd, &bf, filp->f_pos, |
| 1013 | NULL, attr_flags); | 1007 | NULL, attr_flags); |
| 1014 | return -error; | 1008 | return -error; |
| 1015 | } | 1009 | } |
| @@ -1295,7 +1289,7 @@ xfs_ioc_xattr( | |||
| 1295 | 1289 | ||
| 1296 | STATIC int | 1290 | STATIC int |
| 1297 | xfs_ioc_getbmap( | 1291 | xfs_ioc_getbmap( |
| 1298 | bhv_desc_t *bdp, | 1292 | struct xfs_inode *ip, |
| 1299 | int ioflags, | 1293 | int ioflags, |
| 1300 | unsigned int cmd, | 1294 | unsigned int cmd, |
| 1301 | void __user *arg) | 1295 | void __user *arg) |
| @@ -1314,7 +1308,7 @@ xfs_ioc_getbmap( | |||
| 1314 | if (ioflags & IO_INVIS) | 1308 | if (ioflags & IO_INVIS) |
| 1315 | iflags |= BMV_IF_NO_DMAPI_READ; | 1309 | iflags |= BMV_IF_NO_DMAPI_READ; |
| 1316 | 1310 | ||
| 1317 | error = xfs_getbmap(bdp, &bm, (struct getbmap __user *)arg+1, iflags); | 1311 | error = xfs_getbmap(ip, &bm, (struct getbmap __user *)arg+1, iflags); |
| 1318 | if (error) | 1312 | if (error) |
| 1319 | return -error; | 1313 | return -error; |
| 1320 | 1314 | ||
| @@ -1325,7 +1319,7 @@ xfs_ioc_getbmap( | |||
| 1325 | 1319 | ||
| 1326 | STATIC int | 1320 | STATIC int |
| 1327 | xfs_ioc_getbmapx( | 1321 | xfs_ioc_getbmapx( |
| 1328 | bhv_desc_t *bdp, | 1322 | struct xfs_inode *ip, |
| 1329 | void __user *arg) | 1323 | void __user *arg) |
| 1330 | { | 1324 | { |
| 1331 | struct getbmapx bmx; | 1325 | struct getbmapx bmx; |
| @@ -1352,7 +1346,7 @@ xfs_ioc_getbmapx( | |||
| 1352 | 1346 | ||
| 1353 | iflags |= BMV_IF_EXTENDED; | 1347 | iflags |= BMV_IF_EXTENDED; |
| 1354 | 1348 | ||
| 1355 | error = xfs_getbmap(bdp, &bm, (struct getbmapx __user *)arg+1, iflags); | 1349 | error = xfs_getbmap(ip, &bm, (struct getbmapx __user *)arg+1, iflags); |
| 1356 | if (error) | 1350 | if (error) |
| 1357 | return -error; | 1351 | return -error; |
| 1358 | 1352 | ||
diff --git a/fs/xfs/linux-2.6/xfs_iops.h b/fs/xfs/linux-2.6/xfs_iops.h index 95a69398fce0..ce9852e9be00 100644 --- a/fs/xfs/linux-2.6/xfs_iops.h +++ b/fs/xfs/linux-2.6/xfs_iops.h | |||
| @@ -26,8 +26,6 @@ extern const struct file_operations xfs_file_operations; | |||
| 26 | extern const struct file_operations xfs_dir_file_operations; | 26 | extern const struct file_operations xfs_dir_file_operations; |
| 27 | extern const struct file_operations xfs_invis_file_operations; | 27 | extern const struct file_operations xfs_invis_file_operations; |
| 28 | 28 | ||
| 29 | extern int xfs_ioctl(struct bhv_desc *, struct inode *, struct file *, | ||
| 30 | int, unsigned int, void __user *); | ||
| 31 | 29 | ||
| 32 | struct xfs_inode; | 30 | struct xfs_inode; |
| 33 | extern void xfs_ichgtime(struct xfs_inode *, int); | 31 | extern void xfs_ichgtime(struct xfs_inode *, int); |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 94941da6c4da..2dc979e3e969 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
| @@ -48,6 +48,7 @@ | |||
| 48 | #include "xfs_buf_item.h" | 48 | #include "xfs_buf_item.h" |
| 49 | #include "xfs_utils.h" | 49 | #include "xfs_utils.h" |
| 50 | #include "xfs_iomap.h" | 50 | #include "xfs_iomap.h" |
| 51 | #include "xfs_vnodeops.h" | ||
| 51 | 52 | ||
| 52 | #include <linux/capability.h> | 53 | #include <linux/capability.h> |
| 53 | #include <linux/writeback.h> | 54 | #include <linux/writeback.h> |
| @@ -180,27 +181,22 @@ unlock: | |||
| 180 | 181 | ||
| 181 | ssize_t /* bytes read, or (-) error */ | 182 | ssize_t /* bytes read, or (-) error */ |
| 182 | xfs_read( | 183 | xfs_read( |
| 183 | bhv_desc_t *bdp, | 184 | xfs_inode_t *ip, |
| 184 | struct kiocb *iocb, | 185 | struct kiocb *iocb, |
| 185 | const struct iovec *iovp, | 186 | const struct iovec *iovp, |
| 186 | unsigned int segs, | 187 | unsigned int segs, |
| 187 | loff_t *offset, | 188 | loff_t *offset, |
| 188 | int ioflags, | 189 | int ioflags) |
| 189 | cred_t *credp) | ||
| 190 | { | 190 | { |
| 191 | struct file *file = iocb->ki_filp; | 191 | struct file *file = iocb->ki_filp; |
| 192 | struct inode *inode = file->f_mapping->host; | 192 | struct inode *inode = file->f_mapping->host; |
| 193 | bhv_vnode_t *vp = XFS_ITOV(ip); | ||
| 194 | xfs_mount_t *mp = ip->i_mount; | ||
| 193 | size_t size = 0; | 195 | size_t size = 0; |
| 194 | ssize_t ret = 0; | 196 | ssize_t ret = 0; |
| 195 | xfs_fsize_t n; | 197 | xfs_fsize_t n; |
| 196 | xfs_inode_t *ip; | ||
| 197 | xfs_mount_t *mp; | ||
| 198 | bhv_vnode_t *vp; | ||
| 199 | unsigned long seg; | 198 | unsigned long seg; |
| 200 | 199 | ||
| 201 | ip = XFS_BHVTOI(bdp); | ||
| 202 | vp = BHV_TO_VNODE(bdp); | ||
| 203 | mp = ip->i_mount; | ||
| 204 | 200 | ||
| 205 | XFS_STATS_INC(xs_read_calls); | 201 | XFS_STATS_INC(xs_read_calls); |
| 206 | 202 | ||
| @@ -249,8 +245,7 @@ xfs_read( | |||
| 249 | bhv_vrwlock_t locktype = VRWLOCK_READ; | 245 | bhv_vrwlock_t locktype = VRWLOCK_READ; |
| 250 | int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); | 246 | int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags); |
| 251 | 247 | ||
| 252 | ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, | 248 | ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, vp, *offset, size, |
| 253 | BHV_TO_VNODE(bdp), *offset, size, | ||
| 254 | dmflags, &locktype); | 249 | dmflags, &locktype); |
| 255 | if (ret) { | 250 | if (ret) { |
| 256 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | 251 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
| @@ -287,16 +282,15 @@ xfs_read( | |||
| 287 | 282 | ||
| 288 | ssize_t | 283 | ssize_t |
| 289 | xfs_splice_read( | 284 | xfs_splice_read( |
| 290 | bhv_desc_t *bdp, | 285 | xfs_inode_t *ip, |
| 291 | struct file *infilp, | 286 | struct file *infilp, |
| 292 | loff_t *ppos, | 287 | loff_t *ppos, |
| 293 | struct pipe_inode_info *pipe, | 288 | struct pipe_inode_info *pipe, |
| 294 | size_t count, | 289 | size_t count, |
| 295 | int flags, | 290 | int flags, |
| 296 | int ioflags, | 291 | int ioflags) |
| 297 | cred_t *credp) | ||
| 298 | { | 292 | { |
| 299 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | 293 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 300 | xfs_mount_t *mp = ip->i_mount; | 294 | xfs_mount_t *mp = ip->i_mount; |
| 301 | ssize_t ret; | 295 | ssize_t ret; |
| 302 | 296 | ||
| @@ -310,8 +304,7 @@ xfs_splice_read( | |||
| 310 | bhv_vrwlock_t locktype = VRWLOCK_READ; | 304 | bhv_vrwlock_t locktype = VRWLOCK_READ; |
| 311 | int error; | 305 | int error; |
| 312 | 306 | ||
| 313 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), | 307 | error = XFS_SEND_DATA(mp, DM_EVENT_READ, vp, *ppos, count, |
| 314 | *ppos, count, | ||
| 315 | FILP_DELAY_FLAG(infilp), &locktype); | 308 | FILP_DELAY_FLAG(infilp), &locktype); |
| 316 | if (error) { | 309 | if (error) { |
| 317 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); | 310 | xfs_iunlock(ip, XFS_IOLOCK_SHARED); |
| @@ -330,16 +323,15 @@ xfs_splice_read( | |||
| 330 | 323 | ||
| 331 | ssize_t | 324 | ssize_t |
| 332 | xfs_splice_write( | 325 | xfs_splice_write( |
| 333 | bhv_desc_t *bdp, | 326 | xfs_inode_t *ip, |
| 334 | struct pipe_inode_info *pipe, | 327 | struct pipe_inode_info *pipe, |
| 335 | struct file *outfilp, | 328 | struct file *outfilp, |
| 336 | loff_t *ppos, | 329 | loff_t *ppos, |
| 337 | size_t count, | 330 | size_t count, |
| 338 | int flags, | 331 | int flags, |
| 339 | int ioflags, | 332 | int ioflags) |
| 340 | cred_t *credp) | ||
| 341 | { | 333 | { |
| 342 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | 334 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 343 | xfs_mount_t *mp = ip->i_mount; | 335 | xfs_mount_t *mp = ip->i_mount; |
| 344 | xfs_iocore_t *io = &ip->i_iocore; | 336 | xfs_iocore_t *io = &ip->i_iocore; |
| 345 | ssize_t ret; | 337 | ssize_t ret; |
| @@ -356,8 +348,7 @@ xfs_splice_write( | |||
| 356 | bhv_vrwlock_t locktype = VRWLOCK_WRITE; | 348 | bhv_vrwlock_t locktype = VRWLOCK_WRITE; |
| 357 | int error; | 349 | int error; |
| 358 | 350 | ||
| 359 | error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, BHV_TO_VNODE(bdp), | 351 | error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, vp, *ppos, count, |
| 360 | *ppos, count, | ||
| 361 | FILP_DELAY_FLAG(outfilp), &locktype); | 352 | FILP_DELAY_FLAG(outfilp), &locktype); |
| 362 | if (error) { | 353 | if (error) { |
| 363 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); | 354 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); |
| @@ -591,24 +582,22 @@ out_lock: | |||
| 591 | 582 | ||
| 592 | ssize_t /* bytes written, or (-) error */ | 583 | ssize_t /* bytes written, or (-) error */ |
| 593 | xfs_write( | 584 | xfs_write( |
| 594 | bhv_desc_t *bdp, | 585 | struct xfs_inode *xip, |
| 595 | struct kiocb *iocb, | 586 | struct kiocb *iocb, |
| 596 | const struct iovec *iovp, | 587 | const struct iovec *iovp, |
| 597 | unsigned int nsegs, | 588 | unsigned int nsegs, |
| 598 | loff_t *offset, | 589 | loff_t *offset, |
| 599 | int ioflags, | 590 | int ioflags) |
| 600 | cred_t *credp) | ||
| 601 | { | 591 | { |
| 602 | struct file *file = iocb->ki_filp; | 592 | struct file *file = iocb->ki_filp; |
| 603 | struct address_space *mapping = file->f_mapping; | 593 | struct address_space *mapping = file->f_mapping; |
| 604 | struct inode *inode = mapping->host; | 594 | struct inode *inode = mapping->host; |
| 595 | bhv_vnode_t *vp = XFS_ITOV(xip); | ||
| 605 | unsigned long segs = nsegs; | 596 | unsigned long segs = nsegs; |
| 606 | xfs_inode_t *xip; | ||
| 607 | xfs_mount_t *mp; | 597 | xfs_mount_t *mp; |
| 608 | ssize_t ret = 0, error = 0; | 598 | ssize_t ret = 0, error = 0; |
| 609 | xfs_fsize_t isize, new_size; | 599 | xfs_fsize_t isize, new_size; |
| 610 | xfs_iocore_t *io; | 600 | xfs_iocore_t *io; |
| 611 | bhv_vnode_t *vp; | ||
| 612 | int iolock; | 601 | int iolock; |
| 613 | int eventsent = 0; | 602 | int eventsent = 0; |
| 614 | bhv_vrwlock_t locktype; | 603 | bhv_vrwlock_t locktype; |
| @@ -618,9 +607,6 @@ xfs_write( | |||
| 618 | 607 | ||
| 619 | XFS_STATS_INC(xs_write_calls); | 608 | XFS_STATS_INC(xs_write_calls); |
| 620 | 609 | ||
| 621 | vp = BHV_TO_VNODE(bdp); | ||
| 622 | xip = XFS_BHVTOI(bdp); | ||
| 623 | |||
| 624 | error = generic_segment_checks(iovp, &segs, &ocount, VERIFY_READ); | 610 | error = generic_segment_checks(iovp, &segs, &ocount, VERIFY_READ); |
| 625 | if (error) | 611 | if (error) |
| 626 | return error; | 612 | return error; |
| @@ -730,7 +716,7 @@ start: | |||
| 730 | */ | 716 | */ |
| 731 | 717 | ||
| 732 | if (pos > xip->i_size) { | 718 | if (pos > xip->i_size) { |
| 733 | error = xfs_zero_eof(BHV_TO_VNODE(bdp), io, pos, xip->i_size); | 719 | error = xfs_zero_eof(vp, io, pos, xip->i_size); |
| 734 | if (error) { | 720 | if (error) { |
| 735 | xfs_iunlock(xip, XFS_ILOCK_EXCL); | 721 | xfs_iunlock(xip, XFS_ILOCK_EXCL); |
| 736 | goto out_unlock_internal; | 722 | goto out_unlock_internal; |
| @@ -815,7 +801,7 @@ retry: | |||
| 815 | 801 | ||
| 816 | if (ret == -ENOSPC && | 802 | if (ret == -ENOSPC && |
| 817 | DM_EVENT_ENABLED(xip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { | 803 | DM_EVENT_ENABLED(xip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) { |
| 818 | xfs_rwunlock(bdp, locktype); | 804 | xfs_rwunlock(xip, locktype); |
| 819 | if (need_i_mutex) | 805 | if (need_i_mutex) |
| 820 | mutex_unlock(&inode->i_mutex); | 806 | mutex_unlock(&inode->i_mutex); |
| 821 | error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, vp, | 807 | error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, vp, |
| @@ -823,7 +809,7 @@ retry: | |||
| 823 | 0, 0, 0); /* Delay flag intentionally unused */ | 809 | 0, 0, 0); /* Delay flag intentionally unused */ |
| 824 | if (need_i_mutex) | 810 | if (need_i_mutex) |
| 825 | mutex_lock(&inode->i_mutex); | 811 | mutex_lock(&inode->i_mutex); |
| 826 | xfs_rwlock(bdp, locktype); | 812 | xfs_rwlock(xip, locktype); |
| 827 | if (error) | 813 | if (error) |
| 828 | goto out_unlock_internal; | 814 | goto out_unlock_internal; |
| 829 | pos = xip->i_size; | 815 | pos = xip->i_size; |
| @@ -854,7 +840,7 @@ retry: | |||
| 854 | if (error) | 840 | if (error) |
| 855 | goto out_unlock_internal; | 841 | goto out_unlock_internal; |
| 856 | 842 | ||
| 857 | xfs_rwunlock(bdp, locktype); | 843 | xfs_rwunlock(xip, locktype); |
| 858 | if (need_i_mutex) | 844 | if (need_i_mutex) |
| 859 | mutex_unlock(&inode->i_mutex); | 845 | mutex_unlock(&inode->i_mutex); |
| 860 | 846 | ||
| @@ -863,7 +849,7 @@ retry: | |||
| 863 | error = -ret; | 849 | error = -ret; |
| 864 | if (need_i_mutex) | 850 | if (need_i_mutex) |
| 865 | mutex_lock(&inode->i_mutex); | 851 | mutex_lock(&inode->i_mutex); |
| 866 | xfs_rwlock(bdp, locktype); | 852 | xfs_rwlock(xip, locktype); |
| 867 | } | 853 | } |
| 868 | 854 | ||
| 869 | out_unlock_internal: | 855 | out_unlock_internal: |
| @@ -881,7 +867,7 @@ retry: | |||
| 881 | xip->i_d.di_size = xip->i_size; | 867 | xip->i_d.di_size = xip->i_size; |
| 882 | xfs_iunlock(xip, XFS_ILOCK_EXCL); | 868 | xfs_iunlock(xip, XFS_ILOCK_EXCL); |
| 883 | } | 869 | } |
| 884 | xfs_rwunlock(bdp, locktype); | 870 | xfs_rwunlock(xip, locktype); |
| 885 | out_unlock_mutex: | 871 | out_unlock_mutex: |
| 886 | if (need_i_mutex) | 872 | if (need_i_mutex) |
| 887 | mutex_unlock(&inode->i_mutex); | 873 | mutex_unlock(&inode->i_mutex); |
| @@ -920,14 +906,14 @@ xfs_bdstrat_cb(struct xfs_buf *bp) | |||
| 920 | 906 | ||
| 921 | 907 | ||
| 922 | int | 908 | int |
| 923 | xfs_bmap(bhv_desc_t *bdp, | 909 | xfs_bmap( |
| 910 | xfs_inode_t *ip, | ||
| 924 | xfs_off_t offset, | 911 | xfs_off_t offset, |
| 925 | ssize_t count, | 912 | ssize_t count, |
| 926 | int flags, | 913 | int flags, |
| 927 | xfs_iomap_t *iomapp, | 914 | xfs_iomap_t *iomapp, |
| 928 | int *niomaps) | 915 | int *niomaps) |
| 929 | { | 916 | { |
| 930 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | ||
| 931 | xfs_iocore_t *io = &ip->i_iocore; | 917 | xfs_iocore_t *io = &ip->i_iocore; |
| 932 | 918 | ||
| 933 | ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); | 919 | ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.h b/fs/xfs/linux-2.6/xfs_lrw.h index 1ad29bae5415..fa7cefa86a82 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.h +++ b/fs/xfs/linux-2.6/xfs_lrw.h | |||
| @@ -71,25 +71,11 @@ extern void xfs_inval_cached_trace(struct xfs_iocore *, | |||
| 71 | #define xfs_inval_cached_trace(io, offset, len, first, last) | 71 | #define xfs_inval_cached_trace(io, offset, len, first, last) |
| 72 | #endif | 72 | #endif |
| 73 | 73 | ||
| 74 | extern int xfs_bmap(struct bhv_desc *, xfs_off_t, ssize_t, int, | ||
| 75 | struct xfs_iomap *, int *); | ||
| 76 | extern int xfsbdstrat(struct xfs_mount *, struct xfs_buf *); | 74 | extern int xfsbdstrat(struct xfs_mount *, struct xfs_buf *); |
| 77 | extern int xfs_bdstrat_cb(struct xfs_buf *); | 75 | extern int xfs_bdstrat_cb(struct xfs_buf *); |
| 78 | extern int xfs_dev_is_read_only(struct xfs_mount *, char *); | 76 | extern int xfs_dev_is_read_only(struct xfs_mount *, char *); |
| 79 | 77 | ||
| 80 | extern int xfs_zero_eof(struct bhv_vnode *, struct xfs_iocore *, xfs_off_t, | 78 | extern int xfs_zero_eof(struct bhv_vnode *, struct xfs_iocore *, xfs_off_t, |
| 81 | xfs_fsize_t); | 79 | xfs_fsize_t); |
| 82 | extern ssize_t xfs_read(struct bhv_desc *, struct kiocb *, | ||
| 83 | const struct iovec *, unsigned int, | ||
| 84 | loff_t *, int, struct cred *); | ||
| 85 | extern ssize_t xfs_write(struct bhv_desc *, struct kiocb *, | ||
| 86 | const struct iovec *, unsigned int, | ||
| 87 | loff_t *, int, struct cred *); | ||
| 88 | extern ssize_t xfs_splice_read(struct bhv_desc *, struct file *, loff_t *, | ||
| 89 | struct pipe_inode_info *, size_t, int, int, | ||
| 90 | struct cred *); | ||
| 91 | extern ssize_t xfs_splice_write(struct bhv_desc *, struct pipe_inode_info *, | ||
| 92 | struct file *, loff_t *, size_t, int, int, | ||
| 93 | struct cred *); | ||
| 94 | 80 | ||
| 95 | #endif /* __XFS_LRW_H__ */ | 81 | #endif /* __XFS_LRW_H__ */ |
diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 7ce44a7b88a2..1a10bffc7755 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c | |||
| @@ -156,10 +156,14 @@ xfs_attr_fetch(xfs_inode_t *ip, const char *name, int namelen, | |||
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | int | 158 | int |
| 159 | xfs_attr_get(bhv_desc_t *bdp, const char *name, char *value, int *valuelenp, | 159 | xfs_attr_get( |
| 160 | int flags, struct cred *cred) | 160 | xfs_inode_t *ip, |
| 161 | const char *name, | ||
| 162 | char *value, | ||
| 163 | int *valuelenp, | ||
| 164 | int flags, | ||
| 165 | cred_t *cred) | ||
| 161 | { | 166 | { |
| 162 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | ||
| 163 | int error, namelen; | 167 | int error, namelen; |
| 164 | 168 | ||
| 165 | XFS_STATS_INC(xs_attr_get); | 169 | XFS_STATS_INC(xs_attr_get); |
| @@ -417,10 +421,13 @@ out: | |||
| 417 | } | 421 | } |
| 418 | 422 | ||
| 419 | int | 423 | int |
| 420 | xfs_attr_set(bhv_desc_t *bdp, const char *name, char *value, int valuelen, int flags, | 424 | xfs_attr_set( |
| 421 | struct cred *cred) | 425 | xfs_inode_t *dp, |
| 426 | const char *name, | ||
| 427 | char *value, | ||
| 428 | int valuelen, | ||
| 429 | int flags) | ||
| 422 | { | 430 | { |
| 423 | xfs_inode_t *dp; | ||
| 424 | int namelen; | 431 | int namelen; |
| 425 | 432 | ||
| 426 | namelen = strlen(name); | 433 | namelen = strlen(name); |
| @@ -429,7 +436,6 @@ xfs_attr_set(bhv_desc_t *bdp, const char *name, char *value, int valuelen, int f | |||
| 429 | 436 | ||
| 430 | XFS_STATS_INC(xs_attr_set); | 437 | XFS_STATS_INC(xs_attr_set); |
| 431 | 438 | ||
| 432 | dp = XFS_BHVTOI(bdp); | ||
| 433 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) | 439 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) |
| 434 | return (EIO); | 440 | return (EIO); |
| 435 | 441 | ||
| @@ -563,10 +569,12 @@ out: | |||
| 563 | } | 569 | } |
| 564 | 570 | ||
| 565 | int | 571 | int |
| 566 | xfs_attr_remove(bhv_desc_t *bdp, const char *name, int flags, struct cred *cred) | 572 | xfs_attr_remove( |
| 573 | xfs_inode_t *dp, | ||
| 574 | const char *name, | ||
| 575 | int flags) | ||
| 567 | { | 576 | { |
| 568 | xfs_inode_t *dp; | 577 | int namelen; |
| 569 | int namelen; | ||
| 570 | 578 | ||
| 571 | namelen = strlen(name); | 579 | namelen = strlen(name); |
| 572 | if (namelen >= MAXNAMELEN) | 580 | if (namelen >= MAXNAMELEN) |
| @@ -574,7 +582,6 @@ xfs_attr_remove(bhv_desc_t *bdp, const char *name, int flags, struct cred *cred) | |||
| 574 | 582 | ||
| 575 | XFS_STATS_INC(xs_attr_remove); | 583 | XFS_STATS_INC(xs_attr_remove); |
| 576 | 584 | ||
| 577 | dp = XFS_BHVTOI(bdp); | ||
| 578 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) | 585 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) |
| 579 | return (EIO); | 586 | return (EIO); |
| 580 | 587 | ||
| @@ -702,11 +709,14 @@ xfs_attr_kern_list_sizes(xfs_attr_list_context_t *context, attrnames_t *namesp, | |||
| 702 | * success. | 709 | * success. |
| 703 | */ | 710 | */ |
| 704 | int | 711 | int |
| 705 | xfs_attr_list(bhv_desc_t *bdp, char *buffer, int bufsize, int flags, | 712 | xfs_attr_list( |
| 706 | attrlist_cursor_kern_t *cursor, struct cred *cred) | 713 | xfs_inode_t *dp, |
| 714 | char *buffer, | ||
| 715 | int bufsize, | ||
| 716 | int flags, | ||
| 717 | attrlist_cursor_kern_t *cursor) | ||
| 707 | { | 718 | { |
| 708 | xfs_attr_list_context_t context; | 719 | xfs_attr_list_context_t context; |
| 709 | xfs_inode_t *dp; | ||
| 710 | int error; | 720 | int error; |
| 711 | 721 | ||
| 712 | XFS_STATS_INC(xs_attr_list); | 722 | XFS_STATS_INC(xs_attr_list); |
| @@ -731,7 +741,7 @@ xfs_attr_list(bhv_desc_t *bdp, char *buffer, int bufsize, int flags, | |||
| 731 | /* | 741 | /* |
| 732 | * Initialize the output buffer. | 742 | * Initialize the output buffer. |
| 733 | */ | 743 | */ |
| 734 | context.dp = dp = XFS_BHVTOI(bdp); | 744 | context.dp = dp; |
| 735 | context.cursor = cursor; | 745 | context.cursor = cursor; |
| 736 | context.count = 0; | 746 | context.count = 0; |
| 737 | context.dupcnt = 0; | 747 | context.dupcnt = 0; |
diff --git a/fs/xfs/xfs_attr.h b/fs/xfs/xfs_attr.h index 783977d3ea71..47c9ab1eae0b 100644 --- a/fs/xfs/xfs_attr.h +++ b/fs/xfs/xfs_attr.h | |||
| @@ -159,12 +159,8 @@ struct xfs_da_args; | |||
| 159 | /* | 159 | /* |
| 160 | * Overall external interface routines. | 160 | * Overall external interface routines. |
| 161 | */ | 161 | */ |
| 162 | int xfs_attr_get(bhv_desc_t *, const char *, char *, int *, int, struct cred *); | ||
| 163 | int xfs_attr_set(bhv_desc_t *, const char *, char *, int, int, struct cred *); | ||
| 164 | int xfs_attr_set_int(struct xfs_inode *, const char *, int, char *, int, int); | 162 | int xfs_attr_set_int(struct xfs_inode *, const char *, int, char *, int, int); |
| 165 | int xfs_attr_remove(bhv_desc_t *, const char *, int, struct cred *); | ||
| 166 | int xfs_attr_remove_int(struct xfs_inode *, const char *, int, int); | 163 | int xfs_attr_remove_int(struct xfs_inode *, const char *, int, int); |
| 167 | int xfs_attr_list(bhv_desc_t *, char *, int, int, struct attrlist_cursor_kern *, struct cred *); | ||
| 168 | int xfs_attr_list_int(struct xfs_attr_list_context *); | 164 | int xfs_attr_list_int(struct xfs_attr_list_context *); |
| 169 | int xfs_attr_inactive(struct xfs_inode *dp); | 165 | int xfs_attr_inactive(struct xfs_inode *dp); |
| 170 | 166 | ||
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index ea4eab14a603..16b97db4f8aa 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
| @@ -5764,7 +5764,7 @@ xfs_getbmapx_fix_eof_hole( | |||
| 5764 | */ | 5764 | */ |
| 5765 | int /* error code */ | 5765 | int /* error code */ |
| 5766 | xfs_getbmap( | 5766 | xfs_getbmap( |
| 5767 | bhv_desc_t *bdp, /* XFS behavior descriptor*/ | 5767 | xfs_inode_t *ip, |
| 5768 | struct getbmap *bmv, /* user bmap structure */ | 5768 | struct getbmap *bmv, /* user bmap structure */ |
| 5769 | void __user *ap, /* pointer to user's array */ | 5769 | void __user *ap, /* pointer to user's array */ |
| 5770 | int interface) /* interface flags */ | 5770 | int interface) /* interface flags */ |
| @@ -5773,7 +5773,6 @@ xfs_getbmap( | |||
| 5773 | int error; /* return value */ | 5773 | int error; /* return value */ |
| 5774 | __int64_t fixlen; /* length for -1 case */ | 5774 | __int64_t fixlen; /* length for -1 case */ |
| 5775 | int i; /* extent number */ | 5775 | int i; /* extent number */ |
| 5776 | xfs_inode_t *ip; /* xfs incore inode pointer */ | ||
| 5777 | bhv_vnode_t *vp; /* corresponding vnode */ | 5776 | bhv_vnode_t *vp; /* corresponding vnode */ |
| 5778 | int lock; /* lock state */ | 5777 | int lock; /* lock state */ |
| 5779 | xfs_bmbt_irec_t *map; /* buffer for user's data */ | 5778 | xfs_bmbt_irec_t *map; /* buffer for user's data */ |
| @@ -5791,8 +5790,7 @@ xfs_getbmap( | |||
| 5791 | int bmapi_flags; /* flags for xfs_bmapi */ | 5790 | int bmapi_flags; /* flags for xfs_bmapi */ |
| 5792 | __int32_t oflags; /* getbmapx bmv_oflags field */ | 5791 | __int32_t oflags; /* getbmapx bmv_oflags field */ |
| 5793 | 5792 | ||
| 5794 | vp = BHV_TO_VNODE(bdp); | 5793 | vp = XFS_ITOV(ip); |
| 5795 | ip = XFS_BHVTOI(bdp); | ||
| 5796 | mp = ip->i_mount; | 5794 | mp = ip->i_mount; |
| 5797 | 5795 | ||
| 5798 | whichfork = interface & BMV_IF_ATTRFORK ? XFS_ATTR_FORK : XFS_DATA_FORK; | 5796 | whichfork = interface & BMV_IF_ATTRFORK ? XFS_ATTR_FORK : XFS_DATA_FORK; |
diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index a69ef30809fb..68267d75ff19 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h | |||
| @@ -335,7 +335,7 @@ xfs_bunmapi( | |||
| 335 | */ | 335 | */ |
| 336 | int /* error code */ | 336 | int /* error code */ |
| 337 | xfs_getbmap( | 337 | xfs_getbmap( |
| 338 | bhv_desc_t *bdp, /* XFS behavior descriptor*/ | 338 | xfs_inode_t *ip, |
| 339 | struct getbmap *bmv, /* user bmap structure */ | 339 | struct getbmap *bmv, /* user bmap structure */ |
| 340 | void __user *ap, /* pointer to user's array */ | 340 | void __user *ap, /* pointer to user's array */ |
| 341 | int iflags); /* interface flags */ | 341 | int iflags); /* interface flags */ |
diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index c2d2bef26cbd..12001bf0d0cb 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c | |||
| @@ -292,18 +292,16 @@ xfs_dir_removename( | |||
| 292 | */ | 292 | */ |
| 293 | int | 293 | int |
| 294 | xfs_readdir( | 294 | xfs_readdir( |
| 295 | bhv_desc_t *dir_bdp, | 295 | xfs_inode_t *dp, |
| 296 | void *dirent, | 296 | void *dirent, |
| 297 | size_t bufsize, | 297 | size_t bufsize, |
| 298 | xfs_off_t *offset, | 298 | xfs_off_t *offset, |
| 299 | filldir_t filldir) | 299 | filldir_t filldir) |
| 300 | { | 300 | { |
| 301 | xfs_inode_t *dp = XFS_BHVTOI(dir_bdp); | ||
| 302 | int rval; /* return value */ | 301 | int rval; /* return value */ |
| 303 | int v; /* type-checking value */ | 302 | int v; /* type-checking value */ |
| 304 | 303 | ||
| 305 | vn_trace_entry(BHV_TO_VNODE(dir_bdp), __FUNCTION__, | 304 | vn_trace_entry(XFS_ITOV(dp), __FUNCTION__, (inst_t *)__return_address); |
| 306 | (inst_t *)__return_address); | ||
| 307 | 305 | ||
| 308 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) | 306 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) |
| 309 | return XFS_ERROR(EIO); | 307 | return XFS_ERROR(EIO); |
diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index fa5a533a3427..b265197e74cf 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h | |||
| @@ -84,8 +84,6 @@ extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp, | |||
| 84 | extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, | 84 | extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, |
| 85 | char *name, int namelen); | 85 | char *name, int namelen); |
| 86 | extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); | 86 | extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); |
| 87 | extern int xfs_readdir(bhv_desc_t *dir_bdp, void *dirent, size_t bufsize, | ||
| 88 | xfs_off_t *offset, filldir_t filldir); | ||
| 89 | 87 | ||
| 90 | /* | 88 | /* |
| 91 | * Utility routines for v2 directories. | 89 | * Utility routines for v2 directories. |
diff --git a/fs/xfs/xfs_rename.c b/fs/xfs/xfs_rename.c index 187318e8d259..b62b8771afcf 100644 --- a/fs/xfs/xfs_rename.c +++ b/fs/xfs/xfs_rename.c | |||
| @@ -129,8 +129,7 @@ xfs_lock_for_rename( | |||
| 129 | lock_mode = xfs_ilock_map_shared(dp2); | 129 | lock_mode = xfs_ilock_map_shared(dp2); |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | error = xfs_dir_lookup_int(XFS_ITOBHV(dp2), lock_mode, | 132 | error = xfs_dir_lookup_int(dp2, lock_mode, vname2, &inum2, &ip2); |
| 133 | vname2, &inum2, &ip2); | ||
| 134 | if (error == ENOENT) { /* target does not need to exist. */ | 133 | if (error == ENOENT) { /* target does not need to exist. */ |
| 135 | inum2 = 0; | 134 | inum2 = 0; |
| 136 | } else if (error) { | 135 | } else if (error) { |
| @@ -222,15 +221,15 @@ xfs_lock_for_rename( | |||
| 222 | */ | 221 | */ |
| 223 | int | 222 | int |
| 224 | xfs_rename( | 223 | xfs_rename( |
| 225 | bhv_desc_t *src_dir_bdp, | 224 | xfs_inode_t *src_dp, |
| 226 | bhv_vname_t *src_vname, | 225 | bhv_vname_t *src_vname, |
| 227 | bhv_vnode_t *target_dir_vp, | 226 | bhv_vnode_t *target_dir_vp, |
| 228 | bhv_vname_t *target_vname, | 227 | bhv_vname_t *target_vname) |
| 229 | cred_t *credp) | ||
| 230 | { | 228 | { |
| 229 | bhv_vnode_t *src_dir_vp = XFS_ITOV(src_dp); | ||
| 231 | xfs_trans_t *tp; | 230 | xfs_trans_t *tp; |
| 232 | xfs_inode_t *src_dp, *target_dp, *src_ip, *target_ip; | 231 | xfs_inode_t *target_dp, *src_ip, *target_ip; |
| 233 | xfs_mount_t *mp; | 232 | xfs_mount_t *mp = src_dp->i_mount; |
| 234 | int new_parent; /* moving to a new dir */ | 233 | int new_parent; /* moving to a new dir */ |
| 235 | int src_is_directory; /* src_name is a directory */ | 234 | int src_is_directory; /* src_name is a directory */ |
| 236 | int error; | 235 | int error; |
| @@ -240,7 +239,6 @@ xfs_rename( | |||
| 240 | int committed; | 239 | int committed; |
| 241 | xfs_inode_t *inodes[4]; | 240 | xfs_inode_t *inodes[4]; |
| 242 | int target_ip_dropped = 0; /* dropped target_ip link? */ | 241 | int target_ip_dropped = 0; /* dropped target_ip link? */ |
| 243 | bhv_vnode_t *src_dir_vp; | ||
| 244 | int spaceres; | 242 | int spaceres; |
| 245 | int target_link_zero = 0; | 243 | int target_link_zero = 0; |
| 246 | int num_inodes; | 244 | int num_inodes; |
| @@ -249,7 +247,6 @@ xfs_rename( | |||
| 249 | int src_namelen = VNAMELEN(src_vname); | 247 | int src_namelen = VNAMELEN(src_vname); |
| 250 | int target_namelen = VNAMELEN(target_vname); | 248 | int target_namelen = VNAMELEN(target_vname); |
| 251 | 249 | ||
| 252 | src_dir_vp = BHV_TO_VNODE(src_dir_bdp); | ||
| 253 | vn_trace_entry(src_dir_vp, "xfs_rename", (inst_t *)__return_address); | 250 | vn_trace_entry(src_dir_vp, "xfs_rename", (inst_t *)__return_address); |
| 254 | vn_trace_entry(target_dir_vp, "xfs_rename", (inst_t *)__return_address); | 251 | vn_trace_entry(target_dir_vp, "xfs_rename", (inst_t *)__return_address); |
| 255 | 252 | ||
| @@ -262,9 +259,6 @@ xfs_rename( | |||
| 262 | return XFS_ERROR(EXDEV); | 259 | return XFS_ERROR(EXDEV); |
| 263 | } | 260 | } |
| 264 | 261 | ||
| 265 | src_dp = XFS_BHVTOI(src_dir_bdp); | ||
| 266 | mp = src_dp->i_mount; | ||
| 267 | |||
| 268 | if (DM_EVENT_ENABLED(src_dp, DM_EVENT_RENAME) || | 262 | if (DM_EVENT_ENABLED(src_dp, DM_EVENT_RENAME) || |
| 269 | DM_EVENT_ENABLED(target_dp, DM_EVENT_RENAME)) { | 263 | DM_EVENT_ENABLED(target_dp, DM_EVENT_RENAME)) { |
| 270 | error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME, | 264 | error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME, |
diff --git a/fs/xfs/xfs_rw.h b/fs/xfs/xfs_rw.h index 943bddde83c6..49875e1d129f 100644 --- a/fs/xfs/xfs_rw.h +++ b/fs/xfs/xfs_rw.h | |||
| @@ -90,14 +90,6 @@ extern void xfs_ioerror_alert(char *func, struct xfs_mount *mp, | |||
| 90 | /* | 90 | /* |
| 91 | * Prototypes for functions in xfs_vnodeops.c. | 91 | * Prototypes for functions in xfs_vnodeops.c. |
| 92 | */ | 92 | */ |
| 93 | extern int xfs_rwlock(bhv_desc_t *bdp, bhv_vrwlock_t write_lock); | ||
| 94 | extern void xfs_rwunlock(bhv_desc_t *bdp, bhv_vrwlock_t write_lock); | ||
| 95 | extern int xfs_setattr(bhv_desc_t *, bhv_vattr_t *vap, int flags, | ||
| 96 | cred_t *credp); | ||
| 97 | extern int xfs_change_file_space(bhv_desc_t *bdp, int cmd, xfs_flock64_t *bf, | ||
| 98 | xfs_off_t offset, cred_t *credp, int flags); | ||
| 99 | extern int xfs_set_dmattrs(bhv_desc_t *bdp, u_int evmask, u_int16_t state, | ||
| 100 | cred_t *credp); | ||
| 101 | extern int xfs_free_eofblocks(struct xfs_mount *mp, struct xfs_inode *ip, | 93 | extern int xfs_free_eofblocks(struct xfs_mount *mp, struct xfs_inode *ip, |
| 102 | int flags); | 94 | int flags); |
| 103 | 95 | ||
diff --git a/fs/xfs/xfs_utils.c b/fs/xfs/xfs_utils.c index 20ffec308e1e..4a7208ef7faa 100644 --- a/fs/xfs/xfs_utils.c +++ b/fs/xfs/xfs_utils.c | |||
| @@ -65,20 +65,15 @@ xfs_get_dir_entry( | |||
| 65 | 65 | ||
| 66 | int | 66 | int |
| 67 | xfs_dir_lookup_int( | 67 | xfs_dir_lookup_int( |
| 68 | bhv_desc_t *dir_bdp, | 68 | xfs_inode_t *dp, |
| 69 | uint lock_mode, | 69 | uint lock_mode, |
| 70 | bhv_vname_t *dentry, | 70 | bhv_vname_t *dentry, |
| 71 | xfs_ino_t *inum, | 71 | xfs_ino_t *inum, |
| 72 | xfs_inode_t **ipp) | 72 | xfs_inode_t **ipp) |
| 73 | { | 73 | { |
| 74 | bhv_vnode_t *dir_vp; | ||
| 75 | xfs_inode_t *dp; | ||
| 76 | int error; | 74 | int error; |
| 77 | 75 | ||
| 78 | dir_vp = BHV_TO_VNODE(dir_bdp); | 76 | vn_trace_entry(XFS_ITOV(dp), __FUNCTION__, (inst_t *)__return_address); |
| 79 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); | ||
| 80 | |||
| 81 | dp = XFS_BHVTOI(dir_bdp); | ||
| 82 | 77 | ||
| 83 | error = xfs_dir_lookup(NULL, dp, VNAME(dentry), VNAMELEN(dentry), inum); | 78 | error = xfs_dir_lookup(NULL, dp, VNAME(dentry), VNAMELEN(dentry), inum); |
| 84 | if (!error) { | 79 | if (!error) { |
diff --git a/fs/xfs/xfs_utils.h b/fs/xfs/xfs_utils.h index fe953e98afa7..35c7a99f50ac 100644 --- a/fs/xfs/xfs_utils.h +++ b/fs/xfs/xfs_utils.h | |||
| @@ -23,10 +23,8 @@ | |||
| 23 | #define ITRACE(ip) vn_trace_ref(XFS_ITOV(ip), __FILE__, __LINE__, \ | 23 | #define ITRACE(ip) vn_trace_ref(XFS_ITOV(ip), __FILE__, __LINE__, \ |
| 24 | (inst_t *)__return_address) | 24 | (inst_t *)__return_address) |
| 25 | 25 | ||
| 26 | extern int xfs_rename (bhv_desc_t *, bhv_vname_t *, bhv_vnode_t *, | ||
| 27 | bhv_vname_t *, cred_t *); | ||
| 28 | extern int xfs_get_dir_entry (bhv_vname_t *, xfs_inode_t **); | 26 | extern int xfs_get_dir_entry (bhv_vname_t *, xfs_inode_t **); |
| 29 | extern int xfs_dir_lookup_int (bhv_desc_t *, uint, bhv_vname_t *, xfs_ino_t *, | 27 | extern int xfs_dir_lookup_int (xfs_inode_t *, uint, bhv_vname_t *, xfs_ino_t *, |
| 30 | xfs_inode_t **); | 28 | xfs_inode_t **); |
| 31 | extern int xfs_truncate_file (xfs_mount_t *, xfs_inode_t *); | 29 | extern int xfs_truncate_file (xfs_mount_t *, xfs_inode_t *); |
| 32 | extern int xfs_dir_ialloc (xfs_trans_t **, xfs_inode_t *, mode_t, xfs_nlink_t, | 30 | extern int xfs_dir_ialloc (xfs_trans_t **, xfs_inode_t *, mode_t, xfs_nlink_t, |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 15bc01b2d6a0..2b30fa690b4a 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -52,15 +52,13 @@ | |||
| 52 | #include "xfs_trans_space.h" | 52 | #include "xfs_trans_space.h" |
| 53 | #include "xfs_log_priv.h" | 53 | #include "xfs_log_priv.h" |
| 54 | #include "xfs_filestream.h" | 54 | #include "xfs_filestream.h" |
| 55 | #include "xfs_vnodeops.h" | ||
| 55 | 56 | ||
| 56 | STATIC int | 57 | int |
| 57 | xfs_open( | 58 | xfs_open( |
| 58 | bhv_desc_t *bdp, | 59 | xfs_inode_t *ip) |
| 59 | cred_t *credp) | ||
| 60 | { | 60 | { |
| 61 | int mode; | 61 | int mode; |
| 62 | bhv_vnode_t *vp = BHV_TO_VNODE(bdp); | ||
| 63 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | ||
| 64 | 62 | ||
| 65 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) | 63 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) |
| 66 | return XFS_ERROR(EIO); | 64 | return XFS_ERROR(EIO); |
| @@ -69,7 +67,7 @@ xfs_open( | |||
| 69 | * If it's a directory with any blocks, read-ahead block 0 | 67 | * If it's a directory with any blocks, read-ahead block 0 |
| 70 | * as we're almost certain to have the next operation be a read there. | 68 | * as we're almost certain to have the next operation be a read there. |
| 71 | */ | 69 | */ |
| 72 | if (VN_ISDIR(vp) && ip->i_d.di_nextents > 0) { | 70 | if (S_ISDIR(ip->i_d.di_mode) && ip->i_d.di_nextents > 0) { |
| 73 | mode = xfs_ilock_map_shared(ip); | 71 | mode = xfs_ilock_map_shared(ip); |
| 74 | if (ip->i_d.di_nextents > 0) | 72 | if (ip->i_d.di_nextents > 0) |
| 75 | (void)xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK); | 73 | (void)xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK); |
| @@ -81,23 +79,17 @@ xfs_open( | |||
| 81 | /* | 79 | /* |
| 82 | * xfs_getattr | 80 | * xfs_getattr |
| 83 | */ | 81 | */ |
| 84 | STATIC int | 82 | int |
| 85 | xfs_getattr( | 83 | xfs_getattr( |
| 86 | bhv_desc_t *bdp, | 84 | xfs_inode_t *ip, |
| 87 | bhv_vattr_t *vap, | 85 | bhv_vattr_t *vap, |
| 88 | int flags, | 86 | int flags) |
| 89 | cred_t *credp) | ||
| 90 | { | 87 | { |
| 91 | xfs_inode_t *ip; | 88 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 92 | xfs_mount_t *mp; | 89 | xfs_mount_t *mp = ip->i_mount; |
| 93 | bhv_vnode_t *vp; | ||
| 94 | 90 | ||
| 95 | vp = BHV_TO_VNODE(bdp); | ||
| 96 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); | 91 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); |
| 97 | 92 | ||
| 98 | ip = XFS_BHVTOI(bdp); | ||
| 99 | mp = ip->i_mount; | ||
| 100 | |||
| 101 | if (XFS_FORCED_SHUTDOWN(mp)) | 93 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 102 | return XFS_ERROR(EIO); | 94 | return XFS_ERROR(EIO); |
| 103 | 95 | ||
| @@ -215,14 +207,14 @@ xfs_getattr( | |||
| 215 | */ | 207 | */ |
| 216 | int | 208 | int |
| 217 | xfs_setattr( | 209 | xfs_setattr( |
| 218 | bhv_desc_t *bdp, | 210 | xfs_inode_t *ip, |
| 219 | bhv_vattr_t *vap, | 211 | bhv_vattr_t *vap, |
| 220 | int flags, | 212 | int flags, |
| 221 | cred_t *credp) | 213 | cred_t *credp) |
| 222 | { | 214 | { |
| 223 | xfs_inode_t *ip; | 215 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 216 | xfs_mount_t *mp = ip->i_mount; | ||
| 224 | xfs_trans_t *tp; | 217 | xfs_trans_t *tp; |
| 225 | xfs_mount_t *mp; | ||
| 226 | int mask; | 218 | int mask; |
| 227 | int code; | 219 | int code; |
| 228 | uint lock_flags; | 220 | uint lock_flags; |
| @@ -230,14 +222,12 @@ xfs_setattr( | |||
| 230 | uid_t uid=0, iuid=0; | 222 | uid_t uid=0, iuid=0; |
| 231 | gid_t gid=0, igid=0; | 223 | gid_t gid=0, igid=0; |
| 232 | int timeflags = 0; | 224 | int timeflags = 0; |
| 233 | bhv_vnode_t *vp; | ||
| 234 | xfs_prid_t projid=0, iprojid=0; | 225 | xfs_prid_t projid=0, iprojid=0; |
| 235 | int mandlock_before, mandlock_after; | 226 | int mandlock_before, mandlock_after; |
| 236 | struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2; | 227 | struct xfs_dquot *udqp, *gdqp, *olddquot1, *olddquot2; |
| 237 | int file_owner; | 228 | int file_owner; |
| 238 | int need_iolock = 1; | 229 | int need_iolock = 1; |
| 239 | 230 | ||
| 240 | vp = BHV_TO_VNODE(bdp); | ||
| 241 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); | 231 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); |
| 242 | 232 | ||
| 243 | if (vp->v_vfsp->vfs_flag & VFS_RDONLY) | 233 | if (vp->v_vfsp->vfs_flag & VFS_RDONLY) |
| @@ -251,9 +241,6 @@ xfs_setattr( | |||
| 251 | return XFS_ERROR(EINVAL); | 241 | return XFS_ERROR(EINVAL); |
| 252 | } | 242 | } |
| 253 | 243 | ||
| 254 | ip = XFS_BHVTOI(bdp); | ||
| 255 | mp = ip->i_mount; | ||
| 256 | |||
| 257 | if (XFS_FORCED_SHUTDOWN(mp)) | 244 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 258 | return XFS_ERROR(EIO); | 245 | return XFS_ERROR(EIO); |
| 259 | 246 | ||
| @@ -924,19 +911,16 @@ xfs_setattr( | |||
| 924 | * xfs_access | 911 | * xfs_access |
| 925 | * Null conversion from vnode mode bits to inode mode bits, as in efs. | 912 | * Null conversion from vnode mode bits to inode mode bits, as in efs. |
| 926 | */ | 913 | */ |
| 927 | STATIC int | 914 | int |
| 928 | xfs_access( | 915 | xfs_access( |
| 929 | bhv_desc_t *bdp, | 916 | xfs_inode_t *ip, |
| 930 | int mode, | 917 | int mode, |
| 931 | cred_t *credp) | 918 | cred_t *credp) |
| 932 | { | 919 | { |
| 933 | xfs_inode_t *ip; | ||
| 934 | int error; | 920 | int error; |
| 935 | 921 | ||
| 936 | vn_trace_entry(BHV_TO_VNODE(bdp), __FUNCTION__, | 922 | vn_trace_entry(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address); |
| 937 | (inst_t *)__return_address); | ||
| 938 | 923 | ||
| 939 | ip = XFS_BHVTOI(bdp); | ||
| 940 | xfs_ilock(ip, XFS_ILOCK_SHARED); | 924 | xfs_ilock(ip, XFS_ILOCK_SHARED); |
| 941 | error = xfs_iaccess(ip, mode, credp); | 925 | error = xfs_iaccess(ip, mode, credp); |
| 942 | xfs_iunlock(ip, XFS_ILOCK_SHARED); | 926 | xfs_iunlock(ip, XFS_ILOCK_SHARED); |
| @@ -998,16 +982,11 @@ xfs_readlink_bmap( | |||
| 998 | return error; | 982 | return error; |
| 999 | } | 983 | } |
| 1000 | 984 | ||
| 1001 | /* | 985 | int |
| 1002 | * xfs_readlink | ||
| 1003 | * | ||
| 1004 | */ | ||
| 1005 | STATIC int | ||
| 1006 | xfs_readlink( | 986 | xfs_readlink( |
| 1007 | bhv_desc_t *bdp, | 987 | xfs_inode_t *ip, |
| 1008 | char *link) | 988 | char *link) |
| 1009 | { | 989 | { |
| 1010 | xfs_inode_t *ip = XFS_BHVTOI(bdp); | ||
| 1011 | xfs_mount_t *mp = ip->i_mount; | 990 | xfs_mount_t *mp = ip->i_mount; |
| 1012 | int pathlen; | 991 | int pathlen; |
| 1013 | int error = 0; | 992 | int error = 0; |
| @@ -1047,23 +1026,18 @@ xfs_readlink( | |||
| 1047 | * be held while flushing the data, so acquire after we're done | 1026 | * be held while flushing the data, so acquire after we're done |
| 1048 | * with that. | 1027 | * with that. |
| 1049 | */ | 1028 | */ |
| 1050 | STATIC int | 1029 | int |
| 1051 | xfs_fsync( | 1030 | xfs_fsync( |
| 1052 | bhv_desc_t *bdp, | 1031 | xfs_inode_t *ip, |
| 1053 | int flag, | 1032 | int flag, |
| 1054 | cred_t *credp, | ||
| 1055 | xfs_off_t start, | 1033 | xfs_off_t start, |
| 1056 | xfs_off_t stop) | 1034 | xfs_off_t stop) |
| 1057 | { | 1035 | { |
| 1058 | xfs_inode_t *ip; | ||
| 1059 | xfs_trans_t *tp; | 1036 | xfs_trans_t *tp; |
| 1060 | int error; | 1037 | int error; |
| 1061 | int log_flushed = 0, changed = 1; | 1038 | int log_flushed = 0, changed = 1; |
| 1062 | 1039 | ||
| 1063 | vn_trace_entry(BHV_TO_VNODE(bdp), | 1040 | vn_trace_entry(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address); |
| 1064 | __FUNCTION__, (inst_t *)__return_address); | ||
| 1065 | |||
| 1066 | ip = XFS_BHVTOI(bdp); | ||
| 1067 | 1041 | ||
| 1068 | ASSERT(start >= 0 && stop >= -1); | 1042 | ASSERT(start >= 0 && stop >= -1); |
| 1069 | 1043 | ||
| @@ -1533,19 +1507,14 @@ xfs_inactive_attrs( | |||
| 1533 | return 0; | 1507 | return 0; |
| 1534 | } | 1508 | } |
| 1535 | 1509 | ||
| 1536 | STATIC int | 1510 | int |
| 1537 | xfs_release( | 1511 | xfs_release( |
| 1538 | bhv_desc_t *bdp) | 1512 | xfs_inode_t *ip) |
| 1539 | { | 1513 | { |
| 1540 | xfs_inode_t *ip; | 1514 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 1541 | bhv_vnode_t *vp; | 1515 | xfs_mount_t *mp = ip->i_mount; |
| 1542 | xfs_mount_t *mp; | ||
| 1543 | int error; | 1516 | int error; |
| 1544 | 1517 | ||
| 1545 | vp = BHV_TO_VNODE(bdp); | ||
| 1546 | ip = XFS_BHVTOI(bdp); | ||
| 1547 | mp = ip->i_mount; | ||
| 1548 | |||
| 1549 | if (!VN_ISREG(vp) || (ip->i_d.di_mode == 0)) | 1518 | if (!VN_ISREG(vp) || (ip->i_d.di_mode == 0)) |
| 1550 | return 0; | 1519 | return 0; |
| 1551 | 1520 | ||
| @@ -1611,13 +1580,11 @@ xfs_release( | |||
| 1611 | * now be truncated. Also, we clear all of the read-ahead state | 1580 | * now be truncated. Also, we clear all of the read-ahead state |
| 1612 | * kept for the inode here since the file is now closed. | 1581 | * kept for the inode here since the file is now closed. |
| 1613 | */ | 1582 | */ |
| 1614 | STATIC int | 1583 | int |
| 1615 | xfs_inactive( | 1584 | xfs_inactive( |
| 1616 | bhv_desc_t *bdp, | 1585 | xfs_inode_t *ip) |
| 1617 | cred_t *credp) | ||
| 1618 | { | 1586 | { |
| 1619 | xfs_inode_t *ip; | 1587 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 1620 | bhv_vnode_t *vp; | ||
| 1621 | xfs_bmap_free_t free_list; | 1588 | xfs_bmap_free_t free_list; |
| 1622 | xfs_fsblock_t first_block; | 1589 | xfs_fsblock_t first_block; |
| 1623 | int committed; | 1590 | int committed; |
| @@ -1626,11 +1593,8 @@ xfs_inactive( | |||
| 1626 | int error; | 1593 | int error; |
| 1627 | int truncate; | 1594 | int truncate; |
| 1628 | 1595 | ||
| 1629 | vp = BHV_TO_VNODE(bdp); | ||
| 1630 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); | 1596 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); |
| 1631 | 1597 | ||
| 1632 | ip = XFS_BHVTOI(bdp); | ||
| 1633 | |||
| 1634 | /* | 1598 | /* |
| 1635 | * If the inode is already free, then there can be nothing | 1599 | * If the inode is already free, then there can be nothing |
| 1636 | * to clean up here. | 1600 | * to clean up here. |
| @@ -1831,34 +1795,24 @@ xfs_inactive( | |||
| 1831 | } | 1795 | } |
| 1832 | 1796 | ||
| 1833 | 1797 | ||
| 1834 | /* | 1798 | int |
| 1835 | * xfs_lookup | ||
| 1836 | */ | ||
| 1837 | STATIC int | ||
| 1838 | xfs_lookup( | 1799 | xfs_lookup( |
| 1839 | bhv_desc_t *dir_bdp, | 1800 | xfs_inode_t *dp, |
| 1840 | bhv_vname_t *dentry, | 1801 | bhv_vname_t *dentry, |
| 1841 | bhv_vnode_t **vpp, | 1802 | bhv_vnode_t **vpp) |
| 1842 | int flags, | ||
| 1843 | bhv_vnode_t *rdir, | ||
| 1844 | cred_t *credp) | ||
| 1845 | { | 1803 | { |
| 1846 | xfs_inode_t *dp, *ip; | 1804 | xfs_inode_t *ip; |
| 1847 | xfs_ino_t e_inum; | 1805 | xfs_ino_t e_inum; |
| 1848 | int error; | 1806 | int error; |
| 1849 | uint lock_mode; | 1807 | uint lock_mode; |
| 1850 | bhv_vnode_t *dir_vp; | ||
| 1851 | |||
| 1852 | dir_vp = BHV_TO_VNODE(dir_bdp); | ||
| 1853 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); | ||
| 1854 | 1808 | ||
| 1855 | dp = XFS_BHVTOI(dir_bdp); | 1809 | vn_trace_entry(XFS_ITOV(dp), __FUNCTION__, (inst_t *)__return_address); |
| 1856 | 1810 | ||
| 1857 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) | 1811 | if (XFS_FORCED_SHUTDOWN(dp->i_mount)) |
| 1858 | return XFS_ERROR(EIO); | 1812 | return XFS_ERROR(EIO); |
| 1859 | 1813 | ||
| 1860 | lock_mode = xfs_ilock_map_shared(dp); | 1814 | lock_mode = xfs_ilock_map_shared(dp); |
| 1861 | error = xfs_dir_lookup_int(dir_bdp, lock_mode, dentry, &e_inum, &ip); | 1815 | error = xfs_dir_lookup_int(dp, lock_mode, dentry, &e_inum, &ip); |
| 1862 | if (!error) { | 1816 | if (!error) { |
| 1863 | *vpp = XFS_ITOV(ip); | 1817 | *vpp = XFS_ITOV(ip); |
| 1864 | ITRACE(ip); | 1818 | ITRACE(ip); |
| @@ -1867,29 +1821,25 @@ xfs_lookup( | |||
| 1867 | return error; | 1821 | return error; |
| 1868 | } | 1822 | } |
| 1869 | 1823 | ||
| 1870 | 1824 | int | |
| 1871 | /* | ||
| 1872 | * xfs_create (create a new file). | ||
| 1873 | */ | ||
| 1874 | STATIC int | ||
| 1875 | xfs_create( | 1825 | xfs_create( |
| 1876 | bhv_desc_t *dir_bdp, | 1826 | xfs_inode_t *dp, |
| 1877 | bhv_vname_t *dentry, | 1827 | bhv_vname_t *dentry, |
| 1878 | bhv_vattr_t *vap, | 1828 | bhv_vattr_t *vap, |
| 1879 | bhv_vnode_t **vpp, | 1829 | bhv_vnode_t **vpp, |
| 1880 | cred_t *credp) | 1830 | cred_t *credp) |
| 1881 | { | 1831 | { |
| 1882 | char *name = VNAME(dentry); | 1832 | char *name = VNAME(dentry); |
| 1883 | bhv_vnode_t *dir_vp; | 1833 | xfs_mount_t *mp = dp->i_mount; |
| 1884 | xfs_inode_t *dp, *ip; | 1834 | bhv_vnode_t *dir_vp = XFS_ITOV(dp); |
| 1835 | xfs_inode_t *ip; | ||
| 1885 | bhv_vnode_t *vp = NULL; | 1836 | bhv_vnode_t *vp = NULL; |
| 1886 | xfs_trans_t *tp; | 1837 | xfs_trans_t *tp; |
| 1887 | xfs_mount_t *mp; | ||
| 1888 | xfs_dev_t rdev; | 1838 | xfs_dev_t rdev; |
| 1889 | int error; | 1839 | int error; |
| 1890 | xfs_bmap_free_t free_list; | 1840 | xfs_bmap_free_t free_list; |
| 1891 | xfs_fsblock_t first_block; | 1841 | xfs_fsblock_t first_block; |
| 1892 | boolean_t dp_joined_to_trans; | 1842 | boolean_t unlock_dp_on_error = B_FALSE; |
| 1893 | int dm_event_sent = 0; | 1843 | int dm_event_sent = 0; |
| 1894 | uint cancel_flags; | 1844 | uint cancel_flags; |
| 1895 | int committed; | 1845 | int committed; |
| @@ -1900,12 +1850,8 @@ xfs_create( | |||
| 1900 | int namelen; | 1850 | int namelen; |
| 1901 | 1851 | ||
| 1902 | ASSERT(!*vpp); | 1852 | ASSERT(!*vpp); |
| 1903 | dir_vp = BHV_TO_VNODE(dir_bdp); | ||
| 1904 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); | 1853 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); |
| 1905 | 1854 | ||
| 1906 | dp = XFS_BHVTOI(dir_bdp); | ||
| 1907 | mp = dp->i_mount; | ||
| 1908 | |||
| 1909 | dm_di_mode = vap->va_mode; | 1855 | dm_di_mode = vap->va_mode; |
| 1910 | namelen = VNAMELEN(dentry); | 1856 | namelen = VNAMELEN(dentry); |
| 1911 | 1857 | ||
| @@ -1943,7 +1889,6 @@ xfs_create( | |||
| 1943 | goto std_return; | 1889 | goto std_return; |
| 1944 | 1890 | ||
| 1945 | ip = NULL; | 1891 | ip = NULL; |
| 1946 | dp_joined_to_trans = B_FALSE; | ||
| 1947 | 1892 | ||
| 1948 | tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE); | 1893 | tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE); |
| 1949 | cancel_flags = XFS_TRANS_RELEASE_LOG_RES; | 1894 | cancel_flags = XFS_TRANS_RELEASE_LOG_RES; |
| @@ -1963,11 +1908,11 @@ xfs_create( | |||
| 1963 | } | 1908 | } |
| 1964 | if (error) { | 1909 | if (error) { |
| 1965 | cancel_flags = 0; | 1910 | cancel_flags = 0; |
| 1966 | dp = NULL; | ||
| 1967 | goto error_return; | 1911 | goto error_return; |
| 1968 | } | 1912 | } |
| 1969 | 1913 | ||
| 1970 | xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); | 1914 | xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); |
| 1915 | unlock_dp_on_error = B_TRUE; | ||
| 1971 | 1916 | ||
| 1972 | XFS_BMAP_INIT(&free_list, &first_block); | 1917 | XFS_BMAP_INIT(&free_list, &first_block); |
| 1973 | 1918 | ||
| @@ -2001,15 +1946,15 @@ xfs_create( | |||
| 2001 | ASSERT(ismrlocked (&ip->i_lock, MR_UPDATE)); | 1946 | ASSERT(ismrlocked (&ip->i_lock, MR_UPDATE)); |
| 2002 | 1947 | ||
| 2003 | /* | 1948 | /* |
| 2004 | * Now we join the directory inode to the transaction. | 1949 | * Now we join the directory inode to the transaction. We do not do it |
| 2005 | * We do not do it earlier because xfs_dir_ialloc | 1950 | * earlier because xfs_dir_ialloc might commit the previous transaction |
| 2006 | * might commit the previous transaction (and release | 1951 | * (and release all the locks). An error from here on will result in |
| 2007 | * all the locks). | 1952 | * the transaction cancel unlocking dp so don't do it explicitly in the |
| 1953 | * error path. | ||
| 2008 | */ | 1954 | */ |
| 2009 | |||
| 2010 | VN_HOLD(dir_vp); | 1955 | VN_HOLD(dir_vp); |
| 2011 | xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); | 1956 | xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); |
| 2012 | dp_joined_to_trans = B_TRUE; | 1957 | unlock_dp_on_error = B_FALSE; |
| 2013 | 1958 | ||
| 2014 | error = xfs_dir_createname(tp, dp, name, namelen, ip->i_ino, | 1959 | error = xfs_dir_createname(tp, dp, name, namelen, ip->i_ino, |
| 2015 | &first_block, &free_list, resblks ? | 1960 | &first_block, &free_list, resblks ? |
| @@ -2075,7 +2020,7 @@ xfs_create( | |||
| 2075 | 2020 | ||
| 2076 | std_return: | 2021 | std_return: |
| 2077 | if ((*vpp || (error != 0 && dm_event_sent != 0)) && | 2022 | if ((*vpp || (error != 0 && dm_event_sent != 0)) && |
| 2078 | DM_EVENT_ENABLED(XFS_BHVTOI(dir_bdp), DM_EVENT_POSTCREATE)) { | 2023 | DM_EVENT_ENABLED(dp, DM_EVENT_POSTCREATE)) { |
| 2079 | (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, | 2024 | (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, |
| 2080 | dir_vp, DM_RIGHT_NULL, | 2025 | dir_vp, DM_RIGHT_NULL, |
| 2081 | *vpp ? vp:NULL, | 2026 | *vpp ? vp:NULL, |
| @@ -2092,11 +2037,12 @@ std_return: | |||
| 2092 | if (tp != NULL) | 2037 | if (tp != NULL) |
| 2093 | xfs_trans_cancel(tp, cancel_flags); | 2038 | xfs_trans_cancel(tp, cancel_flags); |
| 2094 | 2039 | ||
| 2095 | if (!dp_joined_to_trans && (dp != NULL)) | ||
| 2096 | xfs_iunlock(dp, XFS_ILOCK_EXCL); | ||
| 2097 | XFS_QM_DQRELE(mp, udqp); | 2040 | XFS_QM_DQRELE(mp, udqp); |
| 2098 | XFS_QM_DQRELE(mp, gdqp); | 2041 | XFS_QM_DQRELE(mp, gdqp); |
| 2099 | 2042 | ||
| 2043 | if (unlock_dp_on_error) | ||
| 2044 | xfs_iunlock(dp, XFS_ILOCK_EXCL); | ||
| 2045 | |||
| 2100 | goto std_return; | 2046 | goto std_return; |
| 2101 | 2047 | ||
| 2102 | abort_rele: | 2048 | abort_rele: |
| @@ -2367,22 +2313,16 @@ int remove_which_error_return = 0; | |||
| 2367 | #define REMOVE_DEBUG_TRACE(x) | 2313 | #define REMOVE_DEBUG_TRACE(x) |
| 2368 | #endif /* ! DEBUG */ | 2314 | #endif /* ! DEBUG */ |
| 2369 | 2315 | ||
| 2370 | 2316 | int | |
| 2371 | /* | ||
| 2372 | * xfs_remove | ||
| 2373 | * | ||
| 2374 | */ | ||
| 2375 | STATIC int | ||
| 2376 | xfs_remove( | 2317 | xfs_remove( |
| 2377 | bhv_desc_t *dir_bdp, | 2318 | xfs_inode_t *dp, |
| 2378 | bhv_vname_t *dentry, | 2319 | bhv_vname_t *dentry) |
| 2379 | cred_t *credp) | ||
| 2380 | { | 2320 | { |
| 2381 | bhv_vnode_t *dir_vp; | 2321 | bhv_vnode_t *dir_vp = XFS_ITOV(dp); |
| 2382 | char *name = VNAME(dentry); | 2322 | char *name = VNAME(dentry); |
| 2383 | xfs_inode_t *dp, *ip; | 2323 | xfs_mount_t *mp = dp->i_mount; |
| 2324 | xfs_inode_t *ip; | ||
| 2384 | xfs_trans_t *tp = NULL; | 2325 | xfs_trans_t *tp = NULL; |
| 2385 | xfs_mount_t *mp; | ||
| 2386 | int error = 0; | 2326 | int error = 0; |
| 2387 | xfs_bmap_free_t free_list; | 2327 | xfs_bmap_free_t free_list; |
| 2388 | xfs_fsblock_t first_block; | 2328 | xfs_fsblock_t first_block; |
| @@ -2393,12 +2333,8 @@ xfs_remove( | |||
| 2393 | uint resblks; | 2333 | uint resblks; |
| 2394 | int namelen; | 2334 | int namelen; |
| 2395 | 2335 | ||
| 2396 | dir_vp = BHV_TO_VNODE(dir_bdp); | ||
| 2397 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); | 2336 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); |
| 2398 | 2337 | ||
| 2399 | dp = XFS_BHVTOI(dir_bdp); | ||
| 2400 | mp = dp->i_mount; | ||
| 2401 | |||
| 2402 | if (XFS_FORCED_SHUTDOWN(mp)) | 2338 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 2403 | return XFS_ERROR(EIO); | 2339 | return XFS_ERROR(EIO); |
| 2404 | 2340 | ||
| @@ -2623,42 +2559,32 @@ xfs_remove( | |||
| 2623 | goto std_return; | 2559 | goto std_return; |
| 2624 | } | 2560 | } |
| 2625 | 2561 | ||
| 2626 | 2562 | int | |
| 2627 | /* | ||
| 2628 | * xfs_link | ||
| 2629 | * | ||
| 2630 | */ | ||
| 2631 | STATIC int | ||
| 2632 | xfs_link( | 2563 | xfs_link( |
| 2633 | bhv_desc_t *target_dir_bdp, | 2564 | xfs_inode_t *tdp, |
| 2634 | bhv_vnode_t *src_vp, | 2565 | bhv_vnode_t *src_vp, |
| 2635 | bhv_vname_t *dentry, | 2566 | bhv_vname_t *dentry) |
| 2636 | cred_t *credp) | ||
| 2637 | { | 2567 | { |
| 2638 | xfs_inode_t *tdp, *sip; | 2568 | bhv_vnode_t *target_dir_vp = XFS_ITOV(tdp); |
| 2569 | xfs_mount_t *mp = tdp->i_mount; | ||
| 2570 | xfs_inode_t *sip = xfs_vtoi(src_vp); | ||
| 2639 | xfs_trans_t *tp; | 2571 | xfs_trans_t *tp; |
| 2640 | xfs_mount_t *mp; | ||
| 2641 | xfs_inode_t *ips[2]; | 2572 | xfs_inode_t *ips[2]; |
| 2642 | int error; | 2573 | int error; |
| 2643 | xfs_bmap_free_t free_list; | 2574 | xfs_bmap_free_t free_list; |
| 2644 | xfs_fsblock_t first_block; | 2575 | xfs_fsblock_t first_block; |
| 2645 | int cancel_flags; | 2576 | int cancel_flags; |
| 2646 | int committed; | 2577 | int committed; |
| 2647 | bhv_vnode_t *target_dir_vp; | ||
| 2648 | int resblks; | 2578 | int resblks; |
| 2649 | char *target_name = VNAME(dentry); | 2579 | char *target_name = VNAME(dentry); |
| 2650 | int target_namelen; | 2580 | int target_namelen; |
| 2651 | 2581 | ||
| 2652 | target_dir_vp = BHV_TO_VNODE(target_dir_bdp); | ||
| 2653 | vn_trace_entry(target_dir_vp, __FUNCTION__, (inst_t *)__return_address); | 2582 | vn_trace_entry(target_dir_vp, __FUNCTION__, (inst_t *)__return_address); |
| 2654 | vn_trace_entry(src_vp, __FUNCTION__, (inst_t *)__return_address); | 2583 | vn_trace_entry(src_vp, __FUNCTION__, (inst_t *)__return_address); |
| 2655 | 2584 | ||
| 2656 | target_namelen = VNAMELEN(dentry); | 2585 | target_namelen = VNAMELEN(dentry); |
| 2657 | ASSERT(!VN_ISDIR(src_vp)); | 2586 | ASSERT(!VN_ISDIR(src_vp)); |
| 2658 | 2587 | ||
| 2659 | sip = xfs_vtoi(src_vp); | ||
| 2660 | tdp = XFS_BHVTOI(target_dir_bdp); | ||
| 2661 | mp = tdp->i_mount; | ||
| 2662 | if (XFS_FORCED_SHUTDOWN(mp)) | 2588 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 2663 | return XFS_ERROR(EIO); | 2589 | return XFS_ERROR(EIO); |
| 2664 | 2590 | ||
| @@ -2791,50 +2717,38 @@ std_return: | |||
| 2791 | } | 2717 | } |
| 2792 | 2718 | ||
| 2793 | 2719 | ||
| 2794 | /* | 2720 | int |
| 2795 | * xfs_mkdir | ||
| 2796 | * | ||
| 2797 | */ | ||
| 2798 | STATIC int | ||
| 2799 | xfs_mkdir( | 2721 | xfs_mkdir( |
| 2800 | bhv_desc_t *dir_bdp, | 2722 | xfs_inode_t *dp, |
| 2801 | bhv_vname_t *dentry, | 2723 | bhv_vname_t *dentry, |
| 2802 | bhv_vattr_t *vap, | 2724 | bhv_vattr_t *vap, |
| 2803 | bhv_vnode_t **vpp, | 2725 | bhv_vnode_t **vpp, |
| 2804 | cred_t *credp) | 2726 | cred_t *credp) |
| 2805 | { | 2727 | { |
| 2728 | bhv_vnode_t *dir_vp = XFS_ITOV(dp); | ||
| 2806 | char *dir_name = VNAME(dentry); | 2729 | char *dir_name = VNAME(dentry); |
| 2807 | xfs_inode_t *dp; | 2730 | int dir_namelen = VNAMELEN(dentry); |
| 2731 | xfs_mount_t *mp = dp->i_mount; | ||
| 2808 | xfs_inode_t *cdp; /* inode of created dir */ | 2732 | xfs_inode_t *cdp; /* inode of created dir */ |
| 2809 | bhv_vnode_t *cvp; /* vnode of created dir */ | 2733 | bhv_vnode_t *cvp; /* vnode of created dir */ |
| 2810 | xfs_trans_t *tp; | 2734 | xfs_trans_t *tp; |
| 2811 | xfs_mount_t *mp; | ||
| 2812 | int cancel_flags; | 2735 | int cancel_flags; |
| 2813 | int error; | 2736 | int error; |
| 2814 | int committed; | 2737 | int committed; |
| 2815 | xfs_bmap_free_t free_list; | 2738 | xfs_bmap_free_t free_list; |
| 2816 | xfs_fsblock_t first_block; | 2739 | xfs_fsblock_t first_block; |
| 2817 | bhv_vnode_t *dir_vp; | 2740 | boolean_t unlock_dp_on_error = B_FALSE; |
| 2818 | boolean_t dp_joined_to_trans; | ||
| 2819 | boolean_t created = B_FALSE; | 2741 | boolean_t created = B_FALSE; |
| 2820 | int dm_event_sent = 0; | 2742 | int dm_event_sent = 0; |
| 2821 | xfs_prid_t prid; | 2743 | xfs_prid_t prid; |
| 2822 | struct xfs_dquot *udqp, *gdqp; | 2744 | struct xfs_dquot *udqp, *gdqp; |
| 2823 | uint resblks; | 2745 | uint resblks; |
| 2824 | int dm_di_mode; | 2746 | int dm_di_mode; |
| 2825 | int dir_namelen; | ||
| 2826 | |||
| 2827 | dir_vp = BHV_TO_VNODE(dir_bdp); | ||
| 2828 | dp = XFS_BHVTOI(dir_bdp); | ||
| 2829 | mp = dp->i_mount; | ||
| 2830 | 2747 | ||
| 2831 | if (XFS_FORCED_SHUTDOWN(mp)) | 2748 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 2832 | return XFS_ERROR(EIO); | 2749 | return XFS_ERROR(EIO); |
| 2833 | 2750 | ||
| 2834 | dir_namelen = VNAMELEN(dentry); | ||
| 2835 | |||
| 2836 | tp = NULL; | 2751 | tp = NULL; |
| 2837 | dp_joined_to_trans = B_FALSE; | ||
| 2838 | dm_di_mode = vap->va_mode; | 2752 | dm_di_mode = vap->va_mode; |
| 2839 | 2753 | ||
| 2840 | if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) { | 2754 | if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) { |
| @@ -2882,11 +2796,11 @@ xfs_mkdir( | |||
| 2882 | } | 2796 | } |
| 2883 | if (error) { | 2797 | if (error) { |
| 2884 | cancel_flags = 0; | 2798 | cancel_flags = 0; |
| 2885 | dp = NULL; | ||
| 2886 | goto error_return; | 2799 | goto error_return; |
| 2887 | } | 2800 | } |
| 2888 | 2801 | ||
| 2889 | xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); | 2802 | xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); |
| 2803 | unlock_dp_on_error = B_TRUE; | ||
| 2890 | 2804 | ||
| 2891 | /* | 2805 | /* |
| 2892 | * Check for directory link count overflow. | 2806 | * Check for directory link count overflow. |
| @@ -2923,11 +2837,13 @@ xfs_mkdir( | |||
| 2923 | * Now we add the directory inode to the transaction. | 2837 | * Now we add the directory inode to the transaction. |
| 2924 | * We waited until now since xfs_dir_ialloc might start | 2838 | * We waited until now since xfs_dir_ialloc might start |
| 2925 | * a new transaction. Had we joined the transaction | 2839 | * a new transaction. Had we joined the transaction |
| 2926 | * earlier, the locks might have gotten released. | 2840 | * earlier, the locks might have gotten released. An error |
| 2841 | * from here on will result in the transaction cancel | ||
| 2842 | * unlocking dp so don't do it explicitly in the error path. | ||
| 2927 | */ | 2843 | */ |
| 2928 | VN_HOLD(dir_vp); | 2844 | VN_HOLD(dir_vp); |
| 2929 | xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); | 2845 | xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); |
| 2930 | dp_joined_to_trans = B_TRUE; | 2846 | unlock_dp_on_error = B_FALSE; |
| 2931 | 2847 | ||
| 2932 | XFS_BMAP_INIT(&free_list, &first_block); | 2848 | XFS_BMAP_INIT(&free_list, &first_block); |
| 2933 | 2849 | ||
| @@ -2995,7 +2911,7 @@ xfs_mkdir( | |||
| 2995 | 2911 | ||
| 2996 | std_return: | 2912 | std_return: |
| 2997 | if ((created || (error != 0 && dm_event_sent != 0)) && | 2913 | if ((created || (error != 0 && dm_event_sent != 0)) && |
| 2998 | DM_EVENT_ENABLED(XFS_BHVTOI(dir_bdp), DM_EVENT_POSTCREATE)) { | 2914 | DM_EVENT_ENABLED(dp, DM_EVENT_POSTCREATE)) { |
| 2999 | (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, | 2915 | (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE, |
| 3000 | dir_vp, DM_RIGHT_NULL, | 2916 | dir_vp, DM_RIGHT_NULL, |
| 3001 | created ? XFS_ITOV(cdp):NULL, | 2917 | created ? XFS_ITOV(cdp):NULL, |
| @@ -3015,49 +2931,36 @@ std_return: | |||
| 3015 | XFS_QM_DQRELE(mp, udqp); | 2931 | XFS_QM_DQRELE(mp, udqp); |
| 3016 | XFS_QM_DQRELE(mp, gdqp); | 2932 | XFS_QM_DQRELE(mp, gdqp); |
| 3017 | 2933 | ||
| 3018 | if (!dp_joined_to_trans && (dp != NULL)) { | 2934 | if (unlock_dp_on_error) |
| 3019 | xfs_iunlock(dp, XFS_ILOCK_EXCL); | 2935 | xfs_iunlock(dp, XFS_ILOCK_EXCL); |
| 3020 | } | ||
| 3021 | 2936 | ||
| 3022 | goto std_return; | 2937 | goto std_return; |
| 3023 | } | 2938 | } |
| 3024 | 2939 | ||
| 3025 | 2940 | int | |
| 3026 | /* | ||
| 3027 | * xfs_rmdir | ||
| 3028 | * | ||
| 3029 | */ | ||
| 3030 | STATIC int | ||
| 3031 | xfs_rmdir( | 2941 | xfs_rmdir( |
| 3032 | bhv_desc_t *dir_bdp, | 2942 | xfs_inode_t *dp, |
| 3033 | bhv_vname_t *dentry, | 2943 | bhv_vname_t *dentry) |
| 3034 | cred_t *credp) | ||
| 3035 | { | 2944 | { |
| 2945 | bhv_vnode_t *dir_vp = XFS_ITOV(dp); | ||
| 3036 | char *name = VNAME(dentry); | 2946 | char *name = VNAME(dentry); |
| 3037 | xfs_inode_t *dp; | 2947 | int namelen = VNAMELEN(dentry); |
| 3038 | xfs_inode_t *cdp; /* child directory */ | 2948 | xfs_mount_t *mp = dp->i_mount; |
| 2949 | xfs_inode_t *cdp; /* child directory */ | ||
| 3039 | xfs_trans_t *tp; | 2950 | xfs_trans_t *tp; |
| 3040 | xfs_mount_t *mp; | ||
| 3041 | int error; | 2951 | int error; |
| 3042 | xfs_bmap_free_t free_list; | 2952 | xfs_bmap_free_t free_list; |
| 3043 | xfs_fsblock_t first_block; | 2953 | xfs_fsblock_t first_block; |
| 3044 | int cancel_flags; | 2954 | int cancel_flags; |
| 3045 | int committed; | 2955 | int committed; |
| 3046 | bhv_vnode_t *dir_vp; | ||
| 3047 | int dm_di_mode = S_IFDIR; | 2956 | int dm_di_mode = S_IFDIR; |
| 3048 | int last_cdp_link; | 2957 | int last_cdp_link; |
| 3049 | int namelen; | ||
| 3050 | uint resblks; | 2958 | uint resblks; |
| 3051 | 2959 | ||
| 3052 | dir_vp = BHV_TO_VNODE(dir_bdp); | ||
| 3053 | dp = XFS_BHVTOI(dir_bdp); | ||
| 3054 | mp = dp->i_mount; | ||
| 3055 | |||
| 3056 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); | 2960 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); |
| 3057 | 2961 | ||
| 3058 | if (XFS_FORCED_SHUTDOWN(XFS_BHVTOI(dir_bdp)->i_mount)) | 2962 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 3059 | return XFS_ERROR(EIO); | 2963 | return XFS_ERROR(EIO); |
| 3060 | namelen = VNAMELEN(dentry); | ||
| 3061 | 2964 | ||
| 3062 | if (!xfs_get_dir_entry(dentry, &cdp)) { | 2965 | if (!xfs_get_dir_entry(dentry, &cdp)) { |
| 3063 | dm_di_mode = cdp->i_d.di_mode; | 2966 | dm_di_mode = cdp->i_d.di_mode; |
| @@ -3272,25 +3175,24 @@ xfs_rmdir( | |||
| 3272 | goto std_return; | 3175 | goto std_return; |
| 3273 | } | 3176 | } |
| 3274 | 3177 | ||
| 3275 | STATIC int | 3178 | int |
| 3276 | xfs_symlink( | 3179 | xfs_symlink( |
| 3277 | bhv_desc_t *dir_bdp, | 3180 | xfs_inode_t *dp, |
| 3278 | bhv_vname_t *dentry, | 3181 | bhv_vname_t *dentry, |
| 3279 | bhv_vattr_t *vap, | 3182 | bhv_vattr_t *vap, |
| 3280 | char *target_path, | 3183 | char *target_path, |
| 3281 | bhv_vnode_t **vpp, | 3184 | bhv_vnode_t **vpp, |
| 3282 | cred_t *credp) | 3185 | cred_t *credp) |
| 3283 | { | 3186 | { |
| 3187 | bhv_vnode_t *dir_vp = XFS_ITOV(dp); | ||
| 3188 | xfs_mount_t *mp = dp->i_mount; | ||
| 3284 | xfs_trans_t *tp; | 3189 | xfs_trans_t *tp; |
| 3285 | xfs_mount_t *mp; | ||
| 3286 | xfs_inode_t *dp; | ||
| 3287 | xfs_inode_t *ip; | 3190 | xfs_inode_t *ip; |
| 3288 | int error; | 3191 | int error; |
| 3289 | int pathlen; | 3192 | int pathlen; |
| 3290 | xfs_bmap_free_t free_list; | 3193 | xfs_bmap_free_t free_list; |
| 3291 | xfs_fsblock_t first_block; | 3194 | xfs_fsblock_t first_block; |
| 3292 | boolean_t dp_joined_to_trans; | 3195 | boolean_t unlock_dp_on_error = B_FALSE; |
| 3293 | bhv_vnode_t *dir_vp; | ||
| 3294 | uint cancel_flags; | 3196 | uint cancel_flags; |
| 3295 | int committed; | 3197 | int committed; |
| 3296 | xfs_fileoff_t first_fsb; | 3198 | xfs_fileoff_t first_fsb; |
| @@ -3309,16 +3211,12 @@ xfs_symlink( | |||
| 3309 | int link_namelen; | 3211 | int link_namelen; |
| 3310 | 3212 | ||
| 3311 | *vpp = NULL; | 3213 | *vpp = NULL; |
| 3312 | dir_vp = BHV_TO_VNODE(dir_bdp); | ||
| 3313 | dp = XFS_BHVTOI(dir_bdp); | ||
| 3314 | dp_joined_to_trans = B_FALSE; | ||
| 3315 | error = 0; | 3214 | error = 0; |
| 3316 | ip = NULL; | 3215 | ip = NULL; |
| 3317 | tp = NULL; | 3216 | tp = NULL; |
| 3318 | 3217 | ||
| 3319 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); | 3218 | vn_trace_entry(dir_vp, __FUNCTION__, (inst_t *)__return_address); |
| 3320 | 3219 | ||
| 3321 | mp = dp->i_mount; | ||
| 3322 | 3220 | ||
| 3323 | if (XFS_FORCED_SHUTDOWN(mp)) | 3221 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 3324 | return XFS_ERROR(EIO); | 3222 | return XFS_ERROR(EIO); |
| @@ -3404,11 +3302,11 @@ xfs_symlink( | |||
| 3404 | } | 3302 | } |
| 3405 | if (error) { | 3303 | if (error) { |
| 3406 | cancel_flags = 0; | 3304 | cancel_flags = 0; |
| 3407 | dp = NULL; | ||
| 3408 | goto error_return; | 3305 | goto error_return; |
| 3409 | } | 3306 | } |
| 3410 | 3307 | ||
| 3411 | xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); | 3308 | xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); |
| 3309 | unlock_dp_on_error = B_TRUE; | ||
| 3412 | 3310 | ||
| 3413 | /* | 3311 | /* |
| 3414 | * Check whether the directory allows new symlinks or not. | 3312 | * Check whether the directory allows new symlinks or not. |
| @@ -3449,9 +3347,14 @@ xfs_symlink( | |||
| 3449 | } | 3347 | } |
| 3450 | ITRACE(ip); | 3348 | ITRACE(ip); |
| 3451 | 3349 | ||
| 3350 | /* | ||
| 3351 | * An error after we've joined dp to the transaction will result in the | ||
| 3352 | * transaction cancel unlocking dp so don't do it explicitly in the | ||
| 3353 | * error path. | ||
| 3354 | */ | ||
| 3452 | VN_HOLD(dir_vp); | 3355 | VN_HOLD(dir_vp); |
| 3453 | xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); | 3356 | xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); |
| 3454 | dp_joined_to_trans = B_TRUE; | 3357 | unlock_dp_on_error = B_FALSE; |
| 3455 | 3358 | ||
| 3456 | /* | 3359 | /* |
| 3457 | * Also attach the dquot(s) to it, if applicable. | 3360 | * Also attach the dquot(s) to it, if applicable. |
| @@ -3557,7 +3460,7 @@ xfs_symlink( | |||
| 3557 | /* Fall through to std_return with error = 0 or errno from | 3460 | /* Fall through to std_return with error = 0 or errno from |
| 3558 | * xfs_trans_commit */ | 3461 | * xfs_trans_commit */ |
| 3559 | std_return: | 3462 | std_return: |
| 3560 | if (DM_EVENT_ENABLED(XFS_BHVTOI(dir_bdp), DM_EVENT_POSTSYMLINK)) { | 3463 | if (DM_EVENT_ENABLED(dp, DM_EVENT_POSTSYMLINK)) { |
| 3561 | (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK, | 3464 | (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK, |
| 3562 | dir_vp, DM_RIGHT_NULL, | 3465 | dir_vp, DM_RIGHT_NULL, |
| 3563 | error ? NULL : XFS_ITOV(ip), | 3466 | error ? NULL : XFS_ITOV(ip), |
| @@ -3584,9 +3487,8 @@ std_return: | |||
| 3584 | XFS_QM_DQRELE(mp, udqp); | 3487 | XFS_QM_DQRELE(mp, udqp); |
| 3585 | XFS_QM_DQRELE(mp, gdqp); | 3488 | XFS_QM_DQRELE(mp, gdqp); |
| 3586 | 3489 | ||
| 3587 | if (!dp_joined_to_trans && (dp != NULL)) { | 3490 | if (unlock_dp_on_error) |
| 3588 | xfs_iunlock(dp, XFS_ILOCK_EXCL); | 3491 | xfs_iunlock(dp, XFS_ILOCK_EXCL); |
| 3589 | } | ||
| 3590 | 3492 | ||
| 3591 | goto std_return; | 3493 | goto std_return; |
| 3592 | } | 3494 | } |
| @@ -3598,20 +3500,16 @@ std_return: | |||
| 3598 | * A fid routine that takes a pointer to a previously allocated | 3500 | * A fid routine that takes a pointer to a previously allocated |
| 3599 | * fid structure (like xfs_fast_fid) but uses a 64 bit inode number. | 3501 | * fid structure (like xfs_fast_fid) but uses a 64 bit inode number. |
| 3600 | */ | 3502 | */ |
| 3601 | STATIC int | 3503 | int |
| 3602 | xfs_fid2( | 3504 | xfs_fid2( |
| 3603 | bhv_desc_t *bdp, | 3505 | xfs_inode_t *ip, |
| 3604 | fid_t *fidp) | 3506 | fid_t *fidp) |
| 3605 | { | 3507 | { |
| 3606 | xfs_inode_t *ip; | 3508 | xfs_fid2_t *xfid = (xfs_fid2_t *)fidp; |
| 3607 | xfs_fid2_t *xfid; | ||
| 3608 | 3509 | ||
| 3609 | vn_trace_entry(BHV_TO_VNODE(bdp), __FUNCTION__, | 3510 | vn_trace_entry(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address); |
| 3610 | (inst_t *)__return_address); | ||
| 3611 | ASSERT(sizeof(fid_t) >= sizeof(xfs_fid2_t)); | 3511 | ASSERT(sizeof(fid_t) >= sizeof(xfs_fid2_t)); |
| 3612 | 3512 | ||
| 3613 | xfid = (xfs_fid2_t *)fidp; | ||
| 3614 | ip = XFS_BHVTOI(bdp); | ||
| 3615 | xfid->fid_len = sizeof(xfs_fid2_t) - sizeof(xfid->fid_len); | 3513 | xfid->fid_len = sizeof(xfs_fid2_t) - sizeof(xfid->fid_len); |
| 3616 | xfid->fid_pad = 0; | 3514 | xfid->fid_pad = 0; |
| 3617 | /* | 3515 | /* |
| @@ -3625,21 +3523,13 @@ xfs_fid2( | |||
| 3625 | } | 3523 | } |
| 3626 | 3524 | ||
| 3627 | 3525 | ||
| 3628 | /* | ||
| 3629 | * xfs_rwlock | ||
| 3630 | */ | ||
| 3631 | int | 3526 | int |
| 3632 | xfs_rwlock( | 3527 | xfs_rwlock( |
| 3633 | bhv_desc_t *bdp, | 3528 | xfs_inode_t *ip, |
| 3634 | bhv_vrwlock_t locktype) | 3529 | bhv_vrwlock_t locktype) |
| 3635 | { | 3530 | { |
| 3636 | xfs_inode_t *ip; | 3531 | if (S_ISDIR(ip->i_d.di_mode)) |
| 3637 | bhv_vnode_t *vp; | ||
| 3638 | |||
| 3639 | vp = BHV_TO_VNODE(bdp); | ||
| 3640 | if (VN_ISDIR(vp)) | ||
| 3641 | return 1; | 3532 | return 1; |
| 3642 | ip = XFS_BHVTOI(bdp); | ||
| 3643 | if (locktype == VRWLOCK_WRITE) { | 3533 | if (locktype == VRWLOCK_WRITE) { |
| 3644 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | 3534 | xfs_ilock(ip, XFS_IOLOCK_EXCL); |
| 3645 | } else if (locktype == VRWLOCK_TRY_READ) { | 3535 | } else if (locktype == VRWLOCK_TRY_READ) { |
| @@ -3656,21 +3546,13 @@ xfs_rwlock( | |||
| 3656 | } | 3546 | } |
| 3657 | 3547 | ||
| 3658 | 3548 | ||
| 3659 | /* | ||
| 3660 | * xfs_rwunlock | ||
| 3661 | */ | ||
| 3662 | void | 3549 | void |
| 3663 | xfs_rwunlock( | 3550 | xfs_rwunlock( |
| 3664 | bhv_desc_t *bdp, | 3551 | xfs_inode_t *ip, |
| 3665 | bhv_vrwlock_t locktype) | 3552 | bhv_vrwlock_t locktype) |
| 3666 | { | 3553 | { |
| 3667 | xfs_inode_t *ip; | 3554 | if (S_ISDIR(ip->i_d.di_mode)) |
| 3668 | bhv_vnode_t *vp; | 3555 | return; |
| 3669 | |||
| 3670 | vp = BHV_TO_VNODE(bdp); | ||
| 3671 | if (VN_ISDIR(vp)) | ||
| 3672 | return; | ||
| 3673 | ip = XFS_BHVTOI(bdp); | ||
| 3674 | if (locktype == VRWLOCK_WRITE) { | 3556 | if (locktype == VRWLOCK_WRITE) { |
| 3675 | /* | 3557 | /* |
| 3676 | * In the write case, we may have added a new entry to | 3558 | * In the write case, we may have added a new entry to |
| @@ -3688,20 +3570,16 @@ xfs_rwunlock( | |||
| 3688 | return; | 3570 | return; |
| 3689 | } | 3571 | } |
| 3690 | 3572 | ||
| 3691 | STATIC int | 3573 | |
| 3574 | int | ||
| 3692 | xfs_inode_flush( | 3575 | xfs_inode_flush( |
| 3693 | bhv_desc_t *bdp, | 3576 | xfs_inode_t *ip, |
| 3694 | int flags) | 3577 | int flags) |
| 3695 | { | 3578 | { |
| 3696 | xfs_inode_t *ip; | 3579 | xfs_mount_t *mp = ip->i_mount; |
| 3697 | xfs_mount_t *mp; | 3580 | xfs_inode_log_item_t *iip = ip->i_itemp; |
| 3698 | xfs_inode_log_item_t *iip; | ||
| 3699 | int error = 0; | 3581 | int error = 0; |
| 3700 | 3582 | ||
| 3701 | ip = XFS_BHVTOI(bdp); | ||
| 3702 | mp = ip->i_mount; | ||
| 3703 | iip = ip->i_itemp; | ||
| 3704 | |||
| 3705 | if (XFS_FORCED_SHUTDOWN(mp)) | 3583 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 3706 | return XFS_ERROR(EIO); | 3584 | return XFS_ERROR(EIO); |
| 3707 | 3585 | ||
| @@ -3770,24 +3648,20 @@ xfs_inode_flush( | |||
| 3770 | return error; | 3648 | return error; |
| 3771 | } | 3649 | } |
| 3772 | 3650 | ||
| 3651 | |||
| 3773 | int | 3652 | int |
| 3774 | xfs_set_dmattrs ( | 3653 | xfs_set_dmattrs( |
| 3775 | bhv_desc_t *bdp, | 3654 | xfs_inode_t *ip, |
| 3776 | u_int evmask, | 3655 | u_int evmask, |
| 3777 | u_int16_t state, | 3656 | u_int16_t state) |
| 3778 | cred_t *credp) | ||
| 3779 | { | 3657 | { |
| 3780 | xfs_inode_t *ip; | 3658 | xfs_mount_t *mp = ip->i_mount; |
| 3781 | xfs_trans_t *tp; | 3659 | xfs_trans_t *tp; |
| 3782 | xfs_mount_t *mp; | ||
| 3783 | int error; | 3660 | int error; |
| 3784 | 3661 | ||
| 3785 | if (!capable(CAP_SYS_ADMIN)) | 3662 | if (!capable(CAP_SYS_ADMIN)) |
| 3786 | return XFS_ERROR(EPERM); | 3663 | return XFS_ERROR(EPERM); |
| 3787 | 3664 | ||
| 3788 | ip = XFS_BHVTOI(bdp); | ||
| 3789 | mp = ip->i_mount; | ||
| 3790 | |||
| 3791 | if (XFS_FORCED_SHUTDOWN(mp)) | 3665 | if (XFS_FORCED_SHUTDOWN(mp)) |
| 3792 | return XFS_ERROR(EIO); | 3666 | return XFS_ERROR(EIO); |
| 3793 | 3667 | ||
| @@ -3810,15 +3684,11 @@ xfs_set_dmattrs ( | |||
| 3810 | return error; | 3684 | return error; |
| 3811 | } | 3685 | } |
| 3812 | 3686 | ||
| 3813 | STATIC int | 3687 | int |
| 3814 | xfs_reclaim( | 3688 | xfs_reclaim( |
| 3815 | bhv_desc_t *bdp) | 3689 | xfs_inode_t *ip) |
| 3816 | { | 3690 | { |
| 3817 | xfs_inode_t *ip; | 3691 | bhv_vnode_t *vp = XFS_ITOV(ip); |
| 3818 | bhv_vnode_t *vp; | ||
| 3819 | |||
| 3820 | vp = BHV_TO_VNODE(bdp); | ||
| 3821 | ip = XFS_BHVTOI(bdp); | ||
| 3822 | 3692 | ||
| 3823 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); | 3693 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); |
| 3824 | 3694 | ||
| @@ -4495,35 +4365,29 @@ xfs_free_file_space( | |||
| 4495 | */ | 4365 | */ |
| 4496 | int | 4366 | int |
| 4497 | xfs_change_file_space( | 4367 | xfs_change_file_space( |
| 4498 | bhv_desc_t *bdp, | 4368 | xfs_inode_t *ip, |
| 4499 | int cmd, | 4369 | int cmd, |
| 4500 | xfs_flock64_t *bf, | 4370 | xfs_flock64_t *bf, |
| 4501 | xfs_off_t offset, | 4371 | xfs_off_t offset, |
| 4502 | cred_t *credp, | 4372 | cred_t *credp, |
| 4503 | int attr_flags) | 4373 | int attr_flags) |
| 4504 | { | 4374 | { |
| 4375 | xfs_mount_t *mp = ip->i_mount; | ||
| 4505 | int clrprealloc; | 4376 | int clrprealloc; |
| 4506 | int error; | 4377 | int error; |
| 4507 | xfs_fsize_t fsize; | 4378 | xfs_fsize_t fsize; |
| 4508 | xfs_inode_t *ip; | ||
| 4509 | xfs_mount_t *mp; | ||
| 4510 | int setprealloc; | 4379 | int setprealloc; |
| 4511 | xfs_off_t startoffset; | 4380 | xfs_off_t startoffset; |
| 4512 | xfs_off_t llen; | 4381 | xfs_off_t llen; |
| 4513 | xfs_trans_t *tp; | 4382 | xfs_trans_t *tp; |
| 4514 | bhv_vattr_t va; | 4383 | bhv_vattr_t va; |
| 4515 | bhv_vnode_t *vp; | ||
| 4516 | |||
| 4517 | vp = BHV_TO_VNODE(bdp); | ||
| 4518 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); | ||
| 4519 | 4384 | ||
| 4520 | ip = XFS_BHVTOI(bdp); | 4385 | vn_trace_entry(XFS_ITOV(ip), __FUNCTION__, (inst_t *)__return_address); |
| 4521 | mp = ip->i_mount; | ||
| 4522 | 4386 | ||
| 4523 | /* | 4387 | /* |
| 4524 | * must be a regular file and have write permission | 4388 | * must be a regular file and have write permission |
| 4525 | */ | 4389 | */ |
| 4526 | if (!VN_ISREG(vp)) | 4390 | if (!S_ISREG(ip->i_d.di_mode)) |
| 4527 | return XFS_ERROR(EINVAL); | 4391 | return XFS_ERROR(EINVAL); |
| 4528 | 4392 | ||
| 4529 | xfs_ilock(ip, XFS_ILOCK_SHARED); | 4393 | xfs_ilock(ip, XFS_ILOCK_SHARED); |
| @@ -4605,7 +4469,7 @@ xfs_change_file_space( | |||
| 4605 | va.va_mask = XFS_AT_SIZE; | 4469 | va.va_mask = XFS_AT_SIZE; |
| 4606 | va.va_size = startoffset; | 4470 | va.va_size = startoffset; |
| 4607 | 4471 | ||
| 4608 | error = xfs_setattr(bdp, &va, attr_flags, credp); | 4472 | error = xfs_setattr(ip, &va, attr_flags, credp); |
| 4609 | 4473 | ||
| 4610 | if (error) | 4474 | if (error) |
| 4611 | return error; | 4475 | return error; |
| @@ -4664,46 +4528,3 @@ xfs_change_file_space( | |||
| 4664 | 4528 | ||
| 4665 | return error; | 4529 | return error; |
| 4666 | } | 4530 | } |
| 4667 | |||
| 4668 | bhv_vnodeops_t xfs_vnodeops = { | ||
| 4669 | BHV_IDENTITY_INIT(VN_BHV_XFS,VNODE_POSITION_XFS), | ||
| 4670 | .vop_open = xfs_open, | ||
| 4671 | .vop_read = xfs_read, | ||
| 4672 | #ifdef HAVE_SPLICE | ||
| 4673 | .vop_splice_read = xfs_splice_read, | ||
| 4674 | .vop_splice_write = xfs_splice_write, | ||
| 4675 | #endif | ||
| 4676 | .vop_write = xfs_write, | ||
| 4677 | .vop_ioctl = xfs_ioctl, | ||
| 4678 | .vop_getattr = xfs_getattr, | ||
| 4679 | .vop_setattr = xfs_setattr, | ||
| 4680 | .vop_access = xfs_access, | ||
| 4681 | .vop_lookup = xfs_lookup, | ||
| 4682 | .vop_create = xfs_create, | ||
| 4683 | .vop_remove = xfs_remove, | ||
| 4684 | .vop_link = xfs_link, | ||
| 4685 | .vop_rename = xfs_rename, | ||
| 4686 | .vop_mkdir = xfs_mkdir, | ||
| 4687 | .vop_rmdir = xfs_rmdir, | ||
| 4688 | .vop_readdir = xfs_readdir, | ||
| 4689 | .vop_symlink = xfs_symlink, | ||
| 4690 | .vop_readlink = xfs_readlink, | ||
| 4691 | .vop_fsync = xfs_fsync, | ||
| 4692 | .vop_inactive = xfs_inactive, | ||
| 4693 | .vop_fid2 = xfs_fid2, | ||
| 4694 | .vop_rwlock = xfs_rwlock, | ||
| 4695 | .vop_rwunlock = xfs_rwunlock, | ||
| 4696 | .vop_bmap = xfs_bmap, | ||
| 4697 | .vop_reclaim = xfs_reclaim, | ||
| 4698 | .vop_attr_get = xfs_attr_get, | ||
| 4699 | .vop_attr_set = xfs_attr_set, | ||
| 4700 | .vop_attr_remove = xfs_attr_remove, | ||
| 4701 | .vop_attr_list = xfs_attr_list, | ||
| 4702 | .vop_link_removed = (vop_link_removed_t)fs_noval, | ||
| 4703 | .vop_vnode_change = (vop_vnode_change_t)fs_noval, | ||
| 4704 | .vop_tosspages = fs_tosspages, | ||
| 4705 | .vop_flushinval_pages = fs_flushinval_pages, | ||
| 4706 | .vop_flush_pages = fs_flush_pages, | ||
| 4707 | .vop_release = xfs_release, | ||
| 4708 | .vop_iflush = xfs_inode_flush, | ||
| 4709 | }; | ||
diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h new file mode 100644 index 000000000000..78c8841fbf94 --- /dev/null +++ b/fs/xfs/xfs_vnodeops.h | |||
| @@ -0,0 +1,86 @@ | |||
| 1 | #ifndef _XFS_VNODEOPS_H | ||
| 2 | #define _XFS_VNODEOPS_H 1 | ||
| 3 | |||
| 4 | struct attrlist_cursor_kern; | ||
| 5 | struct bhv_vattr; | ||
| 6 | struct cred; | ||
| 7 | struct file; | ||
| 8 | struct inode; | ||
| 9 | struct iovec; | ||
| 10 | struct kiocb; | ||
| 11 | struct pipe_inode_info; | ||
| 12 | struct uio; | ||
| 13 | struct xfs_inode; | ||
| 14 | struct xfs_iomap; | ||
| 15 | |||
| 16 | |||
| 17 | int xfs_open(struct xfs_inode *ip); | ||
| 18 | int xfs_getattr(struct xfs_inode *ip, struct bhv_vattr *vap, int flags); | ||
| 19 | int xfs_setattr(struct xfs_inode *ip, struct bhv_vattr *vap, int flags, | ||
| 20 | struct cred *credp); | ||
| 21 | int xfs_access(struct xfs_inode *ip, int mode, struct cred *credp); | ||
| 22 | int xfs_readlink(struct xfs_inode *ip, char *link); | ||
| 23 | int xfs_fsync(struct xfs_inode *ip, int flag, xfs_off_t start, | ||
| 24 | xfs_off_t stop); | ||
| 25 | int xfs_release(struct xfs_inode *ip); | ||
| 26 | int xfs_inactive(struct xfs_inode *ip); | ||
| 27 | int xfs_lookup(struct xfs_inode *dp, bhv_vname_t *dentry, | ||
| 28 | bhv_vnode_t **vpp); | ||
| 29 | int xfs_create(struct xfs_inode *dp, bhv_vname_t *dentry, | ||
| 30 | struct bhv_vattr *vap, bhv_vnode_t **vpp, struct cred *credp); | ||
| 31 | int xfs_remove(struct xfs_inode *dp, bhv_vname_t *dentry); | ||
| 32 | int xfs_link(struct xfs_inode *tdp, bhv_vnode_t *src_vp, | ||
| 33 | bhv_vname_t *dentry); | ||
| 34 | int xfs_mkdir(struct xfs_inode *dp, bhv_vname_t *dentry, | ||
| 35 | struct bhv_vattr *vap, bhv_vnode_t **vpp, struct cred *credp); | ||
| 36 | int xfs_rmdir(struct xfs_inode *dp, bhv_vname_t *dentry); | ||
| 37 | int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize, | ||
| 38 | xfs_off_t *offset, filldir_t filldir); | ||
| 39 | int xfs_symlink(struct xfs_inode *dp, bhv_vname_t *dentry, | ||
| 40 | struct bhv_vattr *vap, char *target_path, | ||
| 41 | bhv_vnode_t **vpp, struct cred *credp); | ||
| 42 | int xfs_fid2(struct xfs_inode *ip, fid_t *fidp); | ||
| 43 | int xfs_rwlock(struct xfs_inode *ip, bhv_vrwlock_t locktype); | ||
| 44 | void xfs_rwunlock(struct xfs_inode *ip, bhv_vrwlock_t locktype); | ||
| 45 | int xfs_inode_flush(struct xfs_inode *ip, int flags); | ||
| 46 | int xfs_set_dmattrs(struct xfs_inode *ip, u_int evmask, u_int16_t state); | ||
| 47 | int xfs_reclaim(struct xfs_inode *ip); | ||
| 48 | int xfs_change_file_space(struct xfs_inode *ip, int cmd, | ||
| 49 | xfs_flock64_t *bf, xfs_off_t offset, | ||
| 50 | struct cred *credp, int attr_flags); | ||
| 51 | int xfs_rename(struct xfs_inode *src_dp, bhv_vname_t *src_vname, | ||
| 52 | bhv_vnode_t *target_dir_vp, bhv_vname_t *target_vname); | ||
| 53 | int xfs_attr_get(struct xfs_inode *ip, const char *name, char *value, | ||
| 54 | int *valuelenp, int flags, cred_t *cred); | ||
| 55 | int xfs_attr_set(struct xfs_inode *dp, const char *name, char *value, | ||
| 56 | int valuelen, int flags); | ||
| 57 | int xfs_attr_remove(struct xfs_inode *dp, const char *name, int flags); | ||
| 58 | int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, | ||
| 59 | int flags, struct attrlist_cursor_kern *cursor); | ||
| 60 | int xfs_ioctl(struct xfs_inode *ip, struct file *filp, | ||
| 61 | int ioflags, unsigned int cmd, void __user *arg); | ||
| 62 | ssize_t xfs_read(struct xfs_inode *ip, struct kiocb *iocb, | ||
| 63 | const struct iovec *iovp, unsigned int segs, | ||
| 64 | loff_t *offset, int ioflags); | ||
| 65 | ssize_t xfs_sendfile(struct xfs_inode *ip, struct file *filp, | ||
| 66 | loff_t *offset, int ioflags, size_t count, | ||
| 67 | read_actor_t actor, void *target); | ||
| 68 | ssize_t xfs_splice_read(struct xfs_inode *ip, struct file *infilp, | ||
| 69 | loff_t *ppos, struct pipe_inode_info *pipe, size_t count, | ||
| 70 | int flags, int ioflags); | ||
| 71 | ssize_t xfs_splice_write(struct xfs_inode *ip, | ||
| 72 | struct pipe_inode_info *pipe, struct file *outfilp, | ||
| 73 | loff_t *ppos, size_t count, int flags, int ioflags); | ||
| 74 | ssize_t xfs_write(struct xfs_inode *xip, struct kiocb *iocb, | ||
| 75 | const struct iovec *iovp, unsigned int nsegs, | ||
| 76 | loff_t *offset, int ioflags); | ||
| 77 | int xfs_bmap(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, | ||
| 78 | int flags, struct xfs_iomap *iomapp, int *niomaps); | ||
| 79 | void xfs_tosspages(struct xfs_inode *inode, xfs_off_t first, | ||
| 80 | xfs_off_t last, int fiopt); | ||
| 81 | int xfs_flushinval_pages(struct xfs_inode *ip, xfs_off_t first, | ||
| 82 | xfs_off_t last, int fiopt); | ||
| 83 | int xfs_flush_pages(struct xfs_inode *ip, xfs_off_t first, | ||
| 84 | xfs_off_t last, uint64_t flags, int fiopt); | ||
| 85 | |||
| 86 | #endif /* _XFS_VNODEOPS_H */ | ||
diff --git a/fs/xfs/xfs_vnodeops_bhv.c b/fs/xfs/xfs_vnodeops_bhv.c new file mode 100644 index 000000000000..c61653aed054 --- /dev/null +++ b/fs/xfs/xfs_vnodeops_bhv.c | |||
| @@ -0,0 +1,438 @@ | |||
| 1 | |||
| 2 | #include "xfs_linux.h" | ||
| 3 | #include "xfs_vnodeops.h" | ||
| 4 | |||
| 5 | #include "xfs_bmap_btree.h" | ||
| 6 | #include "xfs_inode.h" | ||
| 7 | |||
| 8 | STATIC int | ||
| 9 | xfs_bhv_open( | ||
| 10 | bhv_desc_t *bdp, | ||
| 11 | cred_t *credp) | ||
| 12 | { | ||
| 13 | return xfs_open(XFS_BHVTOI(bdp)); | ||
| 14 | } | ||
| 15 | |||
| 16 | STATIC int | ||
| 17 | xfs_bhv_getattr( | ||
| 18 | bhv_desc_t *bdp, | ||
| 19 | bhv_vattr_t *vap, | ||
| 20 | int flags, | ||
| 21 | cred_t *credp) | ||
| 22 | { | ||
| 23 | return xfs_getattr(XFS_BHVTOI(bdp), vap, flags); | ||
| 24 | } | ||
| 25 | |||
| 26 | int | ||
| 27 | xfs_bhv_setattr( | ||
| 28 | bhv_desc_t *bdp, | ||
| 29 | bhv_vattr_t *vap, | ||
| 30 | int flags, | ||
| 31 | cred_t *credp) | ||
| 32 | { | ||
| 33 | return xfs_setattr(XFS_BHVTOI(bdp), vap, flags, credp); | ||
| 34 | } | ||
| 35 | |||
| 36 | STATIC int | ||
| 37 | xfs_bhv_access( | ||
| 38 | bhv_desc_t *bdp, | ||
| 39 | int mode, | ||
| 40 | cred_t *credp) | ||
| 41 | { | ||
| 42 | return xfs_access(XFS_BHVTOI(bdp), mode, credp); | ||
| 43 | } | ||
| 44 | |||
| 45 | STATIC int | ||
| 46 | xfs_bhv_readlink( | ||
| 47 | bhv_desc_t *bdp, | ||
| 48 | char *link) | ||
| 49 | { | ||
| 50 | return xfs_readlink(XFS_BHVTOI(bdp), link); | ||
| 51 | } | ||
| 52 | |||
| 53 | STATIC int | ||
| 54 | xfs_bhv_fsync( | ||
| 55 | bhv_desc_t *bdp, | ||
| 56 | int flag, | ||
| 57 | cred_t *credp, | ||
| 58 | xfs_off_t start, | ||
| 59 | xfs_off_t stop) | ||
| 60 | { | ||
| 61 | return xfs_fsync(XFS_BHVTOI(bdp), flag, start, stop); | ||
| 62 | } | ||
| 63 | |||
| 64 | STATIC int | ||
| 65 | xfs_bhv_release( | ||
| 66 | bhv_desc_t *bdp) | ||
| 67 | { | ||
| 68 | return xfs_release(XFS_BHVTOI(bdp)); | ||
| 69 | } | ||
| 70 | |||
| 71 | STATIC int | ||
| 72 | xfs_bhv_inactive( | ||
| 73 | bhv_desc_t *bdp, | ||
| 74 | cred_t *credp) | ||
| 75 | { | ||
| 76 | return xfs_inactive(XFS_BHVTOI(bdp)); | ||
| 77 | } | ||
| 78 | |||
| 79 | STATIC int | ||
| 80 | xfs_bhv_lookup( | ||
| 81 | bhv_desc_t *dir_bdp, | ||
| 82 | bhv_vname_t *dentry, | ||
| 83 | bhv_vnode_t **vpp, | ||
| 84 | int flags, | ||
| 85 | bhv_vnode_t *rdir, | ||
| 86 | cred_t *credp) | ||
| 87 | { | ||
| 88 | return xfs_lookup(XFS_BHVTOI(dir_bdp), dentry, vpp); | ||
| 89 | } | ||
| 90 | |||
| 91 | STATIC int | ||
| 92 | xfs_bhv_create( | ||
| 93 | bhv_desc_t *dir_bdp, | ||
| 94 | bhv_vname_t *dentry, | ||
| 95 | bhv_vattr_t *vap, | ||
| 96 | bhv_vnode_t **vpp, | ||
| 97 | cred_t *credp) | ||
| 98 | { | ||
| 99 | return xfs_create(XFS_BHVTOI(dir_bdp), dentry, vap, vpp, credp); | ||
| 100 | } | ||
| 101 | |||
| 102 | STATIC int | ||
| 103 | xfs_bhv_remove( | ||
| 104 | bhv_desc_t *dir_bdp, | ||
| 105 | bhv_vname_t *dentry, | ||
| 106 | cred_t *credp) | ||
| 107 | { | ||
| 108 | return xfs_remove(XFS_BHVTOI(dir_bdp), dentry); | ||
| 109 | } | ||
| 110 | |||
| 111 | STATIC int | ||
| 112 | xfs_bhv_link( | ||
| 113 | bhv_desc_t *target_dir_bdp, | ||
| 114 | bhv_vnode_t *src_vp, | ||
| 115 | bhv_vname_t *dentry, | ||
| 116 | cred_t *credp) | ||
| 117 | { | ||
| 118 | return xfs_link(XFS_BHVTOI(target_dir_bdp), src_vp, dentry); | ||
| 119 | } | ||
| 120 | |||
| 121 | STATIC int | ||
| 122 | xfs_bhv_mkdir( | ||
| 123 | bhv_desc_t *dir_bdp, | ||
| 124 | bhv_vname_t *dentry, | ||
| 125 | bhv_vattr_t *vap, | ||
| 126 | bhv_vnode_t **vpp, | ||
| 127 | cred_t *credp) | ||
| 128 | { | ||
| 129 | return xfs_mkdir(XFS_BHVTOI(dir_bdp), dentry, vap, vpp, credp); | ||
| 130 | } | ||
| 131 | |||
| 132 | STATIC int | ||
| 133 | xfs_bhv_rmdir( | ||
| 134 | bhv_desc_t *dir_bdp, | ||
| 135 | bhv_vname_t *dentry, | ||
| 136 | cred_t *credp) | ||
| 137 | { | ||
| 138 | return xfs_rmdir(XFS_BHVTOI(dir_bdp), dentry); | ||
| 139 | } | ||
| 140 | |||
| 141 | STATIC int | ||
| 142 | xfs_bhv_readdir( | ||
| 143 | bhv_desc_t *dir_bdp, | ||
| 144 | void *dirent, | ||
| 145 | size_t bufsize, | ||
| 146 | xfs_off_t *offset, | ||
| 147 | filldir_t filldir) | ||
| 148 | { | ||
| 149 | return xfs_readdir(XFS_BHVTOI(dir_bdp), dirent, bufsize, offset, filldir); | ||
| 150 | } | ||
| 151 | |||
| 152 | STATIC int | ||
| 153 | xfs_bhv_symlink( | ||
| 154 | bhv_desc_t *dir_bdp, | ||
| 155 | bhv_vname_t *dentry, | ||
| 156 | bhv_vattr_t *vap, | ||
| 157 | char *target_path, | ||
| 158 | bhv_vnode_t **vpp, | ||
| 159 | cred_t *credp) | ||
| 160 | { | ||
| 161 | return xfs_symlink(XFS_BHVTOI(dir_bdp), dentry, vap, target_path, vpp, credp); | ||
| 162 | } | ||
| 163 | |||
| 164 | STATIC int | ||
| 165 | xfs_bhv_fid2( | ||
| 166 | bhv_desc_t *bdp, | ||
| 167 | fid_t *fidp) | ||
| 168 | { | ||
| 169 | return xfs_fid2(XFS_BHVTOI(bdp), fidp); | ||
| 170 | } | ||
| 171 | |||
| 172 | STATIC int | ||
| 173 | xfs_bhv_rwlock( | ||
| 174 | bhv_desc_t *bdp, | ||
| 175 | bhv_vrwlock_t locktype) | ||
| 176 | { | ||
| 177 | return xfs_rwlock(XFS_BHVTOI(bdp), locktype); | ||
| 178 | } | ||
| 179 | |||
| 180 | STATIC void | ||
| 181 | xfs_bhv_rwunlock( | ||
| 182 | bhv_desc_t *bdp, | ||
| 183 | bhv_vrwlock_t locktype) | ||
| 184 | { | ||
| 185 | xfs_rwunlock(XFS_BHVTOI(bdp), locktype); | ||
| 186 | } | ||
| 187 | |||
| 188 | STATIC int | ||
| 189 | xfs_bhv_inode_flush( | ||
| 190 | bhv_desc_t *bdp, | ||
| 191 | int flags) | ||
| 192 | { | ||
| 193 | return xfs_inode_flush(XFS_BHVTOI(bdp), flags); | ||
| 194 | } | ||
| 195 | |||
| 196 | STATIC int | ||
| 197 | xfs_bhv_reclaim( | ||
| 198 | bhv_desc_t *bdp) | ||
| 199 | { | ||
| 200 | return xfs_reclaim(XFS_BHVTOI(bdp)); | ||
| 201 | } | ||
| 202 | |||
| 203 | STATIC int | ||
| 204 | xfs_bhv_rename( | ||
| 205 | bhv_desc_t *src_dir_bdp, | ||
| 206 | bhv_vname_t *src_vname, | ||
| 207 | bhv_vnode_t *target_dir_vp, | ||
| 208 | bhv_vname_t *target_vname, | ||
| 209 | cred_t *credp) | ||
| 210 | { | ||
| 211 | return xfs_rename(XFS_BHVTOI(src_dir_bdp), src_vname, | ||
| 212 | target_dir_vp, target_vname); | ||
| 213 | } | ||
| 214 | |||
| 215 | STATIC int | ||
| 216 | xfs_bhv_attr_get( | ||
| 217 | bhv_desc_t *bdp, | ||
| 218 | const char *name, | ||
| 219 | char *value, | ||
| 220 | int *valuelenp, | ||
| 221 | int flags, | ||
| 222 | cred_t *cred) | ||
| 223 | { | ||
| 224 | return xfs_attr_get(XFS_BHVTOI(bdp), name, value, valuelenp, | ||
| 225 | flags, cred); | ||
| 226 | } | ||
| 227 | |||
| 228 | STATIC int | ||
| 229 | xfs_bhv_attr_set( | ||
| 230 | bhv_desc_t *bdp, | ||
| 231 | const char *name, | ||
| 232 | char *value, | ||
| 233 | int valuelen, | ||
| 234 | int flags, | ||
| 235 | cred_t *cred) | ||
| 236 | { | ||
| 237 | return xfs_attr_set(XFS_BHVTOI(bdp), name, value, valuelen, | ||
| 238 | flags); | ||
| 239 | } | ||
| 240 | |||
| 241 | STATIC int | ||
| 242 | xfs_bhv_attr_remove( | ||
| 243 | bhv_desc_t *bdp, | ||
| 244 | const char *name, | ||
| 245 | int flags, | ||
| 246 | cred_t *cred) | ||
| 247 | { | ||
| 248 | return xfs_attr_remove(XFS_BHVTOI(bdp), name, flags); | ||
| 249 | } | ||
| 250 | |||
| 251 | STATIC int | ||
| 252 | xfs_bhv_attr_list( | ||
| 253 | bhv_desc_t *bdp, | ||
| 254 | char *buffer, | ||
| 255 | int bufsize, | ||
| 256 | int flags, | ||
| 257 | struct attrlist_cursor_kern *cursor, | ||
| 258 | cred_t *cred) | ||
| 259 | { | ||
| 260 | return xfs_attr_list(XFS_BHVTOI(bdp), buffer, bufsize, flags, | ||
| 261 | cursor); | ||
| 262 | } | ||
| 263 | |||
| 264 | STATIC int | ||
| 265 | xfs_bhv_ioctl( | ||
| 266 | bhv_desc_t *bdp, | ||
| 267 | struct inode *inode, | ||
| 268 | struct file *filp, | ||
| 269 | int ioflags, | ||
| 270 | unsigned int cmd, | ||
| 271 | void __user *arg) | ||
| 272 | { | ||
| 273 | return xfs_ioctl(XFS_BHVTOI(bdp), filp, ioflags, cmd, arg); | ||
| 274 | } | ||
| 275 | |||
| 276 | STATIC ssize_t | ||
| 277 | xfs_bhv_read( | ||
| 278 | bhv_desc_t *bdp, | ||
| 279 | struct kiocb *iocb, | ||
| 280 | const struct iovec *iovp, | ||
| 281 | unsigned int segs, | ||
| 282 | loff_t *offset, | ||
| 283 | int ioflags, | ||
| 284 | cred_t *credp) | ||
| 285 | { | ||
| 286 | return xfs_read(XFS_BHVTOI(bdp), iocb, iovp, segs, | ||
| 287 | offset, ioflags); | ||
| 288 | } | ||
| 289 | |||
| 290 | STATIC ssize_t | ||
| 291 | xfs_bhv_sendfile( | ||
| 292 | bhv_desc_t *bdp, | ||
| 293 | struct file *filp, | ||
| 294 | loff_t *offset, | ||
| 295 | int ioflags, | ||
| 296 | size_t count, | ||
| 297 | read_actor_t actor, | ||
| 298 | void *target, | ||
| 299 | cred_t *credp) | ||
| 300 | { | ||
| 301 | return xfs_sendfile(XFS_BHVTOI(bdp), filp, offset, ioflags, | ||
| 302 | count, actor, target); | ||
| 303 | } | ||
| 304 | |||
| 305 | STATIC ssize_t | ||
| 306 | xfs_bhv_splice_read( | ||
| 307 | bhv_desc_t *bdp, | ||
| 308 | struct file *infilp, | ||
| 309 | loff_t *ppos, | ||
| 310 | struct pipe_inode_info *pipe, | ||
| 311 | size_t count, | ||
| 312 | int flags, | ||
| 313 | int ioflags, | ||
| 314 | cred_t *credp) | ||
| 315 | { | ||
| 316 | return xfs_splice_read(XFS_BHVTOI(bdp), infilp, ppos, pipe, | ||
| 317 | count, flags, ioflags); | ||
| 318 | } | ||
| 319 | |||
| 320 | STATIC ssize_t | ||
| 321 | xfs_bhv_splice_write( | ||
| 322 | bhv_desc_t *bdp, | ||
| 323 | struct pipe_inode_info *pipe, | ||
| 324 | struct file *outfilp, | ||
| 325 | loff_t *ppos, | ||
| 326 | size_t count, | ||
| 327 | int flags, | ||
| 328 | int ioflags, | ||
| 329 | cred_t *credp) | ||
| 330 | { | ||
| 331 | return xfs_splice_write(XFS_BHVTOI(bdp), pipe, outfilp, ppos, | ||
| 332 | count, flags, ioflags); | ||
| 333 | } | ||
| 334 | |||
| 335 | STATIC ssize_t | ||
| 336 | xfs_bhv_write( | ||
| 337 | bhv_desc_t *bdp, | ||
| 338 | struct kiocb *iocb, | ||
| 339 | const struct iovec *iovp, | ||
| 340 | unsigned int nsegs, | ||
| 341 | loff_t *offset, | ||
| 342 | int ioflags, | ||
| 343 | cred_t *credp) | ||
| 344 | { | ||
| 345 | return xfs_write(XFS_BHVTOI(bdp), iocb, iovp, nsegs, offset, | ||
| 346 | ioflags); | ||
| 347 | } | ||
| 348 | |||
| 349 | STATIC int | ||
| 350 | xfs_bhv_bmap(bhv_desc_t *bdp, | ||
| 351 | xfs_off_t offset, | ||
| 352 | ssize_t count, | ||
| 353 | int flags, | ||
| 354 | struct xfs_iomap *iomapp, | ||
| 355 | int *niomaps) | ||
| 356 | { | ||
| 357 | return xfs_bmap(XFS_BHVTOI(bdp), offset, count, flags, | ||
| 358 | iomapp, niomaps); | ||
| 359 | } | ||
| 360 | |||
| 361 | STATIC void | ||
| 362 | fs_tosspages( | ||
| 363 | bhv_desc_t *bdp, | ||
| 364 | xfs_off_t first, | ||
| 365 | xfs_off_t last, | ||
| 366 | int fiopt) | ||
| 367 | { | ||
| 368 | xfs_tosspages(XFS_BHVTOI(bdp), first, last, fiopt); | ||
| 369 | } | ||
| 370 | |||
| 371 | STATIC int | ||
| 372 | fs_flushinval_pages( | ||
| 373 | bhv_desc_t *bdp, | ||
| 374 | xfs_off_t first, | ||
| 375 | xfs_off_t last, | ||
| 376 | int fiopt) | ||
| 377 | { | ||
| 378 | return xfs_flushinval_pages(XFS_BHVTOI(bdp), first, last, | ||
| 379 | fiopt); | ||
| 380 | } | ||
| 381 | |||
| 382 | STATIC int | ||
| 383 | fs_flush_pages( | ||
| 384 | bhv_desc_t *bdp, | ||
| 385 | xfs_off_t first, | ||
| 386 | xfs_off_t last, | ||
| 387 | uint64_t flags, | ||
| 388 | int fiopt) | ||
| 389 | { | ||
| 390 | return xfs_flush_pages(XFS_BHVTOI(bdp), first, last, flags, | ||
| 391 | fiopt); | ||
| 392 | } | ||
| 393 | |||
| 394 | bhv_vnodeops_t xfs_vnodeops = { | ||
| 395 | BHV_IDENTITY_INIT(VN_BHV_XFS,VNODE_POSITION_XFS), | ||
| 396 | .vop_open = xfs_bhv_open, | ||
| 397 | .vop_read = xfs_bhv_read, | ||
| 398 | #ifdef HAVE_SENDFILE | ||
| 399 | .vop_sendfile = xfs_bhv_sendfile, | ||
| 400 | #endif | ||
| 401 | #ifdef HAVE_SPLICE | ||
| 402 | .vop_splice_read = xfs_bhv_splice_read, | ||
| 403 | .vop_splice_write = xfs_bhv_splice_write, | ||
| 404 | #endif | ||
| 405 | .vop_write = xfs_bhv_write, | ||
| 406 | .vop_ioctl = xfs_bhv_ioctl, | ||
| 407 | .vop_getattr = xfs_bhv_getattr, | ||
| 408 | .vop_setattr = xfs_bhv_setattr, | ||
| 409 | .vop_access = xfs_bhv_access, | ||
| 410 | .vop_lookup = xfs_bhv_lookup, | ||
| 411 | .vop_create = xfs_bhv_create, | ||
| 412 | .vop_remove = xfs_bhv_remove, | ||
| 413 | .vop_link = xfs_bhv_link, | ||
| 414 | .vop_rename = xfs_bhv_rename, | ||
| 415 | .vop_mkdir = xfs_bhv_mkdir, | ||
| 416 | .vop_rmdir = xfs_bhv_rmdir, | ||
| 417 | .vop_readdir = xfs_bhv_readdir, | ||
| 418 | .vop_symlink = xfs_bhv_symlink, | ||
| 419 | .vop_readlink = xfs_bhv_readlink, | ||
| 420 | .vop_fsync = xfs_bhv_fsync, | ||
| 421 | .vop_inactive = xfs_bhv_inactive, | ||
| 422 | .vop_fid2 = xfs_bhv_fid2, | ||
| 423 | .vop_rwlock = xfs_bhv_rwlock, | ||
| 424 | .vop_rwunlock = xfs_bhv_rwunlock, | ||
| 425 | .vop_bmap = xfs_bhv_bmap, | ||
| 426 | .vop_reclaim = xfs_bhv_reclaim, | ||
| 427 | .vop_attr_get = xfs_bhv_attr_get, | ||
| 428 | .vop_attr_set = xfs_bhv_attr_set, | ||
| 429 | .vop_attr_remove = xfs_bhv_attr_remove, | ||
| 430 | .vop_attr_list = xfs_bhv_attr_list, | ||
| 431 | .vop_link_removed = (vop_link_removed_t)fs_noval, | ||
| 432 | .vop_vnode_change = (vop_vnode_change_t)fs_noval, | ||
| 433 | .vop_tosspages = fs_tosspages, | ||
| 434 | .vop_flushinval_pages = fs_flushinval_pages, | ||
| 435 | .vop_flush_pages = fs_flush_pages, | ||
| 436 | .vop_release = xfs_bhv_release, | ||
| 437 | .vop_iflush = xfs_bhv_inode_flush, | ||
| 438 | }; | ||
