]> git.karo-electronics.de Git - mv-sheeva.git/blob - fs/btrfs/super.c
btrfs_mkdir
[mv-sheeva.git] / fs / btrfs / super.c
1 #include <linux/module.h>
2 #include <linux/buffer_head.h>
3 #include <linux/fs.h>
4 #include <linux/pagemap.h>
5 #include <linux/highmem.h>
6 #include <linux/time.h>
7 #include <linux/init.h>
8 #include <linux/string.h>
9 #include <linux/smp_lock.h>
10 #include <linux/backing-dev.h>
11 #include "ctree.h"
12 #include "disk-io.h"
13 #include "transaction.h"
14
15 #define BTRFS_SUPER_MAGIC 0x9123682E
16
17 static struct inode_operations btrfs_dir_inode_operations;
18 static struct super_operations btrfs_super_ops;
19 static struct file_operations btrfs_dir_file_operations;
20
21 static void btrfs_read_locked_inode(struct inode *inode)
22 {
23         struct btrfs_path path;
24         struct btrfs_inode_item *inode_item;
25         struct btrfs_root *root = btrfs_sb(inode->i_sb);
26         int ret;
27         btrfs_init_path(&path);
28         ret = btrfs_lookup_inode(NULL, root, &path, inode->i_ino, 0);
29         if (ret) {
30                 make_bad_inode(inode);
31                 btrfs_release_path(root, &path);
32                 return;
33         }
34         inode_item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
35                                   path.slots[0],
36                                   struct btrfs_inode_item);
37
38         inode->i_mode = btrfs_inode_mode(inode_item);
39         inode->i_nlink = btrfs_inode_nlink(inode_item);
40         inode->i_uid = btrfs_inode_uid(inode_item);
41         inode->i_gid = btrfs_inode_gid(inode_item);
42         inode->i_size = btrfs_inode_size(inode_item);
43         inode->i_atime.tv_sec = btrfs_timespec_sec(&inode_item->atime);
44         inode->i_atime.tv_nsec = btrfs_timespec_nsec(&inode_item->atime);
45         inode->i_mtime.tv_sec = btrfs_timespec_sec(&inode_item->mtime);
46         inode->i_mtime.tv_nsec = btrfs_timespec_nsec(&inode_item->mtime);
47         inode->i_ctime.tv_sec = btrfs_timespec_sec(&inode_item->ctime);
48         inode->i_ctime.tv_nsec = btrfs_timespec_nsec(&inode_item->ctime);
49         inode->i_blocks = btrfs_inode_nblocks(inode_item);
50         inode->i_generation = btrfs_inode_generation(inode_item);
51         btrfs_release_path(root, &path);
52         switch (inode->i_mode & S_IFMT) {
53 #if 0
54         default:
55                 init_special_inode(inode, inode->i_mode,
56                                    btrfs_inode_rdev(inode_item));
57                 break;
58 #endif
59         case S_IFREG:
60                 break;
61         case S_IFDIR:
62                 inode->i_op = &btrfs_dir_inode_operations;
63                 inode->i_fop = &btrfs_dir_file_operations;
64                 break;
65         case S_IFLNK:
66                 // inode->i_op = &page_symlink_inode_operations;
67                 break;
68         }
69         return;
70 }
71
72 static int btrfs_unlink(struct inode *dir, struct dentry *dentry)
73 {
74         struct btrfs_path path;
75         struct btrfs_root *root;
76         struct btrfs_trans_handle *trans;
77         const char *name = dentry->d_name.name;
78         int name_len = dentry->d_name.len;
79         int ret;
80         u64 objectid;
81         struct btrfs_dir_item *di;
82
83         btrfs_init_path(&path);
84         root = btrfs_sb(dir->i_sb);
85         mutex_lock(&root->fs_info->fs_mutex);
86         trans = btrfs_start_transaction(root, 1);
87
88         ret = btrfs_lookup_dir_item(trans, root, &path, dir->i_ino,
89                                     name, name_len, -1);
90         if (ret < 0)
91                 goto err;
92         if (ret > 0) {
93                 ret = -ENOENT;
94                 goto err;
95         }
96         di = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0],
97                             struct btrfs_dir_item);
98         objectid = btrfs_dir_objectid(di);
99
100         ret = btrfs_del_item(trans, root, &path);
101         BUG_ON(ret);
102         dentry->d_inode->i_ctime = dir->i_ctime;
103 err:
104         btrfs_release_path(root, &path);
105         btrfs_end_transaction(trans, root);
106         mutex_unlock(&root->fs_info->fs_mutex);
107         if (ret == 0)
108                 inode_dec_link_count(dentry->d_inode);
109         return ret;
110 }
111
112 static int btrfs_free_inode(struct btrfs_trans_handle *trans,
113                             struct btrfs_root *root,
114                             struct inode *inode)
115 {
116         u64 objectid = inode->i_ino;
117         struct btrfs_path path;
118         struct btrfs_inode_map_item *map;
119         struct btrfs_key stat_data_key;
120         int ret;
121         clear_inode(inode);
122         btrfs_init_path(&path);
123         ret = btrfs_lookup_inode_map(trans, root, &path, objectid, -1);
124         if (ret) {
125                 if (ret > 0)
126                         ret = -ENOENT;
127                 btrfs_release_path(root, &path);
128                 goto error;
129         }
130         map = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0],
131                             struct btrfs_inode_map_item);
132         btrfs_disk_key_to_cpu(&stat_data_key, &map->key);
133         ret = btrfs_del_item(trans, root->fs_info->inode_root, &path);
134         BUG_ON(ret);
135         btrfs_release_path(root, &path);
136         btrfs_init_path(&path);
137
138         ret = btrfs_lookup_inode(trans, root, &path, objectid, -1);
139         BUG_ON(ret);
140         ret = btrfs_del_item(trans, root, &path);
141         BUG_ON(ret);
142         btrfs_release_path(root, &path);
143 error:
144         return ret;
145 }
146
147 static void btrfs_delete_inode(struct inode *inode)
148 {
149         struct btrfs_trans_handle *trans;
150         struct btrfs_root *root = btrfs_sb(inode->i_sb);
151         truncate_inode_pages(&inode->i_data, 0);
152         if (is_bad_inode(inode)) {
153                 goto no_delete;
154         }
155         inode->i_size = 0;
156         if (inode->i_blocks)
157                 WARN_ON(1);
158
159         mutex_lock(&root->fs_info->fs_mutex);
160         trans = btrfs_start_transaction(root, 1);
161         btrfs_free_inode(trans, root, inode);
162         btrfs_end_transaction(trans, root);
163         mutex_unlock(&root->fs_info->fs_mutex);
164         return;
165 no_delete:
166         clear_inode(inode);
167 }
168
169
170 static int btrfs_inode_by_name(struct inode *dir, struct dentry *dentry,
171                               ino_t *ino)
172 {
173         const char *name = dentry->d_name.name;
174         int namelen = dentry->d_name.len;
175         struct btrfs_dir_item *di;
176         struct btrfs_path path;
177         struct btrfs_root *root = btrfs_sb(dir->i_sb);
178         int ret;
179
180         btrfs_init_path(&path);
181         ret = btrfs_lookup_dir_item(NULL, root, &path, dir->i_ino, name,
182                                     namelen, 0);
183         if (ret || !btrfs_match_dir_item_name(root, &path, name, namelen)) {
184                 *ino = 0;
185                 goto out;
186         }
187         di = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0],
188                             struct btrfs_dir_item);
189         *ino = btrfs_dir_objectid(di);
190 out:
191         btrfs_release_path(root, &path);
192         return ret;
193 }
194
195 static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
196                                    struct nameidata *nd)
197 {
198         struct inode * inode;
199         ino_t ino;
200         int ret;
201
202         if (dentry->d_name.len > BTRFS_NAME_LEN)
203                 return ERR_PTR(-ENAMETOOLONG);
204
205         ret = btrfs_inode_by_name(dir, dentry, &ino);
206         if (ret < 0)
207                 return ERR_PTR(ret);
208         inode = NULL;
209         if (ino) {
210                 inode = iget(dir->i_sb, ino);
211                 if (!inode)
212                         return ERR_PTR(-EACCES);
213         }
214         return d_splice_alias(inode, dentry);
215 }
216
217 static void reada_leaves(struct btrfs_root *root, struct btrfs_path *path)
218 {
219         struct buffer_head *bh;
220         struct btrfs_node *node;
221         int i;
222         int nritems;
223         u64 objectid;
224         u64 item_objectid;
225         u64 blocknr;
226         int slot;
227
228         if (!path->nodes[1])
229                 return;
230         node = btrfs_buffer_node(path->nodes[1]);
231         slot = path->slots[1];
232         objectid = btrfs_disk_key_objectid(&node->ptrs[slot].key);
233         nritems = btrfs_header_nritems(&node->header);
234         for (i = slot; i < nritems; i++) {
235                 item_objectid = btrfs_disk_key_objectid(&node->ptrs[i].key);
236                 if (item_objectid != objectid)
237                         break;
238                 blocknr = btrfs_node_blockptr(node, i);
239                 bh = sb_getblk(root->fs_info->sb, blocknr);
240                 ll_rw_block(READ, 1, &bh);
241                 brelse(bh);
242         }
243
244 }
245 static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
246 {
247         struct inode *inode = filp->f_path.dentry->d_inode;
248         struct btrfs_root *root = btrfs_sb(inode->i_sb);
249         struct btrfs_item *item;
250         struct btrfs_dir_item *di;
251         struct btrfs_key key;
252         struct btrfs_path path;
253         int ret;
254         u32 nritems;
255         struct btrfs_leaf *leaf;
256         int slot;
257         int advance;
258         unsigned char d_type = DT_UNKNOWN;
259         int over = 0;
260
261         key.objectid = inode->i_ino;
262         key.flags = 0;
263         btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY);
264         key.offset = filp->f_pos;
265         btrfs_init_path(&path);
266         ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
267         if (ret < 0) {
268                 goto err;
269         }
270         advance = 0;
271         reada_leaves(root, &path);
272         while(1) {
273                 leaf = btrfs_buffer_leaf(path.nodes[0]);
274                 nritems = btrfs_header_nritems(&leaf->header);
275                 slot = path.slots[0];
276                 if (advance) {
277                         if (slot == nritems -1) {
278                                 ret = btrfs_next_leaf(root, &path);
279                                 if (ret)
280                                         break;
281                                 leaf = btrfs_buffer_leaf(path.nodes[0]);
282                                 nritems = btrfs_header_nritems(&leaf->header);
283                                 slot = path.slots[0];
284                                 if (path.nodes[1] && path.slots[1] == 0)
285                                         reada_leaves(root, &path);
286                         } else {
287                                 slot++;
288                                 path.slots[0]++;
289                         }
290                 }
291                 advance = 1;
292                 item = leaf->items + slot;
293                 if (btrfs_disk_key_objectid(&item->key) != key.objectid)
294                         break;
295                 if (btrfs_disk_key_type(&item->key) != BTRFS_DIR_ITEM_KEY)
296                         continue;
297                 if (btrfs_disk_key_offset(&item->key) < filp->f_pos)
298                         continue;
299                 di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item);
300                 over = filldir(dirent, (const char *)(di + 1),
301                                btrfs_dir_name_len(di),
302                                btrfs_disk_key_offset(&item->key),
303                                btrfs_dir_objectid(di), d_type);
304                 if (over) {
305                         filp->f_pos = btrfs_disk_key_offset(&item->key);
306                         break;
307                 }
308                 filp->f_pos = btrfs_disk_key_offset(&item->key) + 1;
309         }
310         ret = 0;
311 err:
312         btrfs_release_path(root, &path);
313         return ret;
314 }
315
316 static void btrfs_put_super (struct super_block * sb)
317 {
318         struct btrfs_root *root = btrfs_sb(sb);
319         int ret;
320
321         ret = close_ctree(root);
322         if (ret) {
323                 printk("close ctree returns %d\n", ret);
324         }
325         sb->s_fs_info = NULL;
326 }
327
328 static int btrfs_fill_super(struct super_block * sb, void * data, int silent)
329 {
330         struct inode * inode;
331         struct dentry * root_dentry;
332         struct btrfs_super_block *disk_super;
333         struct buffer_head *bh;
334         struct btrfs_root *root;
335
336         sb->s_maxbytes = MAX_LFS_FILESIZE;
337         sb->s_blocksize = PAGE_CACHE_SIZE;
338         sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
339         sb->s_magic = BTRFS_SUPER_MAGIC;
340         sb->s_op = &btrfs_super_ops;
341         sb->s_time_gran = 1;
342
343         bh = sb_bread(sb, BTRFS_SUPER_INFO_OFFSET / sb->s_blocksize);
344         if (!bh) {
345                 printk("btrfs: unable to read on disk super\n");
346                 return -EIO;
347         }
348         disk_super = (struct btrfs_super_block *)bh->b_data;
349         root = open_ctree(sb, bh, disk_super);
350         sb->s_fs_info = root;
351         if (!root) {
352                 printk("btrfs: open_ctree failed\n");
353                 return -EIO;
354         }
355         printk("read in super total blocks %Lu root %Lu\n",
356                btrfs_super_total_blocks(disk_super),
357                btrfs_super_root_dir(disk_super));
358
359         inode = iget_locked(sb, btrfs_super_root_dir(disk_super));
360         if (!inode)
361                 return -ENOMEM;
362         if (inode->i_state & I_NEW) {
363                 btrfs_read_locked_inode(inode);
364                 unlock_new_inode(inode);
365         }
366
367         root_dentry = d_alloc_root(inode);
368         if (!root_dentry) {
369                 iput(inode);
370                 return -ENOMEM;
371         }
372         sb->s_root = root_dentry;
373
374         return 0;
375 }
376
377 static void fill_inode_item(struct btrfs_inode_item *item,
378                             struct inode *inode)
379 {
380         btrfs_set_inode_uid(item, inode->i_uid);
381         btrfs_set_inode_gid(item, inode->i_gid);
382         btrfs_set_inode_size(item, inode->i_size);
383         btrfs_set_inode_mode(item, inode->i_mode);
384         btrfs_set_inode_nlink(item, inode->i_nlink);
385         btrfs_set_timespec_sec(&item->atime, inode->i_atime.tv_sec);
386         btrfs_set_timespec_nsec(&item->atime, inode->i_atime.tv_nsec);
387         btrfs_set_timespec_sec(&item->mtime, inode->i_mtime.tv_sec);
388         btrfs_set_timespec_nsec(&item->mtime, inode->i_mtime.tv_nsec);
389         btrfs_set_timespec_sec(&item->ctime, inode->i_ctime.tv_sec);
390         btrfs_set_timespec_nsec(&item->ctime, inode->i_ctime.tv_nsec);
391         btrfs_set_inode_nblocks(item, inode->i_blocks);
392         btrfs_set_inode_generation(item, inode->i_generation);
393 }
394
395 static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
396                                      struct inode *dir, int mode)
397 {
398         struct inode *inode;
399         struct btrfs_inode_item inode_item;
400         struct btrfs_root *root = btrfs_sb(dir->i_sb);
401         struct btrfs_key key;
402         int ret;
403         u64 objectid;
404
405         inode = new_inode(dir->i_sb);
406         if (!inode)
407                 return ERR_PTR(-ENOMEM);
408
409         ret = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid);
410         BUG_ON(ret);
411
412         inode->i_uid = current->fsuid;
413         inode->i_gid = current->fsgid;
414         inode->i_mode = mode;
415         inode->i_ino = objectid;
416         inode->i_blocks = 0;
417         inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
418         /* FIXME do this on link */
419         if (mode & S_IFDIR)
420                 inode->i_size = 3;
421         fill_inode_item(&inode_item, inode);
422
423         key.objectid = objectid;
424         key.flags = 0;
425         key.offset = 0;
426         btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY);
427         ret = btrfs_insert_inode_map(trans, root, objectid, &key);
428         BUG_ON(ret);
429
430         ret = btrfs_insert_inode(trans, root, objectid, &inode_item);
431         BUG_ON(ret);
432
433         insert_inode_hash(inode);
434         // FIXME mark_inode_dirty(inode)
435         return inode;
436 }
437
438 static int btrfs_add_link(struct btrfs_trans_handle *trans,
439                             struct dentry *dentry, struct inode *inode)
440 {
441         int ret;
442         ret = btrfs_insert_dir_item(trans, btrfs_sb(inode->i_sb),
443                                     dentry->d_name.name, dentry->d_name.len,
444                                     dentry->d_parent->d_inode->i_ino,
445                                     inode->i_ino, 0);
446         return ret;
447 }
448
449 static int btrfs_add_nondir(struct btrfs_trans_handle *trans,
450                             struct dentry *dentry, struct inode *inode)
451 {
452         int err = btrfs_add_link(trans, dentry, inode);
453         if (!err) {
454                 d_instantiate(dentry, inode);
455                 return 0;
456         }
457         return err;
458 }
459
460 static int btrfs_create(struct inode *dir, struct dentry *dentry,
461                         int mode, struct nameidata *nd)
462 {
463         struct btrfs_trans_handle *trans;
464         struct btrfs_root *root = btrfs_sb(dir->i_sb);
465         struct inode *inode;
466         int err;
467         int drop_inode = 0;
468
469         mutex_lock(&root->fs_info->fs_mutex);
470         trans = btrfs_start_transaction(root, 1);
471         inode = btrfs_new_inode(trans, dir, mode);
472         err = PTR_ERR(inode);
473         if (IS_ERR(inode))
474                 goto out_unlock;
475         // FIXME mark the inode dirty
476         err = btrfs_add_nondir(trans, dentry, inode);
477         if (err)
478                 drop_inode = 1;
479         dir->i_sb->s_dirt = 1;
480         btrfs_end_transaction(trans, root);
481 out_unlock:
482         mutex_unlock(&root->fs_info->fs_mutex);
483         if (drop_inode) {
484                 inode_dec_link_count(inode);
485                 iput(inode);
486         }
487         return err;
488 }
489
490 static int btrfs_make_empty_dir(struct btrfs_trans_handle *trans,
491                                 struct inode *inode, struct inode *dir)
492 {
493         struct btrfs_root *root = btrfs_sb(inode->i_sb);
494         int ret;
495         char buf[2];
496         buf[0] = '.';
497         buf[1] = '.';
498
499         ret = btrfs_insert_dir_item(trans, root, buf, 1, inode->i_ino,
500                                     inode->i_ino, 1);
501         if (ret)
502                 goto error;
503         ret = btrfs_insert_dir_item(trans, root, buf, 2, inode->i_ino,
504                                     dir->i_ino, 1);
505 error:
506         return ret;
507 }
508
509 static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
510 {
511         struct inode *inode;
512         struct btrfs_trans_handle *trans;
513         struct btrfs_root *root = btrfs_sb(dir->i_sb);
514         int err = 0;
515         int drop_on_err = 0;
516
517         mutex_lock(&root->fs_info->fs_mutex);
518         trans = btrfs_start_transaction(root, 1);
519         if (IS_ERR(trans)) {
520                 err = PTR_ERR(trans);
521                 goto out_unlock;
522         }
523         inode = btrfs_new_inode(trans, dir, S_IFDIR | mode);
524         if (IS_ERR(inode)) {
525                 err = PTR_ERR(inode);
526                 goto out_fail;
527         }
528         drop_on_err = 1;
529         inode->i_op = &btrfs_dir_inode_operations;
530         inode->i_fop = &btrfs_dir_file_operations;
531
532         err = btrfs_make_empty_dir(trans, inode, dir);
533         if (err)
534                 goto out_fail;
535         err = btrfs_add_link(trans, dentry, inode);
536         if (err)
537                 goto out_fail;
538         d_instantiate(dentry, inode);
539         mark_inode_dirty(inode);
540         drop_on_err = 0;
541
542 out_fail:
543         btrfs_end_transaction(trans, root);
544 out_unlock:
545         mutex_unlock(&root->fs_info->fs_mutex);
546         if (drop_on_err)
547                 iput(inode);
548         return err;
549 }
550
551 static int btrfs_sync_fs(struct super_block *sb, int wait)
552 {
553         struct btrfs_trans_handle *trans;
554         struct btrfs_root *root;
555         int ret;
556
557         sb->s_dirt = 0;
558         if (!wait) {
559                 filemap_flush(sb->s_bdev->bd_inode->i_mapping);
560                 return 0;
561         }
562         filemap_write_and_wait(sb->s_bdev->bd_inode->i_mapping);
563
564         root = btrfs_sb(sb);
565         mutex_lock(&root->fs_info->fs_mutex);
566         trans = btrfs_start_transaction(root, 1);
567         ret = btrfs_commit_transaction(trans, root);
568         sb->s_dirt = 0;
569         BUG_ON(ret);
570 printk("btrfs sync_fs\n");
571         mutex_unlock(&root->fs_info->fs_mutex);
572         return 0;
573 }
574
575 static void btrfs_write_super(struct super_block *sb)
576 {
577         btrfs_sync_fs(sb, 1);
578 }
579
580
581 static int btrfs_get_sb(struct file_system_type *fs_type,
582         int flags, const char *dev_name, void *data, struct vfsmount *mnt)
583 {
584         return get_sb_bdev(fs_type, flags, dev_name, data,
585                            btrfs_fill_super, mnt);
586 }
587
588 static struct file_system_type btrfs_fs_type = {
589         .owner          = THIS_MODULE,
590         .name           = "btrfs",
591         .get_sb         = btrfs_get_sb,
592         .kill_sb        = kill_block_super,
593         .fs_flags       = FS_REQUIRES_DEV,
594 };
595
596 static struct super_operations btrfs_super_ops = {
597         .statfs         = simple_statfs,
598         .delete_inode   = btrfs_delete_inode,
599         .put_super      = btrfs_put_super,
600         .read_inode     = btrfs_read_locked_inode,
601         .write_super    = btrfs_write_super,
602         .sync_fs        = btrfs_sync_fs,
603 };
604
605 static struct inode_operations btrfs_dir_inode_operations = {
606         .lookup         = btrfs_lookup,
607         .create         = btrfs_create,
608         .unlink         = btrfs_unlink,
609         .mkdir          = btrfs_mkdir,
610 };
611
612 static struct file_operations btrfs_dir_file_operations = {
613         .llseek         = generic_file_llseek,
614         .read           = generic_read_dir,
615         .readdir        = btrfs_readdir,
616 };
617
618
619 static int __init init_btrfs_fs(void)
620 {
621         printk("btrfs loaded!\n");
622         return register_filesystem(&btrfs_fs_type);
623 }
624
625 static void __exit exit_btrfs_fs(void)
626 {
627         unregister_filesystem(&btrfs_fs_type);
628         printk("btrfs unloaded\n");
629 }
630
631 module_init(init_btrfs_fs)
632 module_exit(exit_btrfs_fs)
633
634 MODULE_LICENSE("GPL");