0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 #include <linux/pagemap.h>
0033 #include "nilfs.h"
0034 #include "page.h"
0035
0036 static inline unsigned int nilfs_rec_len_from_disk(__le16 dlen)
0037 {
0038 unsigned int len = le16_to_cpu(dlen);
0039
0040 #if (PAGE_SIZE >= 65536)
0041 if (len == NILFS_MAX_REC_LEN)
0042 return 1 << 16;
0043 #endif
0044 return len;
0045 }
0046
0047 static inline __le16 nilfs_rec_len_to_disk(unsigned int len)
0048 {
0049 #if (PAGE_SIZE >= 65536)
0050 if (len == (1 << 16))
0051 return cpu_to_le16(NILFS_MAX_REC_LEN);
0052
0053 BUG_ON(len > (1 << 16));
0054 #endif
0055 return cpu_to_le16(len);
0056 }
0057
0058
0059
0060
0061
0062 static inline unsigned int nilfs_chunk_size(struct inode *inode)
0063 {
0064 return inode->i_sb->s_blocksize;
0065 }
0066
0067 static inline void nilfs_put_page(struct page *page)
0068 {
0069 kunmap(page);
0070 put_page(page);
0071 }
0072
0073
0074
0075
0076
0077 static unsigned int nilfs_last_byte(struct inode *inode, unsigned long page_nr)
0078 {
0079 unsigned int last_byte = inode->i_size;
0080
0081 last_byte -= page_nr << PAGE_SHIFT;
0082 if (last_byte > PAGE_SIZE)
0083 last_byte = PAGE_SIZE;
0084 return last_byte;
0085 }
0086
0087 static int nilfs_prepare_chunk(struct page *page, unsigned int from,
0088 unsigned int to)
0089 {
0090 loff_t pos = page_offset(page) + from;
0091
0092 return __block_write_begin(page, pos, to - from, nilfs_get_block);
0093 }
0094
0095 static void nilfs_commit_chunk(struct page *page,
0096 struct address_space *mapping,
0097 unsigned int from, unsigned int to)
0098 {
0099 struct inode *dir = mapping->host;
0100 loff_t pos = page_offset(page) + from;
0101 unsigned int len = to - from;
0102 unsigned int nr_dirty, copied;
0103 int err;
0104
0105 nr_dirty = nilfs_page_count_clean_buffers(page, from, to);
0106 copied = block_write_end(NULL, mapping, pos, len, len, page, NULL);
0107 if (pos + copied > dir->i_size)
0108 i_size_write(dir, pos + copied);
0109 if (IS_DIRSYNC(dir))
0110 nilfs_set_transaction_flag(NILFS_TI_SYNC);
0111 err = nilfs_set_file_dirty(dir, nr_dirty);
0112 WARN_ON(err);
0113 unlock_page(page);
0114 }
0115
0116 static bool nilfs_check_page(struct page *page)
0117 {
0118 struct inode *dir = page->mapping->host;
0119 struct super_block *sb = dir->i_sb;
0120 unsigned int chunk_size = nilfs_chunk_size(dir);
0121 char *kaddr = page_address(page);
0122 unsigned int offs, rec_len;
0123 unsigned int limit = PAGE_SIZE;
0124 struct nilfs_dir_entry *p;
0125 char *error;
0126
0127 if ((dir->i_size >> PAGE_SHIFT) == page->index) {
0128 limit = dir->i_size & ~PAGE_MASK;
0129 if (limit & (chunk_size - 1))
0130 goto Ebadsize;
0131 if (!limit)
0132 goto out;
0133 }
0134 for (offs = 0; offs <= limit - NILFS_DIR_REC_LEN(1); offs += rec_len) {
0135 p = (struct nilfs_dir_entry *)(kaddr + offs);
0136 rec_len = nilfs_rec_len_from_disk(p->rec_len);
0137
0138 if (rec_len < NILFS_DIR_REC_LEN(1))
0139 goto Eshort;
0140 if (rec_len & 3)
0141 goto Ealign;
0142 if (rec_len < NILFS_DIR_REC_LEN(p->name_len))
0143 goto Enamelen;
0144 if (((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))
0145 goto Espan;
0146 }
0147 if (offs != limit)
0148 goto Eend;
0149 out:
0150 SetPageChecked(page);
0151 return true;
0152
0153
0154
0155 Ebadsize:
0156 nilfs_error(sb,
0157 "size of directory #%lu is not a multiple of chunk size",
0158 dir->i_ino);
0159 goto fail;
0160 Eshort:
0161 error = "rec_len is smaller than minimal";
0162 goto bad_entry;
0163 Ealign:
0164 error = "unaligned directory entry";
0165 goto bad_entry;
0166 Enamelen:
0167 error = "rec_len is too small for name_len";
0168 goto bad_entry;
0169 Espan:
0170 error = "directory entry across blocks";
0171 bad_entry:
0172 nilfs_error(sb,
0173 "bad entry in directory #%lu: %s - offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
0174 dir->i_ino, error, (page->index << PAGE_SHIFT) + offs,
0175 (unsigned long)le64_to_cpu(p->inode),
0176 rec_len, p->name_len);
0177 goto fail;
0178 Eend:
0179 p = (struct nilfs_dir_entry *)(kaddr + offs);
0180 nilfs_error(sb,
0181 "entry in directory #%lu spans the page boundary offset=%lu, inode=%lu",
0182 dir->i_ino, (page->index << PAGE_SHIFT) + offs,
0183 (unsigned long)le64_to_cpu(p->inode));
0184 fail:
0185 SetPageError(page);
0186 return false;
0187 }
0188
0189 static struct page *nilfs_get_page(struct inode *dir, unsigned long n)
0190 {
0191 struct address_space *mapping = dir->i_mapping;
0192 struct page *page = read_mapping_page(mapping, n, NULL);
0193
0194 if (!IS_ERR(page)) {
0195 kmap(page);
0196 if (unlikely(!PageChecked(page))) {
0197 if (!nilfs_check_page(page))
0198 goto fail;
0199 }
0200 }
0201 return page;
0202
0203 fail:
0204 nilfs_put_page(page);
0205 return ERR_PTR(-EIO);
0206 }
0207
0208
0209
0210
0211
0212
0213 static int
0214 nilfs_match(int len, const unsigned char *name, struct nilfs_dir_entry *de)
0215 {
0216 if (len != de->name_len)
0217 return 0;
0218 if (!de->inode)
0219 return 0;
0220 return !memcmp(name, de->name, len);
0221 }
0222
0223
0224
0225
0226 static struct nilfs_dir_entry *nilfs_next_entry(struct nilfs_dir_entry *p)
0227 {
0228 return (struct nilfs_dir_entry *)((char *)p +
0229 nilfs_rec_len_from_disk(p->rec_len));
0230 }
0231
0232 static unsigned char
0233 nilfs_filetype_table[NILFS_FT_MAX] = {
0234 [NILFS_FT_UNKNOWN] = DT_UNKNOWN,
0235 [NILFS_FT_REG_FILE] = DT_REG,
0236 [NILFS_FT_DIR] = DT_DIR,
0237 [NILFS_FT_CHRDEV] = DT_CHR,
0238 [NILFS_FT_BLKDEV] = DT_BLK,
0239 [NILFS_FT_FIFO] = DT_FIFO,
0240 [NILFS_FT_SOCK] = DT_SOCK,
0241 [NILFS_FT_SYMLINK] = DT_LNK,
0242 };
0243
0244 #define S_SHIFT 12
0245 static unsigned char
0246 nilfs_type_by_mode[S_IFMT >> S_SHIFT] = {
0247 [S_IFREG >> S_SHIFT] = NILFS_FT_REG_FILE,
0248 [S_IFDIR >> S_SHIFT] = NILFS_FT_DIR,
0249 [S_IFCHR >> S_SHIFT] = NILFS_FT_CHRDEV,
0250 [S_IFBLK >> S_SHIFT] = NILFS_FT_BLKDEV,
0251 [S_IFIFO >> S_SHIFT] = NILFS_FT_FIFO,
0252 [S_IFSOCK >> S_SHIFT] = NILFS_FT_SOCK,
0253 [S_IFLNK >> S_SHIFT] = NILFS_FT_SYMLINK,
0254 };
0255
0256 static void nilfs_set_de_type(struct nilfs_dir_entry *de, struct inode *inode)
0257 {
0258 umode_t mode = inode->i_mode;
0259
0260 de->file_type = nilfs_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
0261 }
0262
0263 static int nilfs_readdir(struct file *file, struct dir_context *ctx)
0264 {
0265 loff_t pos = ctx->pos;
0266 struct inode *inode = file_inode(file);
0267 struct super_block *sb = inode->i_sb;
0268 unsigned int offset = pos & ~PAGE_MASK;
0269 unsigned long n = pos >> PAGE_SHIFT;
0270 unsigned long npages = dir_pages(inode);
0271
0272 if (pos > inode->i_size - NILFS_DIR_REC_LEN(1))
0273 return 0;
0274
0275 for ( ; n < npages; n++, offset = 0) {
0276 char *kaddr, *limit;
0277 struct nilfs_dir_entry *de;
0278 struct page *page = nilfs_get_page(inode, n);
0279
0280 if (IS_ERR(page)) {
0281 nilfs_error(sb, "bad page in #%lu", inode->i_ino);
0282 ctx->pos += PAGE_SIZE - offset;
0283 return -EIO;
0284 }
0285 kaddr = page_address(page);
0286 de = (struct nilfs_dir_entry *)(kaddr + offset);
0287 limit = kaddr + nilfs_last_byte(inode, n) -
0288 NILFS_DIR_REC_LEN(1);
0289 for ( ; (char *)de <= limit; de = nilfs_next_entry(de)) {
0290 if (de->rec_len == 0) {
0291 nilfs_error(sb, "zero-length directory entry");
0292 nilfs_put_page(page);
0293 return -EIO;
0294 }
0295 if (de->inode) {
0296 unsigned char t;
0297
0298 if (de->file_type < NILFS_FT_MAX)
0299 t = nilfs_filetype_table[de->file_type];
0300 else
0301 t = DT_UNKNOWN;
0302
0303 if (!dir_emit(ctx, de->name, de->name_len,
0304 le64_to_cpu(de->inode), t)) {
0305 nilfs_put_page(page);
0306 return 0;
0307 }
0308 }
0309 ctx->pos += nilfs_rec_len_from_disk(de->rec_len);
0310 }
0311 nilfs_put_page(page);
0312 }
0313 return 0;
0314 }
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324 struct nilfs_dir_entry *
0325 nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
0326 struct page **res_page)
0327 {
0328 const unsigned char *name = qstr->name;
0329 int namelen = qstr->len;
0330 unsigned int reclen = NILFS_DIR_REC_LEN(namelen);
0331 unsigned long start, n;
0332 unsigned long npages = dir_pages(dir);
0333 struct page *page = NULL;
0334 struct nilfs_inode_info *ei = NILFS_I(dir);
0335 struct nilfs_dir_entry *de;
0336
0337 if (npages == 0)
0338 goto out;
0339
0340
0341 *res_page = NULL;
0342
0343 start = ei->i_dir_start_lookup;
0344 if (start >= npages)
0345 start = 0;
0346 n = start;
0347 do {
0348 char *kaddr;
0349
0350 page = nilfs_get_page(dir, n);
0351 if (!IS_ERR(page)) {
0352 kaddr = page_address(page);
0353 de = (struct nilfs_dir_entry *)kaddr;
0354 kaddr += nilfs_last_byte(dir, n) - reclen;
0355 while ((char *) de <= kaddr) {
0356 if (de->rec_len == 0) {
0357 nilfs_error(dir->i_sb,
0358 "zero-length directory entry");
0359 nilfs_put_page(page);
0360 goto out;
0361 }
0362 if (nilfs_match(namelen, name, de))
0363 goto found;
0364 de = nilfs_next_entry(de);
0365 }
0366 nilfs_put_page(page);
0367 }
0368 if (++n >= npages)
0369 n = 0;
0370
0371 if (unlikely(n > (dir->i_blocks >> (PAGE_SHIFT - 9)))) {
0372 nilfs_error(dir->i_sb,
0373 "dir %lu size %lld exceeds block count %llu",
0374 dir->i_ino, dir->i_size,
0375 (unsigned long long)dir->i_blocks);
0376 goto out;
0377 }
0378 } while (n != start);
0379 out:
0380 return NULL;
0381
0382 found:
0383 *res_page = page;
0384 ei->i_dir_start_lookup = n;
0385 return de;
0386 }
0387
0388 struct nilfs_dir_entry *nilfs_dotdot(struct inode *dir, struct page **p)
0389 {
0390 struct page *page = nilfs_get_page(dir, 0);
0391 struct nilfs_dir_entry *de = NULL;
0392
0393 if (!IS_ERR(page)) {
0394 de = nilfs_next_entry(
0395 (struct nilfs_dir_entry *)page_address(page));
0396 *p = page;
0397 }
0398 return de;
0399 }
0400
0401 ino_t nilfs_inode_by_name(struct inode *dir, const struct qstr *qstr)
0402 {
0403 ino_t res = 0;
0404 struct nilfs_dir_entry *de;
0405 struct page *page;
0406
0407 de = nilfs_find_entry(dir, qstr, &page);
0408 if (de) {
0409 res = le64_to_cpu(de->inode);
0410 kunmap(page);
0411 put_page(page);
0412 }
0413 return res;
0414 }
0415
0416
0417 void nilfs_set_link(struct inode *dir, struct nilfs_dir_entry *de,
0418 struct page *page, struct inode *inode)
0419 {
0420 unsigned int from = (char *)de - (char *)page_address(page);
0421 unsigned int to = from + nilfs_rec_len_from_disk(de->rec_len);
0422 struct address_space *mapping = page->mapping;
0423 int err;
0424
0425 lock_page(page);
0426 err = nilfs_prepare_chunk(page, from, to);
0427 BUG_ON(err);
0428 de->inode = cpu_to_le64(inode->i_ino);
0429 nilfs_set_de_type(de, inode);
0430 nilfs_commit_chunk(page, mapping, from, to);
0431 nilfs_put_page(page);
0432 dir->i_mtime = dir->i_ctime = current_time(dir);
0433 }
0434
0435
0436
0437
0438 int nilfs_add_link(struct dentry *dentry, struct inode *inode)
0439 {
0440 struct inode *dir = d_inode(dentry->d_parent);
0441 const unsigned char *name = dentry->d_name.name;
0442 int namelen = dentry->d_name.len;
0443 unsigned int chunk_size = nilfs_chunk_size(dir);
0444 unsigned int reclen = NILFS_DIR_REC_LEN(namelen);
0445 unsigned short rec_len, name_len;
0446 struct page *page = NULL;
0447 struct nilfs_dir_entry *de;
0448 unsigned long npages = dir_pages(dir);
0449 unsigned long n;
0450 char *kaddr;
0451 unsigned int from, to;
0452 int err;
0453
0454
0455
0456
0457
0458
0459 for (n = 0; n <= npages; n++) {
0460 char *dir_end;
0461
0462 page = nilfs_get_page(dir, n);
0463 err = PTR_ERR(page);
0464 if (IS_ERR(page))
0465 goto out;
0466 lock_page(page);
0467 kaddr = page_address(page);
0468 dir_end = kaddr + nilfs_last_byte(dir, n);
0469 de = (struct nilfs_dir_entry *)kaddr;
0470 kaddr += PAGE_SIZE - reclen;
0471 while ((char *)de <= kaddr) {
0472 if ((char *)de == dir_end) {
0473
0474 name_len = 0;
0475 rec_len = chunk_size;
0476 de->rec_len = nilfs_rec_len_to_disk(chunk_size);
0477 de->inode = 0;
0478 goto got_it;
0479 }
0480 if (de->rec_len == 0) {
0481 nilfs_error(dir->i_sb,
0482 "zero-length directory entry");
0483 err = -EIO;
0484 goto out_unlock;
0485 }
0486 err = -EEXIST;
0487 if (nilfs_match(namelen, name, de))
0488 goto out_unlock;
0489 name_len = NILFS_DIR_REC_LEN(de->name_len);
0490 rec_len = nilfs_rec_len_from_disk(de->rec_len);
0491 if (!de->inode && rec_len >= reclen)
0492 goto got_it;
0493 if (rec_len >= name_len + reclen)
0494 goto got_it;
0495 de = (struct nilfs_dir_entry *)((char *)de + rec_len);
0496 }
0497 unlock_page(page);
0498 nilfs_put_page(page);
0499 }
0500 BUG();
0501 return -EINVAL;
0502
0503 got_it:
0504 from = (char *)de - (char *)page_address(page);
0505 to = from + rec_len;
0506 err = nilfs_prepare_chunk(page, from, to);
0507 if (err)
0508 goto out_unlock;
0509 if (de->inode) {
0510 struct nilfs_dir_entry *de1;
0511
0512 de1 = (struct nilfs_dir_entry *)((char *)de + name_len);
0513 de1->rec_len = nilfs_rec_len_to_disk(rec_len - name_len);
0514 de->rec_len = nilfs_rec_len_to_disk(name_len);
0515 de = de1;
0516 }
0517 de->name_len = namelen;
0518 memcpy(de->name, name, namelen);
0519 de->inode = cpu_to_le64(inode->i_ino);
0520 nilfs_set_de_type(de, inode);
0521 nilfs_commit_chunk(page, page->mapping, from, to);
0522 dir->i_mtime = dir->i_ctime = current_time(dir);
0523 nilfs_mark_inode_dirty(dir);
0524
0525 out_put:
0526 nilfs_put_page(page);
0527 out:
0528 return err;
0529 out_unlock:
0530 unlock_page(page);
0531 goto out_put;
0532 }
0533
0534
0535
0536
0537
0538 int nilfs_delete_entry(struct nilfs_dir_entry *dir, struct page *page)
0539 {
0540 struct address_space *mapping = page->mapping;
0541 struct inode *inode = mapping->host;
0542 char *kaddr = page_address(page);
0543 unsigned int from, to;
0544 struct nilfs_dir_entry *de, *pde = NULL;
0545 int err;
0546
0547 from = ((char *)dir - kaddr) & ~(nilfs_chunk_size(inode) - 1);
0548 to = ((char *)dir - kaddr) + nilfs_rec_len_from_disk(dir->rec_len);
0549 de = (struct nilfs_dir_entry *)(kaddr + from);
0550
0551 while ((char *)de < (char *)dir) {
0552 if (de->rec_len == 0) {
0553 nilfs_error(inode->i_sb,
0554 "zero-length directory entry");
0555 err = -EIO;
0556 goto out;
0557 }
0558 pde = de;
0559 de = nilfs_next_entry(de);
0560 }
0561 if (pde)
0562 from = (char *)pde - (char *)page_address(page);
0563 lock_page(page);
0564 err = nilfs_prepare_chunk(page, from, to);
0565 BUG_ON(err);
0566 if (pde)
0567 pde->rec_len = nilfs_rec_len_to_disk(to - from);
0568 dir->inode = 0;
0569 nilfs_commit_chunk(page, mapping, from, to);
0570 inode->i_ctime = inode->i_mtime = current_time(inode);
0571 out:
0572 nilfs_put_page(page);
0573 return err;
0574 }
0575
0576
0577
0578
0579 int nilfs_make_empty(struct inode *inode, struct inode *parent)
0580 {
0581 struct address_space *mapping = inode->i_mapping;
0582 struct page *page = grab_cache_page(mapping, 0);
0583 unsigned int chunk_size = nilfs_chunk_size(inode);
0584 struct nilfs_dir_entry *de;
0585 int err;
0586 void *kaddr;
0587
0588 if (!page)
0589 return -ENOMEM;
0590
0591 err = nilfs_prepare_chunk(page, 0, chunk_size);
0592 if (unlikely(err)) {
0593 unlock_page(page);
0594 goto fail;
0595 }
0596 kaddr = kmap_atomic(page);
0597 memset(kaddr, 0, chunk_size);
0598 de = (struct nilfs_dir_entry *)kaddr;
0599 de->name_len = 1;
0600 de->rec_len = nilfs_rec_len_to_disk(NILFS_DIR_REC_LEN(1));
0601 memcpy(de->name, ".\0\0", 4);
0602 de->inode = cpu_to_le64(inode->i_ino);
0603 nilfs_set_de_type(de, inode);
0604
0605 de = (struct nilfs_dir_entry *)(kaddr + NILFS_DIR_REC_LEN(1));
0606 de->name_len = 2;
0607 de->rec_len = nilfs_rec_len_to_disk(chunk_size - NILFS_DIR_REC_LEN(1));
0608 de->inode = cpu_to_le64(parent->i_ino);
0609 memcpy(de->name, "..\0", 4);
0610 nilfs_set_de_type(de, inode);
0611 kunmap_atomic(kaddr);
0612 nilfs_commit_chunk(page, mapping, 0, chunk_size);
0613 fail:
0614 put_page(page);
0615 return err;
0616 }
0617
0618
0619
0620
0621 int nilfs_empty_dir(struct inode *inode)
0622 {
0623 struct page *page = NULL;
0624 unsigned long i, npages = dir_pages(inode);
0625
0626 for (i = 0; i < npages; i++) {
0627 char *kaddr;
0628 struct nilfs_dir_entry *de;
0629
0630 page = nilfs_get_page(inode, i);
0631 if (IS_ERR(page))
0632 continue;
0633
0634 kaddr = page_address(page);
0635 de = (struct nilfs_dir_entry *)kaddr;
0636 kaddr += nilfs_last_byte(inode, i) - NILFS_DIR_REC_LEN(1);
0637
0638 while ((char *)de <= kaddr) {
0639 if (de->rec_len == 0) {
0640 nilfs_error(inode->i_sb,
0641 "zero-length directory entry (kaddr=%p, de=%p)",
0642 kaddr, de);
0643 goto not_empty;
0644 }
0645 if (de->inode != 0) {
0646
0647 if (de->name[0] != '.')
0648 goto not_empty;
0649 if (de->name_len > 2)
0650 goto not_empty;
0651 if (de->name_len < 2) {
0652 if (de->inode !=
0653 cpu_to_le64(inode->i_ino))
0654 goto not_empty;
0655 } else if (de->name[1] != '.')
0656 goto not_empty;
0657 }
0658 de = nilfs_next_entry(de);
0659 }
0660 nilfs_put_page(page);
0661 }
0662 return 1;
0663
0664 not_empty:
0665 nilfs_put_page(page);
0666 return 0;
0667 }
0668
0669 const struct file_operations nilfs_dir_operations = {
0670 .llseek = generic_file_llseek,
0671 .read = generic_read_dir,
0672 .iterate_shared = nilfs_readdir,
0673 .unlocked_ioctl = nilfs_ioctl,
0674 #ifdef CONFIG_COMPAT
0675 .compat_ioctl = nilfs_compat_ioctl,
0676 #endif
0677 .fsync = nilfs_sync_file,
0678
0679 };