super.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984
  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 <linux/mpage.h>
  12. #include "ctree.h"
  13. #include "disk-io.h"
  14. #include "transaction.h"
  15. #define BTRFS_SUPER_MAGIC 0x9123682E
  16. static struct inode_operations btrfs_dir_inode_operations;
  17. static struct super_operations btrfs_super_ops;
  18. static struct file_operations btrfs_dir_file_operations;
  19. static struct inode_operations btrfs_file_inode_operations;
  20. static struct address_space_operations btrfs_aops;
  21. static struct file_operations btrfs_file_operations;
  22. static void btrfs_read_locked_inode(struct inode *inode)
  23. {
  24. struct btrfs_path path;
  25. struct btrfs_inode_item *inode_item;
  26. struct btrfs_root *root = btrfs_sb(inode->i_sb);
  27. int ret;
  28. btrfs_init_path(&path);
  29. mutex_lock(&root->fs_info->fs_mutex);
  30. ret = btrfs_lookup_inode(NULL, root, &path, inode->i_ino, 0);
  31. if (ret) {
  32. btrfs_release_path(root, &path);
  33. mutex_unlock(&root->fs_info->fs_mutex);
  34. make_bad_inode(inode);
  35. return;
  36. }
  37. inode_item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
  38. path.slots[0],
  39. struct btrfs_inode_item);
  40. inode->i_mode = btrfs_inode_mode(inode_item);
  41. inode->i_nlink = btrfs_inode_nlink(inode_item);
  42. inode->i_uid = btrfs_inode_uid(inode_item);
  43. inode->i_gid = btrfs_inode_gid(inode_item);
  44. inode->i_size = btrfs_inode_size(inode_item);
  45. inode->i_atime.tv_sec = btrfs_timespec_sec(&inode_item->atime);
  46. inode->i_atime.tv_nsec = btrfs_timespec_nsec(&inode_item->atime);
  47. inode->i_mtime.tv_sec = btrfs_timespec_sec(&inode_item->mtime);
  48. inode->i_mtime.tv_nsec = btrfs_timespec_nsec(&inode_item->mtime);
  49. inode->i_ctime.tv_sec = btrfs_timespec_sec(&inode_item->ctime);
  50. inode->i_ctime.tv_nsec = btrfs_timespec_nsec(&inode_item->ctime);
  51. inode->i_blocks = btrfs_inode_nblocks(inode_item);
  52. inode->i_generation = btrfs_inode_generation(inode_item);
  53. btrfs_release_path(root, &path);
  54. mutex_unlock(&root->fs_info->fs_mutex);
  55. switch (inode->i_mode & S_IFMT) {
  56. #if 0
  57. default:
  58. init_special_inode(inode, inode->i_mode,
  59. btrfs_inode_rdev(inode_item));
  60. break;
  61. #endif
  62. case S_IFREG:
  63. inode->i_mapping->a_ops = &btrfs_aops;
  64. inode->i_fop = &btrfs_file_operations;
  65. inode->i_op = &btrfs_file_inode_operations;
  66. break;
  67. case S_IFDIR:
  68. inode->i_op = &btrfs_dir_inode_operations;
  69. inode->i_fop = &btrfs_dir_file_operations;
  70. break;
  71. case S_IFLNK:
  72. // inode->i_op = &page_symlink_inode_operations;
  73. break;
  74. }
  75. return;
  76. }
  77. static int btrfs_unlink_trans(struct btrfs_trans_handle *trans,
  78. struct btrfs_root *root,
  79. struct inode *dir,
  80. struct dentry *dentry)
  81. {
  82. struct btrfs_path path;
  83. const char *name = dentry->d_name.name;
  84. int name_len = dentry->d_name.len;
  85. int ret;
  86. u64 objectid;
  87. struct btrfs_dir_item *di;
  88. btrfs_init_path(&path);
  89. ret = btrfs_lookup_dir_item(trans, root, &path, dir->i_ino,
  90. name, name_len, -1);
  91. if (ret < 0)
  92. goto err;
  93. if (ret > 0) {
  94. ret = -ENOENT;
  95. goto err;
  96. }
  97. di = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0],
  98. struct btrfs_dir_item);
  99. objectid = btrfs_dir_objectid(di);
  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. if (ret == 0)
  106. inode_dec_link_count(dentry->d_inode);
  107. return ret;
  108. }
  109. static int btrfs_unlink(struct inode *dir, struct dentry *dentry)
  110. {
  111. struct btrfs_root *root;
  112. struct btrfs_trans_handle *trans;
  113. int ret;
  114. root = btrfs_sb(dir->i_sb);
  115. mutex_lock(&root->fs_info->fs_mutex);
  116. trans = btrfs_start_transaction(root, 1);
  117. ret = btrfs_unlink_trans(trans, root, dir, dentry);
  118. btrfs_end_transaction(trans, root);
  119. mutex_unlock(&root->fs_info->fs_mutex);
  120. return ret;
  121. }
  122. static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
  123. {
  124. struct inode *inode = dentry->d_inode;
  125. int err;
  126. int ret;
  127. struct btrfs_root *root = btrfs_sb(dir->i_sb);
  128. struct btrfs_path path;
  129. struct btrfs_key key;
  130. struct btrfs_trans_handle *trans;
  131. struct btrfs_disk_key *found_key;
  132. struct btrfs_leaf *leaf;
  133. btrfs_init_path(&path);
  134. mutex_lock(&root->fs_info->fs_mutex);
  135. trans = btrfs_start_transaction(root, 1);
  136. key.objectid = inode->i_ino;
  137. key.offset = (u64)-1;
  138. key.flags = 0;
  139. btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY);
  140. ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
  141. if (ret < 0) {
  142. err = ret;
  143. goto out;
  144. }
  145. BUG_ON(ret == 0);
  146. BUG_ON(path.slots[0] == 0);
  147. path.slots[0]--;
  148. leaf = btrfs_buffer_leaf(path.nodes[0]);
  149. found_key = &leaf->items[path.slots[0]].key;
  150. if (btrfs_disk_key_objectid(found_key) != inode->i_ino) {
  151. err = -ENOENT;
  152. goto out;
  153. }
  154. if (btrfs_disk_key_type(found_key) != BTRFS_DIR_ITEM_KEY ||
  155. btrfs_disk_key_offset(found_key) != 2) {
  156. err = -ENOTEMPTY;
  157. goto out;
  158. }
  159. ret = btrfs_del_item(trans, root, &path);
  160. BUG_ON(ret);
  161. btrfs_release_path(root, &path);
  162. key.offset = 1;
  163. ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
  164. if (ret < 0) {
  165. err = ret;
  166. goto out;
  167. }
  168. if (ret > 0) {
  169. err = -ENOTEMPTY;
  170. goto out;
  171. }
  172. ret = btrfs_del_item(trans, root, &path);
  173. if (ret) {
  174. err = ret;
  175. goto out;
  176. }
  177. btrfs_release_path(root, &path);
  178. /* now the directory is empty */
  179. err = btrfs_unlink_trans(trans, root, dir, dentry);
  180. if (!err) {
  181. inode->i_size = 0;
  182. }
  183. out:
  184. mutex_unlock(&root->fs_info->fs_mutex);
  185. ret = btrfs_end_transaction(trans, root);
  186. if (ret && !err)
  187. err = ret;
  188. return err;
  189. }
  190. static int btrfs_free_inode(struct btrfs_trans_handle *trans,
  191. struct btrfs_root *root,
  192. struct inode *inode)
  193. {
  194. u64 objectid = inode->i_ino;
  195. struct btrfs_path path;
  196. struct btrfs_inode_map_item *map;
  197. struct btrfs_key stat_data_key;
  198. int ret;
  199. clear_inode(inode);
  200. btrfs_init_path(&path);
  201. ret = btrfs_lookup_inode_map(trans, root, &path, objectid, -1);
  202. if (ret) {
  203. if (ret > 0)
  204. ret = -ENOENT;
  205. btrfs_release_path(root, &path);
  206. goto error;
  207. }
  208. map = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0],
  209. struct btrfs_inode_map_item);
  210. btrfs_disk_key_to_cpu(&stat_data_key, &map->key);
  211. ret = btrfs_del_item(trans, root->fs_info->inode_root, &path);
  212. BUG_ON(ret);
  213. btrfs_release_path(root, &path);
  214. btrfs_init_path(&path);
  215. ret = btrfs_lookup_inode(trans, root, &path, objectid, -1);
  216. BUG_ON(ret);
  217. ret = btrfs_del_item(trans, root, &path);
  218. BUG_ON(ret);
  219. btrfs_release_path(root, &path);
  220. error:
  221. return ret;
  222. }
  223. static int btrfs_truncate_in_trans(struct btrfs_trans_handle *trans,
  224. struct btrfs_root *root,
  225. struct inode *inode)
  226. {
  227. int ret;
  228. struct btrfs_path path;
  229. struct btrfs_key key;
  230. struct btrfs_disk_key *found_key;
  231. struct btrfs_leaf *leaf;
  232. struct btrfs_file_extent_item *fi;
  233. u64 extent_start;
  234. u64 extent_num_blocks;
  235. /* FIXME, add redo link to tree so we don't leak on crash */
  236. key.objectid = inode->i_ino;
  237. key.offset = (u64)-1;
  238. key.flags = 0;
  239. btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY);
  240. while(1) {
  241. btrfs_init_path(&path);
  242. ret = btrfs_search_slot(trans, root, &key, &path, -1, 1);
  243. if (ret < 0) {
  244. btrfs_release_path(root, &path);
  245. goto error;
  246. }
  247. if (ret > 0) {
  248. BUG_ON(path.slots[0] == 0);
  249. path.slots[0]--;
  250. }
  251. leaf = btrfs_buffer_leaf(path.nodes[0]);
  252. found_key = &leaf->items[path.slots[0]].key;
  253. if (btrfs_disk_key_objectid(found_key) != inode->i_ino)
  254. break;
  255. if (btrfs_disk_key_type(found_key) != BTRFS_EXTENT_DATA_KEY)
  256. break;
  257. if (btrfs_disk_key_offset(found_key) < inode->i_size)
  258. break;
  259. fi = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
  260. path.slots[0],
  261. struct btrfs_file_extent_item);
  262. extent_start = btrfs_file_extent_disk_blocknr(fi);
  263. extent_num_blocks = btrfs_file_extent_disk_num_blocks(fi);
  264. key.offset = btrfs_disk_key_offset(found_key) - 1;
  265. ret = btrfs_del_item(trans, root, &path);
  266. BUG_ON(ret);
  267. inode->i_blocks -= btrfs_file_extent_num_blocks(fi) >> 9;
  268. btrfs_release_path(root, &path);
  269. ret = btrfs_free_extent(trans, root, extent_start,
  270. extent_num_blocks, 0);
  271. BUG_ON(ret);
  272. if (key.offset + 1 == 0)
  273. break;
  274. }
  275. btrfs_release_path(root, &path);
  276. ret = 0;
  277. error:
  278. return ret;
  279. }
  280. static void btrfs_delete_inode(struct inode *inode)
  281. {
  282. struct btrfs_trans_handle *trans;
  283. struct btrfs_root *root = btrfs_sb(inode->i_sb);
  284. int ret;
  285. truncate_inode_pages(&inode->i_data, 0);
  286. if (is_bad_inode(inode)) {
  287. goto no_delete;
  288. }
  289. inode->i_size = 0;
  290. mutex_lock(&root->fs_info->fs_mutex);
  291. trans = btrfs_start_transaction(root, 1);
  292. if (S_ISREG(inode->i_mode)) {
  293. ret = btrfs_truncate_in_trans(trans, root, inode);
  294. BUG_ON(ret);
  295. }
  296. btrfs_free_inode(trans, root, inode);
  297. btrfs_end_transaction(trans, root);
  298. mutex_unlock(&root->fs_info->fs_mutex);
  299. return;
  300. no_delete:
  301. clear_inode(inode);
  302. }
  303. static int btrfs_inode_by_name(struct inode *dir, struct dentry *dentry,
  304. ino_t *ino)
  305. {
  306. const char *name = dentry->d_name.name;
  307. int namelen = dentry->d_name.len;
  308. struct btrfs_dir_item *di;
  309. struct btrfs_path path;
  310. struct btrfs_root *root = btrfs_sb(dir->i_sb);
  311. int ret;
  312. btrfs_init_path(&path);
  313. ret = btrfs_lookup_dir_item(NULL, root, &path, dir->i_ino, name,
  314. namelen, 0);
  315. if (ret || !btrfs_match_dir_item_name(root, &path, name, namelen)) {
  316. *ino = 0;
  317. goto out;
  318. }
  319. di = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0],
  320. struct btrfs_dir_item);
  321. *ino = btrfs_dir_objectid(di);
  322. out:
  323. btrfs_release_path(root, &path);
  324. return ret;
  325. }
  326. static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
  327. struct nameidata *nd)
  328. {
  329. struct inode * inode;
  330. ino_t ino;
  331. int ret;
  332. if (dentry->d_name.len > BTRFS_NAME_LEN)
  333. return ERR_PTR(-ENAMETOOLONG);
  334. ret = btrfs_inode_by_name(dir, dentry, &ino);
  335. if (ret < 0)
  336. return ERR_PTR(ret);
  337. inode = NULL;
  338. if (ino) {
  339. inode = iget(dir->i_sb, ino);
  340. if (!inode)
  341. return ERR_PTR(-EACCES);
  342. }
  343. return d_splice_alias(inode, dentry);
  344. }
  345. static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
  346. {
  347. struct inode *inode = filp->f_path.dentry->d_inode;
  348. struct btrfs_root *root = btrfs_sb(inode->i_sb);
  349. struct btrfs_item *item;
  350. struct btrfs_dir_item *di;
  351. struct btrfs_key key;
  352. struct btrfs_path path;
  353. int ret;
  354. u32 nritems;
  355. struct btrfs_leaf *leaf;
  356. int slot;
  357. int advance;
  358. unsigned char d_type = DT_UNKNOWN;
  359. int over = 0;
  360. key.objectid = inode->i_ino;
  361. key.flags = 0;
  362. btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY);
  363. key.offset = filp->f_pos;
  364. btrfs_init_path(&path);
  365. ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
  366. if (ret < 0) {
  367. goto err;
  368. }
  369. advance = 0;
  370. while(1) {
  371. leaf = btrfs_buffer_leaf(path.nodes[0]);
  372. nritems = btrfs_header_nritems(&leaf->header);
  373. slot = path.slots[0];
  374. if (advance || slot >= nritems) {
  375. if (slot >= nritems -1) {
  376. ret = btrfs_next_leaf(root, &path);
  377. if (ret)
  378. break;
  379. leaf = btrfs_buffer_leaf(path.nodes[0]);
  380. nritems = btrfs_header_nritems(&leaf->header);
  381. slot = path.slots[0];
  382. } else {
  383. slot++;
  384. path.slots[0]++;
  385. }
  386. }
  387. advance = 1;
  388. item = leaf->items + slot;
  389. if (btrfs_disk_key_objectid(&item->key) != key.objectid)
  390. break;
  391. if (btrfs_disk_key_type(&item->key) != BTRFS_DIR_ITEM_KEY)
  392. continue;
  393. if (btrfs_disk_key_offset(&item->key) < filp->f_pos)
  394. continue;
  395. advance = 1;
  396. di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item);
  397. over = filldir(dirent, (const char *)(di + 1),
  398. btrfs_dir_name_len(di),
  399. btrfs_disk_key_offset(&item->key),
  400. btrfs_dir_objectid(di), d_type);
  401. if (over) {
  402. filp->f_pos = btrfs_disk_key_offset(&item->key);
  403. break;
  404. }
  405. filp->f_pos = btrfs_disk_key_offset(&item->key) + 1;
  406. }
  407. ret = 0;
  408. err:
  409. btrfs_release_path(root, &path);
  410. return ret;
  411. }
  412. static void btrfs_put_super (struct super_block * sb)
  413. {
  414. struct btrfs_root *root = btrfs_sb(sb);
  415. int ret;
  416. ret = close_ctree(root);
  417. if (ret) {
  418. printk("close ctree returns %d\n", ret);
  419. }
  420. sb->s_fs_info = NULL;
  421. }
  422. static int btrfs_fill_super(struct super_block * sb, void * data, int silent)
  423. {
  424. struct inode * inode;
  425. struct dentry * root_dentry;
  426. struct btrfs_super_block *disk_super;
  427. struct buffer_head *bh;
  428. struct btrfs_root *root;
  429. sb->s_maxbytes = MAX_LFS_FILESIZE;
  430. sb->s_blocksize = PAGE_CACHE_SIZE;
  431. sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
  432. sb->s_magic = BTRFS_SUPER_MAGIC;
  433. sb->s_op = &btrfs_super_ops;
  434. sb->s_time_gran = 1;
  435. bh = sb_bread(sb, BTRFS_SUPER_INFO_OFFSET / sb->s_blocksize);
  436. if (!bh) {
  437. printk("btrfs: unable to read on disk super\n");
  438. return -EIO;
  439. }
  440. disk_super = (struct btrfs_super_block *)bh->b_data;
  441. root = open_ctree(sb, bh, disk_super);
  442. sb->s_fs_info = root;
  443. if (!root) {
  444. printk("btrfs: open_ctree failed\n");
  445. return -EIO;
  446. }
  447. printk("read in super total blocks %Lu root %Lu\n",
  448. btrfs_super_total_blocks(disk_super),
  449. btrfs_super_root_dir(disk_super));
  450. inode = iget_locked(sb, btrfs_super_root_dir(disk_super));
  451. if (!inode)
  452. return -ENOMEM;
  453. if (inode->i_state & I_NEW) {
  454. btrfs_read_locked_inode(inode);
  455. unlock_new_inode(inode);
  456. }
  457. root_dentry = d_alloc_root(inode);
  458. if (!root_dentry) {
  459. iput(inode);
  460. return -ENOMEM;
  461. }
  462. sb->s_root = root_dentry;
  463. return 0;
  464. }
  465. static void fill_inode_item(struct btrfs_inode_item *item,
  466. struct inode *inode)
  467. {
  468. btrfs_set_inode_uid(item, inode->i_uid);
  469. btrfs_set_inode_gid(item, inode->i_gid);
  470. btrfs_set_inode_size(item, inode->i_size);
  471. btrfs_set_inode_mode(item, inode->i_mode);
  472. btrfs_set_inode_nlink(item, inode->i_nlink);
  473. btrfs_set_timespec_sec(&item->atime, inode->i_atime.tv_sec);
  474. btrfs_set_timespec_nsec(&item->atime, inode->i_atime.tv_nsec);
  475. btrfs_set_timespec_sec(&item->mtime, inode->i_mtime.tv_sec);
  476. btrfs_set_timespec_nsec(&item->mtime, inode->i_mtime.tv_nsec);
  477. btrfs_set_timespec_sec(&item->ctime, inode->i_ctime.tv_sec);
  478. btrfs_set_timespec_nsec(&item->ctime, inode->i_ctime.tv_nsec);
  479. btrfs_set_inode_nblocks(item, inode->i_blocks);
  480. btrfs_set_inode_generation(item, inode->i_generation);
  481. }
  482. static int btrfs_update_inode(struct btrfs_trans_handle *trans,
  483. struct btrfs_root *root,
  484. struct inode *inode)
  485. {
  486. struct btrfs_inode_item *inode_item;
  487. struct btrfs_path path;
  488. int ret;
  489. btrfs_init_path(&path);
  490. ret = btrfs_lookup_inode(trans, root, &path, inode->i_ino, 1);
  491. if (ret) {
  492. if (ret > 0)
  493. ret = -ENOENT;
  494. goto failed;
  495. }
  496. inode_item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]),
  497. path.slots[0],
  498. struct btrfs_inode_item);
  499. fill_inode_item(inode_item, inode);
  500. mark_buffer_dirty(path.nodes[0]);
  501. failed:
  502. btrfs_release_path(root, &path);
  503. return 0;
  504. }
  505. static int btrfs_write_inode(struct inode *inode, int wait)
  506. {
  507. struct btrfs_root *root = btrfs_sb(inode->i_sb);
  508. struct btrfs_trans_handle *trans;
  509. int ret;
  510. mutex_lock(&root->fs_info->fs_mutex);
  511. trans = btrfs_start_transaction(root, 1);
  512. ret = btrfs_update_inode(trans, root, inode);
  513. if (wait)
  514. btrfs_commit_transaction(trans, root);
  515. else
  516. btrfs_end_transaction(trans, root);
  517. mutex_unlock(&root->fs_info->fs_mutex);
  518. return ret;
  519. }
  520. static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
  521. struct inode *dir, int mode)
  522. {
  523. struct inode *inode;
  524. struct btrfs_inode_item inode_item;
  525. struct btrfs_root *root = btrfs_sb(dir->i_sb);
  526. struct btrfs_key key;
  527. int ret;
  528. u64 objectid;
  529. inode = new_inode(dir->i_sb);
  530. if (!inode)
  531. return ERR_PTR(-ENOMEM);
  532. ret = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid);
  533. BUG_ON(ret);
  534. inode->i_uid = current->fsuid;
  535. inode->i_gid = current->fsgid;
  536. inode->i_mode = mode;
  537. inode->i_ino = objectid;
  538. inode->i_blocks = 0;
  539. inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
  540. fill_inode_item(&inode_item, inode);
  541. key.objectid = objectid;
  542. key.flags = 0;
  543. key.offset = 0;
  544. btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY);
  545. ret = btrfs_insert_inode_map(trans, root, objectid, &key);
  546. BUG_ON(ret);
  547. ret = btrfs_insert_inode(trans, root, objectid, &inode_item);
  548. BUG_ON(ret);
  549. insert_inode_hash(inode);
  550. return inode;
  551. }
  552. static int btrfs_add_link(struct btrfs_trans_handle *trans,
  553. struct dentry *dentry, struct inode *inode)
  554. {
  555. int ret;
  556. ret = btrfs_insert_dir_item(trans, btrfs_sb(inode->i_sb),
  557. dentry->d_name.name, dentry->d_name.len,
  558. dentry->d_parent->d_inode->i_ino,
  559. inode->i_ino, 0);
  560. if (ret == 0) {
  561. dentry->d_parent->d_inode->i_size += dentry->d_name.len;
  562. ret = btrfs_update_inode(trans, btrfs_sb(inode->i_sb),
  563. dentry->d_parent->d_inode);
  564. }
  565. return ret;
  566. }
  567. static int btrfs_add_nondir(struct btrfs_trans_handle *trans,
  568. struct dentry *dentry, struct inode *inode)
  569. {
  570. int err = btrfs_add_link(trans, dentry, inode);
  571. if (!err) {
  572. d_instantiate(dentry, inode);
  573. return 0;
  574. }
  575. return err;
  576. }
  577. static int btrfs_create(struct inode *dir, struct dentry *dentry,
  578. int mode, struct nameidata *nd)
  579. {
  580. struct btrfs_trans_handle *trans;
  581. struct btrfs_root *root = btrfs_sb(dir->i_sb);
  582. struct inode *inode;
  583. int err;
  584. int drop_inode = 0;
  585. mutex_lock(&root->fs_info->fs_mutex);
  586. trans = btrfs_start_transaction(root, 1);
  587. inode = btrfs_new_inode(trans, dir, mode);
  588. err = PTR_ERR(inode);
  589. if (IS_ERR(inode))
  590. goto out_unlock;
  591. // FIXME mark the inode dirty
  592. err = btrfs_add_nondir(trans, dentry, inode);
  593. if (err)
  594. drop_inode = 1;
  595. else {
  596. inode->i_mapping->a_ops = &btrfs_aops;
  597. inode->i_fop = &btrfs_file_operations;
  598. inode->i_op = &btrfs_file_inode_operations;
  599. }
  600. dir->i_sb->s_dirt = 1;
  601. btrfs_end_transaction(trans, root);
  602. out_unlock:
  603. mutex_unlock(&root->fs_info->fs_mutex);
  604. if (drop_inode) {
  605. inode_dec_link_count(inode);
  606. iput(inode);
  607. }
  608. return err;
  609. }
  610. static int btrfs_make_empty_dir(struct btrfs_trans_handle *trans,
  611. struct inode *inode, struct inode *dir)
  612. {
  613. struct btrfs_root *root = btrfs_sb(inode->i_sb);
  614. int ret;
  615. char buf[2];
  616. buf[0] = '.';
  617. buf[1] = '.';
  618. ret = btrfs_insert_dir_item(trans, root, buf, 1, inode->i_ino,
  619. inode->i_ino, 1);
  620. if (ret)
  621. goto error;
  622. ret = btrfs_insert_dir_item(trans, root, buf, 2, inode->i_ino,
  623. dir->i_ino, 1);
  624. if (ret)
  625. goto error;
  626. inode->i_size = 3;
  627. ret = btrfs_update_inode(trans, root, inode);
  628. error:
  629. return ret;
  630. }
  631. static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
  632. {
  633. struct inode *inode;
  634. struct btrfs_trans_handle *trans;
  635. struct btrfs_root *root = btrfs_sb(dir->i_sb);
  636. int err = 0;
  637. int drop_on_err = 0;
  638. mutex_lock(&root->fs_info->fs_mutex);
  639. trans = btrfs_start_transaction(root, 1);
  640. if (IS_ERR(trans)) {
  641. err = PTR_ERR(trans);
  642. goto out_unlock;
  643. }
  644. inode = btrfs_new_inode(trans, dir, S_IFDIR | mode);
  645. if (IS_ERR(inode)) {
  646. err = PTR_ERR(inode);
  647. goto out_fail;
  648. }
  649. drop_on_err = 1;
  650. inode->i_op = &btrfs_dir_inode_operations;
  651. inode->i_fop = &btrfs_dir_file_operations;
  652. err = btrfs_make_empty_dir(trans, inode, dir);
  653. if (err)
  654. goto out_fail;
  655. err = btrfs_add_link(trans, dentry, inode);
  656. if (err)
  657. goto out_fail;
  658. d_instantiate(dentry, inode);
  659. drop_on_err = 0;
  660. out_fail:
  661. btrfs_end_transaction(trans, root);
  662. out_unlock:
  663. mutex_unlock(&root->fs_info->fs_mutex);
  664. if (drop_on_err)
  665. iput(inode);
  666. return err;
  667. }
  668. static int btrfs_sync_fs(struct super_block *sb, int wait)
  669. {
  670. struct btrfs_trans_handle *trans;
  671. struct btrfs_root *root;
  672. int ret;
  673. sb->s_dirt = 0;
  674. if (!wait) {
  675. filemap_flush(sb->s_bdev->bd_inode->i_mapping);
  676. return 0;
  677. }
  678. filemap_write_and_wait(sb->s_bdev->bd_inode->i_mapping);
  679. root = btrfs_sb(sb);
  680. mutex_lock(&root->fs_info->fs_mutex);
  681. trans = btrfs_start_transaction(root, 1);
  682. ret = btrfs_commit_transaction(trans, root);
  683. sb->s_dirt = 0;
  684. BUG_ON(ret);
  685. printk("btrfs sync_fs\n");
  686. mutex_unlock(&root->fs_info->fs_mutex);
  687. return 0;
  688. }
  689. static int btrfs_get_block(struct inode *inode, sector_t iblock,
  690. struct buffer_head *result, int create)
  691. {
  692. int ret;
  693. int err = 0;
  694. u64 blocknr;
  695. u64 extent_start = 0;
  696. u64 extent_end = 0;
  697. u64 objectid = inode->i_ino;
  698. struct btrfs_path path;
  699. struct btrfs_root *root = btrfs_sb(inode->i_sb);
  700. struct btrfs_trans_handle *trans = NULL;
  701. struct btrfs_file_extent_item *item;
  702. struct btrfs_leaf *leaf;
  703. struct btrfs_disk_key *found_key;
  704. btrfs_init_path(&path);
  705. mutex_lock(&root->fs_info->fs_mutex);
  706. if (create)
  707. trans = btrfs_start_transaction(root, 1);
  708. ret = btrfs_lookup_file_extent(trans, root, &path,
  709. inode->i_ino,
  710. iblock << inode->i_blkbits, 0);
  711. if (ret < 0) {
  712. btrfs_release_path(root, &path);
  713. err = ret;
  714. goto out;
  715. }
  716. if (ret != 0) {
  717. if (path.slots[0] == 0) {
  718. btrfs_release_path(root, &path);
  719. goto allocate;
  720. }
  721. path.slots[0]--;
  722. }
  723. item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0],
  724. struct btrfs_file_extent_item);
  725. leaf = btrfs_buffer_leaf(path.nodes[0]);
  726. blocknr = btrfs_file_extent_disk_blocknr(item);
  727. blocknr += btrfs_file_extent_offset(item);
  728. /* exact match found, use it */
  729. if (ret == 0) {
  730. err = 0;
  731. map_bh(result, inode->i_sb, blocknr);
  732. btrfs_release_path(root, &path);
  733. goto out;
  734. }
  735. /* are we inside the extent that was found? */
  736. found_key = &leaf->items[path.slots[0]].key;
  737. if (btrfs_disk_key_objectid(found_key) != objectid ||
  738. btrfs_disk_key_type(found_key) != BTRFS_EXTENT_DATA_KEY) {
  739. extent_end = 0;
  740. extent_start = 0;
  741. btrfs_release_path(root, &path);
  742. goto allocate;
  743. }
  744. extent_start = btrfs_disk_key_offset(&leaf->items[path.slots[0]].key);
  745. extent_start = extent_start >> inode->i_blkbits;
  746. extent_start += btrfs_file_extent_offset(item);
  747. extent_end = extent_start + btrfs_file_extent_num_blocks(item);
  748. btrfs_release_path(root, &path);
  749. if (iblock >= extent_start && iblock < extent_end) {
  750. err = 0;
  751. map_bh(result, inode->i_sb, blocknr + iblock - extent_start);
  752. goto out;
  753. }
  754. allocate:
  755. /* ok, create a new extent */
  756. if (!create) {
  757. err = 0;
  758. goto out;
  759. }
  760. ret = btrfs_alloc_file_extent(trans, root, objectid,
  761. iblock << inode->i_blkbits,
  762. 1, extent_end, &blocknr);
  763. if (ret) {
  764. err = ret;
  765. goto out;
  766. }
  767. inode->i_blocks += inode->i_sb->s_blocksize >> 9;
  768. set_buffer_new(result);
  769. map_bh(result, inode->i_sb, blocknr);
  770. out:
  771. if (trans)
  772. btrfs_end_transaction(trans, root);
  773. mutex_unlock(&root->fs_info->fs_mutex);
  774. return err;
  775. }
  776. static int btrfs_prepare_write(struct file *file, struct page *page,
  777. unsigned from, unsigned to)
  778. {
  779. return nobh_prepare_write(page, from, to, btrfs_get_block);
  780. }
  781. static void btrfs_write_super(struct super_block *sb)
  782. {
  783. btrfs_sync_fs(sb, 1);
  784. }
  785. static int btrfs_readpage(struct file *file, struct page *page)
  786. {
  787. return mpage_readpage(page, btrfs_get_block);
  788. }
  789. static int btrfs_readpages(struct file *file, struct address_space *mapping,
  790. struct list_head *pages, unsigned nr_pages)
  791. {
  792. return mpage_readpages(mapping, pages, nr_pages, btrfs_get_block);
  793. }
  794. static int btrfs_writepage(struct page *page, struct writeback_control *wbc)
  795. {
  796. return nobh_writepage(page, btrfs_get_block, wbc);
  797. }
  798. static void btrfs_truncate(struct inode *inode)
  799. {
  800. struct btrfs_root *root = btrfs_sb(inode->i_sb);
  801. int ret;
  802. struct btrfs_trans_handle *trans;
  803. if (!S_ISREG(inode->i_mode))
  804. return;
  805. if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
  806. return;
  807. nobh_truncate_page(inode->i_mapping, inode->i_size);
  808. /* FIXME, add redo link to tree so we don't leak on crash */
  809. mutex_lock(&root->fs_info->fs_mutex);
  810. trans = btrfs_start_transaction(root, 1);
  811. ret = btrfs_truncate_in_trans(trans, root, inode);
  812. BUG_ON(ret);
  813. ret = btrfs_end_transaction(trans, root);
  814. BUG_ON(ret);
  815. mutex_unlock(&root->fs_info->fs_mutex);
  816. mark_inode_dirty(inode);
  817. }
  818. static int btrfs_get_sb(struct file_system_type *fs_type,
  819. int flags, const char *dev_name, void *data, struct vfsmount *mnt)
  820. {
  821. return get_sb_bdev(fs_type, flags, dev_name, data,
  822. btrfs_fill_super, mnt);
  823. }
  824. static struct file_system_type btrfs_fs_type = {
  825. .owner = THIS_MODULE,
  826. .name = "btrfs",
  827. .get_sb = btrfs_get_sb,
  828. .kill_sb = kill_block_super,
  829. .fs_flags = FS_REQUIRES_DEV,
  830. };
  831. static struct super_operations btrfs_super_ops = {
  832. .statfs = simple_statfs,
  833. .delete_inode = btrfs_delete_inode,
  834. .put_super = btrfs_put_super,
  835. .read_inode = btrfs_read_locked_inode,
  836. .write_super = btrfs_write_super,
  837. .sync_fs = btrfs_sync_fs,
  838. .write_inode = btrfs_write_inode,
  839. };
  840. static struct inode_operations btrfs_dir_inode_operations = {
  841. .lookup = btrfs_lookup,
  842. .create = btrfs_create,
  843. .unlink = btrfs_unlink,
  844. .mkdir = btrfs_mkdir,
  845. .rmdir = btrfs_rmdir,
  846. };
  847. static struct file_operations btrfs_dir_file_operations = {
  848. .llseek = generic_file_llseek,
  849. .read = generic_read_dir,
  850. .readdir = btrfs_readdir,
  851. };
  852. static struct address_space_operations btrfs_aops = {
  853. .readpage = btrfs_readpage,
  854. .readpages = btrfs_readpages,
  855. .writepage = btrfs_writepage,
  856. .sync_page = block_sync_page,
  857. .prepare_write = btrfs_prepare_write,
  858. .commit_write = nobh_commit_write,
  859. };
  860. static struct inode_operations btrfs_file_inode_operations = {
  861. .truncate = btrfs_truncate,
  862. };
  863. static struct file_operations btrfs_file_operations = {
  864. .llseek = generic_file_llseek,
  865. .read = do_sync_read,
  866. .write = do_sync_write,
  867. .aio_read = generic_file_aio_read,
  868. .aio_write = generic_file_aio_write,
  869. .mmap = generic_file_mmap,
  870. .open = generic_file_open,
  871. .sendfile = generic_file_sendfile,
  872. .splice_read = generic_file_splice_read,
  873. .splice_write = generic_file_splice_write,
  874. };
  875. static int __init init_btrfs_fs(void)
  876. {
  877. printk("btrfs loaded!\n");
  878. return register_filesystem(&btrfs_fs_type);
  879. }
  880. static void __exit exit_btrfs_fs(void)
  881. {
  882. unregister_filesystem(&btrfs_fs_type);
  883. printk("btrfs unloaded\n");
  884. }
  885. module_init(init_btrfs_fs)
  886. module_exit(exit_btrfs_fs)
  887. MODULE_LICENSE("GPL");