netns xfrm: ipcomp6 support
[safe/jmp/linux-2.6] / fs / ext4 / migrate.c
1 /*
2  * Copyright IBM Corporation, 2007
3  * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2.1 of the GNU Lesser General Public License
7  * as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12  *
13  */
14
15 #include <linux/module.h>
16 #include "ext4_jbd2.h"
17 #include "ext4_extents.h"
18
19 /*
20  * The contiguous blocks details which can be
21  * represented by a single extent
22  */
23 struct list_blocks_struct {
24         ext4_lblk_t first_block, last_block;
25         ext4_fsblk_t first_pblock, last_pblock;
26 };
27
28 static int finish_range(handle_t *handle, struct inode *inode,
29                                 struct list_blocks_struct *lb)
30
31 {
32         int retval = 0, needed;
33         struct ext4_extent newext;
34         struct ext4_ext_path *path;
35         if (lb->first_pblock == 0)
36                 return 0;
37
38         /* Add the extent to temp inode*/
39         newext.ee_block = cpu_to_le32(lb->first_block);
40         newext.ee_len   = cpu_to_le16(lb->last_block - lb->first_block + 1);
41         ext4_ext_store_pblock(&newext, lb->first_pblock);
42         path = ext4_ext_find_extent(inode, lb->first_block, NULL);
43
44         if (IS_ERR(path)) {
45                 retval = PTR_ERR(path);
46                 path = NULL;
47                 goto err_out;
48         }
49
50         /*
51          * Calculate the credit needed to inserting this extent
52          * Since we are doing this in loop we may accumalate extra
53          * credit. But below we try to not accumalate too much
54          * of them by restarting the journal.
55          */
56         needed = ext4_ext_calc_credits_for_single_extent(inode,
57                     lb->last_block - lb->first_block + 1, path);
58
59         /*
60          * Make sure the credit we accumalated is not really high
61          */
62         if (needed && ext4_handle_has_enough_credits(handle,
63                                                 EXT4_RESERVE_TRANS_BLOCKS)) {
64                 retval = ext4_journal_restart(handle, needed);
65                 if (retval)
66                         goto err_out;
67         } else if (needed) {
68                 retval = ext4_journal_extend(handle, needed);
69                 if (retval) {
70                         /*
71                          * IF not able to extend the journal restart the journal
72                          */
73                         retval = ext4_journal_restart(handle, needed);
74                         if (retval)
75                                 goto err_out;
76                 }
77         }
78         retval = ext4_ext_insert_extent(handle, inode, path, &newext, 0);
79 err_out:
80         if (path) {
81                 ext4_ext_drop_refs(path);
82                 kfree(path);
83         }
84         lb->first_pblock = 0;
85         return retval;
86 }
87
88 static int update_extent_range(handle_t *handle, struct inode *inode,
89                                 ext4_fsblk_t pblock, ext4_lblk_t blk_num,
90                                 struct list_blocks_struct *lb)
91 {
92         int retval;
93         /*
94          * See if we can add on to the existing range (if it exists)
95          */
96         if (lb->first_pblock &&
97                 (lb->last_pblock+1 == pblock) &&
98                 (lb->last_block+1 == blk_num)) {
99                 lb->last_pblock = pblock;
100                 lb->last_block = blk_num;
101                 return 0;
102         }
103         /*
104          * Start a new range.
105          */
106         retval = finish_range(handle, inode, lb);
107         lb->first_pblock = lb->last_pblock = pblock;
108         lb->first_block = lb->last_block = blk_num;
109
110         return retval;
111 }
112
113 static int update_ind_extent_range(handle_t *handle, struct inode *inode,
114                                    ext4_fsblk_t pblock, ext4_lblk_t *blk_nump,
115                                    struct list_blocks_struct *lb)
116 {
117         struct buffer_head *bh;
118         __le32 *i_data;
119         int i, retval = 0;
120         ext4_lblk_t blk_count = *blk_nump;
121         unsigned long max_entries = inode->i_sb->s_blocksize >> 2;
122
123         if (!pblock) {
124                 /* Only update the file block number */
125                 *blk_nump += max_entries;
126                 return 0;
127         }
128
129         bh = sb_bread(inode->i_sb, pblock);
130         if (!bh)
131                 return -EIO;
132
133         i_data = (__le32 *)bh->b_data;
134         for (i = 0; i < max_entries; i++, blk_count++) {
135                 if (i_data[i]) {
136                         retval = update_extent_range(handle, inode,
137                                                 le32_to_cpu(i_data[i]),
138                                                 blk_count, lb);
139                         if (retval)
140                                 break;
141                 }
142         }
143
144         /* Update the file block number */
145         *blk_nump = blk_count;
146         put_bh(bh);
147         return retval;
148
149 }
150
151 static int update_dind_extent_range(handle_t *handle, struct inode *inode,
152                                     ext4_fsblk_t pblock, ext4_lblk_t *blk_nump,
153                                     struct list_blocks_struct *lb)
154 {
155         struct buffer_head *bh;
156         __le32 *i_data;
157         int i, retval = 0;
158         ext4_lblk_t blk_count = *blk_nump;
159         unsigned long max_entries = inode->i_sb->s_blocksize >> 2;
160
161         if (!pblock) {
162                 /* Only update the file block number */
163                 *blk_nump += max_entries * max_entries;
164                 return 0;
165         }
166         bh = sb_bread(inode->i_sb, pblock);
167         if (!bh)
168                 return -EIO;
169
170         i_data = (__le32 *)bh->b_data;
171         for (i = 0; i < max_entries; i++) {
172                 if (i_data[i]) {
173                         retval = update_ind_extent_range(handle, inode,
174                                                 le32_to_cpu(i_data[i]),
175                                                 &blk_count, lb);
176                         if (retval)
177                                 break;
178                 } else {
179                         /* Only update the file block number */
180                         blk_count += max_entries;
181                 }
182         }
183
184         /* Update the file block number */
185         *blk_nump = blk_count;
186         put_bh(bh);
187         return retval;
188
189 }
190
191 static int update_tind_extent_range(handle_t *handle, struct inode *inode,
192                                      ext4_fsblk_t pblock, ext4_lblk_t *blk_nump,
193                                      struct list_blocks_struct *lb)
194 {
195         struct buffer_head *bh;
196         __le32 *i_data;
197         int i, retval = 0;
198         ext4_lblk_t blk_count = *blk_nump;
199         unsigned long max_entries = inode->i_sb->s_blocksize >> 2;
200
201         if (!pblock) {
202                 /* Only update the file block number */
203                 *blk_nump += max_entries * max_entries * max_entries;
204                 return 0;
205         }
206         bh = sb_bread(inode->i_sb, pblock);
207         if (!bh)
208                 return -EIO;
209
210         i_data = (__le32 *)bh->b_data;
211         for (i = 0; i < max_entries; i++) {
212                 if (i_data[i]) {
213                         retval = update_dind_extent_range(handle, inode,
214                                                 le32_to_cpu(i_data[i]),
215                                                 &blk_count, lb);
216                         if (retval)
217                                 break;
218                 } else
219                         /* Only update the file block number */
220                         blk_count += max_entries * max_entries;
221         }
222         /* Update the file block number */
223         *blk_nump = blk_count;
224         put_bh(bh);
225         return retval;
226
227 }
228
229 static int extend_credit_for_blkdel(handle_t *handle, struct inode *inode)
230 {
231         int retval = 0, needed;
232
233         if (ext4_handle_has_enough_credits(handle, EXT4_RESERVE_TRANS_BLOCKS+1))
234                 return 0;
235         /*
236          * We are freeing a blocks. During this we touch
237          * superblock, group descriptor and block bitmap.
238          * So allocate a credit of 3. We may update
239          * quota (user and group).
240          */
241         needed = 3 + EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb);
242
243         if (ext4_journal_extend(handle, needed) != 0)
244                 retval = ext4_journal_restart(handle, needed);
245
246         return retval;
247 }
248
249 static int free_dind_blocks(handle_t *handle,
250                                 struct inode *inode, __le32 i_data)
251 {
252         int i;
253         __le32 *tmp_idata;
254         struct buffer_head *bh;
255         unsigned long max_entries = inode->i_sb->s_blocksize >> 2;
256
257         bh = sb_bread(inode->i_sb, le32_to_cpu(i_data));
258         if (!bh)
259                 return -EIO;
260
261         tmp_idata = (__le32 *)bh->b_data;
262         for (i = 0; i < max_entries; i++) {
263                 if (tmp_idata[i]) {
264                         extend_credit_for_blkdel(handle, inode);
265                         ext4_free_blocks(handle, inode, 0,
266                                          le32_to_cpu(tmp_idata[i]), 1,
267                                          EXT4_FREE_BLOCKS_METADATA |
268                                          EXT4_FREE_BLOCKS_FORGET);
269                 }
270         }
271         put_bh(bh);
272         extend_credit_for_blkdel(handle, inode);
273         ext4_free_blocks(handle, inode, 0, le32_to_cpu(i_data), 1,
274                          EXT4_FREE_BLOCKS_METADATA |
275                          EXT4_FREE_BLOCKS_FORGET);
276         return 0;
277 }
278
279 static int free_tind_blocks(handle_t *handle,
280                                 struct inode *inode, __le32 i_data)
281 {
282         int i, retval = 0;
283         __le32 *tmp_idata;
284         struct buffer_head *bh;
285         unsigned long max_entries = inode->i_sb->s_blocksize >> 2;
286
287         bh = sb_bread(inode->i_sb, le32_to_cpu(i_data));
288         if (!bh)
289                 return -EIO;
290
291         tmp_idata = (__le32 *)bh->b_data;
292         for (i = 0; i < max_entries; i++) {
293                 if (tmp_idata[i]) {
294                         retval = free_dind_blocks(handle,
295                                         inode, tmp_idata[i]);
296                         if (retval) {
297                                 put_bh(bh);
298                                 return retval;
299                         }
300                 }
301         }
302         put_bh(bh);
303         extend_credit_for_blkdel(handle, inode);
304         ext4_free_blocks(handle, inode, 0, le32_to_cpu(i_data), 1,
305                          EXT4_FREE_BLOCKS_METADATA |
306                          EXT4_FREE_BLOCKS_FORGET);
307         return 0;
308 }
309
310 static int free_ind_block(handle_t *handle, struct inode *inode, __le32 *i_data)
311 {
312         int retval;
313
314         /* ei->i_data[EXT4_IND_BLOCK] */
315         if (i_data[0]) {
316                 extend_credit_for_blkdel(handle, inode);
317                 ext4_free_blocks(handle, inode, 0,
318                                 le32_to_cpu(i_data[0]), 1,
319                                  EXT4_FREE_BLOCKS_METADATA |
320                                  EXT4_FREE_BLOCKS_FORGET);
321         }
322
323         /* ei->i_data[EXT4_DIND_BLOCK] */
324         if (i_data[1]) {
325                 retval = free_dind_blocks(handle, inode, i_data[1]);
326                 if (retval)
327                         return retval;
328         }
329
330         /* ei->i_data[EXT4_TIND_BLOCK] */
331         if (i_data[2]) {
332                 retval = free_tind_blocks(handle, inode, i_data[2]);
333                 if (retval)
334                         return retval;
335         }
336         return 0;
337 }
338
339 static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode,
340                                                 struct inode *tmp_inode)
341 {
342         int retval;
343         __le32  i_data[3];
344         struct ext4_inode_info *ei = EXT4_I(inode);
345         struct ext4_inode_info *tmp_ei = EXT4_I(tmp_inode);
346
347         /*
348          * One credit accounted for writing the
349          * i_data field of the original inode
350          */
351         retval = ext4_journal_extend(handle, 1);
352         if (retval) {
353                 retval = ext4_journal_restart(handle, 1);
354                 if (retval)
355                         goto err_out;
356         }
357
358         i_data[0] = ei->i_data[EXT4_IND_BLOCK];
359         i_data[1] = ei->i_data[EXT4_DIND_BLOCK];
360         i_data[2] = ei->i_data[EXT4_TIND_BLOCK];
361
362         down_write(&EXT4_I(inode)->i_data_sem);
363         /*
364          * if EXT4_STATE_EXT_MIGRATE is cleared a block allocation
365          * happened after we started the migrate. We need to
366          * fail the migrate
367          */
368         if (!(EXT4_I(inode)->i_state & EXT4_STATE_EXT_MIGRATE)) {
369                 retval = -EAGAIN;
370                 up_write(&EXT4_I(inode)->i_data_sem);
371                 goto err_out;
372         } else
373                 EXT4_I(inode)->i_state &= ~EXT4_STATE_EXT_MIGRATE;
374         /*
375          * We have the extent map build with the tmp inode.
376          * Now copy the i_data across
377          */
378         ei->i_flags |= EXT4_EXTENTS_FL;
379         memcpy(ei->i_data, tmp_ei->i_data, sizeof(ei->i_data));
380
381         /*
382          * Update i_blocks with the new blocks that got
383          * allocated while adding extents for extent index
384          * blocks.
385          *
386          * While converting to extents we need not
387          * update the orignal inode i_blocks for extent blocks
388          * via quota APIs. The quota update happened via tmp_inode already.
389          */
390         spin_lock(&inode->i_lock);
391         inode->i_blocks += tmp_inode->i_blocks;
392         spin_unlock(&inode->i_lock);
393         up_write(&EXT4_I(inode)->i_data_sem);
394
395         /*
396          * We mark the inode dirty after, because we decrement the
397          * i_blocks when freeing the indirect meta-data blocks
398          */
399         retval = free_ind_block(handle, inode, i_data);
400         ext4_mark_inode_dirty(handle, inode);
401
402 err_out:
403         return retval;
404 }
405
406 static int free_ext_idx(handle_t *handle, struct inode *inode,
407                                         struct ext4_extent_idx *ix)
408 {
409         int i, retval = 0;
410         ext4_fsblk_t block;
411         struct buffer_head *bh;
412         struct ext4_extent_header *eh;
413
414         block = idx_pblock(ix);
415         bh = sb_bread(inode->i_sb, block);
416         if (!bh)
417                 return -EIO;
418
419         eh = (struct ext4_extent_header *)bh->b_data;
420         if (eh->eh_depth != 0) {
421                 ix = EXT_FIRST_INDEX(eh);
422                 for (i = 0; i < le16_to_cpu(eh->eh_entries); i++, ix++) {
423                         retval = free_ext_idx(handle, inode, ix);
424                         if (retval)
425                                 break;
426                 }
427         }
428         put_bh(bh);
429         extend_credit_for_blkdel(handle, inode);
430         ext4_free_blocks(handle, inode, 0, block, 1,
431                          EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET);
432         return retval;
433 }
434
435 /*
436  * Free the extent meta data blocks only
437  */
438 static int free_ext_block(handle_t *handle, struct inode *inode)
439 {
440         int i, retval = 0;
441         struct ext4_inode_info *ei = EXT4_I(inode);
442         struct ext4_extent_header *eh = (struct ext4_extent_header *)ei->i_data;
443         struct ext4_extent_idx *ix;
444         if (eh->eh_depth == 0)
445                 /*
446                  * No extra blocks allocated for extent meta data
447                  */
448                 return 0;
449         ix = EXT_FIRST_INDEX(eh);
450         for (i = 0; i < le16_to_cpu(eh->eh_entries); i++, ix++) {
451                 retval = free_ext_idx(handle, inode, ix);
452                 if (retval)
453                         return retval;
454         }
455         return retval;
456
457 }
458
459 int ext4_ext_migrate(struct inode *inode)
460 {
461         handle_t *handle;
462         int retval = 0, i;
463         __le32 *i_data;
464         ext4_lblk_t blk_count = 0;
465         struct ext4_inode_info *ei;
466         struct inode *tmp_inode = NULL;
467         struct list_blocks_struct lb;
468         unsigned long max_entries;
469         __u32 goal;
470
471         /*
472          * If the filesystem does not support extents, or the inode
473          * already is extent-based, error out.
474          */
475         if (!EXT4_HAS_INCOMPAT_FEATURE(inode->i_sb,
476                                        EXT4_FEATURE_INCOMPAT_EXTENTS) ||
477             (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL))
478                 return -EINVAL;
479
480         if (S_ISLNK(inode->i_mode) && inode->i_blocks == 0)
481                 /*
482                  * don't migrate fast symlink
483                  */
484                 return retval;
485
486         handle = ext4_journal_start(inode,
487                                         EXT4_DATA_TRANS_BLOCKS(inode->i_sb) +
488                                         EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3 +
489                                         EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb)
490                                         + 1);
491         if (IS_ERR(handle)) {
492                 retval = PTR_ERR(handle);
493                 return retval;
494         }
495         goal = (((inode->i_ino - 1) / EXT4_INODES_PER_GROUP(inode->i_sb)) *
496                 EXT4_INODES_PER_GROUP(inode->i_sb)) + 1;
497         tmp_inode = ext4_new_inode(handle, inode->i_sb->s_root->d_inode,
498                                    S_IFREG, 0, goal);
499         if (IS_ERR(tmp_inode)) {
500                 retval = -ENOMEM;
501                 ext4_journal_stop(handle);
502                 return retval;
503         }
504         i_size_write(tmp_inode, i_size_read(inode));
505         /*
506          * We don't want the inode to be reclaimed
507          * if we got interrupted in between. We have
508          * this tmp inode carrying reference to the
509          * data blocks of the original file. We set
510          * the i_nlink to zero at the last stage after
511          * switching the original file to extent format
512          */
513         tmp_inode->i_nlink = 1;
514
515         ext4_ext_tree_init(handle, tmp_inode);
516         ext4_orphan_add(handle, tmp_inode);
517         ext4_journal_stop(handle);
518
519         /*
520          * start with one credit accounted for
521          * superblock modification.
522          *
523          * For the tmp_inode we already have commited the
524          * trascation that created the inode. Later as and
525          * when we add extents we extent the journal
526          */
527         /*
528          * Even though we take i_mutex we can still cause block
529          * allocation via mmap write to holes. If we have allocated
530          * new blocks we fail migrate.  New block allocation will
531          * clear EXT4_STATE_EXT_MIGRATE flag.  The flag is updated
532          * with i_data_sem held to prevent racing with block
533          * allocation.
534          */
535         down_read((&EXT4_I(inode)->i_data_sem));
536         EXT4_I(inode)->i_state |= EXT4_STATE_EXT_MIGRATE;
537         up_read((&EXT4_I(inode)->i_data_sem));
538
539         handle = ext4_journal_start(inode, 1);
540
541         ei = EXT4_I(inode);
542         i_data = ei->i_data;
543         memset(&lb, 0, sizeof(lb));
544
545         /* 32 bit block address 4 bytes */
546         max_entries = inode->i_sb->s_blocksize >> 2;
547         for (i = 0; i < EXT4_NDIR_BLOCKS; i++, blk_count++) {
548                 if (i_data[i]) {
549                         retval = update_extent_range(handle, tmp_inode,
550                                                 le32_to_cpu(i_data[i]),
551                                                 blk_count, &lb);
552                         if (retval)
553                                 goto err_out;
554                 }
555         }
556         if (i_data[EXT4_IND_BLOCK]) {
557                 retval = update_ind_extent_range(handle, tmp_inode,
558                                         le32_to_cpu(i_data[EXT4_IND_BLOCK]),
559                                         &blk_count, &lb);
560                         if (retval)
561                                 goto err_out;
562         } else
563                 blk_count +=  max_entries;
564         if (i_data[EXT4_DIND_BLOCK]) {
565                 retval = update_dind_extent_range(handle, tmp_inode,
566                                         le32_to_cpu(i_data[EXT4_DIND_BLOCK]),
567                                         &blk_count, &lb);
568                         if (retval)
569                                 goto err_out;
570         } else
571                 blk_count += max_entries * max_entries;
572         if (i_data[EXT4_TIND_BLOCK]) {
573                 retval = update_tind_extent_range(handle, tmp_inode,
574                                         le32_to_cpu(i_data[EXT4_TIND_BLOCK]),
575                                         &blk_count, &lb);
576                         if (retval)
577                                 goto err_out;
578         }
579         /*
580          * Build the last extent
581          */
582         retval = finish_range(handle, tmp_inode, &lb);
583 err_out:
584         if (retval)
585                 /*
586                  * Failure case delete the extent information with the
587                  * tmp_inode
588                  */
589                 free_ext_block(handle, tmp_inode);
590         else {
591                 retval = ext4_ext_swap_inode_data(handle, inode, tmp_inode);
592                 if (retval)
593                         /*
594                          * if we fail to swap inode data free the extent
595                          * details of the tmp inode
596                          */
597                         free_ext_block(handle, tmp_inode);
598         }
599
600         /* We mark the tmp_inode dirty via ext4_ext_tree_init. */
601         if (ext4_journal_extend(handle, 1) != 0)
602                 ext4_journal_restart(handle, 1);
603
604         /*
605          * Mark the tmp_inode as of size zero
606          */
607         i_size_write(tmp_inode, 0);
608
609         /*
610          * set the  i_blocks count to zero
611          * so that the ext4_delete_inode does the
612          * right job
613          *
614          * We don't need to take the i_lock because
615          * the inode is not visible to user space.
616          */
617         tmp_inode->i_blocks = 0;
618
619         /* Reset the extent details */
620         ext4_ext_tree_init(handle, tmp_inode);
621
622         /*
623          * Set the i_nlink to zero so that
624          * generic_drop_inode really deletes the
625          * inode
626          */
627         tmp_inode->i_nlink = 0;
628
629         ext4_journal_stop(handle);
630         unlock_new_inode(tmp_inode);
631         iput(tmp_inode);
632
633         return retval;
634 }