1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/hmdfs/hmdfs_client.c 4 * 5 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 6 */ 7 8#include "hmdfs_client.h" 9#include "hmdfs_server.h" 10 11#include <linux/highmem.h> 12#include <linux/sched/signal.h> 13#include <linux/statfs.h> 14 15#include "comm/socket_adapter.h" 16#include "hmdfs_dentryfile.h" 17#include "hmdfs_trace.h" 18#include "comm/node_cb.h" 19#include "stash.h" 20#include "authority/authentication.h" 21 22#define HMDFS_SYNC_WPAGE_RETRY_MS 2000 23 24static inline void free_sm_outbuf(struct hmdfs_send_command *sm) 25{ 26 if (sm->out_buf && sm->out_len != 0) 27 kfree(sm->out_buf); 28 sm->out_len = 0; 29 sm->out_buf = NULL; 30} 31 32int hmdfs_send_open(struct hmdfs_peer *con, const char *send_buf, 33 __u8 file_type, struct hmdfs_open_ret *open_ret) 34{ 35 int ret; 36 int path_len = strlen(send_buf); 37 size_t send_len = sizeof(struct open_request) + path_len + 1; 38 struct open_request *open_req = kzalloc(send_len, GFP_KERNEL); 39 struct open_response *resp; 40 struct hmdfs_send_command sm = { 41 .data = open_req, 42 .len = send_len, 43 .out_buf = NULL, 44 .local_filp = NULL, 45 }; 46 hmdfs_init_cmd(&sm.operations, F_OPEN); 47 48 if (!open_req) { 49 ret = -ENOMEM; 50 goto out; 51 } 52 open_req->file_type = file_type; 53 open_req->path_len = cpu_to_le32(path_len); 54 strcpy(open_req->buf, send_buf); 55 ret = hmdfs_sendmessage_request(con, &sm); 56 kfree(open_req); 57 58 if (!ret && (sm.out_len == 0 || !sm.out_buf)) 59 ret = -ENOENT; 60 if (ret) 61 goto out; 62 resp = sm.out_buf; 63 64 open_ret->ino = le64_to_cpu(resp->ino); 65 open_ret->fid.ver = le64_to_cpu(resp->file_ver); 66 open_ret->fid.id = le32_to_cpu(resp->file_id); 67 open_ret->file_size = le64_to_cpu(resp->file_size); 68 open_ret->remote_ctime.tv_sec = le64_to_cpu(resp->ctime); 69 open_ret->remote_ctime.tv_nsec = le32_to_cpu(resp->ctime_nsec); 70 open_ret->stable_ctime.tv_sec = le64_to_cpu(resp->stable_ctime); 71 open_ret->stable_ctime.tv_nsec = le32_to_cpu(resp->stable_ctime_nsec); 72 73out: 74 free_sm_outbuf(&sm); 75 return ret; 76} 77 78void hmdfs_send_close(struct hmdfs_peer *con, const struct hmdfs_fid *fid) 79{ 80 size_t send_len = sizeof(struct release_request); 81 struct release_request *release_req = kzalloc(send_len, GFP_KERNEL); 82 struct hmdfs_send_command sm = { 83 .data = release_req, 84 .len = send_len, 85 .local_filp = NULL, 86 }; 87 hmdfs_init_cmd(&sm.operations, F_RELEASE); 88 89 if (!release_req) 90 return; 91 92 release_req->file_ver = cpu_to_le64(fid->ver); 93 release_req->file_id = cpu_to_le32(fid->id); 94 95 hmdfs_sendmessage_request(con, &sm); 96 kfree(release_req); 97} 98 99int hmdfs_send_fsync(struct hmdfs_peer *con, const struct hmdfs_fid *fid, 100 __s64 start, __s64 end, __s32 datasync) 101{ 102 int ret; 103 struct fsync_request *fsync_req = 104 kzalloc(sizeof(struct fsync_request), GFP_KERNEL); 105 struct hmdfs_send_command sm = { 106 .data = fsync_req, 107 .len = sizeof(struct fsync_request), 108 .out_buf = NULL, 109 .local_filp = NULL, 110 }; 111 112 hmdfs_init_cmd(&sm.operations, F_FSYNC); 113 if (!fsync_req) 114 return -ENOMEM; 115 116 fsync_req->file_ver = cpu_to_le64(fid->ver); 117 fsync_req->file_id = cpu_to_le32(fid->id); 118 fsync_req->datasync = cpu_to_le32(datasync); 119 fsync_req->start = cpu_to_le64(start); 120 fsync_req->end = cpu_to_le64(end); 121 122 ret = hmdfs_sendmessage_request(con, &sm); 123 124 free_sm_outbuf(&sm); 125 kfree(fsync_req); 126 return ret; 127} 128 129int hmdfs_client_readpage(struct hmdfs_peer *con, const struct hmdfs_fid *fid, 130 struct page *page) 131{ 132 int ret; 133 size_t send_len = sizeof(struct readpage_request); 134 struct readpage_request *read_data = kzalloc(send_len, GFP_KERNEL); 135 struct hmdfs_send_command sm = { 136 .data = read_data, 137 .len = send_len, 138 .local_filp = NULL, 139 }; 140 141 hmdfs_init_cmd(&sm.operations, F_READPAGE); 142 if (!read_data) { 143 unlock_page(page); 144 return -ENOMEM; 145 } 146 147 sm.out_buf = page; 148 read_data->file_ver = cpu_to_le64(fid->ver); 149 read_data->file_id = cpu_to_le32(fid->id); 150 read_data->size = cpu_to_le32(HMDFS_PAGE_SIZE); 151 read_data->index = cpu_to_le64(page->index); 152 ret = hmdfs_sendpage_request(con, &sm); 153 kfree(read_data); 154 return ret; 155} 156 157bool hmdfs_usr_sig_pending(struct task_struct *p) 158{ 159 sigset_t *sig = &p->pending.signal; 160 161 if (likely(!signal_pending(p))) 162 return false; 163 return sigismember(sig, SIGINT) || sigismember(sig, SIGTERM) || 164 sigismember(sig, SIGKILL); 165} 166 167void hmdfs_client_writepage_done(struct hmdfs_inode_info *info, 168 struct hmdfs_writepage_context *ctx) 169{ 170 struct page *page = ctx->page; 171 bool unlock = ctx->rsem_held; 172 173 SetPageUptodate(page); 174 end_page_writeback(page); 175 if (unlock) 176 up_read(&info->wpage_sem); 177 unlock_page(page); 178} 179 180static void hmdfs_client_writepage_err(struct hmdfs_peer *peer, 181 struct hmdfs_inode_info *info, 182 struct hmdfs_writepage_context *ctx, 183 int err) 184{ 185 struct page *page = ctx->page; 186 bool unlock = ctx->rsem_held; 187 188 if (err == -ENOMEM || err == -EAGAIN || err == -ESHUTDOWN || 189 err == -ETIME) 190 SetPageUptodate(page); 191 else 192 hmdfs_info("Page %ld of file %u writeback err %d devid %llu", 193 page->index, ctx->fid.id, err, peer->device_id); 194 195 /* 196 * Current and subsequent writebacks have been canceled by the 197 * user, leaving these pages' states in chaos. Read pages in 198 * the future to update these pages. 199 */ 200 if (ctx->sync_all && hmdfs_usr_sig_pending(ctx->caller)) 201 ClearPageUptodate(page); 202 203 if (ctx->sync_all || !time_is_after_eq_jiffies(ctx->timeout) || 204 !(err == -ETIME || hmdfs_need_redirty_page(info, err))) { 205 SetPageError(page); 206 mapping_set_error(page->mapping, -EIO); 207 } else { 208 __set_page_dirty_nobuffers(page); 209 } 210 211 end_page_writeback(page); 212 if (unlock) 213 up_read(&info->wpage_sem); 214 unlock_page(page); 215} 216 217static inline bool 218hmdfs_no_timedout_sync_write(struct hmdfs_writepage_context *ctx) 219{ 220 return ctx->sync_all && time_is_after_eq_jiffies(ctx->timeout); 221} 222 223static inline bool 224hmdfs_client_rewrite_for_timeout(struct hmdfs_writepage_context *ctx, int err) 225{ 226 return (err == -ETIME && hmdfs_no_timedout_sync_write(ctx) && 227 !hmdfs_usr_sig_pending(ctx->caller)); 228} 229 230static inline bool 231hmdfs_client_rewrite_for_offline(struct hmdfs_sb_info *sbi, 232 struct hmdfs_writepage_context *ctx, int err) 233{ 234 struct hmdfs_inode_info *info = hmdfs_i(ctx->page->mapping->host); 235 unsigned int status = READ_ONCE(info->stash_status); 236 237 /* 238 * No retry if offline occurs during inode restoration. 239 * 240 * Do retry if local file cache is ready even it is not 241 * a WB_SYNC_ALL write, else no-sync_all writeback will 242 * return -EIO, mapping_set_error(mapping, -EIO) will be 243 * called and it will make the concurrent calling of 244 * filemap_write_and_wait() in hmdfs_flush_stash_file_data() 245 * return -EIO. 246 */ 247 return (hmdfs_is_stash_enabled(sbi) && 248 status != HMDFS_REMOTE_INODE_RESTORING && 249 (hmdfs_no_timedout_sync_write(ctx) || 250 status == HMDFS_REMOTE_INODE_STASHING) && 251 hmdfs_is_offline_or_timeout_err(err)); 252} 253 254static inline bool 255hmdfs_client_redo_writepage(struct hmdfs_sb_info *sbi, 256 struct hmdfs_writepage_context *ctx, int err) 257{ 258 return hmdfs_client_rewrite_for_timeout(ctx, err) || 259 hmdfs_client_rewrite_for_offline(sbi, ctx, err); 260} 261 262static bool hmdfs_remote_write_to_remote(struct hmdfs_inode_info *info) 263{ 264 unsigned int status = READ_ONCE(info->stash_status); 265 bool stashing; 266 267 if (status != HMDFS_REMOTE_INODE_STASHING) 268 return true; 269 270 /* Ensure it's OK to use info->cache afterwards */ 271 spin_lock(&info->stash_lock); 272 stashing = (info->stash_status == HMDFS_REMOTE_INODE_STASHING); 273 spin_unlock(&info->stash_lock); 274 275 return !stashing; 276} 277 278int hmdfs_remote_do_writepage(struct hmdfs_peer *con, 279 struct hmdfs_writepage_context *ctx) 280{ 281 struct hmdfs_inode_info *info = hmdfs_i(ctx->page->mapping->host); 282 bool to_remote = false; 283 int err = 0; 284 285 to_remote = hmdfs_remote_write_to_remote(info); 286 if (to_remote) 287 err = hmdfs_client_writepage(info->conn, ctx); 288 else 289 err = hmdfs_stash_writepage(info->conn, ctx); 290 if (!err) 291 return 0; 292 293 if (!(to_remote && 294 hmdfs_client_rewrite_for_offline(con->sbi, ctx, err))) 295 return err; 296 297 queue_delayed_work(con->retry_wb_wq, &ctx->retry_dwork, 298 msecs_to_jiffies(HMDFS_SYNC_WPAGE_RETRY_MS)); 299 300 return 0; 301} 302 303void hmdfs_remote_writepage_retry(struct work_struct *work) 304{ 305 struct hmdfs_writepage_context *ctx = 306 container_of(work, struct hmdfs_writepage_context, 307 retry_dwork.work); 308 struct hmdfs_inode_info *info = hmdfs_i(ctx->page->mapping->host); 309 struct hmdfs_peer *peer = info->conn; 310 const struct cred *old_cred = NULL; 311 int err; 312 313 old_cred = hmdfs_override_creds(peer->sbi->cred); 314 err = hmdfs_remote_do_writepage(peer, ctx); 315 hmdfs_revert_creds(old_cred); 316 if (err) { 317 hmdfs_client_writepage_err(peer, info, ctx, err); 318 put_task_struct(ctx->caller); 319 kfree(ctx); 320 } 321} 322 323void hmdfs_writepage_cb(struct hmdfs_peer *peer, const struct hmdfs_req *req, 324 const struct hmdfs_resp *resp) 325{ 326 struct hmdfs_writepage_context *ctx = req->private; 327 struct hmdfs_inode_info *info = hmdfs_i(ctx->page->mapping->host); 328 int ret = resp->ret_code; 329 unsigned long page_index = ctx->page->index; 330 331 trace_hmdfs_writepage_cb_enter(peer, info->remote_ino, page_index, ret); 332 333 if (!ret) { 334 hmdfs_client_writepage_done(info, ctx); 335 atomic64_inc(&info->write_counter); 336 goto cleanup_all; 337 } 338 339 if (hmdfs_client_redo_writepage(peer->sbi, ctx, ret)) { 340 ret = hmdfs_remote_do_writepage(peer, ctx); 341 if (!ret) 342 goto cleanup_req; 343 WARN_ON(ret == -ETIME); 344 } 345 346 hmdfs_client_writepage_err(peer, info, ctx, ret); 347 348cleanup_all: 349 put_task_struct(ctx->caller); 350 kfree(ctx); 351cleanup_req: 352 kfree(req->data); 353 354 trace_hmdfs_writepage_cb_exit(peer, info->remote_ino, page_index, ret); 355} 356 357int hmdfs_client_writepage(struct hmdfs_peer *con, 358 struct hmdfs_writepage_context *param) 359{ 360 int ret = 0; 361 size_t send_len = sizeof(struct writepage_request) + HMDFS_PAGE_SIZE; 362 struct writepage_request *write_data = kzalloc(send_len, GFP_NOFS); 363 struct hmdfs_req req; 364 char *data = NULL; 365 366 if (unlikely(!write_data)) 367 return -ENOMEM; 368 369 WARN_ON(!PageLocked(param->page)); // VFS 370 WARN_ON(PageDirty(param->page)); // VFS 371 WARN_ON(!PageWriteback(param->page)); // hmdfs 372 373 write_data->file_ver = cpu_to_le64(param->fid.ver); 374 write_data->file_id = cpu_to_le32(param->fid.id); 375 write_data->index = cpu_to_le64(param->page->index); 376 write_data->count = cpu_to_le32(param->count); 377 data = kmap(param->page); 378 memcpy((char *)write_data->buf, data, HMDFS_PAGE_SIZE); 379 kunmap(param->page); 380 req.data = write_data; 381 req.data_len = send_len; 382 383 req.private = param; 384 req.private_len = sizeof(*param); 385 386 req.timeout = TIMEOUT_CONFIG; 387 hmdfs_init_cmd(&req.operations, F_WRITEPAGE); 388 ret = hmdfs_send_async_request(con, &req); 389 if (unlikely(ret)) 390 kfree(write_data); 391 return ret; 392} 393 394void hmdfs_client_recv_readpage(struct hmdfs_head_cmd *head, int err, 395 struct hmdfs_async_work *async_work) 396{ 397 struct page *page = async_work->page; 398 int ret = le32_to_cpu(head->ret_code); 399 struct hmdfs_inode_info *info = hmdfs_i(page->mapping->host); 400 unsigned long page_index = page->index; 401 402 if (!err) 403 SetPageUptodate(page); 404 else if (err == -EBADF) 405 /* There may be a stale fd caused by fid version, need reopen */ 406 set_bit(HMDFS_FID_NEED_OPEN, &info->fid_flags); 407 408 hmdfs_client_resp_statis(async_work->head.peer->sbi, F_READPAGE, 409 HMDFS_RESP_NORMAL, async_work->start, jiffies); 410 411 trace_hmdfs_client_recv_readpage(async_work->head.peer, 412 info->remote_ino, page_index, ret); 413 414 asw_done(async_work); 415} 416 417/* read cache dentry file at path and write them into filp */ 418int hmdfs_client_start_readdir(struct hmdfs_peer *con, struct file *filp, 419 const char *path, int path_len, 420 struct hmdfs_dcache_header *header) 421{ 422 int ret; 423 size_t send_len = sizeof(struct readdir_request) + path_len + 1; 424 struct readdir_request *req = kzalloc(send_len, GFP_KERNEL); 425 struct hmdfs_send_command sm = { 426 .data = req, 427 .len = send_len, 428 .local_filp = filp, 429 }; 430 431 hmdfs_init_cmd(&sm.operations, F_ITERATE); 432 if (!req) 433 return -ENOMEM; 434 435 /* add ref or it will be release at msg put */ 436 get_file(sm.local_filp); 437 req->path_len = cpu_to_le32(path_len); 438 strncpy(req->path, path, path_len); 439 440 /* 441 * Is we already have a cache file, verify it. If it is 442 * uptodate, then we don't have to transfer a new one 443 */ 444 if (header) { 445 req->dcache_crtime = header->dcache_crtime; 446 req->dcache_crtime_nsec = header->dcache_crtime_nsec; 447 req->dentry_ctime = header->dentry_ctime; 448 req->dentry_ctime_nsec = header->dentry_ctime_nsec; 449 req->num = header->num; 450 req->verify_cache = cpu_to_le32(1); 451 } 452 453 ret = hmdfs_sendmessage_request(con, &sm); 454 kfree(req); 455 return ret; 456} 457 458int hmdfs_client_start_mkdir(struct hmdfs_peer *con, 459 const char *path, const char *name, 460 umode_t mode, struct hmdfs_lookup_ret *mkdir_ret) 461{ 462 int ret = 0; 463 int path_len = strlen(path); 464 int name_len = strlen(name); 465 size_t send_len = sizeof(struct mkdir_request) + path_len + 1 + 466 name_len + 1; 467 struct mkdir_request *mkdir_req = kzalloc(send_len, GFP_KERNEL); 468 struct hmdfs_inodeinfo_response *resp = NULL; 469 struct hmdfs_send_command sm = { 470 .data = mkdir_req, 471 .len = send_len, 472 .out_buf = NULL, 473 .local_filp = NULL, 474 }; 475 476 hmdfs_init_cmd(&sm.operations, F_MKDIR); 477 if (!mkdir_req) 478 return -ENOMEM; 479 480 mkdir_req->path_len = cpu_to_le32(path_len); 481 mkdir_req->name_len = cpu_to_le32(name_len); 482 mkdir_req->mode = cpu_to_le16(mode); 483 strncpy(mkdir_req->path, path, path_len); 484 strncpy(mkdir_req->path + path_len + 1, name, name_len); 485 486 ret = hmdfs_sendmessage_request(con, &sm); 487 if (ret == -ENOENT || ret == -ETIME || ret == -EOPNOTSUPP) 488 goto out; 489 if (!sm.out_buf) { 490 ret = -ENOENT; 491 goto out; 492 } 493 resp = sm.out_buf; 494 mkdir_ret->i_mode = le16_to_cpu(resp->i_mode); 495 mkdir_ret->i_size = le64_to_cpu(resp->i_size); 496 mkdir_ret->i_mtime = le64_to_cpu(resp->i_mtime); 497 mkdir_ret->i_mtime_nsec = le32_to_cpu(resp->i_mtime_nsec); 498 mkdir_ret->i_ino = le64_to_cpu(resp->i_ino); 499 500out: 501 free_sm_outbuf(&sm); 502 kfree(mkdir_req); 503 return ret; 504} 505 506int hmdfs_client_start_create(struct hmdfs_peer *con, 507 const char *path, const char *name, 508 umode_t mode, bool want_excl, 509 struct hmdfs_lookup_ret *create_ret) 510{ 511 int ret = 0; 512 int path_len = strlen(path); 513 int name_len = strlen(name); 514 size_t send_len = sizeof(struct create_request) + path_len + 1 + 515 name_len + 1; 516 struct create_request *create_req = kzalloc(send_len, GFP_KERNEL); 517 struct hmdfs_inodeinfo_response *resp = NULL; 518 struct hmdfs_send_command sm = { 519 .data = create_req, 520 .len = send_len, 521 .out_buf = NULL, 522 .local_filp = NULL, 523 }; 524 525 hmdfs_init_cmd(&sm.operations, F_CREATE); 526 if (!create_req) 527 return -ENOMEM; 528 529 create_req->path_len = cpu_to_le32(path_len); 530 create_req->name_len = cpu_to_le32(name_len); 531 create_req->mode = cpu_to_le16(mode); 532 create_req->want_excl = want_excl; 533 strncpy(create_req->path, path, path_len); 534 strncpy(create_req->path + path_len + 1, name, name_len); 535 536 ret = hmdfs_sendmessage_request(con, &sm); 537 if (ret == -ENOENT || ret == -ETIME || ret == -EOPNOTSUPP) 538 goto out; 539 if (!sm.out_buf) { 540 ret = -ENOENT; 541 goto out; 542 } 543 resp = sm.out_buf; 544 create_ret->i_mode = le16_to_cpu(resp->i_mode); 545 create_ret->i_size = le64_to_cpu(resp->i_size); 546 create_ret->i_mtime = le64_to_cpu(resp->i_mtime); 547 create_ret->i_mtime_nsec = le32_to_cpu(resp->i_mtime_nsec); 548 create_ret->i_ino = le64_to_cpu(resp->i_ino); 549 550out: 551 free_sm_outbuf(&sm); 552 kfree(create_req); 553 return ret; 554} 555 556int hmdfs_client_start_rmdir(struct hmdfs_peer *con, const char *path, 557 const char *name) 558{ 559 int ret; 560 int path_len = strlen(path); 561 int name_len = strlen(name); 562 size_t send_len = sizeof(struct rmdir_request) + path_len + 1 + 563 name_len + 1; 564 struct rmdir_request *rmdir_req = kzalloc(send_len, GFP_KERNEL); 565 struct hmdfs_send_command sm = { 566 .data = rmdir_req, 567 .len = send_len, 568 .out_buf = NULL, 569 .local_filp = NULL, 570 }; 571 572 hmdfs_init_cmd(&sm.operations, F_RMDIR); 573 if (!rmdir_req) 574 return -ENOMEM; 575 576 rmdir_req->path_len = cpu_to_le32(path_len); 577 rmdir_req->name_len = cpu_to_le32(name_len); 578 strncpy(rmdir_req->path, path, path_len); 579 strncpy(rmdir_req->path + path_len + 1, name, name_len); 580 581 ret = hmdfs_sendmessage_request(con, &sm); 582 free_sm_outbuf(&sm); 583 kfree(rmdir_req); 584 return ret; 585} 586 587int hmdfs_client_start_unlink(struct hmdfs_peer *con, const char *path, 588 const char *name) 589{ 590 int ret; 591 int path_len = strlen(path); 592 int name_len = strlen(name); 593 size_t send_len = sizeof(struct unlink_request) + path_len + 1 + 594 name_len + 1; 595 struct unlink_request *unlink_req = kzalloc(send_len, GFP_KERNEL); 596 struct hmdfs_send_command sm = { 597 .data = unlink_req, 598 .len = send_len, 599 .out_buf = NULL, 600 .local_filp = NULL, 601 }; 602 603 hmdfs_init_cmd(&sm.operations, F_UNLINK); 604 if (!unlink_req) 605 return -ENOMEM; 606 607 unlink_req->path_len = cpu_to_le32(path_len); 608 unlink_req->name_len = cpu_to_le32(name_len); 609 strncpy(unlink_req->path, path, path_len); 610 strncpy(unlink_req->path + path_len + 1, name, name_len); 611 612 ret = hmdfs_sendmessage_request(con, &sm); 613 kfree(unlink_req); 614 free_sm_outbuf(&sm); 615 return ret; 616} 617 618int hmdfs_client_start_rename(struct hmdfs_peer *con, const char *old_path, 619 const char *old_name, const char *new_path, 620 const char *new_name, unsigned int flags) 621{ 622 int ret; 623 int old_path_len = strlen(old_path); 624 int new_path_len = strlen(new_path); 625 int old_name_len = strlen(old_name); 626 int new_name_len = strlen(new_name); 627 628 size_t send_len = sizeof(struct rename_request) + old_path_len + 1 + 629 new_path_len + 1 + old_name_len + 1 + new_name_len + 630 1; 631 struct rename_request *rename_req = kzalloc(send_len, GFP_KERNEL); 632 struct hmdfs_send_command sm = { 633 .data = rename_req, 634 .len = send_len, 635 .out_buf = NULL, 636 .local_filp = NULL, 637 }; 638 639 hmdfs_init_cmd(&sm.operations, F_RENAME); 640 if (!rename_req) 641 return -ENOMEM; 642 643 rename_req->old_path_len = cpu_to_le32(old_path_len); 644 rename_req->new_path_len = cpu_to_le32(new_path_len); 645 rename_req->old_name_len = cpu_to_le32(old_name_len); 646 rename_req->new_name_len = cpu_to_le32(new_name_len); 647 rename_req->flags = cpu_to_le32(flags); 648 649 strncpy(rename_req->path, old_path, old_path_len); 650 strncpy(rename_req->path + old_path_len + 1, new_path, new_path_len); 651 652 strncpy(rename_req->path + old_path_len + 1 + new_path_len + 1, 653 old_name, old_name_len); 654 strncpy(rename_req->path + old_path_len + 1 + new_path_len + 1 + 655 old_name_len + 1, 656 new_name, new_name_len); 657 658 ret = hmdfs_sendmessage_request(con, &sm); 659 free_sm_outbuf(&sm); 660 kfree(rename_req); 661 return ret; 662} 663 664int hmdfs_send_setattr(struct hmdfs_peer *con, const char *send_buf, 665 struct setattr_info *attr_info) 666{ 667 int ret; 668 int path_len = strlen(send_buf); 669 size_t send_len = path_len + 1 + sizeof(struct setattr_request); 670 struct setattr_request *setattr_req = kzalloc(send_len, GFP_KERNEL); 671 struct hmdfs_send_command sm = { 672 .data = setattr_req, 673 .len = send_len, 674 .local_filp = NULL, 675 }; 676 677 hmdfs_init_cmd(&sm.operations, F_SETATTR); 678 if (!setattr_req) 679 return -ENOMEM; 680 681 strcpy(setattr_req->buf, send_buf); 682 setattr_req->path_len = cpu_to_le32(path_len); 683 setattr_req->valid = cpu_to_le32(attr_info->valid); 684 setattr_req->size = cpu_to_le64(attr_info->size); 685 setattr_req->mtime = cpu_to_le64(attr_info->mtime); 686 setattr_req->mtime_nsec = cpu_to_le32(attr_info->mtime_nsec); 687 ret = hmdfs_sendmessage_request(con, &sm); 688 kfree(setattr_req); 689 return ret; 690} 691 692static void hmdfs_update_getattr_ret(struct getattr_response *resp, 693 struct hmdfs_getattr_ret *result) 694{ 695 struct kstat *stat = &result->stat; 696 697 stat->result_mask = le32_to_cpu(resp->result_mask); 698 if (stat->result_mask == 0) 699 return; 700 701 stat->ino = le64_to_cpu(resp->ino); 702 stat->mode = le16_to_cpu(resp->mode); 703 stat->nlink = le32_to_cpu(resp->nlink); 704 stat->uid.val = le32_to_cpu(resp->uid); 705 stat->gid.val = le32_to_cpu(resp->gid); 706 stat->size = le64_to_cpu(resp->size); 707 stat->blocks = le64_to_cpu(resp->blocks); 708 stat->blksize = le32_to_cpu(resp->blksize); 709 stat->atime.tv_sec = le64_to_cpu(resp->atime); 710 stat->atime.tv_nsec = le32_to_cpu(resp->atime_nsec); 711 stat->mtime.tv_sec = le64_to_cpu(resp->mtime); 712 stat->mtime.tv_nsec = le32_to_cpu(resp->mtime_nsec); 713 stat->ctime.tv_sec = le64_to_cpu(resp->ctime); 714 stat->ctime.tv_nsec = le32_to_cpu(resp->ctime_nsec); 715 stat->btime.tv_sec = le64_to_cpu(resp->crtime); 716 stat->btime.tv_nsec = le32_to_cpu(resp->crtime_nsec); 717 result->fsid = le64_to_cpu(resp->fsid); 718 /* currently not used */ 719 result->i_flags = 0; 720} 721 722int hmdfs_send_getattr(struct hmdfs_peer *con, const char *send_buf, 723 unsigned int lookup_flags, 724 struct hmdfs_getattr_ret *result) 725{ 726 int path_len = strlen(send_buf); 727 size_t send_len = path_len + 1 + sizeof(struct getattr_request); 728 int ret = 0; 729 struct getattr_request *req = kzalloc(send_len, GFP_KERNEL); 730 struct hmdfs_send_command sm = { 731 .data = req, 732 .len = send_len, 733 .out_buf = NULL, 734 .local_filp = NULL, 735 }; 736 737 hmdfs_init_cmd(&sm.operations, F_GETATTR); 738 if (!req) 739 return -ENOMEM; 740 741 req->path_len = cpu_to_le32(path_len); 742 req->lookup_flags = cpu_to_le32(lookup_flags); 743 strncpy(req->buf, send_buf, path_len); 744 ret = hmdfs_sendmessage_request(con, &sm); 745 if (!ret && (sm.out_len == 0 || !sm.out_buf)) 746 ret = -ENOENT; 747 if (ret) 748 goto out; 749 750 hmdfs_update_getattr_ret(sm.out_buf, result); 751 752out: 753 kfree(req); 754 free_sm_outbuf(&sm); 755 return ret; 756} 757 758static void hmdfs_update_statfs_ret(struct statfs_response *resp, 759 struct kstatfs *buf) 760{ 761 buf->f_type = le64_to_cpu(resp->f_type); 762 buf->f_bsize = le64_to_cpu(resp->f_bsize); 763 buf->f_blocks = le64_to_cpu(resp->f_blocks); 764 buf->f_bfree = le64_to_cpu(resp->f_bfree); 765 buf->f_bavail = le64_to_cpu(resp->f_bavail); 766 buf->f_files = le64_to_cpu(resp->f_files); 767 buf->f_ffree = le64_to_cpu(resp->f_ffree); 768 buf->f_fsid.val[0] = le32_to_cpu(resp->f_fsid_0); 769 buf->f_fsid.val[1] = le32_to_cpu(resp->f_fsid_1); 770 buf->f_namelen = le64_to_cpu(resp->f_namelen); 771 buf->f_frsize = le64_to_cpu(resp->f_frsize); 772 buf->f_flags = le64_to_cpu(resp->f_flags); 773 buf->f_spare[0] = le64_to_cpu(resp->f_spare_0); 774 buf->f_spare[1] = le64_to_cpu(resp->f_spare_1); 775 buf->f_spare[2] = le64_to_cpu(resp->f_spare_2); 776 buf->f_spare[3] = le64_to_cpu(resp->f_spare_3); 777} 778 779int hmdfs_send_statfs(struct hmdfs_peer *con, const char *path, 780 struct kstatfs *buf) 781{ 782 int ret; 783 int path_len = strlen(path); 784 size_t send_len = sizeof(struct statfs_request) + path_len + 1; 785 struct statfs_request *req = kzalloc(send_len, GFP_KERNEL); 786 struct hmdfs_send_command sm = { 787 .data = req, 788 .len = send_len, 789 .out_buf = NULL, 790 .local_filp = NULL, 791 }; 792 793 hmdfs_init_cmd(&sm.operations, F_STATFS); 794 if (!req) 795 return -ENOMEM; 796 797 req->path_len = cpu_to_le32(path_len); 798 strncpy(req->path, path, path_len); 799 800 ret = hmdfs_sendmessage_request(con, &sm); 801 802 if (ret == -ETIME) 803 ret = -EIO; 804 if (!ret && (sm.out_len == 0 || !sm.out_buf)) 805 ret = -ENOENT; 806 if (ret) 807 goto out; 808 809 hmdfs_update_statfs_ret(sm.out_buf, buf); 810out: 811 kfree(req); 812 free_sm_outbuf(&sm); 813 return ret; 814} 815 816int hmdfs_send_syncfs(struct hmdfs_peer *con, int syncfs_timeout) 817{ 818 int ret; 819 struct hmdfs_req req; 820 struct hmdfs_sb_info *sbi = con->sbi; 821 struct syncfs_request *syncfs_req = 822 kzalloc(sizeof(struct syncfs_request), GFP_KERNEL); 823 824 if (!syncfs_req) { 825 hmdfs_err("cannot allocate syncfs_request"); 826 return -ENOMEM; 827 } 828 829 hmdfs_init_cmd(&req.operations, F_SYNCFS); 830 req.timeout = syncfs_timeout; 831 832 syncfs_req->version = cpu_to_le64(sbi->hsi.version); 833 req.data = syncfs_req; 834 req.data_len = sizeof(*syncfs_req); 835 836 ret = hmdfs_send_async_request(con, &req); 837 if (ret) { 838 kfree(syncfs_req); 839 hmdfs_err("ret fail with %d", ret); 840 } 841 842 return ret; 843} 844 845static void hmdfs_update_getxattr_ret(struct getxattr_response *resp, 846 void *value, size_t o_size, int *ret) 847{ 848 ssize_t size = le32_to_cpu(resp->size); 849 850 if (o_size && o_size < size) { 851 *ret = -ERANGE; 852 return; 853 } 854 855 if (o_size) 856 memcpy(value, resp->value, size); 857 858 *ret = size; 859} 860 861int hmdfs_send_getxattr(struct hmdfs_peer *con, const char *send_buf, 862 const char *name, void *value, size_t size) 863{ 864 size_t path_len = strlen(send_buf); 865 size_t name_len = strlen(name); 866 size_t send_len = path_len + name_len + 867 sizeof(struct getxattr_request) + 2; 868 int ret = 0; 869 struct getxattr_request *req = kzalloc(send_len, GFP_KERNEL); 870 struct hmdfs_send_command sm = { 871 .data = req, 872 .len = send_len, 873 .out_buf = NULL, 874 .local_filp = NULL, 875 }; 876 877 hmdfs_init_cmd(&sm.operations, F_GETXATTR); 878 if (!req) 879 return -ENOMEM; 880 881 req->path_len = cpu_to_le32(path_len); 882 req->name_len = cpu_to_le32(name_len); 883 req->size = cpu_to_le32(size); 884 strncpy(req->buf, send_buf, path_len); 885 strncpy(req->buf + path_len + 1, name, name_len); 886 ret = hmdfs_sendmessage_request(con, &sm); 887 if (!ret && (sm.out_len == 0 || !sm.out_buf)) 888 ret = -ENOENT; 889 if (ret) 890 goto out; 891 892 hmdfs_update_getxattr_ret(sm.out_buf, value, size, &ret); 893 894out: 895 kfree(req); 896 free_sm_outbuf(&sm); 897 return ret; 898} 899 900int hmdfs_send_setxattr(struct hmdfs_peer *con, const char *send_buf, 901 const char *name, const void *value, 902 size_t size, int flags) 903{ 904 size_t path_len = strlen(send_buf); 905 size_t name_len = strlen(name); 906 size_t send_len = path_len + name_len + size + 2 + 907 sizeof(struct setxattr_request); 908 int ret = 0; 909 struct setxattr_request *req = kzalloc(send_len, GFP_KERNEL); 910 struct hmdfs_send_command sm = { 911 .data = req, 912 .len = send_len, 913 .local_filp = NULL, 914 }; 915 916 hmdfs_init_cmd(&sm.operations, F_SETXATTR); 917 if (!req) 918 return -ENOMEM; 919 920 req->path_len = cpu_to_le32(path_len); 921 req->name_len = cpu_to_le32(name_len); 922 req->size = cpu_to_le32(size); 923 req->flags = cpu_to_le32(flags); 924 strncpy(req->buf, send_buf, path_len); 925 strncpy(req->buf + path_len + 1, name, name_len); 926 if (!value) 927 req->del = true; 928 else 929 memcpy(req->buf + path_len + name_len + 2, value, size); 930 931 ret = hmdfs_sendmessage_request(con, &sm); 932 kfree(req); 933 return ret; 934} 935 936static void hmdfs_update_listxattr_ret(struct listxattr_response *resp, 937 char *list, size_t o_size, ssize_t *ret) 938{ 939 ssize_t size = le32_to_cpu(resp->size); 940 941 if (o_size && o_size < size) { 942 *ret = -ERANGE; 943 return; 944 } 945 946 /* multi name split with '\0', use memcpy */ 947 if (o_size) 948 memcpy(list, resp->list, size); 949 950 *ret = size; 951} 952 953ssize_t hmdfs_send_listxattr(struct hmdfs_peer *con, const char *send_buf, 954 char *list, size_t size) 955{ 956 size_t path_len = strlen(send_buf); 957 size_t send_len = path_len + 1 + sizeof(struct listxattr_request); 958 ssize_t ret = 0; 959 struct listxattr_request *req = kzalloc(send_len, GFP_KERNEL); 960 struct hmdfs_send_command sm = { 961 .data = req, 962 .len = send_len, 963 .out_buf = NULL, 964 .local_filp = NULL, 965 }; 966 967 hmdfs_init_cmd(&sm.operations, F_LISTXATTR); 968 if (!req) 969 return -ENOMEM; 970 971 req->path_len = cpu_to_le32(path_len); 972 req->size = cpu_to_le32(size); 973 strncpy(req->buf, send_buf, path_len); 974 ret = hmdfs_sendmessage_request(con, &sm); 975 if (!ret && (sm.out_len == 0 || !sm.out_buf)) 976 ret = -ENOENT; 977 if (ret) 978 goto out; 979 980 hmdfs_update_listxattr_ret(sm.out_buf, list, size, &ret); 981 982out: 983 kfree(req); 984 free_sm_outbuf(&sm); 985 return ret; 986} 987 988void hmdfs_recv_syncfs_cb(struct hmdfs_peer *peer, const struct hmdfs_req *req, 989 const struct hmdfs_resp *resp) 990{ 991 struct hmdfs_sb_info *sbi = peer->sbi; 992 struct syncfs_request *syncfs_req = (struct syncfs_request *)req->data; 993 994 WARN_ON(!syncfs_req); 995 spin_lock(&sbi->hsi.v_lock); 996 if (le64_to_cpu(syncfs_req->version) != sbi->hsi.version) { 997 hmdfs_info( 998 "Recv stale syncfs resp[ver: %llu] from device %llu, current ver %llu", 999 le64_to_cpu(syncfs_req->version), peer->device_id, 1000 sbi->hsi.version); 1001 spin_unlock(&sbi->hsi.v_lock); 1002 goto out; 1003 } 1004 1005 if (!sbi->hsi.remote_ret) 1006 sbi->hsi.remote_ret = resp->ret_code; 1007 1008 if (resp->ret_code) { 1009 hmdfs_err("Recv syncfs error code %d from device %llu", 1010 resp->ret_code, peer->device_id); 1011 } else { 1012 /* 1013 * Set @sb_dirty_count to zero if no one else produce 1014 * dirty data on remote server during remote sync. 1015 */ 1016 atomic64_cmpxchg(&peer->sb_dirty_count, 1017 peer->old_sb_dirty_count, 0); 1018 } 1019 1020 atomic_dec(&sbi->hsi.wait_count); 1021 spin_unlock(&sbi->hsi.v_lock); 1022 wake_up_interruptible(&sbi->hsi.wq); 1023 1024out: 1025 kfree(syncfs_req); 1026} 1027 1028void hmdfs_send_drop_push(struct hmdfs_peer *con, const char *path) 1029{ 1030 int path_len = strlen(path); 1031 size_t send_len = sizeof(struct drop_push_request) + path_len + 1; 1032 struct drop_push_request *dp_req = kzalloc(send_len, GFP_KERNEL); 1033 struct hmdfs_send_command sm = { 1034 .data = dp_req, 1035 .len = send_len, 1036 .local_filp = NULL, 1037 }; 1038 1039 hmdfs_init_cmd(&sm.operations, F_DROP_PUSH); 1040 if (!dp_req) 1041 return; 1042 1043 dp_req->path_len = cpu_to_le32(path_len); 1044 strncpy(dp_req->path, path, path_len); 1045 1046 hmdfs_sendmessage_request(con, &sm); 1047 kfree(dp_req); 1048} 1049 1050static void *hmdfs_get_msg_next(struct hmdfs_peer *peer, int *id) 1051{ 1052 struct hmdfs_msg_idr_head *head = NULL; 1053 1054 spin_lock(&peer->idr_lock); 1055 head = idr_get_next(&peer->msg_idr, id); 1056 if (head && head->type < MSG_IDR_MAX && head->type >= 0) 1057 kref_get(&head->ref); 1058 1059 spin_unlock(&peer->idr_lock); 1060 1061 return head; 1062} 1063 1064void hmdfs_client_offline_notify(struct hmdfs_peer *conn, int evt, 1065 unsigned int seq) 1066{ 1067 int id; 1068 int count = 0; 1069 struct hmdfs_msg_idr_head *head = NULL; 1070 1071 for (id = 0; (head = hmdfs_get_msg_next(conn, &id)) != NULL; ++id) { 1072 switch (head->type) { 1073 case MSG_IDR_1_0_NONE: 1074 head_put(head); 1075 head_put(head); 1076 break; 1077 case MSG_IDR_MESSAGE_SYNC: 1078 case MSG_IDR_1_0_MESSAGE_SYNC: 1079 hmdfs_response_wakeup((struct sendmsg_wait_queue *)head, 1080 -ETIME, 0, NULL); 1081 hmdfs_debug("wakeup id=%d", head->msg_id); 1082 msg_put((struct sendmsg_wait_queue *)head); 1083 break; 1084 case MSG_IDR_MESSAGE_ASYNC: 1085 hmdfs_wakeup_parasite( 1086 (struct hmdfs_msg_parasite *)head); 1087 hmdfs_debug("wakeup parasite id=%d", head->msg_id); 1088 mp_put((struct hmdfs_msg_parasite *)head); 1089 break; 1090 case MSG_IDR_PAGE: 1091 case MSG_IDR_1_0_PAGE: 1092 hmdfs_wakeup_async_work( 1093 (struct hmdfs_async_work *)head); 1094 hmdfs_debug("wakeup async work id=%d", head->msg_id); 1095 asw_put((struct hmdfs_async_work *)head); 1096 break; 1097 default: 1098 hmdfs_err("Bad type=%d id=%d", head->type, 1099 head->msg_id); 1100 break; 1101 } 1102 1103 count++; 1104 /* If there are too many idr to process, avoid to soft lockup, 1105 * process every 512 message we resched 1106 */ 1107 if (count % HMDFS_IDR_RESCHED_COUNT == 0) 1108 cond_resched(); 1109 } 1110} 1111 1112static struct hmdfs_node_cb_desc client_cb[] = { 1113 { 1114 .evt = NODE_EVT_OFFLINE, 1115 .sync = true, 1116 .fn = hmdfs_client_offline_notify, 1117 }, 1118}; 1119 1120void __init hmdfs_client_add_node_evt_cb(void) 1121{ 1122 hmdfs_node_add_evt_cb(client_cb, ARRAY_SIZE(client_cb)); 1123} 1124