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 
is_dot_dotdot(const unsigned char *name, __u32 len)29 static 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 
str2hashbuf(const unsigned char *msg, size_t len, unsigned int *buf, int num, bool case_sense)40 static 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 
tea_transform(unsigned int buf[4], unsigned int const in[])72 static 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 
hmdfs_dentry_hash(const struct qstr *qstr, bool case_sense)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 
119 static atomic_t curr_ino = ATOMIC_INIT(INUNUMBER_START);
get_inonumber(void)120 int get_inonumber(void)
121 {
122 	return atomic_inc_return(&curr_ino);
123 }
124 
hmdfs_get_root_dentry_type(struct dentry *dentry, int *is_root)125 static 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 
prepend(char **buffer, int *buflen, const char *str, int namelen)152 static 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 
prepend_name(char **buffer, int *buflen, const struct qstr *name)162 static 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 
hmdfs_dentry_path_raw(struct dentry *d, char *buf, int buflen)183 static 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();
204 restart:
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;
236 Elong:
237 	return ERR_PTR(-ENAMETOOLONG);
238 }
239 
hmdfs_get_dentry_relative_path(struct dentry *dentry)240 char *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 
hmdfs_merge_dentry_path_raw(struct dentry *d, char *buf, int buflen)279 static 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();
290 restart:
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;
321 Elong:
322 	return ERR_PTR(-ENAMETOOLONG);
323 }
324 
hmdfs_merge_get_dentry_relative_path(struct dentry *dentry)325 char *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 
hmdfs_get_dentry_absolute_path(const char *rootdir, const char *relative_path)364 char *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 
hmdfs_connect_path(const char *path, const char *name)383 char *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 
hmdfs_metainfo_read_nocred(struct file *filp, void *buffer, int size, int bidx)406 int 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 
hmdfs_metainfo_read(struct hmdfs_sb_info *sbi, struct file *filp, void *buffer, int size, int bidx)414 int 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 
hmdfs_metainfo_write(struct hmdfs_sb_info *sbi, struct file *filp, const void *buffer, int size, int bidx)422 int 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  */
get_bucketaddr(unsigned int level, __u64 buckoffset)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 
get_bucket_by_level(unsigned int level)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 
get_overall_bucket(unsigned int level)470 static __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 
get_dcache_file_size(unsigned int level)482 static 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 
get_relative_path(struct hmdfs_sb_info *sbi, char *from)489 static 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 
hmdfs_get_or_create_dents(struct hmdfs_sb_info *sbi, char *name)503 struct 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 
534 err_lookup_path:
535 	path_put(&path);
536 err_root_path:
537 	path_put(&root_path);
538 	return filp;
539 }
540 
541 /* read all dentry in target path directory */
read_dentry(struct hmdfs_sb_info *sbi, char *file_name, struct dir_context *ctx)542 int 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 
615 done:
616 	hmdfs_revert_fsids(saved_cred);
617 	kfree(dentry_group);
618 	fput(handler);
619 	return iterate_result;
620 }
621 
get_max_depth(struct file *filp)622 unsigned 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 
find_dentry_page(struct hmdfs_sb_info *sbi, pgoff_t index, struct file *filp)631 struct 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 
write_dentry_page(struct file *filp, const void *buffer, int buffersize, loff_t position)661 static 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 
find_in_block(struct hmdfs_dentry_group *dentry_blk, __u32 namehash, const struct qstr *qstr, struct hmdfs_dentry **insense_de, bool case_sense)673 static 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;
710 found:
711 	return de;
712 }
713 
hmdfs_in_level(struct dentry *child_dentry, unsigned int level, struct hmdfs_dcache_lookup_ctx *ctx)714 static 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 
hmdfs_find_dentry(struct dentry *child_dentry, struct hmdfs_dcache_lookup_ctx *ctx)755 struct 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 
update_dentry(struct hmdfs_dentry_group *d, struct dentry *child_dentry, struct inode *inode, struct super_block *hmdfs_sb, __u32 name_hash, unsigned int bit_pos)790 void 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 
room_for_filename(const void *bitmap, int slots, int max_slots)835 int room_for_filename(const void *bitmap, int slots, int max_slots)
836 {
837 	int bit_start = 0;
838 	int zero_start, zero_end;
839 next:
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 
create_in_cache_file(uint64_t dev_id, struct dentry *dentry)855 void 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 
create_dentry(struct dentry *child_dentry, struct inode *inode, struct file *file, struct hmdfs_sb_info *sbi)872 int 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 	}
893 find:
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;
934 add:
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);
943 out:
944 	kfree(dentry_blk);
945 out_err:
946 	return ret;
947 }
948 
hmdfs_init_dcache_lookup_ctx(struct hmdfs_dcache_lookup_ctx *ctx, struct hmdfs_sb_info *sbi, const struct qstr *qstr, struct file *filp)949 void 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 
update_inode_to_dentry(struct dentry *child_dentry, struct inode *inode)963 int 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);
1003 out_cfn:
1004 	release_cfn(cfn);
1005 out:
1006 	kfree(relative_path);
1007 	return 0;
1008 }
1009 
hmdfs_delete_dentry(struct dentry *d, struct file *filp)1010 void 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 
hmdfs_get_cache_path(struct hmdfs_sb_info *sbi, struct path *dir)1041 static 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 
hmdfs_put_cache_path(struct hmdfs_sb_info *sbi, struct path *dir)1058 static 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 
create_local_dentry_file_cache(struct hmdfs_sb_info *sbi)1065 struct 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);
1086 out:
1087 	hmdfs_revert_creds(old_cred);
1088 	return filp;
1089 }
1090 
hmdfs_linkat(struct path *old_path, const char *newname)1091 static 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 
1111 out_dput:
1112 	done_path_create(&new_path, new_dentry);
1113 	return error;
1114 }
1115 
cache_file_mkdir(const char *name, umode_t mode)1116 static 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 
cache_file_create_path(const char *fullpath)1134 static 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 
hmdfs_cache_path_create(char *s, const char *dir, bool server)1160 static 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 
concat_cachefile_name(char *s, uint64_t hash, const char *id, bool server)1168 static 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 
cache_file_name_generate(char *fullname, struct hmdfs_peer *con, const char *relative_path, bool server)1179 int 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 
free_cfn(struct cache_file_node *cfn)1205 static 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 
path_cmp(const char *path1, const char *path2, bool case_sensitive)1214 static 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 
dentry_file_match(struct cache_file_node *cfn, const char *id, const char *path)1226 static 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 
__find_cfn(struct hmdfs_sb_info *sbi, const char *cid, const char *path, bool server)1233 struct 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 
create_cfn(struct hmdfs_sb_info *sbi, const char *path, const char *cid, bool server)1250 struct 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;
1268 out:
1269 	free_cfn(cfn);
1270 	return NULL;
1271 }
1272 
insert_cfn(struct hmdfs_sb_info *sbi, const char *filename, const char *path, const char *cid, bool server)1273 static 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;
1310 out:
1311 	free_cfn(cfn);
1312 	return filp;
1313 }
1314 
hmdfs_rename_dentry(struct dentry *old_dentry, struct dentry *new_dentry, struct file *old_filp, struct file *new_filp)1315 int 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  */
cache_file_persistent(struct hmdfs_peer *con, struct file *filp, const char *relative_path, bool server)1350 struct 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;
1403 out:
1404 	kfree(fullname);
1405 	return filp;
1406 }
1407 
get_cloud_cache_file(struct dentry *dentry, struct hmdfs_sb_info *sbi)1408 int 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;
1495 out:
1496 	kfree(relative_path);
1497 	kfree(dirname);
1498 	kfree(fullname);
1499 	kfree(cache_file_name);
1500 	kfree(kvalue);
1501 
1502 	return ret;
1503 }
1504 
__destroy_cfn(struct list_head *head)1505 void __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 
hmdfs_cfn_destroy(struct hmdfs_sb_info *sbi)1516 void 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 
find_cfn(struct hmdfs_sb_info *sbi, const char *cid, const char *path, bool server)1524 struct 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 
release_cfn(struct cache_file_node *cfn)1535 void release_cfn(struct cache_file_node *cfn)
1536 {
1537 	if (refcount_dec_and_test(&cfn->ref))
1538 		free_cfn(cfn);
1539 }
1540 
remove_cfn(struct cache_file_node *cfn)1541 void 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 
hmdfs_do_lock_file(struct file *filp, unsigned char fl_type, loff_t start, loff_t len)1557 int 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 
hmdfs_wlock_file(struct file *filp, loff_t start, loff_t len)1582 int 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 
hmdfs_rlock_file(struct file *filp, loff_t start, loff_t len)1587 int 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 
hmdfs_unlock_file(struct file *filp, loff_t start, loff_t len)1592 int 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 
cache_file_truncate(struct hmdfs_sb_info *sbi, const struct path *path, loff_t length)1597 long 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 
cache_file_read(struct hmdfs_sb_info *sbi, struct file *filp, void *buf, size_t count, loff_t *pos)1608 ssize_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 
cache_file_write(struct hmdfs_sb_info *sbi, struct file *filp, const void *buf, size_t count, loff_t *pos)1619 ssize_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 
read_header(struct hmdfs_sb_info *sbi, struct file *filp, struct hmdfs_dcache_header *header)1631 int 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 
cache_get_dentry_count(struct hmdfs_sb_info *sbi, struct file *filp)1646 static 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 
cache_check_case_sensitive(struct hmdfs_sb_info *sbi, struct file *filp)1662 static 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 
write_header(struct file *filp, struct hmdfs_dcache_header *header)1678 int 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 
add_to_delete_list(struct hmdfs_sb_info *sbi, struct cache_file_node *cfn)1692 void 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 
load_cfn(struct hmdfs_sb_info *sbi, const char *fullname, const char *path, const char *cid, bool server)1699 void 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;
1741 out:
1742 	free_cfn(cfn);
1743 }
1744 
get_cid_and_hash(const char *name, uint64_t *hash, char *cid)1745 static 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 
store_one(const char *name, struct cache_file_callback *cb)1765 static 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 
1812 out_kvalue:
1813 	kfree(kvalue);
1814 out_file:
1815 	filp_close(file, NULL);
1816 out:
1817 	kfree(fullname);
1818 }
1819 
cache_file_iterate(struct dir_context *ctx, const char *name, int name_len, loff_t offset, u64 ino, unsigned int d_type)1820 static 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 
hmdfs_do_load(struct hmdfs_sb_info *sbi, const char *fullname, bool server)1851 void 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  */
delete_dentry_file(struct file *filp)1899 int 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 
hmdfs_delete_useless_cfn(struct hmdfs_sb_info *sbi)1915 void 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 
hmdfs_cfn_load(struct hmdfs_sb_info *sbi)1930 void 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 
__cache_file_destroy_by_path(struct list_head *head, const char *path)1954 static 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 
cache_file_destroy_by_path(struct hmdfs_sb_info *sbi, const char *path)1969 static 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 
cache_file_find_and_delete(struct hmdfs_peer *con, const char *relative_path)1980 static 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 
cache_file_delete_by_dentry(struct hmdfs_peer *con, struct dentry *dentry)1993 void 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 
hmdfs_get_new_dentry_file(struct hmdfs_peer *con, const char *relative_path, struct hmdfs_dcache_header *header)2006 struct 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 
add_cfn_to_item(struct dentry *dentry, struct hmdfs_peer *con, struct cache_file_node *cfn)2031 void 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 
hmdfs_add_file_to_cache(struct dentry *dentry, struct hmdfs_peer *con, struct file *file, const char *relative_path)2045 int 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 
read_header_and_revalidate(struct hmdfs_peer *con, struct file *filp, const char *relative_path)2059 static 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 
remote_file_revalidate_cfn(struct dentry *dentry, struct hmdfs_peer *con, struct cache_file_node *cfn, const char *relative_path)2072 void 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 
remote_file_revalidate_item(struct dentry *dentry, struct hmdfs_peer *con, struct clearcache_item *item, const char *relative_path)2105 void 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 
get_remote_dentry_file(struct dentry *dentry, struct hmdfs_peer *con)2139 bool 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 
2189 out_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 
hmdfs_file_type(const char *name)2198 int 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 
hmdfs_find_cache_item(uint64_t dev_id, struct dentry *dentry)2209 struct 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 
hmdfs_cache_revalidate(unsigned long conn_time, uint64_t dev_id, struct dentry *dentry)2230 bool 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 
remove_cache_item(struct clearcache_item *item)2254 void 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 
release_cache_item(struct kref *ref)2267 void 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 
hmdfs_remove_cache_filp(struct hmdfs_peer *con, struct dentry *dentry)2277 void 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 
hmdfs_add_cache_list(uint64_t dev_id, struct dentry *dentry, struct file *filp)2301 int 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 
hmdfs_add_remote_cache_list(struct hmdfs_peer *con, const char *dir_path)2325 void 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 
2372 out:
2373 	path_put(&path);
2374 out_put_root:
2375 	path_put(&root_path);
2376 }
2377 
hmdfs_drop_remote_cache_dents(struct dentry *dentry)2378 int 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 */
hmdfs_clear_cache_dents(struct dentry *dentry, bool remove_cache)2435 int 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 
hmdfs_mark_drop_flag(uint64_t device_id, struct dentry *dentry)2472 void 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 
hmdfs_clear_drop_flag(struct dentry *dentry)2493 void 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"
hmdfs_rename_bak(struct dentry *dentry)2518 static 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);
2568 unlock_parent:
2569 	unlock_dir(lower_parent);
2570 	mnt_drop_write(lower_path.mnt);
2571 free_name:
2572 	kfree(name);
2573 put_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 
hmdfs_root_unlink(uint64_t device_id, struct path *root_path, const char *unlink_dir, const char *unlink_name)2580 int 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 
2634 unlock_out:
2635 	inode_unlock(dir);
2636 	if (child_inode)
2637 		iput(child_inode);
2638 	path_put(&path);
2639 	return err;
2640 }
2641 
hmdfs_root_mkdir(uint64_t device_id, const char *local_dst_path, const char *mkdir_dir, const char *mkdir_name, umode_t mode)2642 struct 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);
2679 out_put:
2680 	done_path_create(&path, child_dentry);
2681 out:
2682 	kfree(mkdir_path);
2683 	kfree(mkdir_abs_path);
2684 	return ret;
2685 }
2686 
hmdfs_root_create(uint64_t device_id, const char *local_dst_path, const char *create_dir, const char *create_name, umode_t mode, bool want_excl)2687 struct 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);
2724 out_put:
2725 	done_path_create(&path, child_dentry);
2726 out:
2727 	kfree(create_path);
2728 	kfree(create_abs_path);
2729 	return ret;
2730 }
2731 
hmdfs_root_rmdir(uint64_t device_id, struct path *root_path, const char *rmdir_dir, const char *rmdir_name)2732 int 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 
2768 unlock_out:
2769 	inode_unlock(dir);
2770 	path_put(&path);
2771 	return err;
2772 }
2773 
hmdfs_root_rename(struct hmdfs_sb_info *sbi, uint64_t device_id, const char *oldpath, const char *oldname, const char *newpath, const char *newname, unsigned int flags)2774 int 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 
2864 put_new_dentry:
2865 	dput(new_dentry);
2866 put_old_dentry:
2867 	dput(old_dentry);
2868 unlock:
2869 	unlock_rename(path_new.dentry, path_old.dentry);
2870 	mnt_drop_write(path_dst.mnt);
2871 put_path_new:
2872 	path_put(&path_new);
2873 put_path_old:
2874 	path_put(&path_old);
2875 put_path_dst:
2876 	path_put(&path_dst);
2877 
2878 	return err;
2879 }
2880 
hmdfs_get_path_in_sb(struct super_block *sb, const char *name, unsigned int flags, struct path *path)2881 int 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