diff options
Diffstat (limited to 'fs/xfs/xfs_iget.c')
-rw-r--r-- | fs/xfs/xfs_iget.c | 48 |
1 files changed, 20 insertions, 28 deletions
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index b07604b94d9f..e229e9e001c2 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
@@ -216,7 +216,14 @@ finish_inode: | |||
216 | mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); | 216 | mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); |
217 | init_waitqueue_head(&ip->i_ipin_wait); | 217 | init_waitqueue_head(&ip->i_ipin_wait); |
218 | atomic_set(&ip->i_pincount, 0); | 218 | atomic_set(&ip->i_pincount, 0); |
219 | initnsema(&ip->i_flock, 1, "xfsfino"); | 219 | |
220 | /* | ||
221 | * Because we want to use a counting completion, complete | ||
222 | * the flush completion once to allow a single access to | ||
223 | * the flush completion without blocking. | ||
224 | */ | ||
225 | init_completion(&ip->i_flush); | ||
226 | complete(&ip->i_flush); | ||
220 | 227 | ||
221 | if (lock_flags) | 228 | if (lock_flags) |
222 | xfs_ilock(ip, lock_flags); | 229 | xfs_ilock(ip, lock_flags); |
@@ -288,10 +295,17 @@ finish_inode: | |||
288 | *ipp = ip; | 295 | *ipp = ip; |
289 | 296 | ||
290 | /* | 297 | /* |
298 | * Set up the Linux with the Linux inode. | ||
299 | */ | ||
300 | ip->i_vnode = inode; | ||
301 | inode->i_private = ip; | ||
302 | |||
303 | /* | ||
291 | * If we have a real type for an on-disk inode, we can set ops(&unlock) | 304 | * If we have a real type for an on-disk inode, we can set ops(&unlock) |
292 | * now. If it's a new inode being created, xfs_ialloc will handle it. | 305 | * now. If it's a new inode being created, xfs_ialloc will handle it. |
293 | */ | 306 | */ |
294 | xfs_initialize_vnode(mp, inode, ip); | 307 | if (ip->i_d.di_mode != 0) |
308 | xfs_setup_inode(ip); | ||
295 | return 0; | 309 | return 0; |
296 | } | 310 | } |
297 | 311 | ||
@@ -411,10 +425,11 @@ xfs_iput(xfs_inode_t *ip, | |||
411 | * Special iput for brand-new inodes that are still locked | 425 | * Special iput for brand-new inodes that are still locked |
412 | */ | 426 | */ |
413 | void | 427 | void |
414 | xfs_iput_new(xfs_inode_t *ip, | 428 | xfs_iput_new( |
415 | uint lock_flags) | 429 | xfs_inode_t *ip, |
430 | uint lock_flags) | ||
416 | { | 431 | { |
417 | struct inode *inode = ip->i_vnode; | 432 | struct inode *inode = VFS_I(ip); |
418 | 433 | ||
419 | xfs_itrace_entry(ip); | 434 | xfs_itrace_entry(ip); |
420 | 435 | ||
@@ -775,26 +790,3 @@ xfs_isilocked( | |||
775 | } | 790 | } |
776 | #endif | 791 | #endif |
777 | 792 | ||
778 | /* | ||
779 | * The following three routines simply manage the i_flock | ||
780 | * semaphore embedded in the inode. This semaphore synchronizes | ||
781 | * processes attempting to flush the in-core inode back to disk. | ||
782 | */ | ||
783 | void | ||
784 | xfs_iflock(xfs_inode_t *ip) | ||
785 | { | ||
786 | psema(&(ip->i_flock), PINOD|PLTWAIT); | ||
787 | } | ||
788 | |||
789 | int | ||
790 | xfs_iflock_nowait(xfs_inode_t *ip) | ||
791 | { | ||
792 | return (cpsema(&(ip->i_flock))); | ||
793 | } | ||
794 | |||
795 | void | ||
796 | xfs_ifunlock(xfs_inode_t *ip) | ||
797 | { | ||
798 | ASSERT(issemalocked(&(ip->i_flock))); | ||
799 | vsema(&(ip->i_flock)); | ||
800 | } | ||