diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-06-24 08:41:41 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-06-24 13:07:53 -0400 |
| commit | 816724e65c72a90a44fbad0ef0b59b186c85fa90 (patch) | |
| tree | 421fa29aedff988e392f92780637553e275d37a0 /fs/xfs/xfs_dfrag.c | |
| parent | 70ac4385a13f78bc478f26d317511893741b05bd (diff) | |
| parent | d384ea691fe4ea8c2dd5b9b8d9042eb181776f18 (diff) | |
Merge branch 'master' of /home/trondmy/kernel/linux-2.6/
Conflicts:
fs/nfs/inode.c
fs/super.c
Fix conflicts between patch 'NFS: Split fs/nfs/inode.c' and patch
'VFS: Permit filesystem to override root dentry on mount'
Diffstat (limited to 'fs/xfs/xfs_dfrag.c')
| -rw-r--r-- | fs/xfs/xfs_dfrag.c | 84 |
1 files changed, 53 insertions, 31 deletions
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index 4968a6358e61..80562b60fb95 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. | 2 | * Copyright (c) 2000-2006 Silicon Graphics, Inc. |
| 3 | * All Rights Reserved. | 3 | * All Rights Reserved. |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -24,14 +24,12 @@ | |||
| 24 | #include "xfs_trans.h" | 24 | #include "xfs_trans.h" |
| 25 | #include "xfs_sb.h" | 25 | #include "xfs_sb.h" |
| 26 | #include "xfs_ag.h" | 26 | #include "xfs_ag.h" |
| 27 | #include "xfs_dir.h" | ||
| 28 | #include "xfs_dir2.h" | 27 | #include "xfs_dir2.h" |
| 29 | #include "xfs_dmapi.h" | 28 | #include "xfs_dmapi.h" |
| 30 | #include "xfs_mount.h" | 29 | #include "xfs_mount.h" |
| 31 | #include "xfs_bmap_btree.h" | 30 | #include "xfs_bmap_btree.h" |
| 32 | #include "xfs_alloc_btree.h" | 31 | #include "xfs_alloc_btree.h" |
| 33 | #include "xfs_ialloc_btree.h" | 32 | #include "xfs_ialloc_btree.h" |
| 34 | #include "xfs_dir_sf.h" | ||
| 35 | #include "xfs_dir2_sf.h" | 33 | #include "xfs_dir2_sf.h" |
| 36 | #include "xfs_attr_sf.h" | 34 | #include "xfs_attr_sf.h" |
| 37 | #include "xfs_dinode.h" | 35 | #include "xfs_dinode.h" |
| @@ -54,24 +52,14 @@ xfs_swapext( | |||
| 54 | xfs_swapext_t __user *sxu) | 52 | xfs_swapext_t __user *sxu) |
| 55 | { | 53 | { |
| 56 | xfs_swapext_t *sxp; | 54 | xfs_swapext_t *sxp; |
| 57 | xfs_inode_t *ip=NULL, *tip=NULL, *ips[2]; | 55 | xfs_inode_t *ip=NULL, *tip=NULL; |
| 58 | xfs_trans_t *tp; | ||
| 59 | xfs_mount_t *mp; | 56 | xfs_mount_t *mp; |
| 60 | xfs_bstat_t *sbp; | ||
| 61 | struct file *fp = NULL, *tfp = NULL; | 57 | struct file *fp = NULL, *tfp = NULL; |
| 62 | vnode_t *vp, *tvp; | 58 | bhv_vnode_t *vp, *tvp; |
| 63 | static uint lock_flags = XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL; | ||
| 64 | int ilf_fields, tilf_fields; | ||
| 65 | int error = 0; | 59 | int error = 0; |
| 66 | xfs_ifork_t *tempifp, *ifp, *tifp; | ||
| 67 | __uint64_t tmp; | ||
| 68 | int aforkblks = 0; | ||
| 69 | int taforkblks = 0; | ||
| 70 | char locked = 0; | ||
| 71 | 60 | ||
| 72 | sxp = kmem_alloc(sizeof(xfs_swapext_t), KM_MAYFAIL); | 61 | sxp = kmem_alloc(sizeof(xfs_swapext_t), KM_MAYFAIL); |
| 73 | tempifp = kmem_alloc(sizeof(xfs_ifork_t), KM_MAYFAIL); | 62 | if (!sxp) { |
| 74 | if (!sxp || !tempifp) { | ||
| 75 | error = XFS_ERROR(ENOMEM); | 63 | error = XFS_ERROR(ENOMEM); |
| 76 | goto error0; | 64 | goto error0; |
| 77 | } | 65 | } |
| @@ -118,14 +106,56 @@ xfs_swapext( | |||
| 118 | 106 | ||
| 119 | mp = ip->i_mount; | 107 | mp = ip->i_mount; |
| 120 | 108 | ||
| 121 | sbp = &sxp->sx_stat; | ||
| 122 | |||
| 123 | if (XFS_FORCED_SHUTDOWN(mp)) { | 109 | if (XFS_FORCED_SHUTDOWN(mp)) { |
| 124 | error = XFS_ERROR(EIO); | 110 | error = XFS_ERROR(EIO); |
| 125 | goto error0; | 111 | goto error0; |
| 126 | } | 112 | } |
| 127 | 113 | ||
| 128 | locked = 1; | 114 | error = XFS_SWAP_EXTENTS(mp, &ip->i_iocore, &tip->i_iocore, sxp); |
| 115 | |||
| 116 | error0: | ||
| 117 | if (fp != NULL) | ||
| 118 | fput(fp); | ||
| 119 | if (tfp != NULL) | ||
| 120 | fput(tfp); | ||
| 121 | |||
| 122 | if (sxp != NULL) | ||
| 123 | kmem_free(sxp, sizeof(xfs_swapext_t)); | ||
| 124 | |||
| 125 | return error; | ||
| 126 | } | ||
| 127 | |||
| 128 | int | ||
| 129 | xfs_swap_extents( | ||
| 130 | xfs_inode_t *ip, | ||
| 131 | xfs_inode_t *tip, | ||
| 132 | xfs_swapext_t *sxp) | ||
| 133 | { | ||
| 134 | xfs_mount_t *mp; | ||
| 135 | xfs_inode_t *ips[2]; | ||
| 136 | xfs_trans_t *tp; | ||
| 137 | xfs_bstat_t *sbp = &sxp->sx_stat; | ||
| 138 | bhv_vnode_t *vp, *tvp; | ||
| 139 | xfs_ifork_t *tempifp, *ifp, *tifp; | ||
| 140 | int ilf_fields, tilf_fields; | ||
| 141 | static uint lock_flags = XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL; | ||
| 142 | int error = 0; | ||
| 143 | int aforkblks = 0; | ||
| 144 | int taforkblks = 0; | ||
| 145 | __uint64_t tmp; | ||
| 146 | char locked = 0; | ||
| 147 | |||
| 148 | mp = ip->i_mount; | ||
| 149 | |||
| 150 | tempifp = kmem_alloc(sizeof(xfs_ifork_t), KM_MAYFAIL); | ||
| 151 | if (!tempifp) { | ||
| 152 | error = XFS_ERROR(ENOMEM); | ||
| 153 | goto error0; | ||
| 154 | } | ||
| 155 | |||
| 156 | sbp = &sxp->sx_stat; | ||
| 157 | vp = XFS_ITOV(ip); | ||
| 158 | tvp = XFS_ITOV(tip); | ||
| 129 | 159 | ||
| 130 | /* Lock in i_ino order */ | 160 | /* Lock in i_ino order */ |
| 131 | if (ip->i_ino < tip->i_ino) { | 161 | if (ip->i_ino < tip->i_ino) { |
| @@ -137,6 +167,7 @@ xfs_swapext( | |||
| 137 | } | 167 | } |
| 138 | 168 | ||
| 139 | xfs_lock_inodes(ips, 2, 0, lock_flags); | 169 | xfs_lock_inodes(ips, 2, 0, lock_flags); |
| 170 | locked = 1; | ||
| 140 | 171 | ||
| 141 | /* Check permissions */ | 172 | /* Check permissions */ |
| 142 | error = xfs_iaccess(ip, S_IWUSR, NULL); | 173 | error = xfs_iaccess(ip, S_IWUSR, NULL); |
| @@ -169,7 +200,7 @@ xfs_swapext( | |||
| 169 | 200 | ||
| 170 | if (VN_CACHED(tvp) != 0) { | 201 | if (VN_CACHED(tvp) != 0) { |
| 171 | xfs_inval_cached_trace(&tip->i_iocore, 0, -1, 0, -1); | 202 | xfs_inval_cached_trace(&tip->i_iocore, 0, -1, 0, -1); |
| 172 | VOP_FLUSHINVAL_PAGES(tvp, 0, -1, FI_REMAPF_LOCKED); | 203 | bhv_vop_flushinval_pages(tvp, 0, -1, FI_REMAPF_LOCKED); |
| 173 | } | 204 | } |
| 174 | 205 | ||
| 175 | /* Verify O_DIRECT for ftmp */ | 206 | /* Verify O_DIRECT for ftmp */ |
| @@ -214,7 +245,7 @@ xfs_swapext( | |||
| 214 | /* We need to fail if the file is memory mapped. Once we have tossed | 245 | /* We need to fail if the file is memory mapped. Once we have tossed |
| 215 | * all existing pages, the page fault will have no option | 246 | * all existing pages, the page fault will have no option |
| 216 | * but to go to the filesystem for pages. By making the page fault call | 247 | * but to go to the filesystem for pages. By making the page fault call |
| 217 | * VOP_READ (or write in the case of autogrow) they block on the iolock | 248 | * vop_read (or write in the case of autogrow) they block on the iolock |
| 218 | * until we have switched the extents. | 249 | * until we have switched the extents. |
| 219 | */ | 250 | */ |
| 220 | if (VN_MAPPED(vp)) { | 251 | if (VN_MAPPED(vp)) { |
| @@ -233,7 +264,7 @@ xfs_swapext( | |||
| 233 | * fields change. | 264 | * fields change. |
| 234 | */ | 265 | */ |
| 235 | 266 | ||
| 236 | VOP_TOSS_PAGES(vp, 0, -1, FI_REMAPF); | 267 | bhv_vop_toss_pages(vp, 0, -1, FI_REMAPF); |
| 237 | 268 | ||
| 238 | tp = xfs_trans_alloc(mp, XFS_TRANS_SWAPEXT); | 269 | tp = xfs_trans_alloc(mp, XFS_TRANS_SWAPEXT); |
| 239 | if ((error = xfs_trans_reserve(tp, 0, | 270 | if ((error = xfs_trans_reserve(tp, 0, |
| @@ -360,16 +391,7 @@ xfs_swapext( | |||
| 360 | xfs_iunlock(ip, lock_flags); | 391 | xfs_iunlock(ip, lock_flags); |
| 361 | xfs_iunlock(tip, lock_flags); | 392 | xfs_iunlock(tip, lock_flags); |
| 362 | } | 393 | } |
| 363 | |||
| 364 | if (fp != NULL) | ||
| 365 | fput(fp); | ||
| 366 | if (tfp != NULL) | ||
| 367 | fput(tfp); | ||
| 368 | |||
| 369 | if (sxp != NULL) | ||
| 370 | kmem_free(sxp, sizeof(xfs_swapext_t)); | ||
| 371 | if (tempifp != NULL) | 394 | if (tempifp != NULL) |
| 372 | kmem_free(tempifp, sizeof(xfs_ifork_t)); | 395 | kmem_free(tempifp, sizeof(xfs_ifork_t)); |
| 373 | |||
| 374 | return error; | 396 | return error; |
| 375 | } | 397 | } |
