dir.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. /*
  2. * linux/fs/ext2/dir.c
  3. *
  4. * Copyright (C) 1992, 1993, 1994, 1995
  5. * Remy Card (card@masi.ibp.fr)
  6. * Laboratoire MASI - Institut Blaise Pascal
  7. * Universite Pierre et Marie Curie (Paris VI)
  8. *
  9. * from
  10. *
  11. * linux/fs/minix/dir.c
  12. *
  13. * Copyright (C) 1991, 1992 Linus Torvalds
  14. *
  15. * ext2 directory handling functions
  16. *
  17. * Big-endian to little-endian byte-swapping/bitmaps by
  18. * David S. Miller (davem@caip.rutgers.edu), 1995
  19. *
  20. * All code that works with directory layout had been switched to pagecache
  21. * and moved here. AV
  22. */
  23. #include "ext2.h"
  24. #include <linux/pagemap.h>
  25. typedef struct ext2_dir_entry_2 ext2_dirent;
  26. /*
  27. * ext2 uses block-sized chunks. Arguably, sector-sized ones would be
  28. * more robust, but we have what we have
  29. */
  30. static inline unsigned ext2_chunk_size(struct inode *inode)
  31. {
  32. return inode->i_sb->s_blocksize;
  33. }
  34. static inline void ext2_put_page(struct page *page)
  35. {
  36. kunmap(page);
  37. page_cache_release(page);
  38. }
  39. static inline unsigned long dir_pages(struct inode *inode)
  40. {
  41. return (inode->i_size+PAGE_CACHE_SIZE-1)>>PAGE_CACHE_SHIFT;
  42. }
  43. /*
  44. * Return the offset into page `page_nr' of the last valid
  45. * byte in that page, plus one.
  46. */
  47. static unsigned
  48. ext2_last_byte(struct inode *inode, unsigned long page_nr)
  49. {
  50. unsigned last_byte = inode->i_size;
  51. last_byte -= page_nr << PAGE_CACHE_SHIFT;
  52. if (last_byte > PAGE_CACHE_SIZE)
  53. last_byte = PAGE_CACHE_SIZE;
  54. return last_byte;
  55. }
  56. static int ext2_commit_chunk(struct page *page, unsigned from, unsigned to)
  57. {
  58. struct inode *dir = page->mapping->host;
  59. int err = 0;
  60. dir->i_version++;
  61. page->mapping->a_ops->commit_write(NULL, page, from, to);
  62. if (IS_DIRSYNC(dir))
  63. err = write_one_page(page, 1);
  64. else
  65. unlock_page(page);
  66. return err;
  67. }
  68. static void ext2_check_page(struct page *page)
  69. {
  70. struct inode *dir = page->mapping->host;
  71. struct super_block *sb = dir->i_sb;
  72. unsigned chunk_size = ext2_chunk_size(dir);
  73. char *kaddr = page_address(page);
  74. u32 max_inumber = le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count);
  75. unsigned offs, rec_len;
  76. unsigned limit = PAGE_CACHE_SIZE;
  77. ext2_dirent *p;
  78. char *error;
  79. if ((dir->i_size >> PAGE_CACHE_SHIFT) == page->index) {
  80. limit = dir->i_size & ~PAGE_CACHE_MASK;
  81. if (limit & (chunk_size - 1))
  82. goto Ebadsize;
  83. if (!limit)
  84. goto out;
  85. }
  86. for (offs = 0; offs <= limit - EXT2_DIR_REC_LEN(1); offs += rec_len) {
  87. p = (ext2_dirent *)(kaddr + offs);
  88. rec_len = le16_to_cpu(p->rec_len);
  89. if (rec_len < EXT2_DIR_REC_LEN(1))
  90. goto Eshort;
  91. if (rec_len & 3)
  92. goto Ealign;
  93. if (rec_len < EXT2_DIR_REC_LEN(p->name_len))
  94. goto Enamelen;
  95. if (((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))
  96. goto Espan;
  97. if (le32_to_cpu(p->inode) > max_inumber)
  98. goto Einumber;
  99. }
  100. if (offs != limit)
  101. goto Eend;
  102. out:
  103. SetPageChecked(page);
  104. return;
  105. /* Too bad, we had an error */
  106. Ebadsize:
  107. ext2_error(sb, "ext2_check_page",
  108. "size of directory #%lu is not a multiple of chunk size",
  109. dir->i_ino
  110. );
  111. goto fail;
  112. Eshort:
  113. error = "rec_len is smaller than minimal";
  114. goto bad_entry;
  115. Ealign:
  116. error = "unaligned directory entry";
  117. goto bad_entry;
  118. Enamelen:
  119. error = "rec_len is too small for name_len";
  120. goto bad_entry;
  121. Espan:
  122. error = "directory entry across blocks";
  123. goto bad_entry;
  124. Einumber:
  125. error = "inode out of bounds";
  126. bad_entry:
  127. ext2_error (sb, "ext2_check_page", "bad entry in directory #%lu: %s - "
  128. "offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
  129. dir->i_ino, error, (page->index<<PAGE_CACHE_SHIFT)+offs,
  130. (unsigned long) le32_to_cpu(p->inode),
  131. rec_len, p->name_len);
  132. goto fail;
  133. Eend:
  134. p = (ext2_dirent *)(kaddr + offs);
  135. ext2_error (sb, "ext2_check_page",
  136. "entry in directory #%lu spans the page boundary"
  137. "offset=%lu, inode=%lu",
  138. dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,
  139. (unsigned long) le32_to_cpu(p->inode));
  140. fail:
  141. SetPageChecked(page);
  142. SetPageError(page);
  143. }
  144. static struct page * ext2_get_page(struct inode *dir, unsigned long n)
  145. {
  146. struct address_space *mapping = dir->i_mapping;
  147. struct page *page = read_mapping_page(mapping, n, NULL);
  148. if (!IS_ERR(page)) {
  149. kmap(page);
  150. if (!PageChecked(page))
  151. ext2_check_page(page);
  152. if (PageError(page))
  153. goto fail;
  154. }
  155. return page;
  156. fail:
  157. ext2_put_page(page);
  158. return ERR_PTR(-EIO);
  159. }
  160. /*
  161. * NOTE! unlike strncmp, ext2_match returns 1 for success, 0 for failure.
  162. *
  163. * len <= EXT2_NAME_LEN and de != NULL are guaranteed by caller.
  164. */
  165. static inline int ext2_match (int len, const char * const name,
  166. struct ext2_dir_entry_2 * de)
  167. {
  168. if (len != de->name_len)
  169. return 0;
  170. if (!de->inode)
  171. return 0;
  172. return !memcmp(name, de->name, len);
  173. }
  174. /*
  175. * p is at least 6 bytes before the end of page
  176. */
  177. static inline ext2_dirent *ext2_next_entry(ext2_dirent *p)
  178. {
  179. return (ext2_dirent *)((char*)p + le16_to_cpu(p->rec_len));
  180. }
  181. static inline unsigned
  182. ext2_validate_entry(char *base, unsigned offset, unsigned mask)
  183. {
  184. ext2_dirent *de = (ext2_dirent*)(base + offset);
  185. ext2_dirent *p = (ext2_dirent*)(base + (offset&mask));
  186. while ((char*)p < (char*)de) {
  187. if (p->rec_len == 0)
  188. break;
  189. p = ext2_next_entry(p);
  190. }
  191. return (char *)p - base;
  192. }
  193. static unsigned char ext2_filetype_table[EXT2_FT_MAX] = {
  194. [EXT2_FT_UNKNOWN] = DT_UNKNOWN,
  195. [EXT2_FT_REG_FILE] = DT_REG,
  196. [EXT2_FT_DIR] = DT_DIR,
  197. [EXT2_FT_CHRDEV] = DT_CHR,
  198. [EXT2_FT_BLKDEV] = DT_BLK,
  199. [EXT2_FT_FIFO] = DT_FIFO,
  200. [EXT2_FT_SOCK] = DT_SOCK,
  201. [EXT2_FT_SYMLINK] = DT_LNK,
  202. };
  203. #define S_SHIFT 12
  204. static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT] = {
  205. [S_IFREG >> S_SHIFT] = EXT2_FT_REG_FILE,
  206. [S_IFDIR >> S_SHIFT] = EXT2_FT_DIR,
  207. [S_IFCHR >> S_SHIFT] = EXT2_FT_CHRDEV,
  208. [S_IFBLK >> S_SHIFT] = EXT2_FT_BLKDEV,
  209. [S_IFIFO >> S_SHIFT] = EXT2_FT_FIFO,
  210. [S_IFSOCK >> S_SHIFT] = EXT2_FT_SOCK,
  211. [S_IFLNK >> S_SHIFT] = EXT2_FT_SYMLINK,
  212. };
  213. static inline void ext2_set_de_type(ext2_dirent *de, struct inode *inode)
  214. {
  215. mode_t mode = inode->i_mode;
  216. if (EXT2_HAS_INCOMPAT_FEATURE(inode->i_sb, EXT2_FEATURE_INCOMPAT_FILETYPE))
  217. de->file_type = ext2_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
  218. else
  219. de->file_type = 0;
  220. }
  221. static int
  222. ext2_readdir (struct file * filp, void * dirent, filldir_t filldir)
  223. {
  224. loff_t pos = filp->f_pos;
  225. struct inode *inode = filp->f_path.dentry->d_inode;
  226. struct super_block *sb = inode->i_sb;
  227. unsigned int offset = pos & ~PAGE_CACHE_MASK;
  228. unsigned long n = pos >> PAGE_CACHE_SHIFT;
  229. unsigned long npages = dir_pages(inode);
  230. unsigned chunk_mask = ~(ext2_chunk_size(inode)-1);
  231. unsigned char *types = NULL;
  232. int need_revalidate = filp->f_version != inode->i_version;
  233. if (pos > inode->i_size - EXT2_DIR_REC_LEN(1))
  234. return 0;
  235. if (EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_FILETYPE))
  236. types = ext2_filetype_table;
  237. for ( ; n < npages; n++, offset = 0) {
  238. char *kaddr, *limit;
  239. ext2_dirent *de;
  240. struct page *page = ext2_get_page(inode, n);
  241. if (IS_ERR(page)) {
  242. ext2_error(sb, __FUNCTION__,
  243. "bad page in #%lu",
  244. inode->i_ino);
  245. filp->f_pos += PAGE_CACHE_SIZE - offset;
  246. return -EIO;
  247. }
  248. kaddr = page_address(page);
  249. if (unlikely(need_revalidate)) {
  250. if (offset) {
  251. offset = ext2_validate_entry(kaddr, offset, chunk_mask);
  252. filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset;
  253. }
  254. filp->f_version = inode->i_version;
  255. need_revalidate = 0;
  256. }
  257. de = (ext2_dirent *)(kaddr+offset);
  258. limit = kaddr + ext2_last_byte(inode, n) - EXT2_DIR_REC_LEN(1);
  259. for ( ;(char*)de <= limit; de = ext2_next_entry(de)) {
  260. if (de->rec_len == 0) {
  261. ext2_error(sb, __FUNCTION__,
  262. "zero-length directory entry");
  263. ext2_put_page(page);
  264. return -EIO;
  265. }
  266. if (de->inode) {
  267. int over;
  268. unsigned char d_type = DT_UNKNOWN;
  269. if (types && de->file_type < EXT2_FT_MAX)
  270. d_type = types[de->file_type];
  271. offset = (char *)de - kaddr;
  272. over = filldir(dirent, de->name, de->name_len,
  273. (n<<PAGE_CACHE_SHIFT) | offset,
  274. le32_to_cpu(de->inode), d_type);
  275. if (over) {
  276. ext2_put_page(page);
  277. return 0;
  278. }
  279. }
  280. filp->f_pos += le16_to_cpu(de->rec_len);
  281. }
  282. ext2_put_page(page);
  283. }
  284. return 0;
  285. }
  286. /*
  287. * ext2_find_entry()
  288. *
  289. * finds an entry in the specified directory with the wanted name. It
  290. * returns the page in which the entry was found, and the entry itself
  291. * (as a parameter - res_dir). Page is returned mapped and unlocked.
  292. * Entry is guaranteed to be valid.
  293. */
  294. struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
  295. struct dentry *dentry, struct page ** res_page)
  296. {
  297. const char *name = dentry->d_name.name;
  298. int namelen = dentry->d_name.len;
  299. unsigned reclen = EXT2_DIR_REC_LEN(namelen);
  300. unsigned long start, n;
  301. unsigned long npages = dir_pages(dir);
  302. struct page *page = NULL;
  303. struct ext2_inode_info *ei = EXT2_I(dir);
  304. ext2_dirent * de;
  305. if (npages == 0)
  306. goto out;
  307. /* OFFSET_CACHE */
  308. *res_page = NULL;
  309. start = ei->i_dir_start_lookup;
  310. if (start >= npages)
  311. start = 0;
  312. n = start;
  313. do {
  314. char *kaddr;
  315. page = ext2_get_page(dir, n);
  316. if (!IS_ERR(page)) {
  317. kaddr = page_address(page);
  318. de = (ext2_dirent *) kaddr;
  319. kaddr += ext2_last_byte(dir, n) - reclen;
  320. while ((char *) de <= kaddr) {
  321. if (de->rec_len == 0) {
  322. ext2_error(dir->i_sb, __FUNCTION__,
  323. "zero-length directory entry");
  324. ext2_put_page(page);
  325. goto out;
  326. }
  327. if (ext2_match (namelen, name, de))
  328. goto found;
  329. de = ext2_next_entry(de);
  330. }
  331. ext2_put_page(page);
  332. }
  333. if (++n >= npages)
  334. n = 0;
  335. /* next page is past the blocks we've got */
  336. if (unlikely(n > (dir->i_blocks >> (PAGE_CACHE_SHIFT - 9)))) {
  337. ext2_error(dir->i_sb, __FUNCTION__,
  338. "dir %lu size %lld exceeds block count %llu",
  339. dir->i_ino, dir->i_size,
  340. (unsigned long long)dir->i_blocks);
  341. goto out;
  342. }
  343. } while (n != start);
  344. out:
  345. return NULL;
  346. found:
  347. *res_page = page;
  348. ei->i_dir_start_lookup = n;
  349. return de;
  350. }
  351. struct ext2_dir_entry_2 * ext2_dotdot (struct inode *dir, struct page **p)
  352. {
  353. struct page *page = ext2_get_page(dir, 0);
  354. ext2_dirent *de = NULL;
  355. if (!IS_ERR(page)) {
  356. de = ext2_next_entry((ext2_dirent *) page_address(page));
  357. *p = page;
  358. }
  359. return de;
  360. }
  361. ino_t ext2_inode_by_name(struct inode * dir, struct dentry *dentry)
  362. {
  363. ino_t res = 0;
  364. struct ext2_dir_entry_2 * de;
  365. struct page *page;
  366. de = ext2_find_entry (dir, dentry, &page);
  367. if (de) {
  368. res = le32_to_cpu(de->inode);
  369. ext2_put_page(page);
  370. }
  371. return res;
  372. }
  373. /* Releases the page */
  374. void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de,
  375. struct page *page, struct inode *inode)
  376. {
  377. unsigned from = (char *) de - (char *) page_address(page);
  378. unsigned to = from + le16_to_cpu(de->rec_len);
  379. int err;
  380. lock_page(page);
  381. err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
  382. BUG_ON(err);
  383. de->inode = cpu_to_le32(inode->i_ino);
  384. ext2_set_de_type (de, inode);
  385. err = ext2_commit_chunk(page, from, to);
  386. ext2_put_page(page);
  387. dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
  388. EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL;
  389. mark_inode_dirty(dir);
  390. }
  391. /*
  392. * Parent is locked.
  393. */
  394. int ext2_add_link (struct dentry *dentry, struct inode *inode)
  395. {
  396. struct inode *dir = dentry->d_parent->d_inode;
  397. const char *name = dentry->d_name.name;
  398. int namelen = dentry->d_name.len;
  399. unsigned chunk_size = ext2_chunk_size(dir);
  400. unsigned reclen = EXT2_DIR_REC_LEN(namelen);
  401. unsigned short rec_len, name_len;
  402. struct page *page = NULL;
  403. ext2_dirent * de;
  404. unsigned long npages = dir_pages(dir);
  405. unsigned long n;
  406. char *kaddr;
  407. unsigned from, to;
  408. int err;
  409. /*
  410. * We take care of directory expansion in the same loop.
  411. * This code plays outside i_size, so it locks the page
  412. * to protect that region.
  413. */
  414. for (n = 0; n <= npages; n++) {
  415. char *dir_end;
  416. page = ext2_get_page(dir, n);
  417. err = PTR_ERR(page);
  418. if (IS_ERR(page))
  419. goto out;
  420. lock_page(page);
  421. kaddr = page_address(page);
  422. dir_end = kaddr + ext2_last_byte(dir, n);
  423. de = (ext2_dirent *)kaddr;
  424. kaddr += PAGE_CACHE_SIZE - reclen;
  425. while ((char *)de <= kaddr) {
  426. if ((char *)de == dir_end) {
  427. /* We hit i_size */
  428. name_len = 0;
  429. rec_len = chunk_size;
  430. de->rec_len = cpu_to_le16(chunk_size);
  431. de->inode = 0;
  432. goto got_it;
  433. }
  434. if (de->rec_len == 0) {
  435. ext2_error(dir->i_sb, __FUNCTION__,
  436. "zero-length directory entry");
  437. err = -EIO;
  438. goto out_unlock;
  439. }
  440. err = -EEXIST;
  441. if (ext2_match (namelen, name, de))
  442. goto out_unlock;
  443. name_len = EXT2_DIR_REC_LEN(de->name_len);
  444. rec_len = le16_to_cpu(de->rec_len);
  445. if (!de->inode && rec_len >= reclen)
  446. goto got_it;
  447. if (rec_len >= name_len + reclen)
  448. goto got_it;
  449. de = (ext2_dirent *) ((char *) de + rec_len);
  450. }
  451. unlock_page(page);
  452. ext2_put_page(page);
  453. }
  454. BUG();
  455. return -EINVAL;
  456. got_it:
  457. from = (char*)de - (char*)page_address(page);
  458. to = from + rec_len;
  459. err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
  460. if (err)
  461. goto out_unlock;
  462. if (de->inode) {
  463. ext2_dirent *de1 = (ext2_dirent *) ((char *) de + name_len);
  464. de1->rec_len = cpu_to_le16(rec_len - name_len);
  465. de->rec_len = cpu_to_le16(name_len);
  466. de = de1;
  467. }
  468. de->name_len = namelen;
  469. memcpy (de->name, name, namelen);
  470. de->inode = cpu_to_le32(inode->i_ino);
  471. ext2_set_de_type (de, inode);
  472. err = ext2_commit_chunk(page, from, to);
  473. dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
  474. EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL;
  475. mark_inode_dirty(dir);
  476. /* OFFSET_CACHE */
  477. out_put:
  478. ext2_put_page(page);
  479. out:
  480. return err;
  481. out_unlock:
  482. unlock_page(page);
  483. goto out_put;
  484. }
  485. /*
  486. * ext2_delete_entry deletes a directory entry by merging it with the
  487. * previous entry. Page is up-to-date. Releases the page.
  488. */
  489. int ext2_delete_entry (struct ext2_dir_entry_2 * dir, struct page * page )
  490. {
  491. struct address_space *mapping = page->mapping;
  492. struct inode *inode = mapping->host;
  493. char *kaddr = page_address(page);
  494. unsigned from = ((char*)dir - kaddr) & ~(ext2_chunk_size(inode)-1);
  495. unsigned to = ((char*)dir - kaddr) + le16_to_cpu(dir->rec_len);
  496. ext2_dirent * pde = NULL;
  497. ext2_dirent * de = (ext2_dirent *) (kaddr + from);
  498. int err;
  499. while ((char*)de < (char*)dir) {
  500. if (de->rec_len == 0) {
  501. ext2_error(inode->i_sb, __FUNCTION__,
  502. "zero-length directory entry");
  503. err = -EIO;
  504. goto out;
  505. }
  506. pde = de;
  507. de = ext2_next_entry(de);
  508. }
  509. if (pde)
  510. from = (char*)pde - (char*)page_address(page);
  511. lock_page(page);
  512. err = mapping->a_ops->prepare_write(NULL, page, from, to);
  513. BUG_ON(err);
  514. if (pde)
  515. pde->rec_len = cpu_to_le16(to-from);
  516. dir->inode = 0;
  517. err = ext2_commit_chunk(page, from, to);
  518. inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC;
  519. EXT2_I(inode)->i_flags &= ~EXT2_BTREE_FL;
  520. mark_inode_dirty(inode);
  521. out:
  522. ext2_put_page(page);
  523. return err;
  524. }
  525. /*
  526. * Set the first fragment of directory.
  527. */
  528. int ext2_make_empty(struct inode *inode, struct inode *parent)
  529. {
  530. struct address_space *mapping = inode->i_mapping;
  531. struct page *page = grab_cache_page(mapping, 0);
  532. unsigned chunk_size = ext2_chunk_size(inode);
  533. struct ext2_dir_entry_2 * de;
  534. int err;
  535. void *kaddr;
  536. if (!page)
  537. return -ENOMEM;
  538. err = mapping->a_ops->prepare_write(NULL, page, 0, chunk_size);
  539. if (err) {
  540. unlock_page(page);
  541. goto fail;
  542. }
  543. kaddr = kmap_atomic(page, KM_USER0);
  544. memset(kaddr, 0, chunk_size);
  545. de = (struct ext2_dir_entry_2 *)kaddr;
  546. de->name_len = 1;
  547. de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(1));
  548. memcpy (de->name, ".\0\0", 4);
  549. de->inode = cpu_to_le32(inode->i_ino);
  550. ext2_set_de_type (de, inode);
  551. de = (struct ext2_dir_entry_2 *)(kaddr + EXT2_DIR_REC_LEN(1));
  552. de->name_len = 2;
  553. de->rec_len = cpu_to_le16(chunk_size - EXT2_DIR_REC_LEN(1));
  554. de->inode = cpu_to_le32(parent->i_ino);
  555. memcpy (de->name, "..\0", 4);
  556. ext2_set_de_type (de, inode);
  557. kunmap_atomic(kaddr, KM_USER0);
  558. err = ext2_commit_chunk(page, 0, chunk_size);
  559. fail:
  560. page_cache_release(page);
  561. return err;
  562. }
  563. /*
  564. * routine to check that the specified directory is empty (for rmdir)
  565. */
  566. int ext2_empty_dir (struct inode * inode)
  567. {
  568. struct page *page = NULL;
  569. unsigned long i, npages = dir_pages(inode);
  570. for (i = 0; i < npages; i++) {
  571. char *kaddr;
  572. ext2_dirent * de;
  573. page = ext2_get_page(inode, i);
  574. if (IS_ERR(page))
  575. continue;
  576. kaddr = page_address(page);
  577. de = (ext2_dirent *)kaddr;
  578. kaddr += ext2_last_byte(inode, i) - EXT2_DIR_REC_LEN(1);
  579. while ((char *)de <= kaddr) {
  580. if (de->rec_len == 0) {
  581. ext2_error(inode->i_sb, __FUNCTION__,
  582. "zero-length directory entry");
  583. printk("kaddr=%p, de=%p\n", kaddr, de);
  584. goto not_empty;
  585. }
  586. if (de->inode != 0) {
  587. /* check for . and .. */
  588. if (de->name[0] != '.')
  589. goto not_empty;
  590. if (de->name_len > 2)
  591. goto not_empty;
  592. if (de->name_len < 2) {
  593. if (de->inode !=
  594. cpu_to_le32(inode->i_ino))
  595. goto not_empty;
  596. } else if (de->name[1] != '.')
  597. goto not_empty;
  598. }
  599. de = ext2_next_entry(de);
  600. }
  601. ext2_put_page(page);
  602. }
  603. return 1;
  604. not_empty:
  605. ext2_put_page(page);
  606. return 0;
  607. }
  608. const struct file_operations ext2_dir_operations = {
  609. .llseek = generic_file_llseek,
  610. .read = generic_read_dir,
  611. .readdir = ext2_readdir,
  612. .ioctl = ext2_ioctl,
  613. #ifdef CONFIG_COMPAT
  614. .compat_ioctl = ext2_compat_ioctl,
  615. #endif
  616. .fsync = ext2_sync_file,
  617. };