[XFS] Kill xfs_sync()
[safe/jmp/linux-2.6] / fs / xfs / xfs_iget.c
1 /*
2  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_types.h"
21 #include "xfs_bit.h"
22 #include "xfs_log.h"
23 #include "xfs_inum.h"
24 #include "xfs_trans.h"
25 #include "xfs_sb.h"
26 #include "xfs_ag.h"
27 #include "xfs_dir2.h"
28 #include "xfs_dmapi.h"
29 #include "xfs_mount.h"
30 #include "xfs_bmap_btree.h"
31 #include "xfs_alloc_btree.h"
32 #include "xfs_ialloc_btree.h"
33 #include "xfs_dir2_sf.h"
34 #include "xfs_attr_sf.h"
35 #include "xfs_dinode.h"
36 #include "xfs_inode.h"
37 #include "xfs_btree.h"
38 #include "xfs_ialloc.h"
39 #include "xfs_quota.h"
40 #include "xfs_utils.h"
41
42 /*
43  * Look up an inode by number in the given file system.
44  * The inode is looked up in the cache held in each AG.
45  * If the inode is found in the cache, attach it to the provided
46  * vnode.
47  *
48  * If it is not in core, read it in from the file system's device,
49  * add it to the cache and attach the provided vnode.
50  *
51  * The inode is locked according to the value of the lock_flags parameter.
52  * This flag parameter indicates how and if the inode's IO lock and inode lock
53  * should be taken.
54  *
55  * mp -- the mount point structure for the current file system.  It points
56  *       to the inode hash table.
57  * tp -- a pointer to the current transaction if there is one.  This is
58  *       simply passed through to the xfs_iread() call.
59  * ino -- the number of the inode desired.  This is the unique identifier
60  *        within the file system for the inode being requested.
61  * lock_flags -- flags indicating how to lock the inode.  See the comment
62  *               for xfs_ilock() for a list of valid values.
63  * bno -- the block number starting the buffer containing the inode,
64  *        if known (as by bulkstat), else 0.
65  */
66 STATIC int
67 xfs_iget_core(
68         struct inode    *inode,
69         xfs_mount_t     *mp,
70         xfs_trans_t     *tp,
71         xfs_ino_t       ino,
72         uint            flags,
73         uint            lock_flags,
74         xfs_inode_t     **ipp,
75         xfs_daddr_t     bno)
76 {
77         struct inode    *old_inode;
78         xfs_inode_t     *ip;
79         int             error;
80         unsigned long   first_index, mask;
81         xfs_perag_t     *pag;
82         xfs_agino_t     agino;
83
84         /* the radix tree exists only in inode capable AGs */
85         if (XFS_INO_TO_AGNO(mp, ino) >= mp->m_maxagi)
86                 return EINVAL;
87
88         /* get the perag structure and ensure that it's inode capable */
89         pag = xfs_get_perag(mp, ino);
90         if (!pag->pagi_inodeok)
91                 return EINVAL;
92         ASSERT(pag->pag_ici_init);
93         agino = XFS_INO_TO_AGINO(mp, ino);
94
95 again:
96         read_lock(&pag->pag_ici_lock);
97         ip = radix_tree_lookup(&pag->pag_ici_root, agino);
98
99         if (ip != NULL) {
100                 /*
101                  * If INEW is set this inode is being set up
102                  * we need to pause and try again.
103                  */
104                 if (xfs_iflags_test(ip, XFS_INEW)) {
105                         read_unlock(&pag->pag_ici_lock);
106                         delay(1);
107                         XFS_STATS_INC(xs_ig_frecycle);
108
109                         goto again;
110                 }
111
112                 old_inode = ip->i_vnode;
113                 if (old_inode == NULL) {
114                         /*
115                          * If IRECLAIM is set this inode is
116                          * on its way out of the system,
117                          * we need to pause and try again.
118                          */
119                         if (xfs_iflags_test(ip, XFS_IRECLAIM)) {
120                                 read_unlock(&pag->pag_ici_lock);
121                                 delay(1);
122                                 XFS_STATS_INC(xs_ig_frecycle);
123
124                                 goto again;
125                         }
126                         ASSERT(xfs_iflags_test(ip, XFS_IRECLAIMABLE));
127
128                         /*
129                          * If lookup is racing with unlink, then we
130                          * should return an error immediately so we
131                          * don't remove it from the reclaim list and
132                          * potentially leak the inode.
133                          */
134                         if ((ip->i_d.di_mode == 0) &&
135                             !(flags & XFS_IGET_CREATE)) {
136                                 read_unlock(&pag->pag_ici_lock);
137                                 xfs_put_perag(mp, pag);
138                                 return ENOENT;
139                         }
140
141                         xfs_itrace_exit_tag(ip, "xfs_iget.alloc");
142
143                         XFS_STATS_INC(xs_ig_found);
144                         xfs_iflags_clear(ip, XFS_IRECLAIMABLE);
145                         read_unlock(&pag->pag_ici_lock);
146
147                         XFS_MOUNT_ILOCK(mp);
148                         list_del_init(&ip->i_reclaim);
149                         XFS_MOUNT_IUNLOCK(mp);
150
151                         goto finish_inode;
152
153                 } else if (inode != old_inode) {
154                         /* The inode is being torn down, pause and
155                          * try again.
156                          */
157                         if (old_inode->i_state & (I_FREEING | I_CLEAR)) {
158                                 read_unlock(&pag->pag_ici_lock);
159                                 delay(1);
160                                 XFS_STATS_INC(xs_ig_frecycle);
161
162                                 goto again;
163                         }
164 /* Chances are the other vnode (the one in the inode) is being torn
165 * down right now, and we landed on top of it. Question is, what do
166 * we do? Unhook the old inode and hook up the new one?
167 */
168                         cmn_err(CE_PANIC,
169                 "xfs_iget_core: ambiguous vns: vp/0x%p, invp/0x%p",
170                                         old_inode, inode);
171                 }
172
173                 /*
174                  * Inode cache hit
175                  */
176                 read_unlock(&pag->pag_ici_lock);
177                 XFS_STATS_INC(xs_ig_found);
178
179 finish_inode:
180                 if (ip->i_d.di_mode == 0 && !(flags & XFS_IGET_CREATE)) {
181                         xfs_put_perag(mp, pag);
182                         return ENOENT;
183                 }
184
185                 if (lock_flags != 0)
186                         xfs_ilock(ip, lock_flags);
187
188                 xfs_iflags_clear(ip, XFS_ISTALE);
189                 xfs_itrace_exit_tag(ip, "xfs_iget.found");
190                 goto return_ip;
191         }
192
193         /*
194          * Inode cache miss
195          */
196         read_unlock(&pag->pag_ici_lock);
197         XFS_STATS_INC(xs_ig_missed);
198
199         /*
200          * Read the disk inode attributes into a new inode structure and get
201          * a new vnode for it. This should also initialize i_ino and i_mount.
202          */
203         error = xfs_iread(mp, tp, ino, &ip, bno,
204                           (flags & XFS_IGET_BULKSTAT) ? XFS_IMAP_BULKSTAT : 0);
205         if (error) {
206                 xfs_put_perag(mp, pag);
207                 return error;
208         }
209
210         xfs_itrace_exit_tag(ip, "xfs_iget.alloc");
211
212         if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) {
213                 xfs_idestroy(ip);
214                 xfs_put_perag(mp, pag);
215                 return ENOENT;
216         }
217
218         /*
219          * Preload the radix tree so we can insert safely under the
220          * write spinlock.
221          */
222         if (radix_tree_preload(GFP_KERNEL)) {
223                 xfs_idestroy(ip);
224                 delay(1);
225                 goto again;
226         }
227
228         if (lock_flags)
229                 xfs_ilock(ip, lock_flags);
230
231         mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1);
232         first_index = agino & mask;
233         write_lock(&pag->pag_ici_lock);
234         /*
235          * insert the new inode
236          */
237         error = radix_tree_insert(&pag->pag_ici_root, agino, ip);
238         if (unlikely(error)) {
239                 BUG_ON(error != -EEXIST);
240                 write_unlock(&pag->pag_ici_lock);
241                 radix_tree_preload_end();
242                 if (lock_flags)
243                         xfs_iunlock(ip, lock_flags);
244                 xfs_idestroy(ip);
245                 XFS_STATS_INC(xs_ig_dup);
246                 goto again;
247         }
248
249         /*
250          * These values _must_ be set before releasing the radix tree lock!
251          */
252         ip->i_udquot = ip->i_gdquot = NULL;
253         xfs_iflags_set(ip, XFS_INEW);
254
255         write_unlock(&pag->pag_ici_lock);
256         radix_tree_preload_end();
257         xfs_put_perag(mp, pag);
258
259  return_ip:
260         ASSERT(ip->i_df.if_ext_max ==
261                XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t));
262
263         xfs_iflags_set(ip, XFS_IMODIFIED);
264         *ipp = ip;
265
266         /*
267          * Set up the Linux with the Linux inode.
268          */
269         ip->i_vnode = inode;
270         inode->i_private = ip;
271
272         /*
273          * If we have a real type for an on-disk inode, we can set ops(&unlock)
274          * now.  If it's a new inode being created, xfs_ialloc will handle it.
275          */
276         if (ip->i_d.di_mode != 0)
277                 xfs_setup_inode(ip);
278         return 0;
279 }
280
281
282 /*
283  * The 'normal' internal xfs_iget, if needed it will
284  * 'allocate', or 'get', the vnode.
285  */
286 int
287 xfs_iget(
288         xfs_mount_t     *mp,
289         xfs_trans_t     *tp,
290         xfs_ino_t       ino,
291         uint            flags,
292         uint            lock_flags,
293         xfs_inode_t     **ipp,
294         xfs_daddr_t     bno)
295 {
296         struct inode    *inode;
297         xfs_inode_t     *ip;
298         int             error;
299
300         XFS_STATS_INC(xs_ig_attempts);
301
302 retry:
303         inode = iget_locked(mp->m_super, ino);
304         if (!inode)
305                 /* If we got no inode we are out of memory */
306                 return ENOMEM;
307
308         if (inode->i_state & I_NEW) {
309                 XFS_STATS_INC(vn_active);
310                 XFS_STATS_INC(vn_alloc);
311
312                 error = xfs_iget_core(inode, mp, tp, ino, flags,
313                                 lock_flags, ipp, bno);
314                 if (error) {
315                         make_bad_inode(inode);
316                         if (inode->i_state & I_NEW)
317                                 unlock_new_inode(inode);
318                         iput(inode);
319                 }
320                 return error;
321         }
322
323         /*
324          * If the inode is not fully constructed due to
325          * filehandle mismatches wait for the inode to go
326          * away and try again.
327          *
328          * iget_locked will call __wait_on_freeing_inode
329          * to wait for the inode to go away.
330          */
331         if (is_bad_inode(inode)) {
332                 iput(inode);
333                 delay(1);
334                 goto retry;
335         }
336
337         ip = XFS_I(inode);
338         if (!ip) {
339                 iput(inode);
340                 delay(1);
341                 goto retry;
342         }
343
344         if (lock_flags != 0)
345                 xfs_ilock(ip, lock_flags);
346         XFS_STATS_INC(xs_ig_found);
347         *ipp = ip;
348         return 0;
349 }
350
351 /*
352  * Look for the inode corresponding to the given ino in the hash table.
353  * If it is there and its i_transp pointer matches tp, return it.
354  * Otherwise, return NULL.
355  */
356 xfs_inode_t *
357 xfs_inode_incore(xfs_mount_t    *mp,
358                  xfs_ino_t      ino,
359                  xfs_trans_t    *tp)
360 {
361         xfs_inode_t     *ip;
362         xfs_perag_t     *pag;
363
364         pag = xfs_get_perag(mp, ino);
365         read_lock(&pag->pag_ici_lock);
366         ip = radix_tree_lookup(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ino));
367         read_unlock(&pag->pag_ici_lock);
368         xfs_put_perag(mp, pag);
369
370         /* the returned inode must match the transaction */
371         if (ip && (ip->i_transp != tp))
372                 return NULL;
373         return ip;
374 }
375
376 /*
377  * Decrement reference count of an inode structure and unlock it.
378  *
379  * ip -- the inode being released
380  * lock_flags -- this parameter indicates the inode's locks to be
381  *       to be released.  See the comment on xfs_iunlock() for a list
382  *       of valid values.
383  */
384 void
385 xfs_iput(xfs_inode_t    *ip,
386          uint           lock_flags)
387 {
388         xfs_itrace_entry(ip);
389         xfs_iunlock(ip, lock_flags);
390         IRELE(ip);
391 }
392
393 /*
394  * Special iput for brand-new inodes that are still locked
395  */
396 void
397 xfs_iput_new(
398         xfs_inode_t     *ip,
399         uint            lock_flags)
400 {
401         struct inode    *inode = VFS_I(ip);
402
403         xfs_itrace_entry(ip);
404
405         if ((ip->i_d.di_mode == 0)) {
406                 ASSERT(!xfs_iflags_test(ip, XFS_IRECLAIMABLE));
407                 make_bad_inode(inode);
408         }
409         if (inode->i_state & I_NEW)
410                 unlock_new_inode(inode);
411         if (lock_flags)
412                 xfs_iunlock(ip, lock_flags);
413         IRELE(ip);
414 }
415
416
417 /*
418  * This routine embodies the part of the reclaim code that pulls
419  * the inode from the inode hash table and the mount structure's
420  * inode list.
421  * This should only be called from xfs_reclaim().
422  */
423 void
424 xfs_ireclaim(xfs_inode_t *ip)
425 {
426         /*
427          * Remove from old hash list and mount list.
428          */
429         XFS_STATS_INC(xs_ig_reclaims);
430
431         xfs_iextract(ip);
432
433         /*
434          * Here we do a spurious inode lock in order to coordinate with inode
435          * cache radix tree lookups.  This is because the lookup can reference
436          * the inodes in the cache without taking references.  We make that OK
437          * here by ensuring that we wait until the inode is unlocked after the
438          * lookup before we go ahead and free it.  We get both the ilock and
439          * the iolock because the code may need to drop the ilock one but will
440          * still hold the iolock.
441          */
442         xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
443
444         /*
445          * Release dquots (and their references) if any. An inode may escape
446          * xfs_inactive and get here via vn_alloc->vn_reclaim path.
447          */
448         XFS_QM_DQDETACH(ip->i_mount, ip);
449
450         /*
451          * Pull our behavior descriptor from the vnode chain.
452          */
453         if (ip->i_vnode) {
454                 ip->i_vnode->i_private = NULL;
455                 ip->i_vnode = NULL;
456         }
457
458         /*
459          * Free all memory associated with the inode.
460          */
461         xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
462         xfs_idestroy(ip);
463 }
464
465 /*
466  * This routine removes an about-to-be-destroyed inode from
467  * all of the lists in which it is located with the exception
468  * of the behavior chain.
469  */
470 void
471 xfs_iextract(
472         xfs_inode_t     *ip)
473 {
474         xfs_mount_t     *mp = ip->i_mount;
475         xfs_perag_t     *pag = xfs_get_perag(mp, ip->i_ino);
476
477         write_lock(&pag->pag_ici_lock);
478         radix_tree_delete(&pag->pag_ici_root, XFS_INO_TO_AGINO(mp, ip->i_ino));
479         write_unlock(&pag->pag_ici_lock);
480         xfs_put_perag(mp, pag);
481
482         /* Deal with the deleted inodes list */
483         XFS_MOUNT_ILOCK(mp);
484         list_del_init(&ip->i_reclaim);
485         mp->m_ireclaims++;
486         XFS_MOUNT_IUNLOCK(mp);
487 }
488
489 /*
490  * This is a wrapper routine around the xfs_ilock() routine
491  * used to centralize some grungy code.  It is used in places
492  * that wish to lock the inode solely for reading the extents.
493  * The reason these places can't just call xfs_ilock(SHARED)
494  * is that the inode lock also guards to bringing in of the
495  * extents from disk for a file in b-tree format.  If the inode
496  * is in b-tree format, then we need to lock the inode exclusively
497  * until the extents are read in.  Locking it exclusively all
498  * the time would limit our parallelism unnecessarily, though.
499  * What we do instead is check to see if the extents have been
500  * read in yet, and only lock the inode exclusively if they
501  * have not.
502  *
503  * The function returns a value which should be given to the
504  * corresponding xfs_iunlock_map_shared().  This value is
505  * the mode in which the lock was actually taken.
506  */
507 uint
508 xfs_ilock_map_shared(
509         xfs_inode_t     *ip)
510 {
511         uint    lock_mode;
512
513         if ((ip->i_d.di_format == XFS_DINODE_FMT_BTREE) &&
514             ((ip->i_df.if_flags & XFS_IFEXTENTS) == 0)) {
515                 lock_mode = XFS_ILOCK_EXCL;
516         } else {
517                 lock_mode = XFS_ILOCK_SHARED;
518         }
519
520         xfs_ilock(ip, lock_mode);
521
522         return lock_mode;
523 }
524
525 /*
526  * This is simply the unlock routine to go with xfs_ilock_map_shared().
527  * All it does is call xfs_iunlock() with the given lock_mode.
528  */
529 void
530 xfs_iunlock_map_shared(
531         xfs_inode_t     *ip,
532         unsigned int    lock_mode)
533 {
534         xfs_iunlock(ip, lock_mode);
535 }
536
537 /*
538  * The xfs inode contains 2 locks: a multi-reader lock called the
539  * i_iolock and a multi-reader lock called the i_lock.  This routine
540  * allows either or both of the locks to be obtained.
541  *
542  * The 2 locks should always be ordered so that the IO lock is
543  * obtained first in order to prevent deadlock.
544  *
545  * ip -- the inode being locked
546  * lock_flags -- this parameter indicates the inode's locks
547  *       to be locked.  It can be:
548  *              XFS_IOLOCK_SHARED,
549  *              XFS_IOLOCK_EXCL,
550  *              XFS_ILOCK_SHARED,
551  *              XFS_ILOCK_EXCL,
552  *              XFS_IOLOCK_SHARED | XFS_ILOCK_SHARED,
553  *              XFS_IOLOCK_SHARED | XFS_ILOCK_EXCL,
554  *              XFS_IOLOCK_EXCL | XFS_ILOCK_SHARED,
555  *              XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL
556  */
557 void
558 xfs_ilock(
559         xfs_inode_t             *ip,
560         uint                    lock_flags)
561 {
562         /*
563          * You can't set both SHARED and EXCL for the same lock,
564          * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED,
565          * and XFS_ILOCK_EXCL are valid values to set in lock_flags.
566          */
567         ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
568                (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
569         ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
570                (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
571         ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0);
572
573         if (lock_flags & XFS_IOLOCK_EXCL)
574                 mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags));
575         else if (lock_flags & XFS_IOLOCK_SHARED)
576                 mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags));
577
578         if (lock_flags & XFS_ILOCK_EXCL)
579                 mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags));
580         else if (lock_flags & XFS_ILOCK_SHARED)
581                 mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags));
582
583         xfs_ilock_trace(ip, 1, lock_flags, (inst_t *)__return_address);
584 }
585
586 /*
587  * This is just like xfs_ilock(), except that the caller
588  * is guaranteed not to sleep.  It returns 1 if it gets
589  * the requested locks and 0 otherwise.  If the IO lock is
590  * obtained but the inode lock cannot be, then the IO lock
591  * is dropped before returning.
592  *
593  * ip -- the inode being locked
594  * lock_flags -- this parameter indicates the inode's locks to be
595  *       to be locked.  See the comment for xfs_ilock() for a list
596  *       of valid values.
597  */
598 int
599 xfs_ilock_nowait(
600         xfs_inode_t             *ip,
601         uint                    lock_flags)
602 {
603         /*
604          * You can't set both SHARED and EXCL for the same lock,
605          * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED,
606          * and XFS_ILOCK_EXCL are valid values to set in lock_flags.
607          */
608         ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
609                (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
610         ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
611                (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
612         ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0);
613
614         if (lock_flags & XFS_IOLOCK_EXCL) {
615                 if (!mrtryupdate(&ip->i_iolock))
616                         goto out;
617         } else if (lock_flags & XFS_IOLOCK_SHARED) {
618                 if (!mrtryaccess(&ip->i_iolock))
619                         goto out;
620         }
621         if (lock_flags & XFS_ILOCK_EXCL) {
622                 if (!mrtryupdate(&ip->i_lock))
623                         goto out_undo_iolock;
624         } else if (lock_flags & XFS_ILOCK_SHARED) {
625                 if (!mrtryaccess(&ip->i_lock))
626                         goto out_undo_iolock;
627         }
628         xfs_ilock_trace(ip, 2, lock_flags, (inst_t *)__return_address);
629         return 1;
630
631  out_undo_iolock:
632         if (lock_flags & XFS_IOLOCK_EXCL)
633                 mrunlock_excl(&ip->i_iolock);
634         else if (lock_flags & XFS_IOLOCK_SHARED)
635                 mrunlock_shared(&ip->i_iolock);
636  out:
637         return 0;
638 }
639
640 /*
641  * xfs_iunlock() is used to drop the inode locks acquired with
642  * xfs_ilock() and xfs_ilock_nowait().  The caller must pass
643  * in the flags given to xfs_ilock() or xfs_ilock_nowait() so
644  * that we know which locks to drop.
645  *
646  * ip -- the inode being unlocked
647  * lock_flags -- this parameter indicates the inode's locks to be
648  *       to be unlocked.  See the comment for xfs_ilock() for a list
649  *       of valid values for this parameter.
650  *
651  */
652 void
653 xfs_iunlock(
654         xfs_inode_t             *ip,
655         uint                    lock_flags)
656 {
657         /*
658          * You can't set both SHARED and EXCL for the same lock,
659          * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED,
660          * and XFS_ILOCK_EXCL are valid values to set in lock_flags.
661          */
662         ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
663                (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
664         ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
665                (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
666         ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_IUNLOCK_NONOTIFY |
667                         XFS_LOCK_DEP_MASK)) == 0);
668         ASSERT(lock_flags != 0);
669
670         if (lock_flags & XFS_IOLOCK_EXCL)
671                 mrunlock_excl(&ip->i_iolock);
672         else if (lock_flags & XFS_IOLOCK_SHARED)
673                 mrunlock_shared(&ip->i_iolock);
674
675         if (lock_flags & XFS_ILOCK_EXCL)
676                 mrunlock_excl(&ip->i_lock);
677         else if (lock_flags & XFS_ILOCK_SHARED)
678                 mrunlock_shared(&ip->i_lock);
679
680         if ((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) &&
681             !(lock_flags & XFS_IUNLOCK_NONOTIFY) && ip->i_itemp) {
682                 /*
683                  * Let the AIL know that this item has been unlocked in case
684                  * it is in the AIL and anyone is waiting on it.  Don't do
685                  * this if the caller has asked us not to.
686                  */
687                 xfs_trans_unlocked_item(ip->i_mount,
688                                         (xfs_log_item_t*)(ip->i_itemp));
689         }
690         xfs_ilock_trace(ip, 3, lock_flags, (inst_t *)__return_address);
691 }
692
693 /*
694  * give up write locks.  the i/o lock cannot be held nested
695  * if it is being demoted.
696  */
697 void
698 xfs_ilock_demote(
699         xfs_inode_t             *ip,
700         uint                    lock_flags)
701 {
702         ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL));
703         ASSERT((lock_flags & ~(XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)) == 0);
704
705         if (lock_flags & XFS_ILOCK_EXCL)
706                 mrdemote(&ip->i_lock);
707         if (lock_flags & XFS_IOLOCK_EXCL)
708                 mrdemote(&ip->i_iolock);
709 }
710
711 #ifdef DEBUG
712 /*
713  * Debug-only routine, without additional rw_semaphore APIs, we can
714  * now only answer requests regarding whether we hold the lock for write
715  * (reader state is outside our visibility, we only track writer state).
716  *
717  * Note: this means !xfs_isilocked would give false positives, so don't do that.
718  */
719 int
720 xfs_isilocked(
721         xfs_inode_t             *ip,
722         uint                    lock_flags)
723 {
724         if ((lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) ==
725                         XFS_ILOCK_EXCL) {
726                 if (!ip->i_lock.mr_writer)
727                         return 0;
728         }
729
730         if ((lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) ==
731                         XFS_IOLOCK_EXCL) {
732                 if (!ip->i_iolock.mr_writer)
733                         return 0;
734         }
735
736         return 1;
737 }
738 #endif
739