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 #include "ubifs.h"
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 static int inherit_flags(const struct inode *dir, umode_t mode)
0048 {
0049 int flags;
0050 const struct ubifs_inode *ui = ubifs_inode(dir);
0051
0052 if (!S_ISDIR(dir->i_mode))
0053
0054
0055
0056
0057 return 0;
0058
0059 flags = ui->flags & (UBIFS_COMPR_FL | UBIFS_SYNC_FL | UBIFS_DIRSYNC_FL);
0060 if (!S_ISDIR(mode))
0061
0062 flags &= ~UBIFS_DIRSYNC_FL;
0063 return flags;
0064 }
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
0077 umode_t mode)
0078 {
0079 int err;
0080 struct inode *inode;
0081 struct ubifs_inode *ui;
0082 bool encrypted = false;
0083
0084 inode = new_inode(c->vfs_sb);
0085 ui = ubifs_inode(inode);
0086 if (!inode)
0087 return ERR_PTR(-ENOMEM);
0088
0089
0090
0091
0092
0093
0094
0095 inode->i_flags |= S_NOCMTIME;
0096
0097 inode_init_owner(&init_user_ns, inode, dir, mode);
0098 inode->i_mtime = inode->i_atime = inode->i_ctime =
0099 current_time(inode);
0100 inode->i_mapping->nrpages = 0;
0101
0102 err = fscrypt_prepare_new_inode(dir, inode, &encrypted);
0103 if (err) {
0104 ubifs_err(c, "fscrypt_prepare_new_inode failed: %i", err);
0105 goto out_iput;
0106 }
0107
0108 switch (mode & S_IFMT) {
0109 case S_IFREG:
0110 inode->i_mapping->a_ops = &ubifs_file_address_operations;
0111 inode->i_op = &ubifs_file_inode_operations;
0112 inode->i_fop = &ubifs_file_operations;
0113 break;
0114 case S_IFDIR:
0115 inode->i_op = &ubifs_dir_inode_operations;
0116 inode->i_fop = &ubifs_dir_operations;
0117 inode->i_size = ui->ui_size = UBIFS_INO_NODE_SZ;
0118 break;
0119 case S_IFLNK:
0120 inode->i_op = &ubifs_symlink_inode_operations;
0121 break;
0122 case S_IFSOCK:
0123 case S_IFIFO:
0124 case S_IFBLK:
0125 case S_IFCHR:
0126 inode->i_op = &ubifs_file_inode_operations;
0127 break;
0128 default:
0129 BUG();
0130 }
0131
0132 ui->flags = inherit_flags(dir, mode);
0133 ubifs_set_inode_flags(inode);
0134 if (S_ISREG(mode))
0135 ui->compr_type = c->default_compr;
0136 else
0137 ui->compr_type = UBIFS_COMPR_NONE;
0138 ui->synced_i_size = 0;
0139
0140 spin_lock(&c->cnt_lock);
0141
0142 if (c->highest_inum >= INUM_WARN_WATERMARK) {
0143 if (c->highest_inum >= INUM_WATERMARK) {
0144 spin_unlock(&c->cnt_lock);
0145 ubifs_err(c, "out of inode numbers");
0146 err = -EINVAL;
0147 goto out_iput;
0148 }
0149 ubifs_warn(c, "running out of inode numbers (current %lu, max %u)",
0150 (unsigned long)c->highest_inum, INUM_WATERMARK);
0151 }
0152
0153 inode->i_ino = ++c->highest_inum;
0154
0155
0156
0157
0158
0159
0160
0161 ui->creat_sqnum = ++c->max_sqnum;
0162 spin_unlock(&c->cnt_lock);
0163
0164 if (encrypted) {
0165 err = fscrypt_set_context(inode, NULL);
0166 if (err) {
0167 ubifs_err(c, "fscrypt_set_context failed: %i", err);
0168 goto out_iput;
0169 }
0170 }
0171
0172 return inode;
0173
0174 out_iput:
0175 make_bad_inode(inode);
0176 iput(inode);
0177 return ERR_PTR(err);
0178 }
0179
0180 static int dbg_check_name(const struct ubifs_info *c,
0181 const struct ubifs_dent_node *dent,
0182 const struct fscrypt_name *nm)
0183 {
0184 if (!dbg_is_chk_gen(c))
0185 return 0;
0186 if (le16_to_cpu(dent->nlen) != fname_len(nm))
0187 return -EINVAL;
0188 if (memcmp(dent->name, fname_name(nm), fname_len(nm)))
0189 return -EINVAL;
0190 return 0;
0191 }
0192
0193 static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry,
0194 unsigned int flags)
0195 {
0196 int err;
0197 union ubifs_key key;
0198 struct inode *inode = NULL;
0199 struct ubifs_dent_node *dent = NULL;
0200 struct ubifs_info *c = dir->i_sb->s_fs_info;
0201 struct fscrypt_name nm;
0202
0203 dbg_gen("'%pd' in dir ino %lu", dentry, dir->i_ino);
0204
0205 err = fscrypt_prepare_lookup(dir, dentry, &nm);
0206 generic_set_encrypted_ci_d_ops(dentry);
0207 if (err == -ENOENT)
0208 return d_splice_alias(NULL, dentry);
0209 if (err)
0210 return ERR_PTR(err);
0211
0212 if (fname_len(&nm) > UBIFS_MAX_NLEN) {
0213 inode = ERR_PTR(-ENAMETOOLONG);
0214 goto done;
0215 }
0216
0217 dent = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS);
0218 if (!dent) {
0219 inode = ERR_PTR(-ENOMEM);
0220 goto done;
0221 }
0222
0223 if (fname_name(&nm) == NULL) {
0224 if (nm.hash & ~UBIFS_S_KEY_HASH_MASK)
0225 goto done;
0226 dent_key_init_hash(c, &key, dir->i_ino, nm.hash);
0227 err = ubifs_tnc_lookup_dh(c, &key, dent, nm.minor_hash);
0228 } else {
0229 dent_key_init(c, &key, dir->i_ino, &nm);
0230 err = ubifs_tnc_lookup_nm(c, &key, dent, &nm);
0231 }
0232
0233 if (err) {
0234 if (err == -ENOENT)
0235 dbg_gen("not found");
0236 else
0237 inode = ERR_PTR(err);
0238 goto done;
0239 }
0240
0241 if (dbg_check_name(c, dent, &nm)) {
0242 inode = ERR_PTR(-EINVAL);
0243 goto done;
0244 }
0245
0246 inode = ubifs_iget(dir->i_sb, le64_to_cpu(dent->inum));
0247 if (IS_ERR(inode)) {
0248
0249
0250
0251
0252 err = PTR_ERR(inode);
0253 ubifs_err(c, "dead directory entry '%pd', error %d",
0254 dentry, err);
0255 ubifs_ro_mode(c, err);
0256 goto done;
0257 }
0258
0259 if (IS_ENCRYPTED(dir) &&
0260 (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
0261 !fscrypt_has_permitted_context(dir, inode)) {
0262 ubifs_warn(c, "Inconsistent encryption contexts: %lu/%lu",
0263 dir->i_ino, inode->i_ino);
0264 iput(inode);
0265 inode = ERR_PTR(-EPERM);
0266 }
0267
0268 done:
0269 kfree(dent);
0270 fscrypt_free_filename(&nm);
0271 return d_splice_alias(inode, dentry);
0272 }
0273
0274 static int ubifs_prepare_create(struct inode *dir, struct dentry *dentry,
0275 struct fscrypt_name *nm)
0276 {
0277 if (fscrypt_is_nokey_name(dentry))
0278 return -ENOKEY;
0279
0280 return fscrypt_setup_filename(dir, &dentry->d_name, 0, nm);
0281 }
0282
0283 static int ubifs_create(struct user_namespace *mnt_userns, struct inode *dir,
0284 struct dentry *dentry, umode_t mode, bool excl)
0285 {
0286 struct inode *inode;
0287 struct ubifs_info *c = dir->i_sb->s_fs_info;
0288 struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
0289 .dirtied_ino = 1 };
0290 struct ubifs_inode *dir_ui = ubifs_inode(dir);
0291 struct fscrypt_name nm;
0292 int err, sz_change;
0293
0294
0295
0296
0297
0298
0299 dbg_gen("dent '%pd', mode %#hx in dir ino %lu",
0300 dentry, mode, dir->i_ino);
0301
0302 err = ubifs_budget_space(c, &req);
0303 if (err)
0304 return err;
0305
0306 err = ubifs_prepare_create(dir, dentry, &nm);
0307 if (err)
0308 goto out_budg;
0309
0310 sz_change = CALC_DENT_SIZE(fname_len(&nm));
0311
0312 inode = ubifs_new_inode(c, dir, mode);
0313 if (IS_ERR(inode)) {
0314 err = PTR_ERR(inode);
0315 goto out_fname;
0316 }
0317
0318 err = ubifs_init_security(dir, inode, &dentry->d_name);
0319 if (err)
0320 goto out_inode;
0321
0322 mutex_lock(&dir_ui->ui_mutex);
0323 dir->i_size += sz_change;
0324 dir_ui->ui_size = dir->i_size;
0325 dir->i_mtime = dir->i_ctime = inode->i_ctime;
0326 err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
0327 if (err)
0328 goto out_cancel;
0329 mutex_unlock(&dir_ui->ui_mutex);
0330
0331 ubifs_release_budget(c, &req);
0332 fscrypt_free_filename(&nm);
0333 insert_inode_hash(inode);
0334 d_instantiate(dentry, inode);
0335 return 0;
0336
0337 out_cancel:
0338 dir->i_size -= sz_change;
0339 dir_ui->ui_size = dir->i_size;
0340 mutex_unlock(&dir_ui->ui_mutex);
0341 out_inode:
0342 make_bad_inode(inode);
0343 iput(inode);
0344 out_fname:
0345 fscrypt_free_filename(&nm);
0346 out_budg:
0347 ubifs_release_budget(c, &req);
0348 ubifs_err(c, "cannot create regular file, error %d", err);
0349 return err;
0350 }
0351
0352 static struct inode *create_whiteout(struct inode *dir, struct dentry *dentry)
0353 {
0354 int err;
0355 umode_t mode = S_IFCHR | WHITEOUT_MODE;
0356 struct inode *inode;
0357 struct ubifs_info *c = dir->i_sb->s_fs_info;
0358 struct fscrypt_name nm;
0359
0360
0361
0362
0363
0364
0365
0366 dbg_gen("dent '%pd', mode %#hx in dir ino %lu",
0367 dentry, mode, dir->i_ino);
0368
0369 err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
0370 if (err)
0371 return ERR_PTR(err);
0372
0373 inode = ubifs_new_inode(c, dir, mode);
0374 if (IS_ERR(inode)) {
0375 err = PTR_ERR(inode);
0376 goto out_free;
0377 }
0378
0379 init_special_inode(inode, inode->i_mode, WHITEOUT_DEV);
0380 ubifs_assert(c, inode->i_op == &ubifs_file_inode_operations);
0381
0382 err = ubifs_init_security(dir, inode, &dentry->d_name);
0383 if (err)
0384 goto out_inode;
0385
0386
0387 insert_inode_hash(inode);
0388
0389 return inode;
0390
0391 out_inode:
0392 make_bad_inode(inode);
0393 iput(inode);
0394 out_free:
0395 fscrypt_free_filename(&nm);
0396 ubifs_err(c, "cannot create whiteout file, error %d", err);
0397 return ERR_PTR(err);
0398 }
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409 static void lock_2_inodes(struct inode *inode1, struct inode *inode2)
0410 {
0411 mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
0412 mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
0413 }
0414
0415
0416
0417
0418
0419
0420 static void unlock_2_inodes(struct inode *inode1, struct inode *inode2)
0421 {
0422 mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
0423 mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
0424 }
0425
0426 static int ubifs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
0427 struct dentry *dentry, umode_t mode)
0428 {
0429 struct inode *inode;
0430 struct ubifs_info *c = dir->i_sb->s_fs_info;
0431 struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
0432 .dirtied_ino = 1};
0433 struct ubifs_budget_req ino_req = { .dirtied_ino = 1 };
0434 struct ubifs_inode *ui;
0435 int err, instantiated = 0;
0436 struct fscrypt_name nm;
0437
0438
0439
0440
0441
0442
0443
0444
0445 dbg_gen("dent '%pd', mode %#hx in dir ino %lu",
0446 dentry, mode, dir->i_ino);
0447
0448 err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
0449 if (err)
0450 return err;
0451
0452 err = ubifs_budget_space(c, &req);
0453 if (err) {
0454 fscrypt_free_filename(&nm);
0455 return err;
0456 }
0457
0458 err = ubifs_budget_space(c, &ino_req);
0459 if (err) {
0460 ubifs_release_budget(c, &req);
0461 fscrypt_free_filename(&nm);
0462 return err;
0463 }
0464
0465 inode = ubifs_new_inode(c, dir, mode);
0466 if (IS_ERR(inode)) {
0467 err = PTR_ERR(inode);
0468 goto out_budg;
0469 }
0470 ui = ubifs_inode(inode);
0471
0472 err = ubifs_init_security(dir, inode, &dentry->d_name);
0473 if (err)
0474 goto out_inode;
0475
0476 mutex_lock(&ui->ui_mutex);
0477 insert_inode_hash(inode);
0478 d_tmpfile(dentry, inode);
0479 ubifs_assert(c, ui->dirty);
0480
0481 instantiated = 1;
0482 mutex_unlock(&ui->ui_mutex);
0483
0484 lock_2_inodes(dir, inode);
0485 err = ubifs_jnl_update(c, dir, &nm, inode, 1, 0);
0486 if (err)
0487 goto out_cancel;
0488 unlock_2_inodes(dir, inode);
0489
0490 ubifs_release_budget(c, &req);
0491
0492 return 0;
0493
0494 out_cancel:
0495 unlock_2_inodes(dir, inode);
0496 out_inode:
0497 make_bad_inode(inode);
0498 if (!instantiated)
0499 iput(inode);
0500 out_budg:
0501 ubifs_release_budget(c, &req);
0502 if (!instantiated)
0503 ubifs_release_budget(c, &ino_req);
0504 fscrypt_free_filename(&nm);
0505 ubifs_err(c, "cannot create temporary file, error %d", err);
0506 return err;
0507 }
0508
0509
0510
0511
0512
0513
0514
0515
0516 static unsigned int vfs_dent_type(uint8_t type)
0517 {
0518 switch (type) {
0519 case UBIFS_ITYPE_REG:
0520 return DT_REG;
0521 case UBIFS_ITYPE_DIR:
0522 return DT_DIR;
0523 case UBIFS_ITYPE_LNK:
0524 return DT_LNK;
0525 case UBIFS_ITYPE_BLK:
0526 return DT_BLK;
0527 case UBIFS_ITYPE_CHR:
0528 return DT_CHR;
0529 case UBIFS_ITYPE_FIFO:
0530 return DT_FIFO;
0531 case UBIFS_ITYPE_SOCK:
0532 return DT_SOCK;
0533 default:
0534 BUG();
0535 }
0536 return 0;
0537 }
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556 static int ubifs_readdir(struct file *file, struct dir_context *ctx)
0557 {
0558 int fstr_real_len = 0, err = 0;
0559 struct fscrypt_name nm;
0560 struct fscrypt_str fstr = {0};
0561 union ubifs_key key;
0562 struct ubifs_dent_node *dent;
0563 struct inode *dir = file_inode(file);
0564 struct ubifs_info *c = dir->i_sb->s_fs_info;
0565 bool encrypted = IS_ENCRYPTED(dir);
0566
0567 dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, ctx->pos);
0568
0569 if (ctx->pos > UBIFS_S_KEY_HASH_MASK || ctx->pos == 2)
0570
0571
0572
0573
0574 return 0;
0575
0576 if (encrypted) {
0577 err = fscrypt_prepare_readdir(dir);
0578 if (err)
0579 return err;
0580
0581 err = fscrypt_fname_alloc_buffer(UBIFS_MAX_NLEN, &fstr);
0582 if (err)
0583 return err;
0584
0585 fstr_real_len = fstr.len;
0586 }
0587
0588 if (file->f_version == 0) {
0589
0590
0591
0592
0593
0594
0595
0596 kfree(file->private_data);
0597 file->private_data = NULL;
0598 }
0599
0600
0601
0602
0603
0604 file->f_version = 1;
0605
0606
0607 if (ctx->pos < 2) {
0608 ubifs_assert(c, !file->private_data);
0609 if (!dir_emit_dots(file, ctx)) {
0610 if (encrypted)
0611 fscrypt_fname_free_buffer(&fstr);
0612 return 0;
0613 }
0614
0615
0616 lowest_dent_key(c, &key, dir->i_ino);
0617 fname_len(&nm) = 0;
0618 dent = ubifs_tnc_next_ent(c, &key, &nm);
0619 if (IS_ERR(dent)) {
0620 err = PTR_ERR(dent);
0621 goto out;
0622 }
0623
0624 ctx->pos = key_hash_flash(c, &dent->key);
0625 file->private_data = dent;
0626 }
0627
0628 dent = file->private_data;
0629 if (!dent) {
0630
0631
0632
0633
0634 dent_key_init_hash(c, &key, dir->i_ino, ctx->pos);
0635 fname_len(&nm) = 0;
0636 dent = ubifs_tnc_next_ent(c, &key, &nm);
0637 if (IS_ERR(dent)) {
0638 err = PTR_ERR(dent);
0639 goto out;
0640 }
0641 ctx->pos = key_hash_flash(c, &dent->key);
0642 file->private_data = dent;
0643 }
0644
0645 while (1) {
0646 dbg_gen("ino %llu, new f_pos %#x",
0647 (unsigned long long)le64_to_cpu(dent->inum),
0648 key_hash_flash(c, &dent->key));
0649 ubifs_assert(c, le64_to_cpu(dent->ch.sqnum) >
0650 ubifs_inode(dir)->creat_sqnum);
0651
0652 fname_len(&nm) = le16_to_cpu(dent->nlen);
0653 fname_name(&nm) = dent->name;
0654
0655 if (encrypted) {
0656 fstr.len = fstr_real_len;
0657
0658 err = fscrypt_fname_disk_to_usr(dir, key_hash_flash(c,
0659 &dent->key),
0660 le32_to_cpu(dent->cookie),
0661 &nm.disk_name, &fstr);
0662 if (err)
0663 goto out;
0664 } else {
0665 fstr.len = fname_len(&nm);
0666 fstr.name = fname_name(&nm);
0667 }
0668
0669 if (!dir_emit(ctx, fstr.name, fstr.len,
0670 le64_to_cpu(dent->inum),
0671 vfs_dent_type(dent->type))) {
0672 if (encrypted)
0673 fscrypt_fname_free_buffer(&fstr);
0674 return 0;
0675 }
0676
0677
0678 key_read(c, &dent->key, &key);
0679 dent = ubifs_tnc_next_ent(c, &key, &nm);
0680 if (IS_ERR(dent)) {
0681 err = PTR_ERR(dent);
0682 goto out;
0683 }
0684
0685 kfree(file->private_data);
0686 ctx->pos = key_hash_flash(c, &dent->key);
0687 file->private_data = dent;
0688 cond_resched();
0689 }
0690
0691 out:
0692 kfree(file->private_data);
0693 file->private_data = NULL;
0694
0695 if (encrypted)
0696 fscrypt_fname_free_buffer(&fstr);
0697
0698 if (err != -ENOENT)
0699 ubifs_err(c, "cannot find next direntry, error %d", err);
0700 else
0701
0702
0703
0704
0705
0706 err = 0;
0707
0708
0709
0710 ctx->pos = 2;
0711 return err;
0712 }
0713
0714
0715 static int ubifs_dir_release(struct inode *dir, struct file *file)
0716 {
0717 kfree(file->private_data);
0718 file->private_data = NULL;
0719 return 0;
0720 }
0721
0722 static int ubifs_link(struct dentry *old_dentry, struct inode *dir,
0723 struct dentry *dentry)
0724 {
0725 struct ubifs_info *c = dir->i_sb->s_fs_info;
0726 struct inode *inode = d_inode(old_dentry);
0727 struct ubifs_inode *ui = ubifs_inode(inode);
0728 struct ubifs_inode *dir_ui = ubifs_inode(dir);
0729 int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len);
0730 struct ubifs_budget_req req = { .new_dent = 1, .dirtied_ino = 2,
0731 .dirtied_ino_d = ALIGN(ui->data_len, 8) };
0732 struct fscrypt_name nm;
0733
0734
0735
0736
0737
0738
0739 dbg_gen("dent '%pd' to ino %lu (nlink %d) in dir ino %lu",
0740 dentry, inode->i_ino,
0741 inode->i_nlink, dir->i_ino);
0742 ubifs_assert(c, inode_is_locked(dir));
0743 ubifs_assert(c, inode_is_locked(inode));
0744
0745 err = fscrypt_prepare_link(old_dentry, dir, dentry);
0746 if (err)
0747 return err;
0748
0749 err = fscrypt_setup_filename(dir, &dentry->d_name, 0, &nm);
0750 if (err)
0751 return err;
0752
0753 err = dbg_check_synced_i_size(c, inode);
0754 if (err)
0755 goto out_fname;
0756
0757 err = ubifs_budget_space(c, &req);
0758 if (err)
0759 goto out_fname;
0760
0761 lock_2_inodes(dir, inode);
0762
0763
0764 if (inode->i_nlink == 0)
0765 ubifs_delete_orphan(c, inode->i_ino);
0766
0767 inc_nlink(inode);
0768 ihold(inode);
0769 inode->i_ctime = current_time(inode);
0770 dir->i_size += sz_change;
0771 dir_ui->ui_size = dir->i_size;
0772 dir->i_mtime = dir->i_ctime = inode->i_ctime;
0773 err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
0774 if (err)
0775 goto out_cancel;
0776 unlock_2_inodes(dir, inode);
0777
0778 ubifs_release_budget(c, &req);
0779 d_instantiate(dentry, inode);
0780 fscrypt_free_filename(&nm);
0781 return 0;
0782
0783 out_cancel:
0784 dir->i_size -= sz_change;
0785 dir_ui->ui_size = dir->i_size;
0786 drop_nlink(inode);
0787 if (inode->i_nlink == 0)
0788 ubifs_add_orphan(c, inode->i_ino);
0789 unlock_2_inodes(dir, inode);
0790 ubifs_release_budget(c, &req);
0791 iput(inode);
0792 out_fname:
0793 fscrypt_free_filename(&nm);
0794 return err;
0795 }
0796
0797 static int ubifs_unlink(struct inode *dir, struct dentry *dentry)
0798 {
0799 struct ubifs_info *c = dir->i_sb->s_fs_info;
0800 struct inode *inode = d_inode(dentry);
0801 struct ubifs_inode *dir_ui = ubifs_inode(dir);
0802 int err, sz_change, budgeted = 1;
0803 struct ubifs_budget_req req = { .mod_dent = 1, .dirtied_ino = 2 };
0804 unsigned int saved_nlink = inode->i_nlink;
0805 struct fscrypt_name nm;
0806
0807
0808
0809
0810
0811
0812
0813
0814 dbg_gen("dent '%pd' from ino %lu (nlink %d) in dir ino %lu",
0815 dentry, inode->i_ino,
0816 inode->i_nlink, dir->i_ino);
0817
0818 err = fscrypt_setup_filename(dir, &dentry->d_name, 1, &nm);
0819 if (err)
0820 return err;
0821
0822 err = ubifs_purge_xattrs(inode);
0823 if (err)
0824 return err;
0825
0826 sz_change = CALC_DENT_SIZE(fname_len(&nm));
0827
0828 ubifs_assert(c, inode_is_locked(dir));
0829 ubifs_assert(c, inode_is_locked(inode));
0830 err = dbg_check_synced_i_size(c, inode);
0831 if (err)
0832 goto out_fname;
0833
0834 err = ubifs_budget_space(c, &req);
0835 if (err) {
0836 if (err != -ENOSPC)
0837 goto out_fname;
0838 budgeted = 0;
0839 }
0840
0841 lock_2_inodes(dir, inode);
0842 inode->i_ctime = current_time(dir);
0843 drop_nlink(inode);
0844 dir->i_size -= sz_change;
0845 dir_ui->ui_size = dir->i_size;
0846 dir->i_mtime = dir->i_ctime = inode->i_ctime;
0847 err = ubifs_jnl_update(c, dir, &nm, inode, 1, 0);
0848 if (err)
0849 goto out_cancel;
0850 unlock_2_inodes(dir, inode);
0851
0852 if (budgeted)
0853 ubifs_release_budget(c, &req);
0854 else {
0855
0856 c->bi.nospace = c->bi.nospace_rp = 0;
0857 smp_wmb();
0858 }
0859 fscrypt_free_filename(&nm);
0860 return 0;
0861
0862 out_cancel:
0863 dir->i_size += sz_change;
0864 dir_ui->ui_size = dir->i_size;
0865 set_nlink(inode, saved_nlink);
0866 unlock_2_inodes(dir, inode);
0867 if (budgeted)
0868 ubifs_release_budget(c, &req);
0869 out_fname:
0870 fscrypt_free_filename(&nm);
0871 return err;
0872 }
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882 int ubifs_check_dir_empty(struct inode *dir)
0883 {
0884 struct ubifs_info *c = dir->i_sb->s_fs_info;
0885 struct fscrypt_name nm = { 0 };
0886 struct ubifs_dent_node *dent;
0887 union ubifs_key key;
0888 int err;
0889
0890 lowest_dent_key(c, &key, dir->i_ino);
0891 dent = ubifs_tnc_next_ent(c, &key, &nm);
0892 if (IS_ERR(dent)) {
0893 err = PTR_ERR(dent);
0894 if (err == -ENOENT)
0895 err = 0;
0896 } else {
0897 kfree(dent);
0898 err = -ENOTEMPTY;
0899 }
0900 return err;
0901 }
0902
0903 static int ubifs_rmdir(struct inode *dir, struct dentry *dentry)
0904 {
0905 struct ubifs_info *c = dir->i_sb->s_fs_info;
0906 struct inode *inode = d_inode(dentry);
0907 int err, sz_change, budgeted = 1;
0908 struct ubifs_inode *dir_ui = ubifs_inode(dir);
0909 struct ubifs_budget_req req = { .mod_dent = 1, .dirtied_ino = 2 };
0910 struct fscrypt_name nm;
0911
0912
0913
0914
0915
0916
0917
0918 dbg_gen("directory '%pd', ino %lu in dir ino %lu", dentry,
0919 inode->i_ino, dir->i_ino);
0920 ubifs_assert(c, inode_is_locked(dir));
0921 ubifs_assert(c, inode_is_locked(inode));
0922 err = ubifs_check_dir_empty(d_inode(dentry));
0923 if (err)
0924 return err;
0925
0926 err = fscrypt_setup_filename(dir, &dentry->d_name, 1, &nm);
0927 if (err)
0928 return err;
0929
0930 err = ubifs_purge_xattrs(inode);
0931 if (err)
0932 return err;
0933
0934 sz_change = CALC_DENT_SIZE(fname_len(&nm));
0935
0936 err = ubifs_budget_space(c, &req);
0937 if (err) {
0938 if (err != -ENOSPC)
0939 goto out_fname;
0940 budgeted = 0;
0941 }
0942
0943 lock_2_inodes(dir, inode);
0944 inode->i_ctime = current_time(dir);
0945 clear_nlink(inode);
0946 drop_nlink(dir);
0947 dir->i_size -= sz_change;
0948 dir_ui->ui_size = dir->i_size;
0949 dir->i_mtime = dir->i_ctime = inode->i_ctime;
0950 err = ubifs_jnl_update(c, dir, &nm, inode, 1, 0);
0951 if (err)
0952 goto out_cancel;
0953 unlock_2_inodes(dir, inode);
0954
0955 if (budgeted)
0956 ubifs_release_budget(c, &req);
0957 else {
0958
0959 c->bi.nospace = c->bi.nospace_rp = 0;
0960 smp_wmb();
0961 }
0962 fscrypt_free_filename(&nm);
0963 return 0;
0964
0965 out_cancel:
0966 dir->i_size += sz_change;
0967 dir_ui->ui_size = dir->i_size;
0968 inc_nlink(dir);
0969 set_nlink(inode, 2);
0970 unlock_2_inodes(dir, inode);
0971 if (budgeted)
0972 ubifs_release_budget(c, &req);
0973 out_fname:
0974 fscrypt_free_filename(&nm);
0975 return err;
0976 }
0977
0978 static int ubifs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
0979 struct dentry *dentry, umode_t mode)
0980 {
0981 struct inode *inode;
0982 struct ubifs_inode *dir_ui = ubifs_inode(dir);
0983 struct ubifs_info *c = dir->i_sb->s_fs_info;
0984 int err, sz_change;
0985 struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
0986 .dirtied_ino = 1};
0987 struct fscrypt_name nm;
0988
0989
0990
0991
0992
0993
0994 dbg_gen("dent '%pd', mode %#hx in dir ino %lu",
0995 dentry, mode, dir->i_ino);
0996
0997 err = ubifs_budget_space(c, &req);
0998 if (err)
0999 return err;
1000
1001 err = ubifs_prepare_create(dir, dentry, &nm);
1002 if (err)
1003 goto out_budg;
1004
1005 sz_change = CALC_DENT_SIZE(fname_len(&nm));
1006
1007 inode = ubifs_new_inode(c, dir, S_IFDIR | mode);
1008 if (IS_ERR(inode)) {
1009 err = PTR_ERR(inode);
1010 goto out_fname;
1011 }
1012
1013 err = ubifs_init_security(dir, inode, &dentry->d_name);
1014 if (err)
1015 goto out_inode;
1016
1017 mutex_lock(&dir_ui->ui_mutex);
1018 insert_inode_hash(inode);
1019 inc_nlink(inode);
1020 inc_nlink(dir);
1021 dir->i_size += sz_change;
1022 dir_ui->ui_size = dir->i_size;
1023 dir->i_mtime = dir->i_ctime = inode->i_ctime;
1024 err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
1025 if (err) {
1026 ubifs_err(c, "cannot create directory, error %d", err);
1027 goto out_cancel;
1028 }
1029 mutex_unlock(&dir_ui->ui_mutex);
1030
1031 ubifs_release_budget(c, &req);
1032 d_instantiate(dentry, inode);
1033 fscrypt_free_filename(&nm);
1034 return 0;
1035
1036 out_cancel:
1037 dir->i_size -= sz_change;
1038 dir_ui->ui_size = dir->i_size;
1039 drop_nlink(dir);
1040 mutex_unlock(&dir_ui->ui_mutex);
1041 out_inode:
1042 make_bad_inode(inode);
1043 iput(inode);
1044 out_fname:
1045 fscrypt_free_filename(&nm);
1046 out_budg:
1047 ubifs_release_budget(c, &req);
1048 return err;
1049 }
1050
1051 static int ubifs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
1052 struct dentry *dentry, umode_t mode, dev_t rdev)
1053 {
1054 struct inode *inode;
1055 struct ubifs_inode *ui;
1056 struct ubifs_inode *dir_ui = ubifs_inode(dir);
1057 struct ubifs_info *c = dir->i_sb->s_fs_info;
1058 union ubifs_dev_desc *dev = NULL;
1059 int sz_change;
1060 int err, devlen = 0;
1061 struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
1062 .dirtied_ino = 1 };
1063 struct fscrypt_name nm;
1064
1065
1066
1067
1068
1069
1070 dbg_gen("dent '%pd' in dir ino %lu", dentry, dir->i_ino);
1071
1072 if (S_ISBLK(mode) || S_ISCHR(mode)) {
1073 dev = kmalloc(sizeof(union ubifs_dev_desc), GFP_NOFS);
1074 if (!dev)
1075 return -ENOMEM;
1076 devlen = ubifs_encode_dev(dev, rdev);
1077 }
1078
1079 req.new_ino_d = ALIGN(devlen, 8);
1080 err = ubifs_budget_space(c, &req);
1081 if (err) {
1082 kfree(dev);
1083 return err;
1084 }
1085
1086 err = ubifs_prepare_create(dir, dentry, &nm);
1087 if (err) {
1088 kfree(dev);
1089 goto out_budg;
1090 }
1091
1092 sz_change = CALC_DENT_SIZE(fname_len(&nm));
1093
1094 inode = ubifs_new_inode(c, dir, mode);
1095 if (IS_ERR(inode)) {
1096 kfree(dev);
1097 err = PTR_ERR(inode);
1098 goto out_fname;
1099 }
1100
1101 init_special_inode(inode, inode->i_mode, rdev);
1102 inode->i_size = ubifs_inode(inode)->ui_size = devlen;
1103 ui = ubifs_inode(inode);
1104 ui->data = dev;
1105 ui->data_len = devlen;
1106
1107 err = ubifs_init_security(dir, inode, &dentry->d_name);
1108 if (err)
1109 goto out_inode;
1110
1111 mutex_lock(&dir_ui->ui_mutex);
1112 dir->i_size += sz_change;
1113 dir_ui->ui_size = dir->i_size;
1114 dir->i_mtime = dir->i_ctime = inode->i_ctime;
1115 err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
1116 if (err)
1117 goto out_cancel;
1118 mutex_unlock(&dir_ui->ui_mutex);
1119
1120 ubifs_release_budget(c, &req);
1121 insert_inode_hash(inode);
1122 d_instantiate(dentry, inode);
1123 fscrypt_free_filename(&nm);
1124 return 0;
1125
1126 out_cancel:
1127 dir->i_size -= sz_change;
1128 dir_ui->ui_size = dir->i_size;
1129 mutex_unlock(&dir_ui->ui_mutex);
1130 out_inode:
1131 make_bad_inode(inode);
1132 iput(inode);
1133 out_fname:
1134 fscrypt_free_filename(&nm);
1135 out_budg:
1136 ubifs_release_budget(c, &req);
1137 return err;
1138 }
1139
1140 static int ubifs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
1141 struct dentry *dentry, const char *symname)
1142 {
1143 struct inode *inode;
1144 struct ubifs_inode *ui;
1145 struct ubifs_inode *dir_ui = ubifs_inode(dir);
1146 struct ubifs_info *c = dir->i_sb->s_fs_info;
1147 int err, sz_change, len = strlen(symname);
1148 struct fscrypt_str disk_link;
1149 struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
1150 .new_ino_d = ALIGN(len, 8),
1151 .dirtied_ino = 1 };
1152 struct fscrypt_name nm;
1153
1154 dbg_gen("dent '%pd', target '%s' in dir ino %lu", dentry,
1155 symname, dir->i_ino);
1156
1157 err = fscrypt_prepare_symlink(dir, symname, len, UBIFS_MAX_INO_DATA,
1158 &disk_link);
1159 if (err)
1160 return err;
1161
1162
1163
1164
1165
1166 err = ubifs_budget_space(c, &req);
1167 if (err)
1168 return err;
1169
1170 err = ubifs_prepare_create(dir, dentry, &nm);
1171 if (err)
1172 goto out_budg;
1173
1174 sz_change = CALC_DENT_SIZE(fname_len(&nm));
1175
1176 inode = ubifs_new_inode(c, dir, S_IFLNK | S_IRWXUGO);
1177 if (IS_ERR(inode)) {
1178 err = PTR_ERR(inode);
1179 goto out_fname;
1180 }
1181
1182 ui = ubifs_inode(inode);
1183 ui->data = kmalloc(disk_link.len, GFP_NOFS);
1184 if (!ui->data) {
1185 err = -ENOMEM;
1186 goto out_inode;
1187 }
1188
1189 if (IS_ENCRYPTED(inode)) {
1190 disk_link.name = ui->data;
1191 err = fscrypt_encrypt_symlink(inode, symname, len, &disk_link);
1192 if (err)
1193 goto out_inode;
1194 } else {
1195 memcpy(ui->data, disk_link.name, disk_link.len);
1196 inode->i_link = ui->data;
1197 }
1198
1199
1200
1201
1202
1203
1204 ui->data_len = disk_link.len - 1;
1205 inode->i_size = ubifs_inode(inode)->ui_size = disk_link.len - 1;
1206
1207 err = ubifs_init_security(dir, inode, &dentry->d_name);
1208 if (err)
1209 goto out_inode;
1210
1211 mutex_lock(&dir_ui->ui_mutex);
1212 dir->i_size += sz_change;
1213 dir_ui->ui_size = dir->i_size;
1214 dir->i_mtime = dir->i_ctime = inode->i_ctime;
1215 err = ubifs_jnl_update(c, dir, &nm, inode, 0, 0);
1216 if (err)
1217 goto out_cancel;
1218 mutex_unlock(&dir_ui->ui_mutex);
1219
1220 insert_inode_hash(inode);
1221 d_instantiate(dentry, inode);
1222 err = 0;
1223 goto out_fname;
1224
1225 out_cancel:
1226 dir->i_size -= sz_change;
1227 dir_ui->ui_size = dir->i_size;
1228 mutex_unlock(&dir_ui->ui_mutex);
1229 out_inode:
1230 make_bad_inode(inode);
1231 iput(inode);
1232 out_fname:
1233 fscrypt_free_filename(&nm);
1234 out_budg:
1235 ubifs_release_budget(c, &req);
1236 return err;
1237 }
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253 static void lock_4_inodes(struct inode *inode1, struct inode *inode2,
1254 struct inode *inode3, struct inode *inode4)
1255 {
1256 mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
1257 if (inode2 != inode1)
1258 mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
1259 if (inode3)
1260 mutex_lock_nested(&ubifs_inode(inode3)->ui_mutex, WB_MUTEX_3);
1261 if (inode4)
1262 mutex_lock_nested(&ubifs_inode(inode4)->ui_mutex, WB_MUTEX_4);
1263 }
1264
1265
1266
1267
1268
1269
1270
1271
1272 static void unlock_4_inodes(struct inode *inode1, struct inode *inode2,
1273 struct inode *inode3, struct inode *inode4)
1274 {
1275 if (inode4)
1276 mutex_unlock(&ubifs_inode(inode4)->ui_mutex);
1277 if (inode3)
1278 mutex_unlock(&ubifs_inode(inode3)->ui_mutex);
1279 if (inode1 != inode2)
1280 mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
1281 mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
1282 }
1283
1284 static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
1285 struct inode *new_dir, struct dentry *new_dentry,
1286 unsigned int flags)
1287 {
1288 struct ubifs_info *c = old_dir->i_sb->s_fs_info;
1289 struct inode *old_inode = d_inode(old_dentry);
1290 struct inode *new_inode = d_inode(new_dentry);
1291 struct inode *whiteout = NULL;
1292 struct ubifs_inode *old_inode_ui = ubifs_inode(old_inode);
1293 struct ubifs_inode *whiteout_ui = NULL;
1294 int err, release, sync = 0, move = (new_dir != old_dir);
1295 int is_dir = S_ISDIR(old_inode->i_mode);
1296 int unlink = !!new_inode, new_sz, old_sz;
1297 struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1,
1298 .dirtied_ino = 3 };
1299 struct ubifs_budget_req ino_req = { .dirtied_ino = 1,
1300 .dirtied_ino_d = ALIGN(old_inode_ui->data_len, 8) };
1301 struct ubifs_budget_req wht_req;
1302 struct timespec64 time;
1303 unsigned int saved_nlink;
1304 struct fscrypt_name old_nm, new_nm;
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316 dbg_gen("dent '%pd' ino %lu in dir ino %lu to dent '%pd' in dir ino %lu flags 0x%x",
1317 old_dentry, old_inode->i_ino, old_dir->i_ino,
1318 new_dentry, new_dir->i_ino, flags);
1319
1320 if (unlink) {
1321 ubifs_assert(c, inode_is_locked(new_inode));
1322
1323 err = ubifs_purge_xattrs(new_inode);
1324 if (err)
1325 return err;
1326 }
1327
1328 if (unlink && is_dir) {
1329 err = ubifs_check_dir_empty(new_inode);
1330 if (err)
1331 return err;
1332 }
1333
1334 err = fscrypt_setup_filename(old_dir, &old_dentry->d_name, 0, &old_nm);
1335 if (err)
1336 return err;
1337
1338 err = fscrypt_setup_filename(new_dir, &new_dentry->d_name, 0, &new_nm);
1339 if (err) {
1340 fscrypt_free_filename(&old_nm);
1341 return err;
1342 }
1343
1344 new_sz = CALC_DENT_SIZE(fname_len(&new_nm));
1345 old_sz = CALC_DENT_SIZE(fname_len(&old_nm));
1346
1347 err = ubifs_budget_space(c, &req);
1348 if (err) {
1349 fscrypt_free_filename(&old_nm);
1350 fscrypt_free_filename(&new_nm);
1351 return err;
1352 }
1353 err = ubifs_budget_space(c, &ino_req);
1354 if (err) {
1355 fscrypt_free_filename(&old_nm);
1356 fscrypt_free_filename(&new_nm);
1357 ubifs_release_budget(c, &req);
1358 return err;
1359 }
1360
1361 if (flags & RENAME_WHITEOUT) {
1362 union ubifs_dev_desc *dev = NULL;
1363
1364 dev = kmalloc(sizeof(union ubifs_dev_desc), GFP_NOFS);
1365 if (!dev) {
1366 err = -ENOMEM;
1367 goto out_release;
1368 }
1369
1370
1371
1372
1373
1374
1375 whiteout = create_whiteout(old_dir, old_dentry);
1376 if (IS_ERR(whiteout)) {
1377 err = PTR_ERR(whiteout);
1378 kfree(dev);
1379 goto out_release;
1380 }
1381
1382 whiteout_ui = ubifs_inode(whiteout);
1383 whiteout_ui->data = dev;
1384 whiteout_ui->data_len = ubifs_encode_dev(dev, MKDEV(0, 0));
1385 ubifs_assert(c, !whiteout_ui->dirty);
1386
1387 memset(&wht_req, 0, sizeof(struct ubifs_budget_req));
1388 wht_req.new_ino = 1;
1389 wht_req.new_ino_d = ALIGN(whiteout_ui->data_len, 8);
1390
1391
1392
1393
1394
1395 err = ubifs_budget_space(c, &wht_req);
1396 if (err) {
1397
1398
1399
1400
1401
1402 iput(whiteout);
1403 goto out_release;
1404 }
1405
1406
1407 old_sz -= CALC_DENT_SIZE(fname_len(&old_nm));
1408 }
1409
1410 lock_4_inodes(old_dir, new_dir, new_inode, whiteout);
1411
1412
1413
1414
1415
1416 time = current_time(old_dir);
1417 old_inode->i_ctime = time;
1418
1419
1420 if (is_dir) {
1421 if (move) {
1422
1423
1424
1425
1426 drop_nlink(old_dir);
1427
1428
1429
1430
1431 if (!unlink)
1432 inc_nlink(new_dir);
1433 } else {
1434
1435
1436
1437
1438
1439 if (unlink)
1440 drop_nlink(old_dir);
1441 }
1442 }
1443
1444 old_dir->i_size -= old_sz;
1445 ubifs_inode(old_dir)->ui_size = old_dir->i_size;
1446 old_dir->i_mtime = old_dir->i_ctime = time;
1447 new_dir->i_mtime = new_dir->i_ctime = time;
1448
1449
1450
1451
1452
1453
1454 if (unlink) {
1455
1456
1457
1458
1459 saved_nlink = new_inode->i_nlink;
1460 if (is_dir)
1461 clear_nlink(new_inode);
1462 else
1463 drop_nlink(new_inode);
1464 new_inode->i_ctime = time;
1465 } else {
1466 new_dir->i_size += new_sz;
1467 ubifs_inode(new_dir)->ui_size = new_dir->i_size;
1468 }
1469
1470
1471
1472
1473
1474
1475 if (IS_SYNC(old_inode)) {
1476 sync = IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir);
1477 if (unlink && IS_SYNC(new_inode))
1478 sync = 1;
1479
1480
1481
1482
1483
1484 }
1485
1486 err = ubifs_jnl_rename(c, old_dir, old_inode, &old_nm, new_dir,
1487 new_inode, &new_nm, whiteout, sync);
1488 if (err)
1489 goto out_cancel;
1490
1491 unlock_4_inodes(old_dir, new_dir, new_inode, whiteout);
1492 ubifs_release_budget(c, &req);
1493
1494 if (whiteout) {
1495 ubifs_release_budget(c, &wht_req);
1496 iput(whiteout);
1497 }
1498
1499 mutex_lock(&old_inode_ui->ui_mutex);
1500 release = old_inode_ui->dirty;
1501 mark_inode_dirty_sync(old_inode);
1502 mutex_unlock(&old_inode_ui->ui_mutex);
1503
1504 if (release)
1505 ubifs_release_budget(c, &ino_req);
1506 if (IS_SYNC(old_inode))
1507
1508
1509
1510
1511
1512 old_inode->i_sb->s_op->write_inode(old_inode, NULL);
1513
1514 fscrypt_free_filename(&old_nm);
1515 fscrypt_free_filename(&new_nm);
1516 return 0;
1517
1518 out_cancel:
1519 if (unlink) {
1520 set_nlink(new_inode, saved_nlink);
1521 } else {
1522 new_dir->i_size -= new_sz;
1523 ubifs_inode(new_dir)->ui_size = new_dir->i_size;
1524 }
1525 old_dir->i_size += old_sz;
1526 ubifs_inode(old_dir)->ui_size = old_dir->i_size;
1527 if (is_dir) {
1528 if (move) {
1529 inc_nlink(old_dir);
1530 if (!unlink)
1531 drop_nlink(new_dir);
1532 } else {
1533 if (unlink)
1534 inc_nlink(old_dir);
1535 }
1536 }
1537 unlock_4_inodes(old_dir, new_dir, new_inode, whiteout);
1538 if (whiteout) {
1539 ubifs_release_budget(c, &wht_req);
1540 iput(whiteout);
1541 }
1542 out_release:
1543 ubifs_release_budget(c, &ino_req);
1544 ubifs_release_budget(c, &req);
1545 fscrypt_free_filename(&old_nm);
1546 fscrypt_free_filename(&new_nm);
1547 return err;
1548 }
1549
1550 static int ubifs_xrename(struct inode *old_dir, struct dentry *old_dentry,
1551 struct inode *new_dir, struct dentry *new_dentry)
1552 {
1553 struct ubifs_info *c = old_dir->i_sb->s_fs_info;
1554 struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1,
1555 .dirtied_ino = 2 };
1556 int sync = IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir);
1557 struct inode *fst_inode = d_inode(old_dentry);
1558 struct inode *snd_inode = d_inode(new_dentry);
1559 struct timespec64 time;
1560 int err;
1561 struct fscrypt_name fst_nm, snd_nm;
1562
1563 ubifs_assert(c, fst_inode && snd_inode);
1564
1565 err = fscrypt_setup_filename(old_dir, &old_dentry->d_name, 0, &fst_nm);
1566 if (err)
1567 return err;
1568
1569 err = fscrypt_setup_filename(new_dir, &new_dentry->d_name, 0, &snd_nm);
1570 if (err) {
1571 fscrypt_free_filename(&fst_nm);
1572 return err;
1573 }
1574
1575 lock_4_inodes(old_dir, new_dir, NULL, NULL);
1576
1577 time = current_time(old_dir);
1578 fst_inode->i_ctime = time;
1579 snd_inode->i_ctime = time;
1580 old_dir->i_mtime = old_dir->i_ctime = time;
1581 new_dir->i_mtime = new_dir->i_ctime = time;
1582
1583 if (old_dir != new_dir) {
1584 if (S_ISDIR(fst_inode->i_mode) && !S_ISDIR(snd_inode->i_mode)) {
1585 inc_nlink(new_dir);
1586 drop_nlink(old_dir);
1587 }
1588 else if (!S_ISDIR(fst_inode->i_mode) && S_ISDIR(snd_inode->i_mode)) {
1589 drop_nlink(new_dir);
1590 inc_nlink(old_dir);
1591 }
1592 }
1593
1594 err = ubifs_jnl_xrename(c, old_dir, fst_inode, &fst_nm, new_dir,
1595 snd_inode, &snd_nm, sync);
1596
1597 unlock_4_inodes(old_dir, new_dir, NULL, NULL);
1598 ubifs_release_budget(c, &req);
1599
1600 fscrypt_free_filename(&fst_nm);
1601 fscrypt_free_filename(&snd_nm);
1602 return err;
1603 }
1604
1605 static int ubifs_rename(struct user_namespace *mnt_userns,
1606 struct inode *old_dir, struct dentry *old_dentry,
1607 struct inode *new_dir, struct dentry *new_dentry,
1608 unsigned int flags)
1609 {
1610 int err;
1611 struct ubifs_info *c = old_dir->i_sb->s_fs_info;
1612
1613 if (flags & ~(RENAME_NOREPLACE | RENAME_WHITEOUT | RENAME_EXCHANGE))
1614 return -EINVAL;
1615
1616 ubifs_assert(c, inode_is_locked(old_dir));
1617 ubifs_assert(c, inode_is_locked(new_dir));
1618
1619 err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,
1620 flags);
1621 if (err)
1622 return err;
1623
1624 if (flags & RENAME_EXCHANGE)
1625 return ubifs_xrename(old_dir, old_dentry, new_dir, new_dentry);
1626
1627 return do_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
1628 }
1629
1630 int ubifs_getattr(struct user_namespace *mnt_userns, const struct path *path,
1631 struct kstat *stat, u32 request_mask, unsigned int flags)
1632 {
1633 loff_t size;
1634 struct inode *inode = d_inode(path->dentry);
1635 struct ubifs_inode *ui = ubifs_inode(inode);
1636
1637 mutex_lock(&ui->ui_mutex);
1638
1639 if (ui->flags & UBIFS_APPEND_FL)
1640 stat->attributes |= STATX_ATTR_APPEND;
1641 if (ui->flags & UBIFS_COMPR_FL)
1642 stat->attributes |= STATX_ATTR_COMPRESSED;
1643 if (ui->flags & UBIFS_CRYPT_FL)
1644 stat->attributes |= STATX_ATTR_ENCRYPTED;
1645 if (ui->flags & UBIFS_IMMUTABLE_FL)
1646 stat->attributes |= STATX_ATTR_IMMUTABLE;
1647
1648 stat->attributes_mask |= (STATX_ATTR_APPEND |
1649 STATX_ATTR_COMPRESSED |
1650 STATX_ATTR_ENCRYPTED |
1651 STATX_ATTR_IMMUTABLE);
1652
1653 generic_fillattr(&init_user_ns, inode, stat);
1654 stat->blksize = UBIFS_BLOCK_SIZE;
1655 stat->size = ui->ui_size;
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669 if (S_ISREG(inode->i_mode)) {
1670 size = ui->xattr_size;
1671 size += stat->size;
1672 size = ALIGN(size, UBIFS_BLOCK_SIZE);
1673
1674
1675
1676
1677 stat->blocks = size >> 9;
1678 } else
1679 stat->blocks = 0;
1680 mutex_unlock(&ui->ui_mutex);
1681 return 0;
1682 }
1683
1684 const struct inode_operations ubifs_dir_inode_operations = {
1685 .lookup = ubifs_lookup,
1686 .create = ubifs_create,
1687 .link = ubifs_link,
1688 .symlink = ubifs_symlink,
1689 .unlink = ubifs_unlink,
1690 .mkdir = ubifs_mkdir,
1691 .rmdir = ubifs_rmdir,
1692 .mknod = ubifs_mknod,
1693 .rename = ubifs_rename,
1694 .setattr = ubifs_setattr,
1695 .getattr = ubifs_getattr,
1696 .listxattr = ubifs_listxattr,
1697 .update_time = ubifs_update_time,
1698 .tmpfile = ubifs_tmpfile,
1699 .fileattr_get = ubifs_fileattr_get,
1700 .fileattr_set = ubifs_fileattr_set,
1701 };
1702
1703 const struct file_operations ubifs_dir_operations = {
1704 .llseek = generic_file_llseek,
1705 .release = ubifs_dir_release,
1706 .read = generic_read_dir,
1707 .iterate_shared = ubifs_readdir,
1708 .fsync = ubifs_fsync,
1709 .unlocked_ioctl = ubifs_ioctl,
1710 #ifdef CONFIG_COMPAT
1711 .compat_ioctl = ubifs_compat_ioctl,
1712 #endif
1713 };