Merge branch 'master' into for-linus
[pandora-kernel.git] / fs / xfs / xfs_trans_item.c
1 /*
2  * Copyright (c) 2000-2002,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_log.h"
22 #include "xfs_inum.h"
23 #include "xfs_trans.h"
24 #include "xfs_trans_priv.h"
25 /* XXX: from here down needed until struct xfs_trans has its own ailp */
26 #include "xfs_bit.h"
27 #include "xfs_buf_item.h"
28 #include "xfs_sb.h"
29 #include "xfs_ag.h"
30 #include "xfs_dir2.h"
31 #include "xfs_dmapi.h"
32 #include "xfs_mount.h"
33
34 STATIC int      xfs_trans_unlock_chunk(xfs_log_item_chunk_t *,
35                                         int, int, xfs_lsn_t);
36
37 /*
38  * This is called to add the given log item to the transaction's
39  * list of log items.  It must find a free log item descriptor
40  * or allocate a new one and add the item to that descriptor.
41  * The function returns a pointer to item descriptor used to point
42  * to the new item.  The log item will now point to its new descriptor
43  * with its li_desc field.
44  */
45 xfs_log_item_desc_t *
46 xfs_trans_add_item(xfs_trans_t *tp, xfs_log_item_t *lip)
47 {
48         xfs_log_item_desc_t     *lidp;
49         xfs_log_item_chunk_t    *licp;
50         int                     i=0;
51
52         /*
53          * If there are no free descriptors, allocate a new chunk
54          * of them and put it at the front of the chunk list.
55          */
56         if (tp->t_items_free == 0) {
57                 licp = (xfs_log_item_chunk_t*)
58                        kmem_alloc(sizeof(xfs_log_item_chunk_t), KM_SLEEP);
59                 ASSERT(licp != NULL);
60                 /*
61                  * Initialize the chunk, and then
62                  * claim the first slot in the newly allocated chunk.
63                  */
64                 xfs_lic_init(licp);
65                 xfs_lic_claim(licp, 0);
66                 licp->lic_unused = 1;
67                 xfs_lic_init_slot(licp, 0);
68                 lidp = xfs_lic_slot(licp, 0);
69
70                 /*
71                  * Link in the new chunk and update the free count.
72                  */
73                 licp->lic_next = tp->t_items.lic_next;
74                 tp->t_items.lic_next = licp;
75                 tp->t_items_free = XFS_LIC_NUM_SLOTS - 1;
76
77                 /*
78                  * Initialize the descriptor and the generic portion
79                  * of the log item.
80                  *
81                  * Point the new slot at this item and return it.
82                  * Also point the log item at its currently active
83                  * descriptor and set the item's mount pointer.
84                  */
85                 lidp->lid_item = lip;
86                 lidp->lid_flags = 0;
87                 lidp->lid_size = 0;
88                 lip->li_desc = lidp;
89                 lip->li_mountp = tp->t_mountp;
90                 lip->li_ailp = tp->t_mountp->m_ail;
91                 return lidp;
92         }
93
94         /*
95          * Find the free descriptor. It is somewhere in the chunklist
96          * of descriptors.
97          */
98         licp = &tp->t_items;
99         while (licp != NULL) {
100                 if (xfs_lic_vacancy(licp)) {
101                         if (licp->lic_unused <= XFS_LIC_MAX_SLOT) {
102                                 i = licp->lic_unused;
103                                 ASSERT(xfs_lic_isfree(licp, i));
104                                 break;
105                         }
106                         for (i = 0; i <= XFS_LIC_MAX_SLOT; i++) {
107                                 if (xfs_lic_isfree(licp, i))
108                                         break;
109                         }
110                         ASSERT(i <= XFS_LIC_MAX_SLOT);
111                         break;
112                 }
113                 licp = licp->lic_next;
114         }
115         ASSERT(licp != NULL);
116         /*
117          * If we find a free descriptor, claim it,
118          * initialize it, and return it.
119          */
120         xfs_lic_claim(licp, i);
121         if (licp->lic_unused <= i) {
122                 licp->lic_unused = i + 1;
123                 xfs_lic_init_slot(licp, i);
124         }
125         lidp = xfs_lic_slot(licp, i);
126         tp->t_items_free--;
127         lidp->lid_item = lip;
128         lidp->lid_flags = 0;
129         lidp->lid_size = 0;
130         lip->li_desc = lidp;
131         lip->li_mountp = tp->t_mountp;
132         lip->li_ailp = tp->t_mountp->m_ail;
133         return lidp;
134 }
135
136 /*
137  * Free the given descriptor.
138  *
139  * This requires setting the bit in the chunk's free mask corresponding
140  * to the given slot.
141  */
142 void
143 xfs_trans_free_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp)
144 {
145         uint                    slot;
146         xfs_log_item_chunk_t    *licp;
147         xfs_log_item_chunk_t    **licpp;
148
149         slot = xfs_lic_desc_to_slot(lidp);
150         licp = xfs_lic_desc_to_chunk(lidp);
151         xfs_lic_relse(licp, slot);
152         lidp->lid_item->li_desc = NULL;
153         tp->t_items_free++;
154
155         /*
156          * If there are no more used items in the chunk and this is not
157          * the chunk embedded in the transaction structure, then free
158          * the chunk. First pull it from the chunk list and then
159          * free it back to the heap.  We didn't bother with a doubly
160          * linked list here because the lists should be very short
161          * and this is not a performance path.  It's better to save
162          * the memory of the extra pointer.
163          *
164          * Also decrement the transaction structure's count of free items
165          * by the number in a chunk since we are freeing an empty chunk.
166          */
167         if (xfs_lic_are_all_free(licp) && (licp != &(tp->t_items))) {
168                 licpp = &(tp->t_items.lic_next);
169                 while (*licpp != licp) {
170                         ASSERT(*licpp != NULL);
171                         licpp = &((*licpp)->lic_next);
172                 }
173                 *licpp = licp->lic_next;
174                 kmem_free(licp);
175                 tp->t_items_free -= XFS_LIC_NUM_SLOTS;
176         }
177 }
178
179 /*
180  * This is called to find the descriptor corresponding to the given
181  * log item.  It returns a pointer to the descriptor.
182  * The log item MUST have a corresponding descriptor in the given
183  * transaction.  This routine does not return NULL, it panics.
184  *
185  * The descriptor pointer is kept in the log item's li_desc field.
186  * Just return it.
187  */
188 /*ARGSUSED*/
189 xfs_log_item_desc_t *
190 xfs_trans_find_item(xfs_trans_t *tp, xfs_log_item_t *lip)
191 {
192         ASSERT(lip->li_desc != NULL);
193
194         return lip->li_desc;
195 }
196
197
198 /*
199  * Return a pointer to the first descriptor in the chunk list.
200  * This does not return NULL if there are none, it panics.
201  *
202  * The first descriptor must be in either the first or second chunk.
203  * This is because the only chunk allowed to be empty is the first.
204  * All others are freed when they become empty.
205  *
206  * At some point this and xfs_trans_next_item() should be optimized
207  * to quickly look at the mask to determine if there is anything to
208  * look at.
209  */
210 xfs_log_item_desc_t *
211 xfs_trans_first_item(xfs_trans_t *tp)
212 {
213         xfs_log_item_chunk_t    *licp;
214         int                     i;
215
216         licp = &tp->t_items;
217         /*
218          * If it's not in the first chunk, skip to the second.
219          */
220         if (xfs_lic_are_all_free(licp)) {
221                 licp = licp->lic_next;
222         }
223
224         /*
225          * Return the first non-free descriptor in the chunk.
226          */
227         ASSERT(!xfs_lic_are_all_free(licp));
228         for (i = 0; i < licp->lic_unused; i++) {
229                 if (xfs_lic_isfree(licp, i)) {
230                         continue;
231                 }
232
233                 return xfs_lic_slot(licp, i);
234         }
235         cmn_err(CE_WARN, "xfs_trans_first_item() -- no first item");
236         return NULL;
237 }
238
239
240 /*
241  * Given a descriptor, return the next descriptor in the chunk list.
242  * This returns NULL if there are no more used descriptors in the list.
243  *
244  * We do this by first locating the chunk in which the descriptor resides,
245  * and then scanning forward in the chunk and the list for the next
246  * used descriptor.
247  */
248 /*ARGSUSED*/
249 xfs_log_item_desc_t *
250 xfs_trans_next_item(xfs_trans_t *tp, xfs_log_item_desc_t *lidp)
251 {
252         xfs_log_item_chunk_t    *licp;
253         int                     i;
254
255         licp = xfs_lic_desc_to_chunk(lidp);
256
257         /*
258          * First search the rest of the chunk. The for loop keeps us
259          * from referencing things beyond the end of the chunk.
260          */
261         for (i = (int)xfs_lic_desc_to_slot(lidp) + 1; i < licp->lic_unused; i++) {
262                 if (xfs_lic_isfree(licp, i)) {
263                         continue;
264                 }
265
266                 return xfs_lic_slot(licp, i);
267         }
268
269         /*
270          * Now search the next chunk.  It must be there, because the
271          * next chunk would have been freed if it were empty.
272          * If there is no next chunk, return NULL.
273          */
274         if (licp->lic_next == NULL) {
275                 return NULL;
276         }
277
278         licp = licp->lic_next;
279         ASSERT(!xfs_lic_are_all_free(licp));
280         for (i = 0; i < licp->lic_unused; i++) {
281                 if (xfs_lic_isfree(licp, i)) {
282                         continue;
283                 }
284
285                 return xfs_lic_slot(licp, i);
286         }
287         ASSERT(0);
288         /* NOTREACHED */
289         return NULL; /* keep gcc quite */
290 }
291
292 /*
293  * This is called to unlock all of the items of a transaction and to free
294  * all the descriptors of that transaction.
295  *
296  * It walks the list of descriptors and unlocks each item.  It frees
297  * each chunk except that embedded in the transaction as it goes along.
298  */
299 void
300 xfs_trans_free_items(
301         xfs_trans_t     *tp,
302         xfs_lsn_t       commit_lsn,
303         int             flags)
304 {
305         xfs_log_item_chunk_t    *licp;
306         xfs_log_item_chunk_t    *next_licp;
307         int                     abort;
308
309         abort = flags & XFS_TRANS_ABORT;
310         licp = &tp->t_items;
311         /*
312          * Special case the embedded chunk so we don't free it below.
313          */
314         if (!xfs_lic_are_all_free(licp)) {
315                 (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn);
316                 xfs_lic_all_free(licp);
317                 licp->lic_unused = 0;
318         }
319         licp = licp->lic_next;
320
321         /*
322          * Unlock each item in each chunk and free the chunks.
323          */
324         while (licp != NULL) {
325                 ASSERT(!xfs_lic_are_all_free(licp));
326                 (void) xfs_trans_unlock_chunk(licp, 1, abort, commit_lsn);
327                 next_licp = licp->lic_next;
328                 kmem_free(licp);
329                 licp = next_licp;
330         }
331
332         /*
333          * Reset the transaction structure's free item count.
334          */
335         tp->t_items_free = XFS_LIC_NUM_SLOTS;
336         tp->t_items.lic_next = NULL;
337 }
338
339
340
341 /*
342  * This is called to unlock the items associated with a transaction.
343  * Items which were not logged should be freed.
344  * Those which were logged must still be tracked so they can be unpinned
345  * when the transaction commits.
346  */
347 void
348 xfs_trans_unlock_items(xfs_trans_t *tp, xfs_lsn_t commit_lsn)
349 {
350         xfs_log_item_chunk_t    *licp;
351         xfs_log_item_chunk_t    *next_licp;
352         xfs_log_item_chunk_t    **licpp;
353         int                     freed;
354
355         freed = 0;
356         licp = &tp->t_items;
357
358         /*
359          * Special case the embedded chunk so we don't free.
360          */
361         if (!xfs_lic_are_all_free(licp)) {
362                 freed = xfs_trans_unlock_chunk(licp, 0, 0, commit_lsn);
363         }
364         licpp = &(tp->t_items.lic_next);
365         licp = licp->lic_next;
366
367         /*
368          * Unlock each item in each chunk, free non-dirty descriptors,
369          * and free empty chunks.
370          */
371         while (licp != NULL) {
372                 ASSERT(!xfs_lic_are_all_free(licp));
373                 freed += xfs_trans_unlock_chunk(licp, 0, 0, commit_lsn);
374                 next_licp = licp->lic_next;
375                 if (xfs_lic_are_all_free(licp)) {
376                         *licpp = next_licp;
377                         kmem_free(licp);
378                         freed -= XFS_LIC_NUM_SLOTS;
379                 } else {
380                         licpp = &(licp->lic_next);
381                 }
382                 ASSERT(*licpp == next_licp);
383                 licp = next_licp;
384         }
385
386         /*
387          * Fix the free descriptor count in the transaction.
388          */
389         tp->t_items_free += freed;
390 }
391
392 /*
393  * Unlock each item pointed to by a descriptor in the given chunk.
394  * Stamp the commit lsn into each item if necessary.
395  * Free descriptors pointing to items which are not dirty if freeing_chunk
396  * is zero. If freeing_chunk is non-zero, then we need to unlock all
397  * items in the chunk.
398  * 
399  * Return the number of descriptors freed.
400  */
401 STATIC int
402 xfs_trans_unlock_chunk(
403         xfs_log_item_chunk_t    *licp,
404         int                     freeing_chunk,
405         int                     abort,
406         xfs_lsn_t               commit_lsn)
407 {
408         xfs_log_item_desc_t     *lidp;
409         xfs_log_item_t          *lip;
410         int                     i;
411         int                     freed;
412
413         freed = 0;
414         lidp = licp->lic_descs;
415         for (i = 0; i < licp->lic_unused; i++, lidp++) {
416                 if (xfs_lic_isfree(licp, i)) {
417                         continue;
418                 }
419                 lip = lidp->lid_item;
420                 lip->li_desc = NULL;
421
422                 if (commit_lsn != NULLCOMMITLSN)
423                         IOP_COMMITTING(lip, commit_lsn);
424                 if (abort)
425                         lip->li_flags |= XFS_LI_ABORTED;
426                 IOP_UNLOCK(lip);
427
428                 /*
429                  * Free the descriptor if the item is not dirty
430                  * within this transaction and the caller is not
431                  * going to just free the entire thing regardless.
432                  */
433                 if (!(freeing_chunk) &&
434                     (!(lidp->lid_flags & XFS_LID_DIRTY) || abort)) {
435                         xfs_lic_relse(licp, i);
436                         freed++;
437                 }
438         }
439
440         return freed;
441 }