1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/hmdfs/hmdfs_dentryfile.c 4 * 5 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 6 */ 7 8#include "hmdfs_dentryfile.h" 9 10#include <linux/ctype.h> 11#include <linux/file.h> 12#include <linux/mount.h> 13#include <linux/pagemap.h> 14#include <linux/slab.h> 15#include <linux/xattr.h> 16#include <linux/err.h> 17#include <linux/filelock.h> 18 19#include "authority/authentication.h" 20#include "comm/transport.h" 21#include "hmdfs_client.h" 22#include "hmdfs_device_view.h" 23#include "hmdfs_merge_view.h" 24 25/* Hashing code copied from f2fs */ 26#define HMDFS_HASH_COL_BIT ((0x1ULL) << 63) 27#define DELTA 0x9E3779B9 28 29static bool is_dot_dotdot(const unsigned char *name, __u32 len) 30{ 31 if (len == 1 && name[0] == '.') 32 return true; 33 34 if (len == 2 && name[0] == '.' && name[1] == '.') 35 return true; 36 37 return false; 38} 39 40static void str2hashbuf(const unsigned char *msg, size_t len, unsigned int *buf, 41 int num, bool case_sense) 42{ 43 unsigned int pad, val; 44 int i; 45 unsigned char c; 46 47 pad = (__u32)len | ((__u32)len << 8); 48 pad |= pad << 16; 49 50 val = pad; 51 if (len > (size_t)num * 4) 52 len = (size_t)num * 4; 53 for (i = 0; i < len; i++) { 54 if ((i % 4) == 0) 55 val = pad; 56 c = msg[i]; 57 if (!case_sense) 58 c = tolower(c); 59 val = c + (val << 8); 60 if ((i % 4) == 3) { 61 *buf++ = val; 62 val = pad; 63 num--; 64 } 65 } 66 if (--num >= 0) 67 *buf++ = val; 68 while (--num >= 0) 69 *buf++ = pad; 70} 71 72static void tea_transform(unsigned int buf[4], unsigned int const in[]) 73{ 74 __u32 sum = 0; 75 __u32 b0 = buf[0], b1 = buf[1]; 76 __u32 a = in[0], b = in[1], c = in[2], d = in[3]; 77 int n = 16; 78 79 do { 80 sum += DELTA; 81 b0 += ((b1 << 4) + a) ^ (b1 + sum) ^ ((b1 >> 5) + b); 82 b1 += ((b0 << 4) + c) ^ (b0 + sum) ^ ((b0 >> 5) + d); 83 } while (--n); 84 85 buf[0] += b0; 86 buf[1] += b1; 87} 88 89__u32 hmdfs_dentry_hash(const struct qstr *qstr, bool case_sense) 90{ 91 __u32 hash; 92 __u32 hmdfs_hash; 93 const unsigned char *p = qstr->name; 94 __u32 len = qstr->len; 95 __u32 in[8], buf[4]; 96 97 if (is_dot_dotdot(p, len)) 98 return 0; 99 100 /* Initialize the default seed for the hash checksum functions */ 101 buf[0] = 0x67452301; 102 buf[1] = 0xefcdab89; 103 buf[2] = 0x98badcfe; 104 buf[3] = 0x10325476; 105 106 while (1) { 107 str2hashbuf(p, len, in, 4, case_sense); 108 tea_transform(buf, in); 109 p += 16; 110 if (len <= 16) 111 break; 112 len -= 16; 113 } 114 hash = buf[0]; 115 hmdfs_hash = hash & ~HMDFS_HASH_COL_BIT; 116 return hmdfs_hash; 117} 118 119static atomic_t curr_ino = ATOMIC_INIT(INUNUMBER_START); 120int get_inonumber(void) 121{ 122 return atomic_inc_return(&curr_ino); 123} 124 125static int hmdfs_get_root_dentry_type(struct dentry *dentry, int *is_root) 126{ 127 struct hmdfs_dentry_info *d_info = hmdfs_d(dentry); 128 129 *is_root = 1; 130 switch (d_info->dentry_type) { 131 case HMDFS_LAYER_OTHER_LOCAL: 132 *is_root = 0; 133 fallthrough; 134 case HMDFS_LAYER_SECOND_LOCAL: 135 return HMDFS_LAYER_SECOND_LOCAL; 136 case HMDFS_LAYER_OTHER_CLOUD: 137 *is_root = 0; 138 fallthrough; 139 case HMDFS_LAYER_SECOND_CLOUD: 140 return HMDFS_LAYER_SECOND_CLOUD; 141 case HMDFS_LAYER_OTHER_REMOTE: 142 *is_root = 0; 143 fallthrough; 144 case HMDFS_LAYER_SECOND_REMOTE: 145 return HMDFS_LAYER_SECOND_REMOTE; 146 default: 147 hmdfs_info("Unexpected dentry type %d", d_info->dentry_type); 148 return -EINVAL; 149 } 150} 151 152static int prepend(char **buffer, int *buflen, const char *str, int namelen) 153{ 154 *buflen -= namelen; 155 if (*buflen < 0) 156 return -ENAMETOOLONG; 157 *buffer -= namelen; 158 memcpy(*buffer, str, namelen); 159 return 0; 160} 161 162static int prepend_name(char **buffer, int *buflen, const struct qstr *name) 163{ 164 const char *dname = name->name; 165 u32 dlen = name->len; 166 char *p = NULL; 167 168 *buflen -= dlen + 1; 169 if (*buflen < 0) 170 return -ENAMETOOLONG; 171 p = *buffer -= dlen + 1; 172 *p++ = '/'; 173 while (dlen--) { 174 char c = *dname++; 175 176 if (!c) 177 break; 178 *p++ = c; 179 } 180 return 0; 181} 182 183static char *hmdfs_dentry_path_raw(struct dentry *d, char *buf, int buflen) 184{ 185 struct dentry *dentry = NULL; 186 char *end = NULL; 187 char *retval = NULL; 188 unsigned int len; 189 unsigned int seq = 0; 190 int root_flag = 0; 191 int error = 0; 192 struct hmdfs_dentry_info *di = hmdfs_d(d); 193 int hmdfs_root_dentry_type = 0; 194 195 di->time = jiffies; 196 hmdfs_root_dentry_type = hmdfs_get_root_dentry_type(d, &root_flag); 197 if (hmdfs_root_dentry_type < 0) 198 return NULL; 199 if (root_flag) { 200 strcpy(buf, "/"); 201 return buf; 202 } 203 rcu_read_lock(); 204restart: 205 dentry = d; 206 di = hmdfs_d(dentry); 207 di->time = jiffies; 208 end = buf + buflen; 209 len = buflen; 210 prepend(&end, &len, "\0", 1); 211 retval = end - 1; 212 *retval = '/'; 213 read_seqbegin_or_lock(&rename_lock, &seq); 214 while (di->dentry_type != hmdfs_root_dentry_type) { 215 struct dentry *parent = dentry->d_parent; 216 217 prefetch(parent); 218 error = prepend_name(&end, &len, &dentry->d_name); 219 if (error) 220 break; 221 retval = end; 222 dentry = parent; 223 di = hmdfs_d(dentry); 224 di->time = jiffies; 225 } 226 if (!(seq & 1)) 227 rcu_read_unlock(); 228 if (need_seqretry(&rename_lock, seq)) { 229 seq = 1; 230 goto restart; 231 } 232 done_seqretry(&rename_lock, seq); 233 if (error) 234 goto Elong; 235 return retval; 236Elong: 237 return ERR_PTR(-ENAMETOOLONG); 238} 239 240char *hmdfs_get_dentry_relative_path(struct dentry *dentry) 241{ 242 char *final_buf = NULL; 243 char *buf = NULL; 244 char *p = NULL; 245 246 buf = kzalloc(PATH_MAX, GFP_KERNEL); 247 if (!buf) 248 return NULL; 249 250 final_buf = kzalloc(PATH_MAX, GFP_KERNEL); 251 if (!final_buf) { 252 kfree(buf); 253 return NULL; 254 } 255 256 /* NULL dentry return root dir */ 257 if (!dentry) { 258 strcpy(final_buf, "/"); 259 kfree(buf); 260 return final_buf; 261 } 262 p = hmdfs_dentry_path_raw(dentry, buf, PATH_MAX); 263 if (IS_ERR_OR_NULL(p)) { 264 kfree(buf); 265 kfree(final_buf); 266 return NULL; 267 } 268 269 if (strlen(p) >= PATH_MAX) { 270 kfree(buf); 271 kfree(final_buf); 272 return NULL; 273 } 274 strcpy(final_buf, p); 275 kfree(buf); 276 return final_buf; 277} 278 279static char *hmdfs_merge_dentry_path_raw(struct dentry *d, char *buf, int buflen) 280{ 281 struct dentry *dentry = NULL; 282 char *end = NULL; 283 char *retval = NULL; 284 unsigned int len; 285 unsigned int seq = 0; 286 int error = 0; 287 struct hmdfs_dentry_info_merge *mdi = NULL; 288 289 rcu_read_lock(); 290restart: 291 mdi = hmdfs_dm(d); 292 dentry = d; 293 end = buf + buflen; 294 len = buflen; 295 prepend(&end, &len, "\0", 1); 296 retval = end - 1; 297 *retval = '/'; 298 read_seqbegin_or_lock(&rename_lock, &seq); 299 while (mdi->dentry_type != HMDFS_LAYER_FIRST_MERGE && 300 mdi->dentry_type != HMDFS_LAYER_FIRST_MERGE_CLOUD) { 301 struct dentry *parent = dentry->d_parent; 302 303 prefetch(parent); 304 error = prepend_name(&end, &len, &dentry->d_name); 305 if (error) 306 break; 307 retval = end; 308 dentry = parent; 309 mdi = hmdfs_dm(dentry); 310 } 311 if (!(seq & 1)) 312 rcu_read_unlock(); 313 if (need_seqretry(&rename_lock, seq)) { 314 seq = 1; 315 goto restart; 316 } 317 done_seqretry(&rename_lock, seq); 318 if (error) 319 goto Elong; 320 return retval; 321Elong: 322 return ERR_PTR(-ENAMETOOLONG); 323} 324 325char *hmdfs_merge_get_dentry_relative_path(struct dentry *dentry) 326{ 327 char *final_buf = NULL; 328 char *buf = NULL; 329 char *p = NULL; 330 331 buf = kzalloc(PATH_MAX, GFP_KERNEL); 332 if (!buf) 333 return NULL; 334 335 final_buf = kzalloc(PATH_MAX, GFP_KERNEL); 336 if (!final_buf) { 337 kfree(buf); 338 return NULL; 339 } 340 341 /* NULL dentry return root dir */ 342 if (!dentry) { 343 strcpy(final_buf, "/"); 344 kfree(buf); 345 return final_buf; 346 } 347 p = hmdfs_merge_dentry_path_raw(dentry, buf, PATH_MAX); 348 if (IS_ERR_OR_NULL(p)) { 349 kfree(buf); 350 kfree(final_buf); 351 return NULL; 352 } 353 354 if (strlen(p) >= PATH_MAX) { 355 kfree(buf); 356 kfree(final_buf); 357 return NULL; 358 } 359 strcpy(final_buf, p); 360 kfree(buf); 361 return final_buf; 362} 363 364char *hmdfs_get_dentry_absolute_path(const char *rootdir, 365 const char *relative_path) 366{ 367 char *buf = 0; 368 369 if (!rootdir || !relative_path) 370 return NULL; 371 if (strlen(rootdir) + strlen(relative_path) >= PATH_MAX) 372 return NULL; 373 374 buf = kzalloc(PATH_MAX, GFP_KERNEL); 375 if (!buf) 376 return NULL; 377 378 strcpy(buf, rootdir); 379 strcat(buf, relative_path); 380 return buf; 381} 382 383char *hmdfs_connect_path(const char *path, const char *name) 384{ 385 char *buf = 0; 386 size_t path_len, name_len; 387 388 if (!path || !name) 389 return NULL; 390 391 path_len = strnlen(path, PATH_MAX); 392 name_len = strnlen(name, PATH_MAX); 393 if (path_len + name_len + 1 >= PATH_MAX) 394 return NULL; 395 396 buf = kzalloc(PATH_MAX, GFP_KERNEL); 397 if (!buf) 398 return NULL; 399 400 strncpy(buf, path, path_len); 401 strcat(buf, "/"); 402 strncat(buf, name, name_len); 403 return buf; 404} 405 406int hmdfs_metainfo_read_nocred(struct file *filp, 407 void *buffer, int size, int bidx) 408{ 409 loff_t pos = get_dentry_group_pos(bidx); 410 411 return kernel_read(filp, buffer, (size_t)size, &pos); 412} 413 414int hmdfs_metainfo_read(struct hmdfs_sb_info *sbi, struct file *filp, 415 void *buffer, int size, int bidx) 416{ 417 loff_t pos = get_dentry_group_pos(bidx); 418 419 return cache_file_read(sbi, filp, buffer, (size_t)size, &pos); 420} 421 422int hmdfs_metainfo_write(struct hmdfs_sb_info *sbi, struct file *filp, 423 const void *buffer, int size, int bidx) 424{ 425 loff_t pos = get_dentry_group_pos(bidx); 426 427 return cache_file_write(sbi, filp, buffer, (size_t)size, &pos); 428} 429 430/* for each level */ 431/* bucketseq start offset by 0,for example 432 * level0 bucket0(0) 433 * level1 bucket0(1) bucket1(2) 434 * level2 bucket0(3) bucket1(4) bucket2(5) bucket3(6) 435 * return bucket number. 436 */ 437__u64 get_bucketaddr(unsigned int level, __u64 buckoffset) 438{ 439 __u64 all_level_bucketaddr = 0; 440 __u64 curlevelmaxbucks; 441 442 if (level >= MAX_BUCKET_LEVEL) { 443 hmdfs_err("level = %d overflow", level); 444 return all_level_bucketaddr; 445 } 446 curlevelmaxbucks = ((__u64)1 << level); 447 if (buckoffset >= curlevelmaxbucks) { 448 hmdfs_err("buckoffset %llu overflow, level %d has %llu buckets max", 449 buckoffset, level, curlevelmaxbucks); 450 return all_level_bucketaddr; 451 } 452 all_level_bucketaddr = curlevelmaxbucks + buckoffset - 1; 453 454 return all_level_bucketaddr; 455} 456 457__u64 get_bucket_by_level(unsigned int level) 458{ 459 __u64 buckets = 0; 460 461 if (level >= MAX_BUCKET_LEVEL) { 462 hmdfs_err("level = %d overflow", level); 463 return buckets; 464 } 465 466 buckets = ((__u64)1 << level); 467 return buckets; 468} 469 470static __u64 get_overall_bucket(unsigned int level) 471{ 472 __u64 buckets = 0; 473 474 if (level >= MAX_BUCKET_LEVEL) { 475 hmdfs_err("level = %d overflow", level); 476 return buckets; 477 } 478 buckets = ((__u64)1 << (level + 1)) - 1; 479 return buckets; 480} 481 482static inline loff_t get_dcache_file_size(unsigned int level) 483{ 484 loff_t buckets = get_overall_bucket(level); 485 486 return buckets * DENTRYGROUP_SIZE * BUCKET_BLOCKS + DENTRYGROUP_HEADER; 487} 488 489static char *get_relative_path(struct hmdfs_sb_info *sbi, char *from) 490{ 491 char *relative; 492 493 if (strncmp(from, sbi->local_src, strlen(sbi->local_src))) { 494 hmdfs_warning("orig path do not start with local_src"); 495 return NULL; 496 } 497 relative = from + strlen(sbi->local_src); 498 if (*relative == '/') 499 relative++; 500 return relative; 501} 502 503struct file *hmdfs_get_or_create_dents(struct hmdfs_sb_info *sbi, char *name) 504{ 505 struct path root_path, path; 506 struct file *filp = NULL; 507 char *relative; 508 int err; 509 510 err = kern_path(sbi->local_src, 0, &root_path); 511 if (err) { 512 hmdfs_err("kern_path failed err = %d", err); 513 return NULL; 514 } 515 relative = get_relative_path(sbi, name); 516 if (!relative) { 517 hmdfs_err("get relative path failed"); 518 goto err_root_path; 519 } 520 err = vfs_path_lookup(root_path.dentry, root_path.mnt, relative, 0, 521 &path); 522 if (err) { 523 hmdfs_err("lookup failed err = %d", err); 524 goto err_root_path; 525 } 526 527 filp = hmdfs_server_cache_revalidate(sbi, relative, &path); 528 if (IS_ERR_OR_NULL(filp)) { 529 filp = hmdfs_server_rebuild_dents(sbi, &path, NULL, relative); 530 if (IS_ERR_OR_NULL(filp)) 531 goto err_lookup_path; 532 } 533 534err_lookup_path: 535 path_put(&path); 536err_root_path: 537 path_put(&root_path); 538 return filp; 539} 540 541/* read all dentry in target path directory */ 542int read_dentry(struct hmdfs_sb_info *sbi, char *file_name, 543 struct dir_context *ctx) 544{ 545 unsigned long pos = (unsigned long)(ctx->pos); 546 unsigned long group_id = (pos << (1 + DEV_ID_BIT_NUM)) >> 547 (POS_BIT_NUM - GROUP_ID_BIT_NUM); 548 unsigned long offset = pos & OFFSET_BIT_MASK; 549 struct hmdfs_dentry_group *dentry_group = NULL; 550 struct file *handler = NULL; 551 int group_num = 0; 552 int iterate_result = 0; 553 int i, j; 554 const struct cred *saved_cred; 555 556 saved_cred = hmdfs_override_fsids(false); 557 if (!saved_cred) { 558 hmdfs_err("prepare cred failed!"); 559 return -ENOMEM; 560 } 561 562 563 if (!file_name) 564 return -EINVAL; 565 566 dentry_group = kzalloc(sizeof(*dentry_group), GFP_KERNEL); 567 if (!dentry_group) 568 return -ENOMEM; 569 570 handler = hmdfs_get_or_create_dents(sbi, file_name); 571 if (IS_ERR_OR_NULL(handler)) { 572 kfree(dentry_group); 573 return -ENOENT; 574 } 575 576 group_num = get_dentry_group_cnt(file_inode(handler)); 577 578 for (i = group_id; i < group_num; i++) { 579 hmdfs_metainfo_read(sbi, handler, dentry_group, 580 sizeof(struct hmdfs_dentry_group), i); 581 for (j = offset; j < DENTRY_PER_GROUP; j++) { 582 int len; 583 int file_type = 0; 584 bool is_continue; 585 586 len = le16_to_cpu(dentry_group->nsl[j].namelen); 587 if (!test_bit_le(j, dentry_group->bitmap) || len == 0) 588 continue; 589 590 if (S_ISDIR(le16_to_cpu(dentry_group->nsl[j].i_mode))) 591 file_type = DT_DIR; 592 else if (S_ISREG(le16_to_cpu( 593 dentry_group->nsl[j].i_mode))) 594 file_type = DT_REG; 595 else if (S_ISLNK(le16_to_cpu( 596 dentry_group->nsl[j].i_mode))) 597 file_type = DT_LNK; 598 else 599 continue; 600 601 pos = hmdfs_set_pos(0, i, j); 602 is_continue = dir_emit( 603 ctx, dentry_group->filename[j], len, 604 le64_to_cpu(dentry_group->nsl[j].i_ino), 605 file_type); 606 if (!is_continue) { 607 ctx->pos = pos; 608 iterate_result = 1; 609 goto done; 610 } 611 } 612 offset = 0; 613 } 614 615done: 616 hmdfs_revert_fsids(saved_cred); 617 kfree(dentry_group); 618 fput(handler); 619 return iterate_result; 620} 621 622unsigned int get_max_depth(struct file *filp) 623{ 624 size_t isize; 625 626 isize = get_dentry_group_cnt(file_inode(filp)) / BUCKET_BLOCKS; 627 628 return get_count_order(isize + 1); 629} 630 631struct hmdfs_dentry_group *find_dentry_page(struct hmdfs_sb_info *sbi, 632 pgoff_t index, struct file *filp) 633{ 634 int size; 635 struct hmdfs_dentry_group *dentry_blk = NULL; 636 loff_t pos = get_dentry_group_pos(index); 637 int err; 638 639 dentry_blk = kmalloc(sizeof(*dentry_blk), GFP_KERNEL); 640 if (!dentry_blk) 641 return NULL; 642 643 err = hmdfs_wlock_file(filp, pos, DENTRYGROUP_SIZE); 644 if (err) { 645 hmdfs_err("lock file pos %lld failed", pos); 646 kfree(dentry_blk); 647 return NULL; 648 } 649 650 size = cache_file_read(sbi, filp, dentry_blk, (size_t)DENTRYGROUP_SIZE, 651 &pos); 652 if (size != DENTRYGROUP_SIZE) { 653 hmdfs_unlock_file(filp, pos, DENTRYGROUP_SIZE); 654 kfree(dentry_blk); 655 dentry_blk = NULL; 656 } 657 658 return dentry_blk; 659} 660 661static ssize_t write_dentry_page(struct file *filp, const void *buffer, 662 int buffersize, loff_t position) 663{ 664 ssize_t size; 665 666 size = kernel_write(filp, buffer, (size_t)buffersize, &position); 667 if (size != buffersize) 668 hmdfs_err("write failed, ret = %zd", size); 669 670 return size; 671} 672 673static struct hmdfs_dentry *find_in_block(struct hmdfs_dentry_group *dentry_blk, 674 __u32 namehash, 675 const struct qstr *qstr, 676 struct hmdfs_dentry **insense_de, 677 bool case_sense) 678{ 679 struct hmdfs_dentry *de; 680 unsigned long bit_pos = 0; 681 int max_len = 0; 682 683 while (bit_pos < DENTRY_PER_GROUP) { 684 if (!test_bit_le(bit_pos, dentry_blk->bitmap)) { 685 bit_pos++; 686 max_len++; 687 continue; 688 } 689 de = &dentry_blk->nsl[bit_pos]; 690 if (unlikely(!de->namelen)) { 691 bit_pos++; 692 continue; 693 } 694 695 if (le32_to_cpu(de->hash) == namehash && 696 le16_to_cpu(de->namelen) == qstr->len && 697 !memcmp(qstr->name, dentry_blk->filename[bit_pos], 698 le16_to_cpu(de->namelen))) 699 goto found; 700 if (!(*insense_de) && !case_sense && 701 le32_to_cpu(de->hash) == namehash && 702 le16_to_cpu(de->namelen) == qstr->len && 703 str_n_case_eq(qstr->name, dentry_blk->filename[bit_pos], 704 le16_to_cpu(de->namelen))) 705 *insense_de = de; 706 max_len = 0; 707 bit_pos += get_dentry_slots(le16_to_cpu(de->namelen)); 708 } 709 de = NULL; 710found: 711 return de; 712} 713 714static struct hmdfs_dentry *hmdfs_in_level(struct dentry *child_dentry, 715 unsigned int level, 716 struct hmdfs_dcache_lookup_ctx *ctx) 717{ 718 unsigned long nbucket; 719 unsigned long bidx, end_block; 720 struct hmdfs_dentry *de = NULL; 721 struct hmdfs_dentry *tmp_insense_de = NULL; 722 struct hmdfs_dentry_group *dentry_blk; 723 724 nbucket = get_bucket_by_level(level); 725 if (!nbucket) 726 return de; 727 728 bidx = get_bucketaddr(level, ctx->hash % nbucket) * BUCKET_BLOCKS; 729 end_block = bidx + BUCKET_BLOCKS; 730 731 for (; bidx < end_block; bidx++) { 732 dentry_blk = find_dentry_page(ctx->sbi, bidx, ctx->filp); 733 if (!dentry_blk) 734 break; 735 736 de = find_in_block(dentry_blk, ctx->hash, ctx->name, 737 &tmp_insense_de, ctx->sbi->s_case_sensitive); 738 if (!de && !(ctx->insense_de) && tmp_insense_de) { 739 ctx->insense_de = tmp_insense_de; 740 ctx->insense_page = dentry_blk; 741 ctx->insense_bidx = bidx; 742 } else if (!de) { 743 hmdfs_unlock_file(ctx->filp, get_dentry_group_pos(bidx), 744 DENTRYGROUP_SIZE); 745 kfree(dentry_blk); 746 } else { 747 ctx->page = dentry_blk; 748 break; 749 } 750 } 751 ctx->bidx = bidx; 752 return de; 753} 754 755struct hmdfs_dentry *hmdfs_find_dentry(struct dentry *child_dentry, 756 struct hmdfs_dcache_lookup_ctx *ctx) 757{ 758 struct hmdfs_dentry *de = NULL; 759 unsigned int max_depth; 760 unsigned int level; 761 762 if (!ctx->filp) 763 return NULL; 764 765 ctx->hash = hmdfs_dentry_hash(ctx->name, ctx->sbi->s_case_sensitive); 766 767 max_depth = get_max_depth(ctx->filp); 768 for (level = 0; level < max_depth; level++) { 769 de = hmdfs_in_level(child_dentry, level, ctx); 770 if (de) { 771 if (ctx->insense_page) { 772 hmdfs_unlock_file(ctx->filp, 773 get_dentry_group_pos(ctx->insense_bidx), 774 DENTRYGROUP_SIZE); 775 kfree(ctx->insense_page); 776 ctx->insense_page = NULL; 777 } 778 return de; 779 } 780 } 781 if (ctx->insense_de) { 782 ctx->bidx = ctx->insense_bidx; 783 ctx->page = ctx->insense_page; 784 ctx->insense_bidx = 0; 785 ctx->insense_page = NULL; 786 } 787 return ctx->insense_de; 788} 789 790void update_dentry(struct hmdfs_dentry_group *d, struct dentry *child_dentry, 791 struct inode *inode, struct super_block *hmdfs_sb, 792 __u32 name_hash, unsigned int bit_pos) 793{ 794 struct hmdfs_dentry *de; 795 struct hmdfs_dentry_info *gdi; 796 const struct qstr name = child_dentry->d_name; 797 int slots = get_dentry_slots(name.len); 798 int i; 799 unsigned long ino; 800 __u32 igen; 801 802 gdi = hmdfs_sb == child_dentry->d_sb ? hmdfs_d(child_dentry) : NULL; 803 if (!gdi && S_ISLNK(d_inode(child_dentry)->i_mode)) { 804 ino = d_inode(child_dentry)->i_ino; 805 igen = d_inode(child_dentry)->i_generation; 806 } else { 807 ino = inode->i_ino; 808 igen = inode->i_generation; 809 } 810 811 de = &d->nsl[bit_pos]; 812 de->hash = cpu_to_le32(name_hash); 813 de->namelen = cpu_to_le16(name.len); 814 memcpy(d->filename[bit_pos], name.name, name.len); 815 de->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec); 816 de->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec); 817 de->i_size = cpu_to_le64(inode->i_size); 818 de->i_ino = cpu_to_le64(generate_u64_ino(ino, igen)); 819 de->i_flag = 0; 820 if (gdi && hm_islnk(gdi->file_type)) 821 de->i_mode = cpu_to_le16(S_IFLNK); 822 else if (!gdi && S_ISLNK(d_inode(child_dentry)->i_mode)) 823 de->i_mode = d_inode(child_dentry)->i_mode; 824 else 825 de->i_mode = cpu_to_le16(inode->i_mode); 826 827 for (i = 0; i < slots; i++) { 828 __set_bit_le(bit_pos + i, d->bitmap); 829 /* avoid wrong garbage data for readdir */ 830 if (i) 831 (de + i)->namelen = 0; 832 } 833} 834 835int room_for_filename(const void *bitmap, int slots, int max_slots) 836{ 837 int bit_start = 0; 838 int zero_start, zero_end; 839next: 840 zero_start = find_next_zero_bit_le(bitmap, max_slots, bit_start); 841 if (zero_start >= max_slots) 842 return max_slots; 843 844 zero_end = find_next_bit_le(bitmap, max_slots, zero_start); 845 if (zero_end - zero_start >= slots) 846 return zero_start; 847 848 bit_start = zero_end + 1; 849 850 if (zero_end + 1 >= max_slots) 851 return max_slots; 852 goto next; 853} 854 855void create_in_cache_file(uint64_t dev_id, struct dentry *dentry) 856{ 857 struct clearcache_item *item = NULL; 858 859 item = hmdfs_find_cache_item(dev_id, dentry->d_parent); 860 if (item) { 861 if (d_inode(dentry)) 862 create_dentry(dentry, d_inode(dentry), item->filp, 863 hmdfs_sb(dentry->d_sb)); 864 else 865 hmdfs_err("inode is null!"); 866 kref_put(&item->ref, release_cache_item); 867 } else { 868 hmdfs_info("find cache item failed, device_id:%llu", dev_id); 869 } 870} 871 872int create_dentry(struct dentry *child_dentry, struct inode *inode, 873 struct file *file, struct hmdfs_sb_info *sbi) 874{ 875 unsigned int bit_pos, level; 876 unsigned long bidx, end_block; 877 const struct qstr qstr = child_dentry->d_name; 878 __u32 namehash; 879 loff_t pos; 880 ssize_t size; 881 int ret = 0; 882 struct hmdfs_dentry_group *dentry_blk = NULL; 883 884 level = 0; 885 886 namehash = hmdfs_dentry_hash(&qstr, sbi->s_case_sensitive); 887 888 dentry_blk = kmalloc(sizeof(*dentry_blk), GFP_KERNEL); 889 if (!dentry_blk) { 890 ret = -ENOMEM; 891 goto out_err; 892 } 893find: 894 if (level == MAX_BUCKET_LEVEL) { 895 ret = -ENOSPC; 896 goto out; 897 } 898 bidx = BUCKET_BLOCKS * 899 get_bucketaddr(level, namehash % get_bucket_by_level(level)); 900 end_block = bidx + BUCKET_BLOCKS; 901 if (end_block > get_dentry_group_cnt(file_inode(file))) { 902 if (cache_file_truncate(sbi, &(file->f_path), 903 get_dcache_file_size(level))) { 904 ret = -ENOSPC; 905 goto out; 906 } 907 } 908 909 for (; bidx < end_block; bidx++) { 910 int size; 911 912 pos = get_dentry_group_pos(bidx); 913 ret = hmdfs_wlock_file(file, pos, DENTRYGROUP_SIZE); 914 if (ret) 915 goto out; 916 917 size = cache_file_read(sbi, file, dentry_blk, 918 (size_t)DENTRYGROUP_SIZE, &pos); 919 if (size != DENTRYGROUP_SIZE) { 920 ret = -ENOSPC; 921 hmdfs_unlock_file(file, pos, DENTRYGROUP_SIZE); 922 goto out; 923 } 924 925 bit_pos = room_for_filename(&dentry_blk->bitmap, 926 get_dentry_slots(qstr.len), 927 DENTRY_PER_GROUP); 928 if (bit_pos < DENTRY_PER_GROUP) 929 goto add; 930 hmdfs_unlock_file(file, pos, DENTRYGROUP_SIZE); 931 } 932 ++level; 933 goto find; 934add: 935 pos = get_dentry_group_pos(bidx); 936 update_dentry(dentry_blk, child_dentry, inode, sbi->sb, namehash, 937 bit_pos); 938 size = cache_file_write(sbi, file, dentry_blk, 939 sizeof(struct hmdfs_dentry_group), &pos); 940 if (size != sizeof(struct hmdfs_dentry_group)) 941 hmdfs_err("cache file write failed!, ret = %zd", size); 942 hmdfs_unlock_file(file, pos, DENTRYGROUP_SIZE); 943out: 944 kfree(dentry_blk); 945out_err: 946 return ret; 947} 948 949void hmdfs_init_dcache_lookup_ctx(struct hmdfs_dcache_lookup_ctx *ctx, 950 struct hmdfs_sb_info *sbi, 951 const struct qstr *qstr, struct file *filp) 952{ 953 ctx->sbi = sbi; 954 ctx->name = qstr; 955 ctx->filp = filp; 956 ctx->bidx = 0; 957 ctx->page = NULL; 958 ctx->insense_de = NULL; 959 ctx->insense_bidx = 0; 960 ctx->insense_page = NULL; 961} 962 963int update_inode_to_dentry(struct dentry *child_dentry, struct inode *inode) 964{ 965 struct hmdfs_sb_info *sbi = d_inode(child_dentry)->i_sb->s_fs_info; 966 struct hmdfs_dentry *de = NULL; 967 loff_t ipos; 968 struct dentry *parent_dentry; 969 struct cache_file_node *cfn = NULL; 970 char *relative_path = NULL; 971 struct hmdfs_dcache_lookup_ctx ctx; 972 973 parent_dentry = child_dentry->d_parent; 974 if (hmdfs_d(parent_dentry)->dentry_type == HMDFS_LAYER_FIRST_DEVICE) 975 return 0; 976 977 relative_path = hmdfs_get_dentry_relative_path(parent_dentry); 978 if (!relative_path) 979 return -ENOMEM; 980 981 cfn = find_cfn(sbi, HMDFS_SERVER_CID, relative_path, true); 982 if (!cfn) 983 goto out; 984 985 hmdfs_init_dcache_lookup_ctx(&ctx, sbi, &child_dentry->d_name, 986 cfn->filp); 987 de = hmdfs_find_dentry(child_dentry, &ctx); 988 if (!de) 989 goto out_cfn; 990 991 de->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec); 992 de->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec); 993 de->i_size = cpu_to_le64(inode->i_size); 994 de->i_ino = cpu_to_le64( 995 generate_u64_ino(inode->i_ino, inode->i_generation)); 996 de->i_flag = 0; 997 998 ipos = get_dentry_group_pos(ctx.bidx); 999 write_dentry_page(cfn->filp, ctx.page, 1000 sizeof(struct hmdfs_dentry_group), ipos); 1001 hmdfs_unlock_file(cfn->filp, ipos, DENTRYGROUP_SIZE); 1002 kfree(ctx.page); 1003out_cfn: 1004 release_cfn(cfn); 1005out: 1006 kfree(relative_path); 1007 return 0; 1008} 1009 1010void hmdfs_delete_dentry(struct dentry *d, struct file *filp) 1011{ 1012 struct hmdfs_dentry *de = NULL; 1013 unsigned int bit_pos; 1014 int slots, i; 1015 loff_t ipos; 1016 ssize_t size; 1017 struct hmdfs_dcache_lookup_ctx ctx; 1018 1019 hmdfs_init_dcache_lookup_ctx(&ctx, hmdfs_sb(d->d_sb), &d->d_name, filp); 1020 1021 de = hmdfs_find_dentry(d, &ctx); 1022 if (IS_ERR_OR_NULL(de)) { 1023 hmdfs_info("find dentry failed!, err=%ld", PTR_ERR(de)); 1024 return; 1025 } 1026 slots = get_dentry_slots(le16_to_cpu(de->namelen)); 1027 1028 bit_pos = de - ctx.page->nsl; 1029 for (i = 0; i < slots; i++) 1030 __clear_bit_le(bit_pos + i, &ctx.page->bitmap); 1031 1032 ipos = get_dentry_group_pos(ctx.bidx); 1033 size = cache_file_write(hmdfs_sb(d->d_sb), filp, ctx.page, 1034 sizeof(struct hmdfs_dentry_group), &ipos); 1035 if (size != sizeof(struct hmdfs_dentry_group)) 1036 hmdfs_err("cache file write failed!, ret = %zd", size); 1037 hmdfs_unlock_file(filp, ipos, DENTRYGROUP_SIZE); 1038 kfree(ctx.page); 1039} 1040 1041static int hmdfs_get_cache_path(struct hmdfs_sb_info *sbi, struct path *dir) 1042{ 1043 struct hmdfs_dentry_info *di = hmdfs_d(sbi->sb->s_root); 1044 int err; 1045 1046 if (!sbi->s_dentry_cache) { 1047 *dir = di->lower_path; 1048 return 0; 1049 } 1050 1051 err = kern_path(sbi->cache_dir, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, dir); 1052 if (err) 1053 hmdfs_err("open failed, errno = %d", err); 1054 1055 return err; 1056} 1057 1058static void hmdfs_put_cache_path(struct hmdfs_sb_info *sbi, struct path *dir) 1059{ 1060 if (!sbi->s_dentry_cache) 1061 return; 1062 path_put(dir); 1063} 1064 1065struct file *create_local_dentry_file_cache(struct hmdfs_sb_info *sbi) 1066{ 1067 struct file *filp = NULL; 1068 const struct cred *old_cred = hmdfs_override_creds(sbi->system_cred); 1069 struct path cache_dir; 1070 int err; 1071 1072 err = hmdfs_get_cache_path(sbi, &cache_dir); 1073 if (err) { 1074 filp = ERR_PTR(err); 1075 goto out; 1076 } 1077 1078 filp = file_open_root(&cache_dir, ".", 1079 O_RDWR | O_LARGEFILE | O_TMPFILE, 1080 DENTRY_FILE_PERM); 1081 if (IS_ERR(filp)) 1082 hmdfs_err("dentryfile open failed and exit err=%ld", 1083 PTR_ERR(filp)); 1084 1085 hmdfs_put_cache_path(sbi, &cache_dir); 1086out: 1087 hmdfs_revert_creds(old_cred); 1088 return filp; 1089} 1090 1091static int hmdfs_linkat(struct path *old_path, const char *newname) 1092{ 1093 struct dentry *new_dentry = NULL; 1094 struct path new_path; 1095 int error; 1096 1097 new_dentry = kern_path_create(AT_FDCWD, newname, &new_path, 0); 1098 if (IS_ERR(new_dentry)) { 1099 hmdfs_err("create kernel path failed, error: %ld", 1100 PTR_ERR(new_dentry)); 1101 return PTR_ERR(new_dentry); 1102 } 1103 1104 error = -EXDEV; 1105 if (old_path->mnt != new_path.mnt) 1106 goto out_dput; 1107 1108 error = vfs_link(old_path->dentry, &nop_mnt_idmap, new_path.dentry->d_inode, new_dentry, 1109 NULL); 1110 1111out_dput: 1112 done_path_create(&new_path, new_dentry); 1113 return error; 1114} 1115 1116static int cache_file_mkdir(const char *name, umode_t mode) 1117{ 1118 struct dentry *dentry; 1119 struct path path; 1120 int err; 1121 1122 dentry = kern_path_create(AT_FDCWD, name, &path, LOOKUP_DIRECTORY); 1123 if (IS_ERR(dentry)) 1124 return PTR_ERR(dentry); 1125 1126 err = vfs_mkdir(&nop_mnt_idmap, d_inode(path.dentry), dentry, mode); 1127 if (err && err != -EEXIST) 1128 hmdfs_err("vfs_mkdir failed, err = %d", err); 1129 1130 done_path_create(&path, dentry); 1131 return err; 1132} 1133 1134static int cache_file_create_path(const char *fullpath) 1135{ 1136 char *path; 1137 char *s; 1138 int err = 0; 1139 1140 path = kstrdup(fullpath, GFP_KERNEL); 1141 if (!path) 1142 return -ENOMEM; 1143 1144 s = path + 1; 1145 while (true) { 1146 s = strchr(s, '/'); 1147 if (!s) 1148 break; 1149 s[0] = '\0'; 1150 err = cache_file_mkdir(path, 0755); 1151 if (err && err != -EEXIST) 1152 break; 1153 s[0] = '/'; 1154 s++; 1155 } 1156 kfree(path); 1157 return err; 1158} 1159 1160static void hmdfs_cache_path_create(char *s, const char *dir, bool server) 1161{ 1162 if (server) 1163 snprintf(s, PATH_MAX, "%s/dentry_cache/server/", dir); 1164 else 1165 snprintf(s, PATH_MAX, "%s/dentry_cache/client/", dir); 1166} 1167 1168static void concat_cachefile_name(char *s, uint64_t hash, const char *id, 1169 bool server) 1170{ 1171 int offset = strlen(s); 1172 1173 if (server) 1174 snprintf(s + offset, PATH_MAX - offset, "%016llx", hash); 1175 else 1176 snprintf(s + offset, PATH_MAX - offset, "%s_%016llx", id, hash); 1177} 1178 1179int cache_file_name_generate(char *fullname, struct hmdfs_peer *con, 1180 const char *relative_path, bool server) 1181{ 1182 struct hmdfs_sb_info *sbi = con->sbi; 1183 uint64_t hash; 1184 char cid[HMDFS_CFN_CID_SIZE]; 1185 int err; 1186 1187 hmdfs_cache_path_create(fullname, sbi->cache_dir, server); 1188 1189 err = cache_file_create_path(fullname); 1190 if (err && err != -EEXIST) { 1191 hmdfs_err("making dir failed %d", err); 1192 return err; 1193 } 1194 1195 strncpy(cid, con->cid, HMDFS_CFN_CID_SIZE - 1); 1196 cid[HMDFS_CFN_CID_SIZE - 1] = '\0'; 1197 1198 hash = path_hash(relative_path, strlen(relative_path), 1199 sbi->s_case_sensitive); 1200 concat_cachefile_name(fullname, hash, cid, server); 1201 1202 return 0; 1203} 1204 1205static void free_cfn(struct cache_file_node *cfn) 1206{ 1207 if (!IS_ERR_OR_NULL(cfn->filp)) 1208 filp_close(cfn->filp, NULL); 1209 1210 kfree(cfn->relative_path); 1211 kfree(cfn); 1212} 1213 1214static bool path_cmp(const char *path1, const char *path2, bool case_sensitive) 1215{ 1216 int ret; 1217 1218 if (case_sensitive) 1219 ret = strcmp(path1, path2); 1220 else 1221 ret = strcasecmp(path1, path2); 1222 1223 return !ret; 1224} 1225 1226static bool dentry_file_match(struct cache_file_node *cfn, const char *id, 1227 const char *path) 1228{ 1229 return (path_cmp(cfn->relative_path, path, cfn->sbi->s_case_sensitive) && 1230 !strncmp((cfn)->cid, id, HMDFS_CFN_CID_SIZE - 1)); 1231} 1232 1233struct cache_file_node *__find_cfn(struct hmdfs_sb_info *sbi, const char *cid, 1234 const char *path, bool server) 1235{ 1236 struct cache_file_node *cfn = NULL; 1237 struct list_head *head = NULL; 1238 1239 head = get_list_head(sbi, server); 1240 1241 list_for_each_entry(cfn, head, list) { 1242 if (dentry_file_match(cfn, cid, path)) { 1243 refcount_inc(&cfn->ref); 1244 return cfn; 1245 } 1246 } 1247 return NULL; 1248} 1249 1250struct cache_file_node *create_cfn(struct hmdfs_sb_info *sbi, const char *path, 1251 const char *cid, bool server) 1252{ 1253 struct cache_file_node *cfn = kzalloc(sizeof(*cfn), GFP_KERNEL); 1254 1255 if (!cfn) 1256 return NULL; 1257 1258 cfn->relative_path = kstrdup(path, GFP_KERNEL); 1259 if (!cfn->relative_path) 1260 goto out; 1261 1262 refcount_set(&cfn->ref, 1); 1263 strncpy(cfn->cid, cid, HMDFS_CFN_CID_SIZE - 1); 1264 cfn->cid[HMDFS_CFN_CID_SIZE - 1] = '\0'; 1265 cfn->sbi = sbi; 1266 cfn->server = server; 1267 return cfn; 1268out: 1269 free_cfn(cfn); 1270 return NULL; 1271} 1272 1273static struct file *insert_cfn(struct hmdfs_sb_info *sbi, const char *filename, 1274 const char *path, const char *cid, bool server) 1275{ 1276 const struct cred *old_cred = NULL; 1277 struct cache_file_node *cfn = NULL; 1278 struct cache_file_node *exist = NULL; 1279 struct list_head *head = NULL; 1280 struct file *filp = NULL; 1281 1282 cfn = create_cfn(sbi, path, cid, server); 1283 if (!cfn) 1284 return ERR_PTR(-ENOMEM); 1285 1286 old_cred = hmdfs_override_creds(sbi->system_cred); 1287 filp = filp_open(filename, O_RDWR | O_LARGEFILE, 0); 1288 hmdfs_revert_creds(old_cred); 1289 if (IS_ERR(filp)) { 1290 hmdfs_err("open file failed, err=%ld", PTR_ERR(filp)); 1291 goto out; 1292 } 1293 1294 head = get_list_head(sbi, server); 1295 1296 mutex_lock(&sbi->cache_list_lock); 1297 exist = __find_cfn(sbi, cid, path, server); 1298 if (!exist) { 1299 cfn->filp = filp; 1300 list_add_tail(&cfn->list, head); 1301 } else { 1302 mutex_unlock(&sbi->cache_list_lock); 1303 release_cfn(exist); 1304 filp_close(filp, NULL); 1305 filp = ERR_PTR(-EEXIST); 1306 goto out; 1307 } 1308 mutex_unlock(&sbi->cache_list_lock); 1309 return filp; 1310out: 1311 free_cfn(cfn); 1312 return filp; 1313} 1314 1315int hmdfs_rename_dentry(struct dentry *old_dentry, struct dentry *new_dentry, 1316 struct file *old_filp, struct file *new_filp) 1317{ 1318 int ret; 1319 struct hmdfs_sb_info *sbi = hmdfs_sb(new_dentry->d_sb); 1320 1321 /* 1322 * Try to delete first, because stale dentry might exist after 1323 * coverwrite. 1324 */ 1325 hmdfs_delete_dentry(new_dentry, new_filp); 1326 1327 ret = create_dentry(new_dentry, d_inode(old_dentry), new_filp, sbi); 1328 if (ret) { 1329 hmdfs_err("create dentry failed!, err=%d", ret); 1330 return ret; 1331 } 1332 1333 hmdfs_delete_dentry(old_dentry, old_filp); 1334 return 0; 1335} 1336 1337/** 1338 * cache_file_persistent - link the tmpfile to the cache dir 1339 * @con: the connection peer 1340 * @filp: the file handler of the tmpfile 1341 * @relative_path: the relative path which the tmpfile belongs 1342 * @server: server or client 1343 * 1344 * Return value: the new file handler of the persistent file if the 1345 * persistent operation succeed. Otherwise will return the original handler 1346 * of the tmpfile passed in, so that the caller does not have to check 1347 * the returned handler. 1348 * 1349 */ 1350struct file *cache_file_persistent(struct hmdfs_peer *con, struct file *filp, 1351 const char *relative_path, bool server) 1352{ 1353 struct cache_file_node *cfn = NULL; 1354 char *fullname = NULL; 1355 char *cid = server ? HMDFS_SERVER_CID : (char *)con->cid; 1356 struct file *newf = NULL; 1357 int i = 0; 1358 int len; 1359 int err; 1360 1361 if (!con->sbi->s_dentry_cache) 1362 return filp; 1363 1364 cfn = find_cfn(con->sbi, cid, relative_path, server); 1365 if (cfn) { 1366 release_cfn(cfn); 1367 return filp; 1368 } 1369 fullname = kzalloc(PATH_MAX, GFP_KERNEL); 1370 if (!fullname) 1371 return filp; 1372 1373 err = cache_file_name_generate(fullname, con, relative_path, server); 1374 if (err) 1375 goto out; 1376 1377 err = __vfs_setxattr(&nop_mnt_idmap, file_dentry(filp), file_inode(filp), 1378 DENTRY_FILE_XATTR_NAME, relative_path, 1379 strlen(relative_path), 0); 1380 if (err) { 1381 hmdfs_err("setxattr for file failed, err=%d", err); 1382 goto out; 1383 } 1384 1385 len = strlen(fullname); 1386 1387 do { 1388 err = hmdfs_linkat(&filp->f_path, fullname); 1389 if (!err) 1390 break; 1391 1392 snprintf(fullname + len, PATH_MAX - len, "_%d", i); 1393 } while (i++ < DENTRY_FILE_NAME_RETRY); 1394 1395 if (err) { 1396 hmdfs_err("link for file failed, err=%d", err); 1397 goto out; 1398 } 1399 1400 newf = insert_cfn(con->sbi, fullname, relative_path, cid, server); 1401 if (!IS_ERR(newf)) 1402 filp = newf; 1403out: 1404 kfree(fullname); 1405 return filp; 1406} 1407 1408int get_cloud_cache_file(struct dentry *dentry, struct hmdfs_sb_info *sbi) 1409{ 1410 int ret; 1411 ssize_t res; 1412 struct hmdfs_dentry_info *d_info = hmdfs_d(dentry); 1413 struct clearcache_item *item; 1414 struct file *filp = NULL; 1415 uint64_t hash; 1416 char *relative_path = NULL; 1417 char *dirname = NULL; 1418 char *fullname = NULL; 1419 char *cache_file_name = NULL; 1420 char *kvalue = NULL; 1421 1422 item = hmdfs_find_cache_item(CLOUD_DEVICE, dentry); 1423 if (item) { 1424 kref_put(&item->ref, release_cache_item); 1425 return 0; 1426 } 1427 1428 relative_path = hmdfs_get_dentry_relative_path(dentry); 1429 if (unlikely(!relative_path)) { 1430 hmdfs_err("get relative path failed %d", -ENOMEM); 1431 ret = -ENOMEM; 1432 goto out; 1433 } 1434 1435 dirname = kzalloc(PATH_MAX, GFP_KERNEL); 1436 if (!dirname) { 1437 ret = -ENOMEM; 1438 goto out; 1439 } 1440 1441 cache_file_name = kzalloc(PATH_MAX, GFP_KERNEL); 1442 if (!cache_file_name) { 1443 ret = -ENOMEM; 1444 goto out; 1445 } 1446 1447 fullname = kzalloc(PATH_MAX, GFP_KERNEL); 1448 if (!fullname) { 1449 ret = -ENOMEM; 1450 goto out; 1451 } 1452 1453 kvalue = kzalloc(PATH_MAX, GFP_KERNEL); 1454 if (!kvalue) { 1455 ret = -ENOMEM; 1456 goto out; 1457 } 1458 1459 hash = path_hash(relative_path, strlen(relative_path), 1460 sbi->s_case_sensitive); 1461 concat_cachefile_name(cache_file_name, hash, CLOUD_CID, false); 1462 snprintf(dirname, PATH_MAX, "%s/dentry_cache/cloud/", 1463 sbi->cache_dir); 1464 snprintf(fullname, PATH_MAX, "%s%s", dirname, cache_file_name); 1465 1466 filp = filp_open(fullname, O_RDWR | O_LARGEFILE, 0); 1467 if (IS_ERR(filp)) { 1468 hmdfs_debug("open fail %ld", PTR_ERR(filp)); 1469 ret = PTR_ERR(filp); 1470 goto out; 1471 } 1472 1473 res = __vfs_getxattr(file_dentry(filp), file_inode(filp), 1474 DENTRY_FILE_XATTR_NAME, kvalue, PATH_MAX); 1475 if (res <= 0 || res >= PATH_MAX) { 1476 hmdfs_err("getxattr return: %zd", res); 1477 filp_close(filp, NULL); 1478 ret = -ENOENT; 1479 goto out; 1480 } 1481 kvalue[res] = '\0'; 1482 1483 if (!path_cmp(relative_path, kvalue, sbi->s_case_sensitive)) { 1484 hmdfs_err("relative path from xattr do not match"); 1485 filp_close(filp, NULL); 1486 ret = -ENOENT; 1487 goto out; 1488 } 1489 1490 mutex_lock(&d_info->cache_pull_lock); 1491 hmdfs_add_cache_list(CLOUD_DEVICE, dentry, filp); 1492 mutex_unlock(&d_info->cache_pull_lock); 1493 1494 ret = 0; 1495out: 1496 kfree(relative_path); 1497 kfree(dirname); 1498 kfree(fullname); 1499 kfree(cache_file_name); 1500 kfree(kvalue); 1501 1502 return ret; 1503} 1504 1505void __destroy_cfn(struct list_head *head) 1506{ 1507 struct cache_file_node *cfn = NULL; 1508 struct cache_file_node *n = NULL; 1509 1510 list_for_each_entry_safe(cfn, n, head, list) { 1511 list_del_init(&cfn->list); 1512 release_cfn(cfn); 1513 } 1514} 1515 1516void hmdfs_cfn_destroy(struct hmdfs_sb_info *sbi) 1517{ 1518 mutex_lock(&sbi->cache_list_lock); 1519 __destroy_cfn(&sbi->client_cache); 1520 __destroy_cfn(&sbi->server_cache); 1521 mutex_unlock(&sbi->cache_list_lock); 1522} 1523 1524struct cache_file_node *find_cfn(struct hmdfs_sb_info *sbi, const char *cid, 1525 const char *path, bool server) 1526{ 1527 struct cache_file_node *cfn = NULL; 1528 1529 mutex_lock(&sbi->cache_list_lock); 1530 cfn = __find_cfn(sbi, cid, path, server); 1531 mutex_unlock(&sbi->cache_list_lock); 1532 return cfn; 1533} 1534 1535void release_cfn(struct cache_file_node *cfn) 1536{ 1537 if (refcount_dec_and_test(&cfn->ref)) 1538 free_cfn(cfn); 1539} 1540 1541void remove_cfn(struct cache_file_node *cfn) 1542{ 1543 struct hmdfs_sb_info *sbi = cfn->sbi; 1544 bool deleted; 1545 1546 mutex_lock(&sbi->cache_list_lock); 1547 deleted = list_empty(&cfn->list); 1548 if (!deleted) 1549 list_del_init(&cfn->list); 1550 mutex_unlock(&sbi->cache_list_lock); 1551 if (!deleted) { 1552 delete_dentry_file(cfn->filp); 1553 release_cfn(cfn); 1554 } 1555} 1556 1557int hmdfs_do_lock_file(struct file *filp, unsigned char fl_type, loff_t start, 1558 loff_t len) 1559{ 1560 struct file_lock fl; 1561 int err; 1562 1563 locks_init_lock(&fl); 1564 1565 fl.fl_type = fl_type; 1566 fl.fl_flags = FL_POSIX | FL_CLOSE | FL_SLEEP; 1567 fl.fl_start = start; 1568 fl.fl_end = start + len - 1; 1569 fl.fl_owner = filp; 1570 fl.fl_pid = current->tgid; 1571 fl.fl_file = filp; 1572 fl.fl_ops = NULL; 1573 fl.fl_lmops = NULL; 1574 1575 err = locks_lock_file_wait(filp, &fl); 1576 if (err) 1577 hmdfs_err("lock file wait failed: %d", err); 1578 1579 return err; 1580} 1581 1582int hmdfs_wlock_file(struct file *filp, loff_t start, loff_t len) 1583{ 1584 return hmdfs_do_lock_file(filp, F_WRLCK, start, len); 1585} 1586 1587int hmdfs_rlock_file(struct file *filp, loff_t start, loff_t len) 1588{ 1589 return hmdfs_do_lock_file(filp, F_RDLCK, start, len); 1590} 1591 1592int hmdfs_unlock_file(struct file *filp, loff_t start, loff_t len) 1593{ 1594 return hmdfs_do_lock_file(filp, F_UNLCK, start, len); 1595} 1596 1597long cache_file_truncate(struct hmdfs_sb_info *sbi, const struct path *path, 1598 loff_t length) 1599{ 1600 const struct cred *old_cred = hmdfs_override_creds(sbi->system_cred); 1601 long ret = vfs_truncate(path, length); 1602 1603 hmdfs_revert_creds(old_cred); 1604 1605 return ret; 1606} 1607 1608ssize_t cache_file_read(struct hmdfs_sb_info *sbi, struct file *filp, void *buf, 1609 size_t count, loff_t *pos) 1610{ 1611 const struct cred *old_cred = hmdfs_override_creds(sbi->system_cred); 1612 ssize_t ret = kernel_read(filp, buf, count, pos); 1613 1614 hmdfs_revert_creds(old_cred); 1615 1616 return ret; 1617} 1618 1619ssize_t cache_file_write(struct hmdfs_sb_info *sbi, struct file *filp, 1620 const void *buf, size_t count, loff_t *pos) 1621{ 1622 const struct cred *old_cred = hmdfs_override_creds(sbi->system_cred); 1623 ssize_t ret = kernel_write(filp, buf, count, pos); 1624 1625 hmdfs_revert_creds(old_cred); 1626 1627 return ret; 1628} 1629 1630 1631int read_header(struct hmdfs_sb_info *sbi, struct file *filp, 1632 struct hmdfs_dcache_header *header) 1633{ 1634 ssize_t bytes; 1635 loff_t pos = 0; 1636 1637 bytes = cache_file_read(sbi, filp, header, sizeof(*header), &pos); 1638 if (bytes != sizeof(*header)) { 1639 hmdfs_err("read file failed, err:%zd", bytes); 1640 return -EIO; 1641 } 1642 1643 return 0; 1644} 1645 1646static unsigned long long cache_get_dentry_count(struct hmdfs_sb_info *sbi, 1647 struct file *filp) 1648{ 1649 struct hmdfs_dcache_header header; 1650 int overallpage; 1651 1652 overallpage = get_dentry_group_cnt(file_inode(filp)); 1653 if (overallpage == 0) 1654 return 0; 1655 1656 if (read_header(sbi, filp, &header)) 1657 return 0; 1658 1659 return le64_to_cpu(header.num); 1660} 1661 1662static int cache_check_case_sensitive(struct hmdfs_sb_info *sbi, 1663 struct file *filp) 1664{ 1665 struct hmdfs_dcache_header header; 1666 1667 if (read_header(sbi, filp, &header)) 1668 return 0; 1669 1670 if (sbi->s_case_sensitive != (bool)header.case_sensitive) { 1671 hmdfs_info("Case sensitive inconsistent, current fs is: %d, cache is %d, will drop cache", 1672 sbi->s_case_sensitive, header.case_sensitive); 1673 return 0; 1674 } 1675 return 1; 1676} 1677 1678int write_header(struct file *filp, struct hmdfs_dcache_header *header) 1679{ 1680 loff_t pos = 0; 1681 ssize_t size; 1682 1683 size = kernel_write(filp, header, sizeof(*header), &pos); 1684 if (size != sizeof(*header)) { 1685 hmdfs_err("update dcache header failed %zd", size); 1686 return -EIO; 1687 } 1688 1689 return 0; 1690} 1691 1692void add_to_delete_list(struct hmdfs_sb_info *sbi, struct cache_file_node *cfn) 1693{ 1694 mutex_lock(&sbi->cache_list_lock); 1695 list_add_tail(&cfn->list, &sbi->to_delete); 1696 mutex_unlock(&sbi->cache_list_lock); 1697} 1698 1699void load_cfn(struct hmdfs_sb_info *sbi, const char *fullname, const char *path, 1700 const char *cid, bool server) 1701{ 1702 struct cache_file_node *cfn = NULL; 1703 struct cache_file_node *cfn1 = NULL; 1704 struct list_head *head = NULL; 1705 1706 cfn = create_cfn(sbi, path, cid, server); 1707 if (!cfn) 1708 return; 1709 1710 cfn->filp = filp_open(fullname, O_RDWR | O_LARGEFILE, 0); 1711 if (IS_ERR(cfn->filp)) { 1712 hmdfs_err("open fail %ld", PTR_ERR(cfn->filp)); 1713 goto out; 1714 } 1715 1716 if (cache_get_dentry_count(sbi, cfn->filp) < sbi->dcache_threshold && strcmp(cid, CLOUD_CID)) { 1717 add_to_delete_list(sbi, cfn); 1718 return; 1719 } 1720 1721 if (!cache_check_case_sensitive(sbi, cfn->filp) && strcmp(cid, CLOUD_CID)) { 1722 add_to_delete_list(sbi, cfn); 1723 return; 1724 } 1725 1726 head = get_list_head(sbi, server); 1727 1728 mutex_lock(&sbi->cache_list_lock); 1729 cfn1 = __find_cfn(sbi, cid, path, server); 1730 if (!cfn1) { 1731 list_add_tail(&cfn->list, head); 1732 } else { 1733 release_cfn(cfn1); 1734 mutex_unlock(&sbi->cache_list_lock); 1735 add_to_delete_list(sbi, cfn); 1736 return; 1737 } 1738 mutex_unlock(&sbi->cache_list_lock); 1739 1740 return; 1741out: 1742 free_cfn(cfn); 1743} 1744 1745static int get_cid_and_hash(const char *name, uint64_t *hash, char *cid) 1746{ 1747 int len; 1748 char *p = strstr(name, "_"); 1749 1750 if (!p) 1751 return -EINVAL; 1752 1753 len = p - name; 1754 if (len >= HMDFS_CFN_CID_SIZE) 1755 return -EINVAL; 1756 1757 memcpy(cid, name, len); 1758 cid[len] = '\0'; 1759 1760 if (sscanf(++p, "%llx", hash) != 1) 1761 return -EINVAL; 1762 return 0; 1763} 1764 1765static void store_one(const char *name, struct cache_file_callback *cb) 1766{ 1767 struct file *file = NULL; 1768 char *fullname = NULL; 1769 char *kvalue = NULL; 1770 char cid[HMDFS_CFN_CID_SIZE]; 1771 uint64_t hash; 1772 ssize_t error; 1773 1774 if (strlen(name) + strlen(cb->dirname) >= PATH_MAX) 1775 return; 1776 1777 fullname = kzalloc(PATH_MAX, GFP_KERNEL); 1778 if (!fullname) 1779 return; 1780 1781 snprintf(fullname, PATH_MAX, "%s%s", cb->dirname, name); 1782 1783 file = filp_open(fullname, O_RDWR | O_LARGEFILE, 0); 1784 if (IS_ERR(file)) { 1785 hmdfs_err("open fail %ld", PTR_ERR(file)); 1786 goto out; 1787 } 1788 1789 kvalue = kzalloc(PATH_MAX, GFP_KERNEL); 1790 if (!kvalue) 1791 goto out_file; 1792 1793 error = __vfs_getxattr(file_dentry(file), file_inode(file), 1794 DENTRY_FILE_XATTR_NAME, kvalue, PATH_MAX); 1795 if (error <= 0 || error >= PATH_MAX) { 1796 hmdfs_err("getxattr return: %zd", error); 1797 goto out_kvalue; 1798 } 1799 1800 kvalue[error] = '\0'; 1801 cid[0] = '\0'; 1802 1803 if (!cb->server) { 1804 if (get_cid_and_hash(name, &hash, cid)) { 1805 hmdfs_err("get cid and hash fail"); 1806 goto out_kvalue; 1807 } 1808 } 1809 1810 load_cfn(cb->sbi, fullname, kvalue, cid, cb->server); 1811 1812out_kvalue: 1813 kfree(kvalue); 1814out_file: 1815 filp_close(file, NULL); 1816out: 1817 kfree(fullname); 1818} 1819 1820static bool cache_file_iterate(struct dir_context *ctx, const char *name, 1821 int name_len, loff_t offset, u64 ino, 1822 unsigned int d_type) 1823{ 1824 struct cache_file_item *cfi = NULL; 1825 struct cache_file_callback *cb = 1826 container_of(ctx, struct cache_file_callback, ctx); 1827 1828 if (name_len > NAME_MAX) { 1829 hmdfs_err("name_len:%d NAME_MAX:%u", name_len, NAME_MAX); 1830 return true; 1831 } 1832 1833 if (d_type != DT_REG) 1834 return true; 1835 1836 cfi = kmalloc(sizeof(*cfi), GFP_KERNEL); 1837 if (!cfi) 1838 return false; 1839 1840 cfi->name = kstrndup(name, name_len, GFP_KERNEL); 1841 if (!cfi->name) { 1842 kfree(cfi); 1843 return false; 1844 } 1845 1846 list_add_tail(&cfi->list, &cb->list); 1847 1848 return true; 1849} 1850 1851void hmdfs_do_load(struct hmdfs_sb_info *sbi, const char *fullname, bool server) 1852{ 1853 struct file *file = NULL; 1854 struct path dirpath; 1855 int err; 1856 struct cache_file_item *cfi = NULL; 1857 struct cache_file_item *n = NULL; 1858 struct cache_file_callback cb = { 1859 .ctx.actor = cache_file_iterate, 1860 .ctx.pos = 0, 1861 .dirname = fullname, 1862 .sbi = sbi, 1863 .server = server, 1864 }; 1865 INIT_LIST_HEAD(&cb.list); 1866 1867 1868 err = kern_path(fullname, LOOKUP_DIRECTORY, &dirpath); 1869 if (err) { 1870 hmdfs_info("No file path"); 1871 return; 1872 } 1873 1874 file = dentry_open(&dirpath, O_RDONLY, current_cred()); 1875 if (IS_ERR_OR_NULL(file)) { 1876 hmdfs_err("dentry_open failed, error: %ld", PTR_ERR(file)); 1877 path_put(&dirpath); 1878 return; 1879 } 1880 1881 err = iterate_dir(file, &cb.ctx); 1882 if (err) 1883 hmdfs_err("iterate_dir failed, err: %d", err); 1884 1885 list_for_each_entry_safe(cfi, n, &cb.list, list) { 1886 store_one(cfi->name, &cb); 1887 list_del_init(&cfi->list); 1888 kfree(cfi->name); 1889 kfree(cfi); 1890 } 1891 1892 fput(file); 1893 path_put(&dirpath); 1894} 1895 1896/** 1897 * This function just used for delete dentryfile.dat 1898 */ 1899int delete_dentry_file(struct file *filp) 1900{ 1901 int err = 0; 1902 struct dentry *dentry = file_dentry(filp); 1903 struct dentry *parent = lock_parent(dentry); 1904 1905 if (dentry->d_parent == parent) { 1906 dget(dentry); 1907 err = vfs_unlink(&nop_mnt_idmap, d_inode(parent), dentry, NULL); 1908 dput(dentry); 1909 } 1910 unlock_dir(parent); 1911 1912 return err; 1913} 1914 1915void hmdfs_delete_useless_cfn(struct hmdfs_sb_info *sbi) 1916{ 1917 struct cache_file_node *cfn = NULL; 1918 struct cache_file_node *n = NULL; 1919 1920 mutex_lock(&sbi->cache_list_lock); 1921 1922 list_for_each_entry_safe(cfn, n, &sbi->to_delete, list) { 1923 delete_dentry_file(cfn->filp); 1924 list_del_init(&cfn->list); 1925 release_cfn(cfn); 1926 } 1927 mutex_unlock(&sbi->cache_list_lock); 1928} 1929 1930void hmdfs_cfn_load(struct hmdfs_sb_info *sbi) 1931{ 1932 char *fullname = NULL; 1933 1934 if (!sbi->s_dentry_cache) 1935 return; 1936 1937 fullname = kzalloc(PATH_MAX, GFP_KERNEL); 1938 if (!fullname) 1939 return; 1940 1941 snprintf(fullname, PATH_MAX, "%s/dentry_cache/client/", 1942 sbi->cache_dir); 1943 hmdfs_do_load(sbi, fullname, false); 1944 1945 snprintf(fullname, PATH_MAX, "%s/dentry_cache/server/", 1946 sbi->cache_dir); 1947 hmdfs_do_load(sbi, fullname, true); 1948 1949 kfree(fullname); 1950 1951 hmdfs_delete_useless_cfn(sbi); 1952} 1953 1954static void __cache_file_destroy_by_path(struct list_head *head, 1955 const char *path) 1956{ 1957 struct cache_file_node *cfn = NULL; 1958 struct cache_file_node *n = NULL; 1959 1960 list_for_each_entry_safe(cfn, n, head, list) { 1961 if (strcmp(path, cfn->relative_path) != 0) 1962 continue; 1963 list_del_init(&cfn->list); 1964 delete_dentry_file(cfn->filp); 1965 release_cfn(cfn); 1966 } 1967} 1968 1969static void cache_file_destroy_by_path(struct hmdfs_sb_info *sbi, 1970 const char *path) 1971{ 1972 mutex_lock(&sbi->cache_list_lock); 1973 1974 __cache_file_destroy_by_path(&sbi->server_cache, path); 1975 __cache_file_destroy_by_path(&sbi->client_cache, path); 1976 1977 mutex_unlock(&sbi->cache_list_lock); 1978} 1979 1980static void cache_file_find_and_delete(struct hmdfs_peer *con, 1981 const char *relative_path) 1982{ 1983 struct cache_file_node *cfn; 1984 1985 cfn = find_cfn(con->sbi, con->cid, relative_path, false); 1986 if (!cfn) 1987 return; 1988 1989 remove_cfn(cfn); 1990 release_cfn(cfn); 1991} 1992 1993void cache_file_delete_by_dentry(struct hmdfs_peer *con, struct dentry *dentry) 1994{ 1995 char *relative_path = NULL; 1996 1997 relative_path = hmdfs_get_dentry_relative_path(dentry); 1998 if (unlikely(!relative_path)) { 1999 hmdfs_err("get relative path failed %d", -ENOMEM); 2000 return; 2001 } 2002 cache_file_find_and_delete(con, relative_path); 2003 kfree(relative_path); 2004} 2005 2006struct file *hmdfs_get_new_dentry_file(struct hmdfs_peer *con, 2007 const char *relative_path, 2008 struct hmdfs_dcache_header *header) 2009{ 2010 struct hmdfs_sb_info *sbi = con->sbi; 2011 int len = strlen(relative_path); 2012 struct file *filp = NULL; 2013 int err; 2014 2015 filp = create_local_dentry_file_cache(sbi); 2016 if (IS_ERR(filp)) 2017 return filp; 2018 2019 err = hmdfs_client_start_readdir(con, filp, relative_path, len, header); 2020 if (err) { 2021 if (err != -ENOENT) 2022 hmdfs_err("readdir failed dev: %llu err: %d", 2023 con->device_id, err); 2024 fput(filp); 2025 filp = ERR_PTR(err); 2026 } 2027 2028 return filp; 2029} 2030 2031void add_cfn_to_item(struct dentry *dentry, struct hmdfs_peer *con, 2032 struct cache_file_node *cfn) 2033{ 2034 struct file *file = cfn->filp; 2035 int err; 2036 2037 err = hmdfs_add_cache_list(con->device_id, dentry, file); 2038 if (unlikely(err)) { 2039 hmdfs_err("add cache list failed devid:%llu err:%d", 2040 con->device_id, err); 2041 return; 2042 } 2043} 2044 2045int hmdfs_add_file_to_cache(struct dentry *dentry, struct hmdfs_peer *con, 2046 struct file *file, const char *relative_path) 2047{ 2048 struct hmdfs_sb_info *sbi = con->sbi; 2049 struct file *newf = file; 2050 2051 if (cache_get_dentry_count(sbi, file) >= sbi->dcache_threshold) 2052 newf = cache_file_persistent(con, file, relative_path, false); 2053 else 2054 cache_file_find_and_delete(con, relative_path); 2055 2056 return hmdfs_add_cache_list(con->device_id, dentry, newf); 2057} 2058 2059static struct file *read_header_and_revalidate(struct hmdfs_peer *con, 2060 struct file *filp, 2061 const char *relative_path) 2062{ 2063 struct hmdfs_dcache_header header; 2064 struct hmdfs_dcache_header *p = NULL; 2065 2066 if (read_header(con->sbi, filp, &header) == 0) 2067 p = &header; 2068 2069 return hmdfs_get_new_dentry_file(con, relative_path, p); 2070} 2071 2072void remote_file_revalidate_cfn(struct dentry *dentry, struct hmdfs_peer *con, 2073 struct cache_file_node *cfn, 2074 const char *relative_path) 2075{ 2076 struct file *file = NULL; 2077 int err; 2078 2079 file = read_header_and_revalidate(con, cfn->filp, relative_path); 2080 if (IS_ERR(file)) 2081 return; 2082 2083 /* 2084 * If the request returned ok but file length is 0, we assume 2085 * that the server verified the client cache file is uptodate. 2086 */ 2087 if (i_size_read(file->f_inode) == 0) { 2088 hmdfs_info("The cfn cache for dev:%llu is uptodate", 2089 con->device_id); 2090 fput(file); 2091 add_cfn_to_item(dentry, con, cfn); 2092 return; 2093 } 2094 2095 /* OK, cfn is not uptodate, let's remove it and add the new file */ 2096 remove_cfn(cfn); 2097 2098 err = hmdfs_add_file_to_cache(dentry, con, file, relative_path); 2099 if (unlikely(err)) 2100 hmdfs_err("add cache list failed devid:%llu err:%d", 2101 con->device_id, err); 2102 fput(file); 2103} 2104 2105void remote_file_revalidate_item(struct dentry *dentry, struct hmdfs_peer *con, 2106 struct clearcache_item *item, 2107 const char *relative_path) 2108{ 2109 struct file *file = NULL; 2110 int err; 2111 2112 file = read_header_and_revalidate(con, item->filp, relative_path); 2113 if (IS_ERR(file)) 2114 return; 2115 2116 /* 2117 * If the request returned ok but file length is 0, we assume 2118 * that the server verified the client cache file is uptodate. 2119 */ 2120 if (i_size_read(file->f_inode) == 0) { 2121 hmdfs_info("The item cache for dev:%llu is uptodate", 2122 con->device_id); 2123 item->time = jiffies; 2124 fput(file); 2125 return; 2126 } 2127 2128 /* We need to replace the old item */ 2129 remove_cache_item(item); 2130 cache_file_find_and_delete(con, relative_path); 2131 2132 err = hmdfs_add_file_to_cache(dentry, con, file, relative_path); 2133 if (unlikely(err)) 2134 hmdfs_err("add cache list failed devid:%llu err:%d", 2135 con->device_id, err); 2136 fput(file); 2137} 2138 2139bool get_remote_dentry_file(struct dentry *dentry, struct hmdfs_peer *con) 2140{ 2141 struct hmdfs_dentry_info *d_info = hmdfs_d(dentry); 2142 struct cache_file_node *cfn = NULL; 2143 struct hmdfs_sb_info *sbi = con->sbi; 2144 char *relative_path = NULL; 2145 int err = 0; 2146 struct file *filp = NULL; 2147 struct clearcache_item *item; 2148 2149 if (hmdfs_cache_revalidate(READ_ONCE(con->conn_time), con->device_id, 2150 dentry)) 2151 return false; 2152 2153 relative_path = hmdfs_get_dentry_relative_path(dentry); 2154 if (unlikely(!relative_path)) { 2155 hmdfs_err("get relative path failed %d", -ENOMEM); 2156 return false; 2157 } 2158 mutex_lock(&d_info->cache_pull_lock); 2159 if (hmdfs_cache_revalidate(READ_ONCE(con->conn_time), con->device_id, 2160 dentry)) 2161 goto out_unlock; 2162 2163 item = hmdfs_find_cache_item(con->device_id, dentry); 2164 if (item) { 2165 remote_file_revalidate_item(dentry, con, item, relative_path); 2166 kref_put(&item->ref, release_cache_item); 2167 goto out_unlock; 2168 } 2169 2170 cfn = find_cfn(sbi, con->cid, relative_path, false); 2171 if (cfn) { 2172 remote_file_revalidate_cfn(dentry, con, cfn, relative_path); 2173 release_cfn(cfn); 2174 goto out_unlock; 2175 } 2176 2177 filp = hmdfs_get_new_dentry_file(con, relative_path, NULL); 2178 if (IS_ERR(filp)) { 2179 err = PTR_ERR(filp); 2180 goto out_unlock; 2181 } 2182 2183 err = hmdfs_add_file_to_cache(dentry, con, filp, relative_path); 2184 if (unlikely(err)) 2185 hmdfs_err("add cache list failed devid:%lu err:%d", 2186 (unsigned long)con->device_id, err); 2187 fput(filp); 2188 2189out_unlock: 2190 mutex_unlock(&d_info->cache_pull_lock); 2191 if (err && err != -ENOENT) 2192 hmdfs_err("readdir failed dev:%lu err:%d", 2193 (unsigned long)con->device_id, err); 2194 kfree(relative_path); 2195 return true; 2196} 2197 2198int hmdfs_file_type(const char *name) 2199{ 2200 if (!name) 2201 return -EINVAL; 2202 2203 if (!strcmp(name, CURRENT_DIR) || !strcmp(name, PARENT_DIR)) 2204 return HMDFS_TYPE_DOT; 2205 2206 return HMDFS_TYPE_COMMON; 2207} 2208 2209struct clearcache_item *hmdfs_find_cache_item(uint64_t dev_id, 2210 struct dentry *dentry) 2211{ 2212 struct clearcache_item *item = NULL; 2213 struct hmdfs_dentry_info *d_info = hmdfs_d(dentry); 2214 2215 if (!d_info) 2216 return NULL; 2217 2218 spin_lock(&d_info->cache_list_lock); 2219 list_for_each_entry(item, &(d_info->cache_list_head), list) { 2220 if (dev_id == item->dev_id) { 2221 kref_get(&item->ref); 2222 spin_unlock(&d_info->cache_list_lock); 2223 return item; 2224 } 2225 } 2226 spin_unlock(&d_info->cache_list_lock); 2227 return NULL; 2228} 2229 2230bool hmdfs_cache_revalidate(unsigned long conn_time, uint64_t dev_id, 2231 struct dentry *dentry) 2232{ 2233 bool ret = false; 2234 struct clearcache_item *item = NULL; 2235 struct hmdfs_dentry_info *d_info = hmdfs_d(dentry); 2236 unsigned int timeout; 2237 2238 if (!d_info) 2239 return ret; 2240 2241 timeout = hmdfs_sb(dentry->d_sb)->dcache_timeout; 2242 spin_lock(&d_info->cache_list_lock); 2243 list_for_each_entry(item, &(d_info->cache_list_head), list) { 2244 if (dev_id == item->dev_id) { 2245 ret = cache_item_revalidate(conn_time, item->time, 2246 timeout); 2247 break; 2248 } 2249 } 2250 spin_unlock(&d_info->cache_list_lock); 2251 return ret; 2252} 2253 2254void remove_cache_item(struct clearcache_item *item) 2255{ 2256 bool deleted; 2257 2258 spin_lock(&item->d_info->cache_list_lock); 2259 deleted = list_empty(&item->list); 2260 if (!deleted) 2261 list_del_init(&item->list); 2262 spin_unlock(&item->d_info->cache_list_lock); 2263 if (!deleted) 2264 kref_put(&item->ref, release_cache_item); 2265} 2266 2267void release_cache_item(struct kref *ref) 2268{ 2269 struct clearcache_item *item = 2270 container_of(ref, struct clearcache_item, ref); 2271 2272 if (item->filp) 2273 fput(item->filp); 2274 kfree(item); 2275} 2276 2277void hmdfs_remove_cache_filp(struct hmdfs_peer *con, struct dentry *dentry) 2278{ 2279 struct clearcache_item *item = NULL; 2280 struct clearcache_item *item_temp = NULL; 2281 struct hmdfs_dentry_info *d_info = hmdfs_d(dentry); 2282 // struct path *lower_path = NULL; 2283 2284 if (!d_info) 2285 return; 2286 2287 spin_lock(&d_info->cache_list_lock); 2288 list_for_each_entry_safe(item, item_temp, &(d_info->cache_list_head), 2289 list) { 2290 if (con->device_id == item->dev_id) { 2291 list_del_init(&item->list); 2292 spin_unlock(&d_info->cache_list_lock); 2293 cache_file_delete_by_dentry(con, dentry); 2294 kref_put(&item->ref, release_cache_item); 2295 return; 2296 } 2297 } 2298 spin_unlock(&d_info->cache_list_lock); 2299} 2300 2301int hmdfs_add_cache_list(uint64_t dev_id, struct dentry *dentry, 2302 struct file *filp) 2303{ 2304 struct clearcache_item *item = NULL; 2305 struct hmdfs_dentry_info *d_info = hmdfs_d(dentry); 2306 2307 if (!d_info) 2308 return -ENOMEM; 2309 2310 item = kzalloc(sizeof(*item), GFP_KERNEL); 2311 if (!item) 2312 return -ENOMEM; 2313 2314 item->dev_id = dev_id; 2315 item->filp = get_file(filp); 2316 item->time = jiffies; 2317 item->d_info = d_info; 2318 kref_init(&item->ref); 2319 spin_lock(&d_info->cache_list_lock); 2320 list_add_tail(&(item->list), &(d_info->cache_list_head)); 2321 spin_unlock(&d_info->cache_list_lock); 2322 return 0; 2323} 2324 2325void hmdfs_add_remote_cache_list(struct hmdfs_peer *con, const char *dir_path) 2326{ 2327 int err = 0; 2328 struct remotecache_item *item = NULL; 2329 struct remotecache_item *item_temp = NULL; 2330 struct path path, root_path; 2331 struct hmdfs_dentry_info *d_info = NULL; 2332 2333 err = kern_path(con->sbi->local_dst, 0, &root_path); 2334 if (err) { 2335 hmdfs_err("kern_path failed err = %d", err); 2336 return; 2337 } 2338 2339 err = vfs_path_lookup(root_path.dentry, root_path.mnt, dir_path, 0, 2340 &path); 2341 if (err) 2342 goto out_put_root; 2343 2344 d_info = hmdfs_d(path.dentry); 2345 if (!d_info) { 2346 err = -EINVAL; 2347 goto out; 2348 } 2349 2350 /* find duplicate con */ 2351 mutex_lock(&d_info->remote_cache_list_lock); 2352 list_for_each_entry_safe(item, item_temp, 2353 &(d_info->remote_cache_list_head), list) { 2354 if (item->con->device_id == con->device_id) { 2355 mutex_unlock(&d_info->remote_cache_list_lock); 2356 goto out; 2357 } 2358 } 2359 2360 item = kzalloc(sizeof(*item), GFP_KERNEL); 2361 if (!item) { 2362 err = -ENOMEM; 2363 mutex_unlock(&d_info->remote_cache_list_lock); 2364 goto out; 2365 } 2366 2367 item->con = con; 2368 item->drop_flag = 0; 2369 list_add(&(item->list), &(d_info->remote_cache_list_head)); 2370 mutex_unlock(&d_info->remote_cache_list_lock); 2371 2372out: 2373 path_put(&path); 2374out_put_root: 2375 path_put(&root_path); 2376} 2377 2378int hmdfs_drop_remote_cache_dents(struct dentry *dentry) 2379{ 2380 struct path lower_path; 2381 struct inode *lower_inode = NULL; 2382 struct remotecache_item *item = NULL; 2383 struct remotecache_item *item_temp = NULL; 2384 struct hmdfs_dentry_info *d_info = NULL; 2385 char *relative_path = NULL; 2386 2387 if (!dentry) { 2388 hmdfs_err("dentry null and return"); 2389 return 0; 2390 } 2391 2392 d_info = hmdfs_d(dentry); 2393 if (!d_info) { 2394 hmdfs_err("d_info null and return"); 2395 return 0; 2396 } 2397 hmdfs_get_lower_path(dentry, &lower_path); 2398 if (IS_ERR_OR_NULL(lower_path.dentry)) { 2399 hmdfs_put_lower_path(&lower_path); 2400 return 0; 2401 } 2402 lower_inode = d_inode(lower_path.dentry); 2403 hmdfs_put_lower_path(&lower_path); 2404 if (IS_ERR_OR_NULL(lower_inode)) 2405 return 0; 2406 /* only for directory */ 2407 if (!S_ISDIR(lower_inode->i_mode)) 2408 return 0; 2409 2410 relative_path = hmdfs_get_dentry_relative_path(dentry); 2411 if (!relative_path) { 2412 hmdfs_err("get dentry relative path failed"); 2413 return 0; 2414 } 2415 mutex_lock(&d_info->remote_cache_list_lock); 2416 list_for_each_entry_safe(item, item_temp, 2417 &(d_info->remote_cache_list_head), list) { 2418 if (item->drop_flag) { 2419 item->drop_flag = 0; 2420 continue; 2421 } 2422 mutex_unlock(&d_info->remote_cache_list_lock); 2423 hmdfs_send_drop_push(item->con, relative_path); 2424 mutex_lock(&d_info->remote_cache_list_lock); 2425 list_del(&item->list); 2426 kfree(item); 2427 } 2428 mutex_unlock(&d_info->remote_cache_list_lock); 2429 2430 kfree(relative_path); 2431 return 0; 2432} 2433 2434/* Clear the dentry cache files of target directory */ 2435int hmdfs_clear_cache_dents(struct dentry *dentry, bool remove_cache) 2436{ 2437 struct clearcache_item *item = NULL; 2438 struct clearcache_item *item_temp = NULL; 2439 struct hmdfs_dentry_info *d_info = hmdfs_d(dentry); 2440 char *path = NULL; 2441 2442 if (!d_info) 2443 return 0; 2444 2445 spin_lock(&d_info->cache_list_lock); 2446 list_for_each_entry_safe(item, item_temp, &(d_info->cache_list_head), 2447 list) { 2448 list_del_init(&item->list); 2449 kref_put(&item->ref, release_cache_item); 2450 } 2451 spin_unlock(&d_info->cache_list_lock); 2452 2453 if (!remove_cache) 2454 return 0; 2455 2456 /* it also need confirm that there are no dentryfile_dev* 2457 * under this dentry 2458 */ 2459 path = hmdfs_get_dentry_relative_path(dentry); 2460 2461 if (unlikely(!path)) { 2462 hmdfs_err("get relative path failed"); 2463 return 0; 2464 } 2465 2466 cache_file_destroy_by_path(hmdfs_sb(dentry->d_sb), path); 2467 2468 kfree(path); 2469 return 0; 2470} 2471 2472void hmdfs_mark_drop_flag(uint64_t device_id, struct dentry *dentry) 2473{ 2474 struct remotecache_item *item = NULL; 2475 struct hmdfs_dentry_info *d_info = NULL; 2476 2477 d_info = hmdfs_d(dentry); 2478 if (!d_info) { 2479 hmdfs_err("d_info null and return"); 2480 return; 2481 } 2482 2483 mutex_lock(&d_info->remote_cache_list_lock); 2484 list_for_each_entry(item, &(d_info->remote_cache_list_head), list) { 2485 if (item->con->device_id == device_id) { 2486 item->drop_flag = 1; 2487 break; 2488 } 2489 } 2490 mutex_unlock(&d_info->remote_cache_list_lock); 2491} 2492 2493void hmdfs_clear_drop_flag(struct dentry *dentry) 2494{ 2495 struct remotecache_item *item = NULL; 2496 struct hmdfs_dentry_info *d_info = NULL; 2497 2498 if (!dentry) { 2499 hmdfs_err("dentry null and return"); 2500 return; 2501 } 2502 2503 d_info = hmdfs_d(dentry); 2504 if (!d_info) { 2505 hmdfs_err("d_info null and return"); 2506 return; 2507 } 2508 2509 mutex_lock(&d_info->remote_cache_list_lock); 2510 list_for_each_entry(item, &(d_info->remote_cache_list_head), list) { 2511 if (item->drop_flag) 2512 item->drop_flag = 0; 2513 } 2514 mutex_unlock(&d_info->remote_cache_list_lock); 2515} 2516 2517#define DUSTBIN_SUFFIX ".hwbk" 2518static void hmdfs_rename_bak(struct dentry *dentry) 2519{ 2520 struct path lower_path; 2521 struct dentry *lower_parent = NULL; 2522 struct dentry *lower_dentry = NULL; 2523 struct dentry *new_dentry = NULL; 2524 struct renamedata rename_data; 2525 char *name = NULL; 2526 int len = 0; 2527 int err = 0; 2528 2529 hmdfs_get_lower_path(dentry, &lower_path); 2530 lower_dentry = lower_path.dentry; 2531 len = strlen(lower_dentry->d_name.name) + strlen(DUSTBIN_SUFFIX) + 2; 2532 if (len >= NAME_MAX) { 2533 err = -ENAMETOOLONG; 2534 goto put_lower_path; 2535 } 2536 2537 name = kmalloc(len, GFP_KERNEL); 2538 if (!name) { 2539 err = -ENOMEM; 2540 goto put_lower_path; 2541 } 2542 2543 snprintf(name, len, ".%s%s", lower_dentry->d_name.name, DUSTBIN_SUFFIX); 2544 err = mnt_want_write(lower_path.mnt); 2545 if (err) { 2546 hmdfs_info("get write access failed, err %d", err); 2547 goto free_name; 2548 } 2549 2550 lower_parent = lock_parent(lower_dentry); 2551 new_dentry = lookup_one_len(name, lower_parent, strlen(name)); 2552 if (IS_ERR(new_dentry)) { 2553 err = PTR_ERR(new_dentry); 2554 hmdfs_info("lookup new dentry failed, err %d", err); 2555 goto unlock_parent; 2556 } 2557 2558 rename_data.old_mnt_idmap = &nop_mnt_idmap; 2559 rename_data.old_dir = d_inode(lower_parent); 2560 rename_data.old_dentry = lower_dentry; 2561 rename_data.new_mnt_idmap = &nop_mnt_idmap; 2562 rename_data.new_dir = d_inode(lower_parent); 2563 rename_data.new_dentry = new_dentry; 2564 rename_data.flags = 0; 2565 err = vfs_rename(&rename_data); 2566 2567 dput(new_dentry); 2568unlock_parent: 2569 unlock_dir(lower_parent); 2570 mnt_drop_write(lower_path.mnt); 2571free_name: 2572 kfree(name); 2573put_lower_path: 2574 hmdfs_put_lower_path(&lower_path); 2575 2576 if (err) 2577 hmdfs_err("failed to rename file, err %d", err); 2578} 2579 2580int hmdfs_root_unlink(uint64_t device_id, struct path *root_path, 2581 const char *unlink_dir, const char *unlink_name) 2582{ 2583 int err = 0; 2584 struct path path; 2585 struct dentry *child_dentry = NULL; 2586 struct inode *dir = NULL; 2587 struct inode *child_inode = NULL; 2588 kuid_t tmp_uid; 2589 2590 err = vfs_path_lookup(root_path->dentry, root_path->mnt, 2591 unlink_dir, LOOKUP_DIRECTORY, &path); 2592 if (err) { 2593 hmdfs_err("found path failed err = %d", err); 2594 return err; 2595 } 2596 dir = d_inode(path.dentry); 2597 inode_lock_nested(dir, I_MUTEX_PARENT); 2598 2599 child_dentry = lookup_one_len(unlink_name, path.dentry, 2600 strlen(unlink_name)); 2601 if (IS_ERR(child_dentry)) { 2602 err = PTR_ERR(child_dentry); 2603 hmdfs_err("lookup_one_len failed, err = %d", err); 2604 goto unlock_out; 2605 } 2606 if (d_is_negative(child_dentry)) { 2607 err = -ENOENT; 2608 dput(child_dentry); 2609 goto unlock_out; 2610 } 2611 child_inode = d_inode(child_dentry); 2612 if (!child_inode) 2613 goto unlock_out; 2614 2615 tmp_uid = hmdfs_override_inode_uid(dir); 2616 2617 hmdfs_mark_drop_flag(device_id, path.dentry); 2618 ihold(child_inode); 2619 err = vfs_unlink(&nop_mnt_idmap, dir, child_dentry, NULL); 2620 /* 2621 * -EOWNERDEAD means we want to put the file in a specail dir instead of 2622 * deleting it, specifically dustbin in phone, so that user can 2623 * recover the deleted images and videos. 2624 */ 2625 if (err == -EOWNERDEAD) { 2626 hmdfs_rename_bak(child_dentry); 2627 err = 0; 2628 } 2629 if (err) 2630 hmdfs_err("unlink path failed err = %d", err); 2631 hmdfs_revert_inode_uid(dir, tmp_uid); 2632 dput(child_dentry); 2633 2634unlock_out: 2635 inode_unlock(dir); 2636 if (child_inode) 2637 iput(child_inode); 2638 path_put(&path); 2639 return err; 2640} 2641 2642struct dentry *hmdfs_root_mkdir(uint64_t device_id, const char *local_dst_path, 2643 const char *mkdir_dir, const char *mkdir_name, 2644 umode_t mode) 2645{ 2646 int err; 2647 struct path path; 2648 struct dentry *child_dentry = NULL; 2649 struct dentry *ret = NULL; 2650 char *mkdir_path = NULL; 2651 char *mkdir_abs_path = NULL; 2652 2653 mkdir_path = hmdfs_connect_path(mkdir_dir, mkdir_name); 2654 if (!mkdir_path) 2655 return ERR_PTR(-EACCES); 2656 2657 mkdir_abs_path = 2658 hmdfs_get_dentry_absolute_path(local_dst_path, mkdir_path); 2659 if (!mkdir_abs_path) { 2660 ret = ERR_PTR(-ENOMEM); 2661 goto out; 2662 } 2663 2664 child_dentry = kern_path_create(AT_FDCWD, mkdir_abs_path, 2665 &path, LOOKUP_DIRECTORY); 2666 if (IS_ERR(child_dentry)) { 2667 ret = child_dentry; 2668 goto out; 2669 } 2670 2671 hmdfs_mark_drop_flag(device_id, child_dentry->d_parent); 2672 err = vfs_mkdir(&nop_mnt_idmap, d_inode(path.dentry), child_dentry, mode); 2673 if (err) { 2674 hmdfs_err("mkdir failed! err=%d", err); 2675 ret = ERR_PTR(err); 2676 goto out_put; 2677 } 2678 ret = dget(child_dentry); 2679out_put: 2680 done_path_create(&path, child_dentry); 2681out: 2682 kfree(mkdir_path); 2683 kfree(mkdir_abs_path); 2684 return ret; 2685} 2686 2687struct dentry *hmdfs_root_create(uint64_t device_id, const char *local_dst_path, 2688 const char *create_dir, 2689 const char *create_name, 2690 umode_t mode, bool want_excl) 2691{ 2692 int err; 2693 struct path path; 2694 struct dentry *child_dentry = NULL; 2695 struct dentry *ret = NULL; 2696 char *create_path = NULL; 2697 char *create_abs_path = NULL; 2698 2699 create_path = hmdfs_connect_path(create_dir, create_name); 2700 if (!create_path) 2701 return ERR_PTR(-EACCES); 2702 2703 create_abs_path = 2704 hmdfs_get_dentry_absolute_path(local_dst_path, create_path); 2705 if (!create_abs_path) { 2706 ret = ERR_PTR(-ENOMEM); 2707 goto out; 2708 } 2709 2710 child_dentry = kern_path_create(AT_FDCWD, create_abs_path, &path, 0); 2711 2712 if (IS_ERR(child_dentry)) { 2713 ret = child_dentry; 2714 goto out; 2715 } 2716 hmdfs_mark_drop_flag(device_id, child_dentry->d_parent); 2717 err = vfs_create(&nop_mnt_idmap, d_inode(path.dentry), child_dentry, mode, want_excl); 2718 if (err) { 2719 hmdfs_err("path create failed! err=%d", err); 2720 ret = ERR_PTR(err); 2721 goto out_put; 2722 } 2723 ret = dget(child_dentry); 2724out_put: 2725 done_path_create(&path, child_dentry); 2726out: 2727 kfree(create_path); 2728 kfree(create_abs_path); 2729 return ret; 2730} 2731 2732int hmdfs_root_rmdir(uint64_t device_id, struct path *root_path, 2733 const char *rmdir_dir, const char *rmdir_name) 2734{ 2735 int err = 0; 2736 struct path path; 2737 struct dentry *child_dentry = NULL; 2738 struct inode *dir = NULL; 2739 2740 err = vfs_path_lookup(root_path->dentry, root_path->mnt, 2741 rmdir_dir, LOOKUP_DIRECTORY, &path); 2742 if (err) { 2743 hmdfs_err("found path failed err = %d", err); 2744 return err; 2745 } 2746 dir = d_inode(path.dentry); 2747 inode_lock_nested(dir, I_MUTEX_PARENT); 2748 2749 child_dentry = lookup_one_len(rmdir_name, path.dentry, 2750 strlen(rmdir_name)); 2751 if (IS_ERR(child_dentry)) { 2752 err = PTR_ERR(child_dentry); 2753 hmdfs_err("lookup_one_len failed, err = %d", err); 2754 goto unlock_out; 2755 } 2756 if (d_is_negative(child_dentry)) { 2757 err = -ENOENT; 2758 dput(child_dentry); 2759 goto unlock_out; 2760 } 2761 2762 hmdfs_mark_drop_flag(device_id, path.dentry); 2763 err = vfs_rmdir(&nop_mnt_idmap, dir, child_dentry); 2764 if (err) 2765 hmdfs_err("rmdir failed err = %d", err); 2766 dput(child_dentry); 2767 2768unlock_out: 2769 inode_unlock(dir); 2770 path_put(&path); 2771 return err; 2772} 2773 2774int hmdfs_root_rename(struct hmdfs_sb_info *sbi, uint64_t device_id, 2775 const char *oldpath, const char *oldname, 2776 const char *newpath, const char *newname, 2777 unsigned int flags) 2778{ 2779 int err = 0; 2780 struct path path_dst; 2781 struct path path_old; 2782 struct path path_new; 2783 struct dentry *trap = NULL; 2784 struct dentry *old_dentry = NULL; 2785 struct dentry *new_dentry = NULL; 2786 struct renamedata rename_data; 2787 2788 err = kern_path(sbi->local_dst, 0, &path_dst); 2789 if (err) { 2790 hmdfs_err("kern_path for local dst failed %d", err); 2791 return err; 2792 } 2793 2794 err = vfs_path_lookup(path_dst.dentry, path_dst.mnt, oldpath, 0, 2795 &path_old); 2796 if (err) { 2797 hmdfs_info("lookup oldpath from local_dst failed, err %d", err); 2798 goto put_path_dst; 2799 } 2800 2801 err = vfs_path_lookup(path_dst.dentry, path_dst.mnt, newpath, 0, 2802 &path_new); 2803 if (err) { 2804 hmdfs_info("lookup newpath from local_dst failed, err %d", err); 2805 goto put_path_old; 2806 } 2807 2808 err = mnt_want_write(path_dst.mnt); 2809 if (err) { 2810 hmdfs_info("get write access failed for local_dst, err %d", 2811 err); 2812 goto put_path_new; 2813 } 2814 2815 trap = lock_rename(path_new.dentry, path_old.dentry); 2816 2817 old_dentry = lookup_one_len(oldname, path_old.dentry, strlen(oldname)); 2818 if (IS_ERR(old_dentry)) { 2819 err = PTR_ERR(old_dentry); 2820 hmdfs_info("lookup old dentry failed, err %d", err); 2821 goto unlock; 2822 } 2823 2824 /* source should not be ancestor of target */ 2825 if (old_dentry == trap) { 2826 err = -EINVAL; 2827 goto put_old_dentry; 2828 } 2829 2830 new_dentry = lookup_one_len(newname, path_new.dentry, strlen(newname)); 2831 if (IS_ERR(new_dentry)) { 2832 err = PTR_ERR(new_dentry); 2833 hmdfs_info("lookup new dentry failed, err %d", err); 2834 goto put_old_dentry; 2835 } 2836 2837 /* 2838 * Exchange rename is not supported, thus target should not be an 2839 * ancestor of source. 2840 */ 2841 if (trap == new_dentry) { 2842 err = -ENOTEMPTY; 2843 goto put_new_dentry; 2844 } 2845 2846 if (d_is_positive(new_dentry) && (flags & RENAME_NOREPLACE)) { 2847 err = -EEXIST; 2848 goto put_new_dentry; 2849 } 2850 2851 hmdfs_mark_drop_flag(device_id, path_old.dentry); 2852 if (path_old.dentry != path_new.dentry) 2853 hmdfs_mark_drop_flag(device_id, path_new.dentry); 2854 2855 rename_data.old_mnt_idmap = &nop_mnt_idmap; 2856 rename_data.old_dir = d_inode(path_old.dentry); 2857 rename_data.old_dentry = old_dentry; 2858 rename_data.new_mnt_idmap = &nop_mnt_idmap; 2859 rename_data.new_dir = d_inode(path_new.dentry); 2860 rename_data.new_dentry = new_dentry; 2861 rename_data.flags = flags; 2862 err = vfs_rename(&rename_data); 2863 2864put_new_dentry: 2865 dput(new_dentry); 2866put_old_dentry: 2867 dput(old_dentry); 2868unlock: 2869 unlock_rename(path_new.dentry, path_old.dentry); 2870 mnt_drop_write(path_dst.mnt); 2871put_path_new: 2872 path_put(&path_new); 2873put_path_old: 2874 path_put(&path_old); 2875put_path_dst: 2876 path_put(&path_dst); 2877 2878 return err; 2879} 2880 2881int hmdfs_get_path_in_sb(struct super_block *sb, const char *name, 2882 unsigned int flags, struct path *path) 2883{ 2884 int err; 2885 2886 err = kern_path(name, flags, path); 2887 if (err) { 2888 hmdfs_err("can't get %s %d\n", name, err); 2889 return err; 2890 } 2891 2892 /* should ensure the path is belong sb */ 2893 if (path->dentry->d_sb != sb) { 2894 err = -EINVAL; 2895 hmdfs_err("Wrong sb: %s on %s", name, 2896 path->dentry->d_sb->s_type->name); 2897 path_put(path); 2898 } 2899 2900 return err; 2901} 2902