dir.c 17 KB

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