]> bbs.cooldavid.org Git - net-next-2.6.git/blame - fs/btrfs/super.c
btrfs_dirty_inode
[net-next-2.6.git] / fs / btrfs / super.c
CommitLineData
2e635a27 1#include <linux/module.h>
e20d96d6 2#include <linux/buffer_head.h>
2e635a27
CM
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"
e20d96d6 12#include "disk-io.h"
d5719762 13#include "transaction.h"
2e635a27
CM
14
15#define BTRFS_SUPER_MAGIC 0x9123682E
e20d96d6
CM
16
17static struct inode_operations btrfs_dir_inode_operations;
18static struct super_operations btrfs_super_ops;
19static struct file_operations btrfs_dir_file_operations;
20
e20d96d6 21static void btrfs_read_locked_inode(struct inode *inode)
2e635a27 22{
e20d96d6
CM
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;
e20d96d6
CM
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);
78fae27e 31 btrfs_release_path(root, &path);
e20d96d6
CM
32 return;
33 }
34 inode_item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
35 path.slots[0],
36 struct btrfs_inode_item);
2e635a27 37
e20d96d6
CM
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);
e20d96d6
CM
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:
e20d96d6
CM
60 break;
61 case S_IFDIR:
e20d96d6
CM
62 inode->i_op = &btrfs_dir_inode_operations;
63 inode->i_fop = &btrfs_dir_file_operations;
64 break;
65 case S_IFLNK:
e20d96d6
CM
66 // inode->i_op = &page_symlink_inode_operations;
67 break;
2e635a27 68 }
e20d96d6 69 return;
2e635a27
CM
70}
71
134e9731
CM
72static 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;
103err:
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
112static 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);
143error:
144 return ret;
145}
146
147static 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;
165no_delete:
166 clear_inode(inode);
167}
168
169
e20d96d6
CM
170static 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);
7f5c1516 183 if (ret || !btrfs_match_dir_item_name(root, &path, name, namelen)) {
e20d96d6
CM
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);
190out:
191 btrfs_release_path(root, &path);
192 return ret;
193}
194
195static 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) {
e20d96d6
CM
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
dcea7915
CM
217static 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}
4730a4bc 245
e20d96d6
CM
246static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
247{
248 struct inode *inode = filp->f_path.dentry->d_inode;
249 struct btrfs_root *root = btrfs_sb(inode->i_sb);
250 struct btrfs_item *item;
251 struct btrfs_dir_item *di;
252 struct btrfs_key key;
253 struct btrfs_path path;
254 int ret;
255 u32 nritems;
256 struct btrfs_leaf *leaf;
257 int slot;
258 int advance;
259 unsigned char d_type = DT_UNKNOWN;
7f5c1516 260 int over = 0;
e20d96d6
CM
261
262 key.objectid = inode->i_ino;
e20d96d6
CM
263 key.flags = 0;
264 btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY);
265 key.offset = filp->f_pos;
266 btrfs_init_path(&path);
267 ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
268 if (ret < 0) {
269 goto err;
270 }
7f5c1516 271 advance = 0;
dcea7915 272 reada_leaves(root, &path);
e20d96d6
CM
273 while(1) {
274 leaf = btrfs_buffer_leaf(path.nodes[0]);
275 nritems = btrfs_header_nritems(&leaf->header);
276 slot = path.slots[0];
e20d96d6 277 if (advance) {
e20d96d6
CM
278 if (slot == nritems -1) {
279 ret = btrfs_next_leaf(root, &path);
280 if (ret)
281 break;
282 leaf = btrfs_buffer_leaf(path.nodes[0]);
283 nritems = btrfs_header_nritems(&leaf->header);
284 slot = path.slots[0];
dcea7915
CM
285 if (path.nodes[1] && path.slots[1] == 0)
286 reada_leaves(root, &path);
e20d96d6
CM
287 } else {
288 slot++;
289 path.slots[0]++;
290 }
291 }
292 advance = 1;
293 item = leaf->items + slot;
e20d96d6
CM
294 if (btrfs_disk_key_objectid(&item->key) != key.objectid)
295 break;
296 if (btrfs_disk_key_type(&item->key) != BTRFS_DIR_ITEM_KEY)
297 continue;
7f5c1516
CM
298 if (btrfs_disk_key_offset(&item->key) < filp->f_pos)
299 continue;
e20d96d6 300 di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item);
e20d96d6
CM
301 over = filldir(dirent, (const char *)(di + 1),
302 btrfs_dir_name_len(di),
303 btrfs_disk_key_offset(&item->key),
304 btrfs_dir_objectid(di), d_type);
7f5c1516
CM
305 if (over) {
306 filp->f_pos = btrfs_disk_key_offset(&item->key);
e20d96d6 307 break;
7f5c1516 308 }
e20d96d6
CM
309 filp->f_pos = btrfs_disk_key_offset(&item->key) + 1;
310 }
e20d96d6
CM
311 ret = 0;
312err:
313 btrfs_release_path(root, &path);
314 return ret;
315}
316
317static void btrfs_put_super (struct super_block * sb)
318{
319 struct btrfs_root *root = btrfs_sb(sb);
320 int ret;
321
322 ret = close_ctree(root);
323 if (ret) {
324 printk("close ctree returns %d\n", ret);
325 }
326 sb->s_fs_info = NULL;
327}
2e635a27
CM
328
329static int btrfs_fill_super(struct super_block * sb, void * data, int silent)
330{
331 struct inode * inode;
e20d96d6
CM
332 struct dentry * root_dentry;
333 struct btrfs_super_block *disk_super;
334 struct buffer_head *bh;
335 struct btrfs_root *root;
2e635a27
CM
336
337 sb->s_maxbytes = MAX_LFS_FILESIZE;
338 sb->s_blocksize = PAGE_CACHE_SIZE;
339 sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
340 sb->s_magic = BTRFS_SUPER_MAGIC;
e20d96d6 341 sb->s_op = &btrfs_super_ops;
2e635a27 342 sb->s_time_gran = 1;
e20d96d6
CM
343
344 bh = sb_bread(sb, BTRFS_SUPER_INFO_OFFSET / sb->s_blocksize);
345 if (!bh) {
346 printk("btrfs: unable to read on disk super\n");
347 return -EIO;
348 }
349 disk_super = (struct btrfs_super_block *)bh->b_data;
350 root = open_ctree(sb, bh, disk_super);
351 sb->s_fs_info = root;
352 if (!root) {
353 printk("btrfs: open_ctree failed\n");
354 return -EIO;
355 }
356 printk("read in super total blocks %Lu root %Lu\n",
357 btrfs_super_total_blocks(disk_super),
358 btrfs_super_root_dir(disk_super));
359
360 inode = iget_locked(sb, btrfs_super_root_dir(disk_super));
2e635a27
CM
361 if (!inode)
362 return -ENOMEM;
e20d96d6
CM
363 if (inode->i_state & I_NEW) {
364 btrfs_read_locked_inode(inode);
365 unlock_new_inode(inode);
366 }
2e635a27 367
e20d96d6
CM
368 root_dentry = d_alloc_root(inode);
369 if (!root_dentry) {
2e635a27
CM
370 iput(inode);
371 return -ENOMEM;
372 }
e20d96d6
CM
373 sb->s_root = root_dentry;
374
2e635a27
CM
375 return 0;
376}
377
d5719762
CM
378static void fill_inode_item(struct btrfs_inode_item *item,
379 struct inode *inode)
380{
381 btrfs_set_inode_uid(item, inode->i_uid);
382 btrfs_set_inode_gid(item, inode->i_gid);
383 btrfs_set_inode_size(item, inode->i_size);
384 btrfs_set_inode_mode(item, inode->i_mode);
385 btrfs_set_inode_nlink(item, inode->i_nlink);
386 btrfs_set_timespec_sec(&item->atime, inode->i_atime.tv_sec);
387 btrfs_set_timespec_nsec(&item->atime, inode->i_atime.tv_nsec);
388 btrfs_set_timespec_sec(&item->mtime, inode->i_mtime.tv_sec);
389 btrfs_set_timespec_nsec(&item->mtime, inode->i_mtime.tv_nsec);
390 btrfs_set_timespec_sec(&item->ctime, inode->i_ctime.tv_sec);
391 btrfs_set_timespec_nsec(&item->ctime, inode->i_ctime.tv_nsec);
392 btrfs_set_inode_nblocks(item, inode->i_blocks);
393 btrfs_set_inode_generation(item, inode->i_generation);
394}
395
4730a4bc
CM
396static int btrfs_update_inode(struct btrfs_trans_handle *trans,
397 struct btrfs_root *root,
398 struct inode *inode)
399{
400 struct btrfs_inode_item *inode_item;
401 struct btrfs_path path;
402 int ret;
403
404 btrfs_init_path(&path);
405
406 ret = btrfs_lookup_inode(trans, root, &path, inode->i_ino, 1);
407 if (ret) {
408 if (ret > 0)
409 ret = -ENOENT;
410 goto failed;
411 }
412
413 inode_item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
414 path.slots[0],
415 struct btrfs_inode_item);
416
417 fill_inode_item(inode_item, inode);
418 mark_buffer_dirty(path.nodes[0]);
419failed:
420 btrfs_release_path(root, &path);
421 return 0;
422}
423
424static int btrfs_write_inode(struct inode *inode, int wait)
425{
426 struct btrfs_root *root = btrfs_sb(inode->i_sb);
427 struct btrfs_trans_handle *trans;
428 int ret;
429
430 mutex_lock(&root->fs_info->fs_mutex);
431 trans = btrfs_start_transaction(root, 1);
432 ret = btrfs_update_inode(trans, root, inode);
433 if (wait)
434 btrfs_commit_transaction(trans, root);
435 else
436 btrfs_end_transaction(trans, root);
437 mutex_unlock(&root->fs_info->fs_mutex);
438 return ret;
439}
440
d5719762
CM
441static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
442 struct inode *dir, int mode)
443{
444 struct inode *inode;
445 struct btrfs_inode_item inode_item;
446 struct btrfs_root *root = btrfs_sb(dir->i_sb);
447 struct btrfs_key key;
448 int ret;
449 u64 objectid;
450
451 inode = new_inode(dir->i_sb);
452 if (!inode)
453 return ERR_PTR(-ENOMEM);
454
455 ret = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid);
456 BUG_ON(ret);
457
458 inode->i_uid = current->fsuid;
459 inode->i_gid = current->fsgid;
460 inode->i_mode = mode;
461 inode->i_ino = objectid;
462 inode->i_blocks = 0;
463 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
464 fill_inode_item(&inode_item, inode);
465
d5719762
CM
466 key.objectid = objectid;
467 key.flags = 0;
468 key.offset = 0;
469 btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY);
470 ret = btrfs_insert_inode_map(trans, root, objectid, &key);
471 BUG_ON(ret);
472
473 ret = btrfs_insert_inode(trans, root, objectid, &inode_item);
474 BUG_ON(ret);
475
476 insert_inode_hash(inode);
d5719762
CM
477 return inode;
478}
479
480static int btrfs_add_link(struct btrfs_trans_handle *trans,
481 struct dentry *dentry, struct inode *inode)
482{
483 int ret;
484 ret = btrfs_insert_dir_item(trans, btrfs_sb(inode->i_sb),
485 dentry->d_name.name, dentry->d_name.len,
486 dentry->d_parent->d_inode->i_ino,
487 inode->i_ino, 0);
4730a4bc
CM
488 if (ret == 0) {
489 dentry->d_parent->d_inode->i_size += dentry->d_name.len;
490 ret = btrfs_update_inode(trans, btrfs_sb(inode->i_sb),
491 dentry->d_parent->d_inode);
492 }
493
d5719762
CM
494 return ret;
495}
496
497static int btrfs_add_nondir(struct btrfs_trans_handle *trans,
498 struct dentry *dentry, struct inode *inode)
499{
500 int err = btrfs_add_link(trans, dentry, inode);
501 if (!err) {
502 d_instantiate(dentry, inode);
503 return 0;
504 }
d5719762
CM
505 return err;
506}
507
508static int btrfs_create(struct inode *dir, struct dentry *dentry,
509 int mode, struct nameidata *nd)
510{
511 struct btrfs_trans_handle *trans;
512 struct btrfs_root *root = btrfs_sb(dir->i_sb);
513 struct inode *inode;
514 int err;
134e9731 515 int drop_inode = 0;
d5719762 516
d561c025 517 mutex_lock(&root->fs_info->fs_mutex);
d5719762
CM
518 trans = btrfs_start_transaction(root, 1);
519 inode = btrfs_new_inode(trans, dir, mode);
520 err = PTR_ERR(inode);
521 if (IS_ERR(inode))
d561c025 522 goto out_unlock;
d5719762
CM
523 // FIXME mark the inode dirty
524 err = btrfs_add_nondir(trans, dentry, inode);
134e9731
CM
525 if (err)
526 drop_inode = 1;
d5719762
CM
527 dir->i_sb->s_dirt = 1;
528 btrfs_end_transaction(trans, root);
d561c025
CM
529out_unlock:
530 mutex_unlock(&root->fs_info->fs_mutex);
134e9731
CM
531 if (drop_inode) {
532 inode_dec_link_count(inode);
533 iput(inode);
534 }
d5719762
CM
535 return err;
536}
537
f7922033
CM
538static int btrfs_make_empty_dir(struct btrfs_trans_handle *trans,
539 struct inode *inode, struct inode *dir)
540{
541 struct btrfs_root *root = btrfs_sb(inode->i_sb);
542 int ret;
543 char buf[2];
544 buf[0] = '.';
545 buf[1] = '.';
546
547 ret = btrfs_insert_dir_item(trans, root, buf, 1, inode->i_ino,
548 inode->i_ino, 1);
549 if (ret)
550 goto error;
551 ret = btrfs_insert_dir_item(trans, root, buf, 2, inode->i_ino,
552 dir->i_ino, 1);
4730a4bc
CM
553 if (ret)
554 goto error;
555 inode->i_size = 3;
556 ret = btrfs_update_inode(trans, root, inode);
f7922033
CM
557error:
558 return ret;
559}
560
561static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
562{
563 struct inode *inode;
564 struct btrfs_trans_handle *trans;
565 struct btrfs_root *root = btrfs_sb(dir->i_sb);
566 int err = 0;
567 int drop_on_err = 0;
568
569 mutex_lock(&root->fs_info->fs_mutex);
570 trans = btrfs_start_transaction(root, 1);
571 if (IS_ERR(trans)) {
572 err = PTR_ERR(trans);
573 goto out_unlock;
574 }
575 inode = btrfs_new_inode(trans, dir, S_IFDIR | mode);
576 if (IS_ERR(inode)) {
577 err = PTR_ERR(inode);
578 goto out_fail;
579 }
580 drop_on_err = 1;
581 inode->i_op = &btrfs_dir_inode_operations;
582 inode->i_fop = &btrfs_dir_file_operations;
583
584 err = btrfs_make_empty_dir(trans, inode, dir);
585 if (err)
586 goto out_fail;
587 err = btrfs_add_link(trans, dentry, inode);
588 if (err)
589 goto out_fail;
590 d_instantiate(dentry, inode);
f7922033
CM
591 drop_on_err = 0;
592
593out_fail:
594 btrfs_end_transaction(trans, root);
595out_unlock:
596 mutex_unlock(&root->fs_info->fs_mutex);
597 if (drop_on_err)
598 iput(inode);
599 return err;
600}
601
d5719762
CM
602static int btrfs_sync_fs(struct super_block *sb, int wait)
603{
604 struct btrfs_trans_handle *trans;
605 struct btrfs_root *root;
606 int ret;
df2ce34c 607
d5719762 608 sb->s_dirt = 0;
d561c025
CM
609 if (!wait) {
610 filemap_flush(sb->s_bdev->bd_inode->i_mapping);
611 return 0;
612 }
613 filemap_write_and_wait(sb->s_bdev->bd_inode->i_mapping);
df2ce34c 614
d5719762 615 root = btrfs_sb(sb);
d561c025 616 mutex_lock(&root->fs_info->fs_mutex);
d5719762
CM
617 trans = btrfs_start_transaction(root, 1);
618 ret = btrfs_commit_transaction(trans, root);
619 sb->s_dirt = 0;
620 BUG_ON(ret);
621printk("btrfs sync_fs\n");
d561c025 622 mutex_unlock(&root->fs_info->fs_mutex);
d5719762
CM
623 return 0;
624}
625
d561c025
CM
626static void btrfs_write_super(struct super_block *sb)
627{
628 btrfs_sync_fs(sb, 1);
629}
630
631
2e635a27
CM
632static int btrfs_get_sb(struct file_system_type *fs_type,
633 int flags, const char *dev_name, void *data, struct vfsmount *mnt)
634{
635 return get_sb_bdev(fs_type, flags, dev_name, data,
636 btrfs_fill_super, mnt);
637}
638
639static struct file_system_type btrfs_fs_type = {
640 .owner = THIS_MODULE,
641 .name = "btrfs",
642 .get_sb = btrfs_get_sb,
643 .kill_sb = kill_block_super,
644 .fs_flags = FS_REQUIRES_DEV,
645};
646
e20d96d6
CM
647static struct super_operations btrfs_super_ops = {
648 .statfs = simple_statfs,
134e9731 649 .delete_inode = btrfs_delete_inode,
e20d96d6
CM
650 .put_super = btrfs_put_super,
651 .read_inode = btrfs_read_locked_inode,
d5719762
CM
652 .write_super = btrfs_write_super,
653 .sync_fs = btrfs_sync_fs,
4730a4bc 654 .write_inode = btrfs_write_inode,
e20d96d6
CM
655};
656
657static struct inode_operations btrfs_dir_inode_operations = {
658 .lookup = btrfs_lookup,
d5719762 659 .create = btrfs_create,
134e9731 660 .unlink = btrfs_unlink,
f7922033 661 .mkdir = btrfs_mkdir,
e20d96d6
CM
662};
663
664static struct file_operations btrfs_dir_file_operations = {
665 .llseek = generic_file_llseek,
666 .read = generic_read_dir,
667 .readdir = btrfs_readdir,
668};
669
670
2e635a27
CM
671static int __init init_btrfs_fs(void)
672{
673 printk("btrfs loaded!\n");
674 return register_filesystem(&btrfs_fs_type);
675}
676
677static void __exit exit_btrfs_fs(void)
678{
679 unregister_filesystem(&btrfs_fs_type);
680 printk("btrfs unloaded\n");
681}
682
683module_init(init_btrfs_fs)
684module_exit(exit_btrfs_fs)
685
686MODULE_LICENSE("GPL");