dir.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * NILFS directory entry operations
  4. *
  5. * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
  6. *
  7. * Modified for NILFS by Amagai Yoshiji.
  8. */
  9. /*
  10. * linux/fs/ext2/dir.c
  11. *
  12. * Copyright (C) 1992, 1993, 1994, 1995
  13. * Remy Card (card@masi.ibp.fr)
  14. * Laboratoire MASI - Institut Blaise Pascal
  15. * Universite Pierre et Marie Curie (Paris VI)
  16. *
  17. * from
  18. *
  19. * linux/fs/minix/dir.c
  20. *
  21. * Copyright (C) 1991, 1992 Linus Torvalds
  22. *
  23. * ext2 directory handling functions
  24. *
  25. * Big-endian to little-endian byte-swapping/bitmaps by
  26. * David S. Miller (davem@caip.rutgers.edu), 1995
  27. *
  28. * All code that works with directory layout had been switched to pagecache
  29. * and moved here. AV
  30. */
  31. #include <linux/pagemap.h>
  32. #include <linux/filelock.h>
  33. #include "nilfs.h"
  34. #include "page.h"
  35. static inline unsigned int nilfs_rec_len_from_disk(__le16 dlen)
  36. {
  37. unsigned int len = le16_to_cpu(dlen);
  38. #if (PAGE_SIZE >= 65536)
  39. if (len == NILFS_MAX_REC_LEN)
  40. return 1 << 16;
  41. #endif
  42. return len;
  43. }
  44. static inline __le16 nilfs_rec_len_to_disk(unsigned int len)
  45. {
  46. #if (PAGE_SIZE >= 65536)
  47. if (len == (1 << 16))
  48. return cpu_to_le16(NILFS_MAX_REC_LEN);
  49. BUG_ON(len > (1 << 16));
  50. #endif
  51. return cpu_to_le16(len);
  52. }
  53. /*
  54. * nilfs uses block-sized chunks. Arguably, sector-sized ones would be
  55. * more robust, but we have what we have
  56. */
  57. static inline unsigned int nilfs_chunk_size(struct inode *inode)
  58. {
  59. return inode->i_sb->s_blocksize;
  60. }
  61. /*
  62. * Return the offset into page `page_nr' of the last valid
  63. * byte in that page, plus one.
  64. */
  65. static unsigned int nilfs_last_byte(struct inode *inode, unsigned long page_nr)
  66. {
  67. u64 last_byte = inode->i_size;
  68. last_byte -= page_nr << PAGE_SHIFT;
  69. if (last_byte > PAGE_SIZE)
  70. last_byte = PAGE_SIZE;
  71. return last_byte;
  72. }
  73. static int nilfs_prepare_chunk(struct folio *folio, unsigned int from,
  74. unsigned int to)
  75. {
  76. loff_t pos = folio_pos(folio) + from;
  77. return __block_write_begin(folio, pos, to - from, nilfs_get_block);
  78. }
  79. static void nilfs_commit_chunk(struct folio *folio,
  80. struct address_space *mapping, size_t from, size_t to)
  81. {
  82. struct inode *dir = mapping->host;
  83. loff_t pos = folio_pos(folio) + from;
  84. size_t copied, len = to - from;
  85. unsigned int nr_dirty;
  86. int err;
  87. nr_dirty = nilfs_page_count_clean_buffers(folio, from, to);
  88. copied = block_write_end(pos, len, len, folio);
  89. if (pos + copied > dir->i_size)
  90. i_size_write(dir, pos + copied);
  91. if (IS_DIRSYNC(dir))
  92. nilfs_set_transaction_flag(NILFS_TI_SYNC);
  93. err = nilfs_set_file_dirty(dir, nr_dirty);
  94. WARN_ON(err); /* do not happen */
  95. folio_unlock(folio);
  96. }
  97. static bool nilfs_check_folio(struct folio *folio, char *kaddr)
  98. {
  99. struct inode *dir = folio->mapping->host;
  100. struct super_block *sb = dir->i_sb;
  101. unsigned int chunk_size = nilfs_chunk_size(dir);
  102. size_t offs, rec_len;
  103. size_t limit = folio_size(folio);
  104. struct nilfs_dir_entry *p;
  105. char *error;
  106. if (dir->i_size < folio_pos(folio) + limit) {
  107. limit = dir->i_size - folio_pos(folio);
  108. if (limit & (chunk_size - 1))
  109. goto Ebadsize;
  110. if (!limit)
  111. goto out;
  112. }
  113. for (offs = 0; offs <= limit - NILFS_DIR_REC_LEN(1); offs += rec_len) {
  114. p = (struct nilfs_dir_entry *)(kaddr + offs);
  115. rec_len = nilfs_rec_len_from_disk(p->rec_len);
  116. if (rec_len < NILFS_DIR_REC_LEN(1))
  117. goto Eshort;
  118. if (rec_len & 3)
  119. goto Ealign;
  120. if (rec_len < NILFS_DIR_REC_LEN(p->name_len))
  121. goto Enamelen;
  122. if (((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))
  123. goto Espan;
  124. if (unlikely(p->inode &&
  125. NILFS_PRIVATE_INODE(le64_to_cpu(p->inode))))
  126. goto Einumber;
  127. }
  128. if (offs != limit)
  129. goto Eend;
  130. out:
  131. folio_set_checked(folio);
  132. return true;
  133. /* Too bad, we had an error */
  134. Ebadsize:
  135. nilfs_error(sb,
  136. "size of directory #%lu is not a multiple of chunk size",
  137. dir->i_ino);
  138. goto fail;
  139. Eshort:
  140. error = "rec_len is smaller than minimal";
  141. goto bad_entry;
  142. Ealign:
  143. error = "unaligned directory entry";
  144. goto bad_entry;
  145. Enamelen:
  146. error = "rec_len is too small for name_len";
  147. goto bad_entry;
  148. Espan:
  149. error = "directory entry across blocks";
  150. goto bad_entry;
  151. Einumber:
  152. error = "disallowed inode number";
  153. bad_entry:
  154. nilfs_error(sb,
  155. "bad entry in directory #%lu: %s - offset=%lu, inode=%lu, rec_len=%zd, name_len=%d",
  156. dir->i_ino, error, (folio->index << PAGE_SHIFT) + offs,
  157. (unsigned long)le64_to_cpu(p->inode),
  158. rec_len, p->name_len);
  159. goto fail;
  160. Eend:
  161. p = (struct nilfs_dir_entry *)(kaddr + offs);
  162. nilfs_error(sb,
  163. "entry in directory #%lu spans the page boundary offset=%lu, inode=%lu",
  164. dir->i_ino, (folio->index << PAGE_SHIFT) + offs,
  165. (unsigned long)le64_to_cpu(p->inode));
  166. fail:
  167. return false;
  168. }
  169. static void *nilfs_get_folio(struct inode *dir, unsigned long n,
  170. struct folio **foliop)
  171. {
  172. struct address_space *mapping = dir->i_mapping;
  173. struct folio *folio = read_mapping_folio(mapping, n, NULL);
  174. void *kaddr;
  175. if (IS_ERR(folio))
  176. return folio;
  177. kaddr = kmap_local_folio(folio, 0);
  178. if (unlikely(!folio_test_checked(folio))) {
  179. if (!nilfs_check_folio(folio, kaddr))
  180. goto fail;
  181. }
  182. *foliop = folio;
  183. return kaddr;
  184. fail:
  185. folio_release_kmap(folio, kaddr);
  186. return ERR_PTR(-EIO);
  187. }
  188. /*
  189. * NOTE! unlike strncmp, nilfs_match returns 1 for success, 0 for failure.
  190. *
  191. * len <= NILFS_NAME_LEN and de != NULL are guaranteed by caller.
  192. */
  193. static int
  194. nilfs_match(int len, const unsigned char *name, struct nilfs_dir_entry *de)
  195. {
  196. if (len != de->name_len)
  197. return 0;
  198. if (!de->inode)
  199. return 0;
  200. return !memcmp(name, de->name, len);
  201. }
  202. /*
  203. * p is at least 6 bytes before the end of page
  204. */
  205. static struct nilfs_dir_entry *nilfs_next_entry(struct nilfs_dir_entry *p)
  206. {
  207. return (struct nilfs_dir_entry *)((char *)p +
  208. nilfs_rec_len_from_disk(p->rec_len));
  209. }
  210. static int nilfs_readdir(struct file *file, struct dir_context *ctx)
  211. {
  212. loff_t pos = ctx->pos;
  213. struct inode *inode = file_inode(file);
  214. struct super_block *sb = inode->i_sb;
  215. unsigned int offset = pos & ~PAGE_MASK;
  216. unsigned long n = pos >> PAGE_SHIFT;
  217. unsigned long npages = dir_pages(inode);
  218. if (pos > inode->i_size - NILFS_DIR_REC_LEN(1))
  219. return 0;
  220. for ( ; n < npages; n++, offset = 0) {
  221. char *kaddr, *limit;
  222. struct nilfs_dir_entry *de;
  223. struct folio *folio;
  224. kaddr = nilfs_get_folio(inode, n, &folio);
  225. if (IS_ERR(kaddr)) {
  226. nilfs_error(sb, "bad page in #%lu", inode->i_ino);
  227. ctx->pos += PAGE_SIZE - offset;
  228. return -EIO;
  229. }
  230. de = (struct nilfs_dir_entry *)(kaddr + offset);
  231. limit = kaddr + nilfs_last_byte(inode, n) -
  232. NILFS_DIR_REC_LEN(1);
  233. for ( ; (char *)de <= limit; de = nilfs_next_entry(de)) {
  234. if (de->rec_len == 0) {
  235. nilfs_error(sb, "zero-length directory entry");
  236. folio_release_kmap(folio, kaddr);
  237. return -EIO;
  238. }
  239. if (de->inode) {
  240. unsigned char t;
  241. t = fs_ftype_to_dtype(de->file_type);
  242. if (!dir_emit(ctx, de->name, de->name_len,
  243. le64_to_cpu(de->inode), t)) {
  244. folio_release_kmap(folio, kaddr);
  245. return 0;
  246. }
  247. }
  248. ctx->pos += nilfs_rec_len_from_disk(de->rec_len);
  249. }
  250. folio_release_kmap(folio, kaddr);
  251. }
  252. return 0;
  253. }
  254. /*
  255. * nilfs_find_entry()
  256. *
  257. * Finds an entry in the specified directory with the wanted name. It
  258. * returns the folio in which the entry was found, and the entry itself.
  259. * The folio is mapped and unlocked. When the caller is finished with
  260. * the entry, it should call folio_release_kmap().
  261. *
  262. * On failure, returns an error pointer and the caller should ignore foliop.
  263. */
  264. struct nilfs_dir_entry *nilfs_find_entry(struct inode *dir,
  265. const struct qstr *qstr, struct folio **foliop)
  266. {
  267. const unsigned char *name = qstr->name;
  268. int namelen = qstr->len;
  269. unsigned int reclen = NILFS_DIR_REC_LEN(namelen);
  270. unsigned long start, n;
  271. unsigned long npages = dir_pages(dir);
  272. struct nilfs_inode_info *ei = NILFS_I(dir);
  273. struct nilfs_dir_entry *de;
  274. if (npages == 0)
  275. goto out;
  276. start = ei->i_dir_start_lookup;
  277. if (start >= npages)
  278. start = 0;
  279. n = start;
  280. do {
  281. char *kaddr = nilfs_get_folio(dir, n, foliop);
  282. if (IS_ERR(kaddr))
  283. return ERR_CAST(kaddr);
  284. de = (struct nilfs_dir_entry *)kaddr;
  285. kaddr += nilfs_last_byte(dir, n) - reclen;
  286. while ((char *)de <= kaddr) {
  287. if (de->rec_len == 0) {
  288. nilfs_error(dir->i_sb,
  289. "zero-length directory entry");
  290. folio_release_kmap(*foliop, kaddr);
  291. goto out;
  292. }
  293. if (nilfs_match(namelen, name, de))
  294. goto found;
  295. de = nilfs_next_entry(de);
  296. }
  297. folio_release_kmap(*foliop, kaddr);
  298. if (++n >= npages)
  299. n = 0;
  300. /* next folio is past the blocks we've got */
  301. if (unlikely(n > (dir->i_blocks >> (PAGE_SHIFT - 9)))) {
  302. nilfs_error(dir->i_sb,
  303. "dir %lu size %lld exceeds block count %llu",
  304. dir->i_ino, dir->i_size,
  305. (unsigned long long)dir->i_blocks);
  306. goto out;
  307. }
  308. } while (n != start);
  309. out:
  310. return ERR_PTR(-ENOENT);
  311. found:
  312. ei->i_dir_start_lookup = n;
  313. return de;
  314. }
  315. struct nilfs_dir_entry *nilfs_dotdot(struct inode *dir, struct folio **foliop)
  316. {
  317. struct folio *folio;
  318. struct nilfs_dir_entry *de, *next_de;
  319. size_t limit;
  320. char *msg;
  321. de = nilfs_get_folio(dir, 0, &folio);
  322. if (IS_ERR(de))
  323. return NULL;
  324. limit = nilfs_last_byte(dir, 0); /* is a multiple of chunk size */
  325. if (unlikely(!limit || le64_to_cpu(de->inode) != dir->i_ino ||
  326. !nilfs_match(1, ".", de))) {
  327. msg = "missing '.'";
  328. goto fail;
  329. }
  330. next_de = nilfs_next_entry(de);
  331. /*
  332. * If "next_de" has not reached the end of the chunk, there is
  333. * at least one more record. Check whether it matches "..".
  334. */
  335. if (unlikely((char *)next_de == (char *)de + nilfs_chunk_size(dir) ||
  336. !nilfs_match(2, "..", next_de))) {
  337. msg = "missing '..'";
  338. goto fail;
  339. }
  340. *foliop = folio;
  341. return next_de;
  342. fail:
  343. nilfs_error(dir->i_sb, "directory #%lu %s", dir->i_ino, msg);
  344. folio_release_kmap(folio, de);
  345. return NULL;
  346. }
  347. int nilfs_inode_by_name(struct inode *dir, const struct qstr *qstr, ino_t *ino)
  348. {
  349. struct nilfs_dir_entry *de;
  350. struct folio *folio;
  351. de = nilfs_find_entry(dir, qstr, &folio);
  352. if (IS_ERR(de))
  353. return PTR_ERR(de);
  354. *ino = le64_to_cpu(de->inode);
  355. folio_release_kmap(folio, de);
  356. return 0;
  357. }
  358. int nilfs_set_link(struct inode *dir, struct nilfs_dir_entry *de,
  359. struct folio *folio, struct inode *inode)
  360. {
  361. size_t from = offset_in_folio(folio, de);
  362. size_t to = from + nilfs_rec_len_from_disk(de->rec_len);
  363. struct address_space *mapping = folio->mapping;
  364. int err;
  365. folio_lock(folio);
  366. err = nilfs_prepare_chunk(folio, from, to);
  367. if (unlikely(err)) {
  368. folio_unlock(folio);
  369. return err;
  370. }
  371. de->inode = cpu_to_le64(inode->i_ino);
  372. de->file_type = fs_umode_to_ftype(inode->i_mode);
  373. nilfs_commit_chunk(folio, mapping, from, to);
  374. inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
  375. return 0;
  376. }
  377. /*
  378. * Parent is locked.
  379. */
  380. int nilfs_add_link(struct dentry *dentry, struct inode *inode)
  381. {
  382. struct inode *dir = d_inode(dentry->d_parent);
  383. const unsigned char *name = dentry->d_name.name;
  384. int namelen = dentry->d_name.len;
  385. unsigned int chunk_size = nilfs_chunk_size(dir);
  386. unsigned int reclen = NILFS_DIR_REC_LEN(namelen);
  387. unsigned short rec_len, name_len;
  388. struct folio *folio = NULL;
  389. struct nilfs_dir_entry *de;
  390. unsigned long npages = dir_pages(dir);
  391. unsigned long n;
  392. size_t from, to;
  393. int err;
  394. /*
  395. * We take care of directory expansion in the same loop.
  396. * This code plays outside i_size, so it locks the folio
  397. * to protect that region.
  398. */
  399. for (n = 0; n <= npages; n++) {
  400. char *kaddr = nilfs_get_folio(dir, n, &folio);
  401. char *dir_end;
  402. if (IS_ERR(kaddr))
  403. return PTR_ERR(kaddr);
  404. folio_lock(folio);
  405. dir_end = kaddr + nilfs_last_byte(dir, n);
  406. de = (struct nilfs_dir_entry *)kaddr;
  407. kaddr += folio_size(folio) - reclen;
  408. while ((char *)de <= kaddr) {
  409. if ((char *)de == dir_end) {
  410. /* We hit i_size */
  411. name_len = 0;
  412. rec_len = chunk_size;
  413. de->rec_len = nilfs_rec_len_to_disk(chunk_size);
  414. de->inode = 0;
  415. goto got_it;
  416. }
  417. if (de->rec_len == 0) {
  418. nilfs_error(dir->i_sb,
  419. "zero-length directory entry");
  420. err = -EIO;
  421. goto out_unlock;
  422. }
  423. err = -EEXIST;
  424. if (nilfs_match(namelen, name, de))
  425. goto out_unlock;
  426. name_len = NILFS_DIR_REC_LEN(de->name_len);
  427. rec_len = nilfs_rec_len_from_disk(de->rec_len);
  428. if (!de->inode && rec_len >= reclen)
  429. goto got_it;
  430. if (rec_len >= name_len + reclen)
  431. goto got_it;
  432. de = (struct nilfs_dir_entry *)((char *)de + rec_len);
  433. }
  434. folio_unlock(folio);
  435. folio_release_kmap(folio, kaddr);
  436. }
  437. BUG();
  438. return -EINVAL;
  439. got_it:
  440. from = offset_in_folio(folio, de);
  441. to = from + rec_len;
  442. err = nilfs_prepare_chunk(folio, from, to);
  443. if (err)
  444. goto out_unlock;
  445. if (de->inode) {
  446. struct nilfs_dir_entry *de1;
  447. de1 = (struct nilfs_dir_entry *)((char *)de + name_len);
  448. de1->rec_len = nilfs_rec_len_to_disk(rec_len - name_len);
  449. de->rec_len = nilfs_rec_len_to_disk(name_len);
  450. de = de1;
  451. }
  452. de->name_len = namelen;
  453. memcpy(de->name, name, namelen);
  454. de->inode = cpu_to_le64(inode->i_ino);
  455. de->file_type = fs_umode_to_ftype(inode->i_mode);
  456. nilfs_commit_chunk(folio, folio->mapping, from, to);
  457. inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
  458. nilfs_mark_inode_dirty(dir);
  459. /* OFFSET_CACHE */
  460. out_put:
  461. folio_release_kmap(folio, de);
  462. return err;
  463. out_unlock:
  464. folio_unlock(folio);
  465. goto out_put;
  466. }
  467. /*
  468. * nilfs_delete_entry deletes a directory entry by merging it with the
  469. * previous entry. Folio is up-to-date.
  470. */
  471. int nilfs_delete_entry(struct nilfs_dir_entry *dir, struct folio *folio)
  472. {
  473. struct address_space *mapping = folio->mapping;
  474. struct inode *inode = mapping->host;
  475. char *kaddr = (char *)((unsigned long)dir & ~(folio_size(folio) - 1));
  476. size_t from, to;
  477. struct nilfs_dir_entry *de, *pde = NULL;
  478. int err;
  479. from = ((char *)dir - kaddr) & ~(nilfs_chunk_size(inode) - 1);
  480. to = ((char *)dir - kaddr) + nilfs_rec_len_from_disk(dir->rec_len);
  481. de = (struct nilfs_dir_entry *)(kaddr + from);
  482. while ((char *)de < (char *)dir) {
  483. if (de->rec_len == 0) {
  484. nilfs_error(inode->i_sb,
  485. "zero-length directory entry");
  486. err = -EIO;
  487. goto out;
  488. }
  489. pde = de;
  490. de = nilfs_next_entry(de);
  491. }
  492. if (pde)
  493. from = (char *)pde - kaddr;
  494. folio_lock(folio);
  495. err = nilfs_prepare_chunk(folio, from, to);
  496. if (unlikely(err)) {
  497. folio_unlock(folio);
  498. goto out;
  499. }
  500. if (pde)
  501. pde->rec_len = nilfs_rec_len_to_disk(to - from);
  502. dir->inode = 0;
  503. nilfs_commit_chunk(folio, mapping, from, to);
  504. inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
  505. out:
  506. return err;
  507. }
  508. /*
  509. * Set the first fragment of directory.
  510. */
  511. int nilfs_make_empty(struct inode *inode, struct inode *parent)
  512. {
  513. struct address_space *mapping = inode->i_mapping;
  514. struct folio *folio = filemap_grab_folio(mapping, 0);
  515. unsigned int chunk_size = nilfs_chunk_size(inode);
  516. struct nilfs_dir_entry *de;
  517. int err;
  518. void *kaddr;
  519. if (IS_ERR(folio))
  520. return PTR_ERR(folio);
  521. err = nilfs_prepare_chunk(folio, 0, chunk_size);
  522. if (unlikely(err)) {
  523. folio_unlock(folio);
  524. goto fail;
  525. }
  526. kaddr = kmap_local_folio(folio, 0);
  527. memset(kaddr, 0, chunk_size);
  528. de = (struct nilfs_dir_entry *)kaddr;
  529. de->name_len = 1;
  530. de->rec_len = nilfs_rec_len_to_disk(NILFS_DIR_REC_LEN(1));
  531. memcpy(de->name, ".\0\0", 4);
  532. de->inode = cpu_to_le64(inode->i_ino);
  533. de->file_type = fs_umode_to_ftype(inode->i_mode);
  534. de = (struct nilfs_dir_entry *)(kaddr + NILFS_DIR_REC_LEN(1));
  535. de->name_len = 2;
  536. de->rec_len = nilfs_rec_len_to_disk(chunk_size - NILFS_DIR_REC_LEN(1));
  537. de->inode = cpu_to_le64(parent->i_ino);
  538. memcpy(de->name, "..\0", 4);
  539. de->file_type = fs_umode_to_ftype(inode->i_mode);
  540. kunmap_local(kaddr);
  541. nilfs_commit_chunk(folio, mapping, 0, chunk_size);
  542. fail:
  543. folio_put(folio);
  544. return err;
  545. }
  546. /*
  547. * routine to check that the specified directory is empty (for rmdir)
  548. */
  549. int nilfs_empty_dir(struct inode *inode)
  550. {
  551. struct folio *folio = NULL;
  552. char *kaddr;
  553. unsigned long i, npages = dir_pages(inode);
  554. for (i = 0; i < npages; i++) {
  555. struct nilfs_dir_entry *de;
  556. kaddr = nilfs_get_folio(inode, i, &folio);
  557. if (IS_ERR(kaddr))
  558. return 0;
  559. de = (struct nilfs_dir_entry *)kaddr;
  560. kaddr += nilfs_last_byte(inode, i) - NILFS_DIR_REC_LEN(1);
  561. while ((char *)de <= kaddr) {
  562. if (de->rec_len == 0) {
  563. nilfs_error(inode->i_sb,
  564. "zero-length directory entry (kaddr=%p, de=%p)",
  565. kaddr, de);
  566. goto not_empty;
  567. }
  568. if (de->inode != 0) {
  569. /* check for . and .. */
  570. if (de->name[0] != '.')
  571. goto not_empty;
  572. if (de->name_len > 2)
  573. goto not_empty;
  574. if (de->name_len < 2) {
  575. if (de->inode !=
  576. cpu_to_le64(inode->i_ino))
  577. goto not_empty;
  578. } else if (de->name[1] != '.')
  579. goto not_empty;
  580. }
  581. de = nilfs_next_entry(de);
  582. }
  583. folio_release_kmap(folio, kaddr);
  584. }
  585. return 1;
  586. not_empty:
  587. folio_release_kmap(folio, kaddr);
  588. return 0;
  589. }
  590. const struct file_operations nilfs_dir_operations = {
  591. .llseek = generic_file_llseek,
  592. .read = generic_read_dir,
  593. .iterate_shared = nilfs_readdir,
  594. .unlocked_ioctl = nilfs_ioctl,
  595. #ifdef CONFIG_COMPAT
  596. .compat_ioctl = nilfs_compat_ioctl,
  597. #endif /* CONFIG_COMPAT */
  598. .fsync = nilfs_sync_file,
  599. .setlease = generic_setlease,
  600. };