Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec...
[pandora-kernel.git] / fs / xfs / quota / xfs_dquot_item.c
1 /*
2  * Copyright (c) 2000-2003 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_bit.h"
21 #include "xfs_log.h"
22 #include "xfs_inum.h"
23 #include "xfs_trans.h"
24 #include "xfs_sb.h"
25 #include "xfs_ag.h"
26 #include "xfs_dir2.h"
27 #include "xfs_alloc.h"
28 #include "xfs_dmapi.h"
29 #include "xfs_quota.h"
30 #include "xfs_mount.h"
31 #include "xfs_bmap_btree.h"
32 #include "xfs_alloc_btree.h"
33 #include "xfs_ialloc_btree.h"
34 #include "xfs_dir2_sf.h"
35 #include "xfs_attr_sf.h"
36 #include "xfs_dinode.h"
37 #include "xfs_inode.h"
38 #include "xfs_bmap.h"
39 #include "xfs_btree.h"
40 #include "xfs_ialloc.h"
41 #include "xfs_rtalloc.h"
42 #include "xfs_error.h"
43 #include "xfs_itable.h"
44 #include "xfs_rw.h"
45 #include "xfs_attr.h"
46 #include "xfs_buf_item.h"
47 #include "xfs_trans_priv.h"
48 #include "xfs_qm.h"
49
50 /*
51  * returns the number of iovecs needed to log the given dquot item.
52  */
53 /* ARGSUSED */
54 STATIC uint
55 xfs_qm_dquot_logitem_size(
56         xfs_dq_logitem_t        *logitem)
57 {
58         /*
59          * we need only two iovecs, one for the format, one for the real thing
60          */
61         return (2);
62 }
63
64 /*
65  * fills in the vector of log iovecs for the given dquot log item.
66  */
67 STATIC void
68 xfs_qm_dquot_logitem_format(
69         xfs_dq_logitem_t        *logitem,
70         xfs_log_iovec_t         *logvec)
71 {
72         ASSERT(logitem);
73         ASSERT(logitem->qli_dquot);
74
75         logvec->i_addr = (xfs_caddr_t)&logitem->qli_format;
76         logvec->i_len  = sizeof(xfs_dq_logformat_t);
77         logvec->i_type = XLOG_REG_TYPE_QFORMAT;
78         logvec++;
79         logvec->i_addr = (xfs_caddr_t)&logitem->qli_dquot->q_core;
80         logvec->i_len  = sizeof(xfs_disk_dquot_t);
81         logvec->i_type = XLOG_REG_TYPE_DQUOT;
82
83         ASSERT(2 == logitem->qli_item.li_desc->lid_size);
84         logitem->qli_format.qlf_size = 2;
85
86 }
87
88 /*
89  * Increment the pin count of the given dquot.
90  */
91 STATIC void
92 xfs_qm_dquot_logitem_pin(
93         xfs_dq_logitem_t *logitem)
94 {
95         xfs_dquot_t *dqp = logitem->qli_dquot;
96
97         ASSERT(XFS_DQ_IS_LOCKED(dqp));
98         atomic_inc(&dqp->q_pincount);
99 }
100
101 /*
102  * Decrement the pin count of the given dquot, and wake up
103  * anyone in xfs_dqwait_unpin() if the count goes to 0.  The
104  * dquot must have been previously pinned with a call to
105  * xfs_qm_dquot_logitem_pin().
106  */
107 /* ARGSUSED */
108 STATIC void
109 xfs_qm_dquot_logitem_unpin(
110         xfs_dq_logitem_t *logitem,
111         int               stale)
112 {
113         xfs_dquot_t *dqp = logitem->qli_dquot;
114
115         ASSERT(atomic_read(&dqp->q_pincount) > 0);
116         if (atomic_dec_and_test(&dqp->q_pincount))
117                 wake_up(&dqp->q_pinwait);
118 }
119
120 /* ARGSUSED */
121 STATIC void
122 xfs_qm_dquot_logitem_unpin_remove(
123         xfs_dq_logitem_t *logitem,
124         xfs_trans_t      *tp)
125 {
126         xfs_qm_dquot_logitem_unpin(logitem, 0);
127 }
128
129 /*
130  * Given the logitem, this writes the corresponding dquot entry to disk
131  * asynchronously. This is called with the dquot entry securely locked;
132  * we simply get xfs_qm_dqflush() to do the work, and unlock the dquot
133  * at the end.
134  */
135 STATIC void
136 xfs_qm_dquot_logitem_push(
137         xfs_dq_logitem_t        *logitem)
138 {
139         xfs_dquot_t     *dqp;
140         int             error;
141
142         dqp = logitem->qli_dquot;
143
144         ASSERT(XFS_DQ_IS_LOCKED(dqp));
145         ASSERT(!completion_done(&dqp->q_flush));
146
147         /*
148          * Since we were able to lock the dquot's flush lock and
149          * we found it on the AIL, the dquot must be dirty.  This
150          * is because the dquot is removed from the AIL while still
151          * holding the flush lock in xfs_dqflush_done().  Thus, if
152          * we found it in the AIL and were able to obtain the flush
153          * lock without sleeping, then there must not have been
154          * anyone in the process of flushing the dquot.
155          */
156         error = xfs_qm_dqflush(dqp, 0);
157         if (error)
158                 xfs_fs_cmn_err(CE_WARN, dqp->q_mount,
159                         "xfs_qm_dquot_logitem_push: push error %d on dqp %p",
160                         error, dqp);
161         xfs_dqunlock(dqp);
162 }
163
164 /*ARGSUSED*/
165 STATIC xfs_lsn_t
166 xfs_qm_dquot_logitem_committed(
167         xfs_dq_logitem_t        *l,
168         xfs_lsn_t               lsn)
169 {
170         /*
171          * We always re-log the entire dquot when it becomes dirty,
172          * so, the latest copy _is_ the only one that matters.
173          */
174         return (lsn);
175 }
176
177
178 /*
179  * This is called to wait for the given dquot to be unpinned.
180  * Most of these pin/unpin routines are plagiarized from inode code.
181  */
182 void
183 xfs_qm_dqunpin_wait(
184         xfs_dquot_t     *dqp)
185 {
186         ASSERT(XFS_DQ_IS_LOCKED(dqp));
187         if (atomic_read(&dqp->q_pincount) == 0)
188                 return;
189
190         /*
191          * Give the log a push so we don't wait here too long.
192          */
193         xfs_log_force(dqp->q_mount, 0);
194         wait_event(dqp->q_pinwait, (atomic_read(&dqp->q_pincount) == 0));
195 }
196
197 /*
198  * This is called when IOP_TRYLOCK returns XFS_ITEM_PUSHBUF to indicate that
199  * the dquot is locked by us, but the flush lock isn't. So, here we are
200  * going to see if the relevant dquot buffer is incore, waiting on DELWRI.
201  * If so, we want to push it out to help us take this item off the AIL as soon
202  * as possible.
203  *
204  * We must not be holding the AIL lock at this point. Calling incore() to
205  * search the buffer cache can be a time consuming thing, and AIL lock is a
206  * spinlock.
207  */
208 STATIC void
209 xfs_qm_dquot_logitem_pushbuf(
210         xfs_dq_logitem_t    *qip)
211 {
212         xfs_dquot_t     *dqp;
213         xfs_mount_t     *mp;
214         xfs_buf_t       *bp;
215
216         dqp = qip->qli_dquot;
217         ASSERT(XFS_DQ_IS_LOCKED(dqp));
218
219         /*
220          * If flushlock isn't locked anymore, chances are that the
221          * inode flush completed and the inode was taken off the AIL.
222          * So, just get out.
223          */
224         if (completion_done(&dqp->q_flush)  ||
225             ((qip->qli_item.li_flags & XFS_LI_IN_AIL) == 0)) {
226                 xfs_dqunlock(dqp);
227                 return;
228         }
229         mp = dqp->q_mount;
230         bp = xfs_incore(mp->m_ddev_targp, qip->qli_format.qlf_blkno,
231                     XFS_QI_DQCHUNKLEN(mp), XBF_TRYLOCK);
232         xfs_dqunlock(dqp);
233         if (!bp)
234                 return;
235         if (XFS_BUF_ISDELAYWRITE(bp))
236                 xfs_buf_delwri_promote(bp);
237         xfs_buf_relse(bp);
238         return;
239
240 }
241
242 /*
243  * This is called to attempt to lock the dquot associated with this
244  * dquot log item.  Don't sleep on the dquot lock or the flush lock.
245  * If the flush lock is already held, indicating that the dquot has
246  * been or is in the process of being flushed, then see if we can
247  * find the dquot's buffer in the buffer cache without sleeping.  If
248  * we can and it is marked delayed write, then we want to send it out.
249  * We delay doing so until the push routine, though, to avoid sleeping
250  * in any device strategy routines.
251  */
252 STATIC uint
253 xfs_qm_dquot_logitem_trylock(
254         xfs_dq_logitem_t        *qip)
255 {
256         xfs_dquot_t             *dqp;
257
258         dqp = qip->qli_dquot;
259         if (atomic_read(&dqp->q_pincount) > 0)
260                 return XFS_ITEM_PINNED;
261
262         if (! xfs_qm_dqlock_nowait(dqp))
263                 return XFS_ITEM_LOCKED;
264
265         if (!xfs_dqflock_nowait(dqp)) {
266                 /*
267                  * dquot has already been flushed to the backing buffer,
268                  * leave it locked, pushbuf routine will unlock it.
269                  */
270                 return XFS_ITEM_PUSHBUF;
271         }
272
273         ASSERT(qip->qli_item.li_flags & XFS_LI_IN_AIL);
274         return XFS_ITEM_SUCCESS;
275 }
276
277
278 /*
279  * Unlock the dquot associated with the log item.
280  * Clear the fields of the dquot and dquot log item that
281  * are specific to the current transaction.  If the
282  * hold flags is set, do not unlock the dquot.
283  */
284 STATIC void
285 xfs_qm_dquot_logitem_unlock(
286         xfs_dq_logitem_t    *ql)
287 {
288         xfs_dquot_t     *dqp;
289
290         ASSERT(ql != NULL);
291         dqp = ql->qli_dquot;
292         ASSERT(XFS_DQ_IS_LOCKED(dqp));
293
294         /*
295          * Clear the transaction pointer in the dquot
296          */
297         dqp->q_transp = NULL;
298
299         /*
300          * dquots are never 'held' from getting unlocked at the end of
301          * a transaction.  Their locking and unlocking is hidden inside the
302          * transaction layer, within trans_commit. Hence, no LI_HOLD flag
303          * for the logitem.
304          */
305         xfs_dqunlock(dqp);
306 }
307
308
309 /*
310  * this needs to stamp an lsn into the dquot, I think.
311  * rpc's that look at user dquot's would then have to
312  * push on the dependency recorded in the dquot
313  */
314 /* ARGSUSED */
315 STATIC void
316 xfs_qm_dquot_logitem_committing(
317         xfs_dq_logitem_t        *l,
318         xfs_lsn_t               lsn)
319 {
320         return;
321 }
322
323
324 /*
325  * This is the ops vector for dquots
326  */
327 static struct xfs_item_ops xfs_dquot_item_ops = {
328         .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_size,
329         .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
330                                         xfs_qm_dquot_logitem_format,
331         .iop_pin        = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_pin,
332         .iop_unpin      = (void(*)(xfs_log_item_t*, int))
333                                         xfs_qm_dquot_logitem_unpin,
334         .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t*))
335                                         xfs_qm_dquot_logitem_unpin_remove,
336         .iop_trylock    = (uint(*)(xfs_log_item_t*))
337                                         xfs_qm_dquot_logitem_trylock,
338         .iop_unlock     = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_unlock,
339         .iop_committed  = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t))
340                                         xfs_qm_dquot_logitem_committed,
341         .iop_push       = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_push,
342         .iop_pushbuf    = (void(*)(xfs_log_item_t*))
343                                         xfs_qm_dquot_logitem_pushbuf,
344         .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t))
345                                         xfs_qm_dquot_logitem_committing
346 };
347
348 /*
349  * Initialize the dquot log item for a newly allocated dquot.
350  * The dquot isn't locked at this point, but it isn't on any of the lists
351  * either, so we don't care.
352  */
353 void
354 xfs_qm_dquot_logitem_init(
355         struct xfs_dquot *dqp)
356 {
357         xfs_dq_logitem_t  *lp;
358         lp = &dqp->q_logitem;
359
360         lp->qli_item.li_type = XFS_LI_DQUOT;
361         lp->qli_item.li_ops = &xfs_dquot_item_ops;
362         lp->qli_item.li_mountp = dqp->q_mount;
363         lp->qli_dquot = dqp;
364         lp->qli_format.qlf_type = XFS_LI_DQUOT;
365         lp->qli_format.qlf_id = be32_to_cpu(dqp->q_core.d_id);
366         lp->qli_format.qlf_blkno = dqp->q_blkno;
367         lp->qli_format.qlf_len = 1;
368         /*
369          * This is just the offset of this dquot within its buffer
370          * (which is currently 1 FSB and probably won't change).
371          * Hence 32 bits for this offset should be just fine.
372          * Alternatively, we can store (bufoffset / sizeof(xfs_dqblk_t))
373          * here, and recompute it at recovery time.
374          */
375         lp->qli_format.qlf_boffset = (__uint32_t)dqp->q_bufoffset;
376 }
377
378 /*------------------  QUOTAOFF LOG ITEMS  -------------------*/
379
380 /*
381  * This returns the number of iovecs needed to log the given quotaoff item.
382  * We only need 1 iovec for an quotaoff item.  It just logs the
383  * quotaoff_log_format structure.
384  */
385 /*ARGSUSED*/
386 STATIC uint
387 xfs_qm_qoff_logitem_size(xfs_qoff_logitem_t *qf)
388 {
389         return (1);
390 }
391
392 /*
393  * This is called to fill in the vector of log iovecs for the
394  * given quotaoff log item. We use only 1 iovec, and we point that
395  * at the quotaoff_log_format structure embedded in the quotaoff item.
396  * It is at this point that we assert that all of the extent
397  * slots in the quotaoff item have been filled.
398  */
399 STATIC void
400 xfs_qm_qoff_logitem_format(xfs_qoff_logitem_t   *qf,
401                            xfs_log_iovec_t      *log_vector)
402 {
403         ASSERT(qf->qql_format.qf_type == XFS_LI_QUOTAOFF);
404
405         log_vector->i_addr = (xfs_caddr_t)&(qf->qql_format);
406         log_vector->i_len = sizeof(xfs_qoff_logitem_t);
407         log_vector->i_type = XLOG_REG_TYPE_QUOTAOFF;
408         qf->qql_format.qf_size = 1;
409 }
410
411
412 /*
413  * Pinning has no meaning for an quotaoff item, so just return.
414  */
415 /*ARGSUSED*/
416 STATIC void
417 xfs_qm_qoff_logitem_pin(xfs_qoff_logitem_t *qf)
418 {
419         return;
420 }
421
422
423 /*
424  * Since pinning has no meaning for an quotaoff item, unpinning does
425  * not either.
426  */
427 /*ARGSUSED*/
428 STATIC void
429 xfs_qm_qoff_logitem_unpin(xfs_qoff_logitem_t *qf, int stale)
430 {
431         return;
432 }
433
434 /*ARGSUSED*/
435 STATIC void
436 xfs_qm_qoff_logitem_unpin_remove(xfs_qoff_logitem_t *qf, xfs_trans_t *tp)
437 {
438         return;
439 }
440
441 /*
442  * Quotaoff items have no locking, so just return success.
443  */
444 /*ARGSUSED*/
445 STATIC uint
446 xfs_qm_qoff_logitem_trylock(xfs_qoff_logitem_t *qf)
447 {
448         return XFS_ITEM_LOCKED;
449 }
450
451 /*
452  * Quotaoff items have no locking or pushing, so return failure
453  * so that the caller doesn't bother with us.
454  */
455 /*ARGSUSED*/
456 STATIC void
457 xfs_qm_qoff_logitem_unlock(xfs_qoff_logitem_t *qf)
458 {
459         return;
460 }
461
462 /*
463  * The quotaoff-start-item is logged only once and cannot be moved in the log,
464  * so simply return the lsn at which it's been logged.
465  */
466 /*ARGSUSED*/
467 STATIC xfs_lsn_t
468 xfs_qm_qoff_logitem_committed(xfs_qoff_logitem_t *qf, xfs_lsn_t lsn)
469 {
470         return (lsn);
471 }
472
473 /*
474  * There isn't much you can do to push on an quotaoff item.  It is simply
475  * stuck waiting for the log to be flushed to disk.
476  */
477 /*ARGSUSED*/
478 STATIC void
479 xfs_qm_qoff_logitem_push(xfs_qoff_logitem_t *qf)
480 {
481         return;
482 }
483
484
485 /*ARGSUSED*/
486 STATIC xfs_lsn_t
487 xfs_qm_qoffend_logitem_committed(
488         xfs_qoff_logitem_t *qfe,
489         xfs_lsn_t lsn)
490 {
491         xfs_qoff_logitem_t      *qfs;
492         struct xfs_ail          *ailp;
493
494         qfs = qfe->qql_start_lip;
495         ailp = qfs->qql_item.li_ailp;
496         spin_lock(&ailp->xa_lock);
497         /*
498          * Delete the qoff-start logitem from the AIL.
499          * xfs_trans_ail_delete() drops the AIL lock.
500          */
501         xfs_trans_ail_delete(ailp, (xfs_log_item_t *)qfs);
502         kmem_free(qfs);
503         kmem_free(qfe);
504         return (xfs_lsn_t)-1;
505 }
506
507 /*
508  * XXX rcc - don't know quite what to do with this.  I think we can
509  * just ignore it.  The only time that isn't the case is if we allow
510  * the client to somehow see that quotas have been turned off in which
511  * we can't allow that to get back until the quotaoff hits the disk.
512  * So how would that happen?  Also, do we need different routines for
513  * quotaoff start and quotaoff end?  I suspect the answer is yes but
514  * to be sure, I need to look at the recovery code and see how quota off
515  * recovery is handled (do we roll forward or back or do something else).
516  * If we roll forwards or backwards, then we need two separate routines,
517  * one that does nothing and one that stamps in the lsn that matters
518  * (truly makes the quotaoff irrevocable).  If we do something else,
519  * then maybe we don't need two.
520  */
521 /* ARGSUSED */
522 STATIC void
523 xfs_qm_qoff_logitem_committing(xfs_qoff_logitem_t *qip, xfs_lsn_t commit_lsn)
524 {
525         return;
526 }
527
528 /* ARGSUSED */
529 STATIC void
530 xfs_qm_qoffend_logitem_committing(xfs_qoff_logitem_t *qip, xfs_lsn_t commit_lsn)
531 {
532         return;
533 }
534
535 static struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
536         .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size,
537         .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
538                                         xfs_qm_qoff_logitem_format,
539         .iop_pin        = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_pin,
540         .iop_unpin      = (void(*)(xfs_log_item_t* ,int))
541                                         xfs_qm_qoff_logitem_unpin,
542         .iop_unpin_remove = (void(*)(xfs_log_item_t*,xfs_trans_t*))
543                                         xfs_qm_qoff_logitem_unpin_remove,
544         .iop_trylock    = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_trylock,
545         .iop_unlock     = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_unlock,
546         .iop_committed  = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t))
547                                         xfs_qm_qoffend_logitem_committed,
548         .iop_push       = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_push,
549         .iop_pushbuf    = NULL,
550         .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t))
551                                         xfs_qm_qoffend_logitem_committing
552 };
553
554 /*
555  * This is the ops vector shared by all quotaoff-start log items.
556  */
557 static struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
558         .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size,
559         .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
560                                         xfs_qm_qoff_logitem_format,
561         .iop_pin        = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_pin,
562         .iop_unpin      = (void(*)(xfs_log_item_t*, int))
563                                         xfs_qm_qoff_logitem_unpin,
564         .iop_unpin_remove = (void(*)(xfs_log_item_t*,xfs_trans_t*))
565                                         xfs_qm_qoff_logitem_unpin_remove,
566         .iop_trylock    = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_trylock,
567         .iop_unlock     = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_unlock,
568         .iop_committed  = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t))
569                                         xfs_qm_qoff_logitem_committed,
570         .iop_push       = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_push,
571         .iop_pushbuf    = NULL,
572         .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t))
573                                         xfs_qm_qoff_logitem_committing
574 };
575
576 /*
577  * Allocate and initialize an quotaoff item of the correct quota type(s).
578  */
579 xfs_qoff_logitem_t *
580 xfs_qm_qoff_logitem_init(
581         struct xfs_mount *mp,
582         xfs_qoff_logitem_t *start,
583         uint flags)
584 {
585         xfs_qoff_logitem_t      *qf;
586
587         qf = (xfs_qoff_logitem_t*) kmem_zalloc(sizeof(xfs_qoff_logitem_t), KM_SLEEP);
588
589         qf->qql_item.li_type = XFS_LI_QUOTAOFF;
590         if (start)
591                 qf->qql_item.li_ops = &xfs_qm_qoffend_logitem_ops;
592         else
593                 qf->qql_item.li_ops = &xfs_qm_qoff_logitem_ops;
594         qf->qql_item.li_mountp = mp;
595         qf->qql_format.qf_type = XFS_LI_QUOTAOFF;
596         qf->qql_format.qf_flags = flags;
597         qf->qql_start_lip = start;
598         return (qf);
599 }