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