1 // SPDX-License-Identifier: LGPL-2.1 2 /* 3 * 4 * Copyright (C) International Business Machines Corp., 2002,2010 5 * Author(s): Steve French (sfrench@us.ibm.com) 6 * 7 */ 8 #include <linux/fs.h> 9 #include <linux/stat.h> 10 #include <linux/slab.h> 11 #include <linux/pagemap.h> 12 #include <linux/freezer.h> 13 #include <linux/sched/signal.h> 14 #include <linux/wait_bit.h> 15 #include <linux/fiemap.h> 16 #include <asm/div64.h> 17 #include "cifsfs.h" 18 #include "cifspdu.h" 19 #include "cifsglob.h" 20 #include "cifsproto.h" 21 #include "smb2proto.h" 22 #include "cifs_debug.h" 23 #include "cifs_fs_sb.h" 24 #include "cifs_unicode.h" 25 #include "fscache.h" 26 #include "fs_context.h" 27 #include "cifs_ioctl.h" 28 #include "cached_dir.h" 29 #include "reparse.h" 30 31 /* 32 * Set parameters for the netfs library 33 */ 34 static void cifs_set_netfs_context(struct inode *inode) 35 { 36 struct cifsInodeInfo *cifs_i = CIFS_I(inode); 37 38 netfs_inode_init(&cifs_i->netfs, &cifs_req_ops, true); 39 } 40 41 static void cifs_set_ops(struct inode *inode) 42 { 43 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 44 struct netfs_inode *ictx = netfs_inode(inode); 45 46 switch (inode->i_mode & S_IFMT) { 47 case S_IFREG: 48 inode->i_op = &cifs_file_inode_ops; 49 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { 50 set_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags); 51 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) 52 inode->i_fop = &cifs_file_direct_nobrl_ops; 53 else 54 inode->i_fop = &cifs_file_direct_ops; 55 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) { 56 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) 57 inode->i_fop = &cifs_file_strict_nobrl_ops; 58 else 59 inode->i_fop = &cifs_file_strict_ops; 60 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) 61 inode->i_fop = &cifs_file_nobrl_ops; 62 else { /* not direct, send byte range locks */ 63 inode->i_fop = &cifs_file_ops; 64 } 65 66 /* check if server can support readahead */ 67 if (cifs_sb_master_tcon(cifs_sb)->ses->server->max_read < 68 PAGE_SIZE + MAX_CIFS_HDR_SIZE) 69 inode->i_data.a_ops = &cifs_addr_ops_smallbuf; 70 else 71 inode->i_data.a_ops = &cifs_addr_ops; 72 mapping_set_large_folios(inode->i_mapping); 73 break; 74 case S_IFDIR: 75 if (IS_AUTOMOUNT(inode)) { 76 inode->i_op = &cifs_namespace_inode_operations; 77 } else { 78 inode->i_op = &cifs_dir_inode_ops; 79 inode->i_fop = &cifs_dir_ops; 80 } 81 break; 82 case S_IFLNK: 83 inode->i_op = &cifs_symlink_inode_ops; 84 break; 85 default: 86 init_special_inode(inode, inode->i_mode, inode->i_rdev); 87 break; 88 } 89 } 90 91 /* check inode attributes against fattr. If they don't match, tag the 92 * inode for cache invalidation 93 */ 94 static void 95 cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr) 96 { 97 struct cifs_fscache_inode_coherency_data cd; 98 struct cifsInodeInfo *cifs_i = CIFS_I(inode); 99 struct timespec64 mtime; 100 101 cifs_dbg(FYI, "%s: revalidating inode %llu\n", 102 __func__, cifs_i->uniqueid); 103 104 if (inode->i_state & I_NEW) { 105 cifs_dbg(FYI, "%s: inode %llu is new\n", 106 __func__, cifs_i->uniqueid); 107 return; 108 } 109 110 /* don't bother with revalidation if we have an oplock */ 111 if (CIFS_CACHE_READ(cifs_i)) { 112 cifs_dbg(FYI, "%s: inode %llu is oplocked\n", 113 __func__, cifs_i->uniqueid); 114 return; 115 } 116 117 /* revalidate if mtime or size have changed */ 118 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode); 119 mtime = inode_get_mtime(inode); 120 if (timespec64_equal(&mtime, &fattr->cf_mtime) && 121 cifs_i->netfs.remote_i_size == fattr->cf_eof) { 122 cifs_dbg(FYI, "%s: inode %llu is unchanged\n", 123 __func__, cifs_i->uniqueid); 124 return; 125 } 126 127 cifs_dbg(FYI, "%s: invalidating inode %llu mapping\n", 128 __func__, cifs_i->uniqueid); 129 set_bit(CIFS_INO_INVALID_MAPPING, &cifs_i->flags); 130 /* Invalidate fscache cookie */ 131 cifs_fscache_fill_coherency(&cifs_i->netfs.inode, &cd); 132 fscache_invalidate(cifs_inode_cookie(inode), &cd, i_size_read(inode), 0); 133 } 134 135 /* 136 * copy nlink to the inode, unless it wasn't provided. Provide 137 * sane values if we don't have an existing one and none was provided 138 */ 139 static void 140 cifs_nlink_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) 141 { 142 /* 143 * if we're in a situation where we can't trust what we 144 * got from the server (readdir, some non-unix cases) 145 * fake reasonable values 146 */ 147 if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) { 148 /* only provide fake values on a new inode */ 149 if (inode->i_state & I_NEW) { 150 if (fattr->cf_cifsattrs & ATTR_DIRECTORY) 151 set_nlink(inode, 2); 152 else 153 set_nlink(inode, 1); 154 } 155 return; 156 } 157 158 /* we trust the server, so update it */ 159 set_nlink(inode, fattr->cf_nlink); 160 } 161 162 /* populate an inode with info from a cifs_fattr struct */ 163 int 164 cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr, 165 bool from_readdir) 166 { 167 struct cifsInodeInfo *cifs_i = CIFS_I(inode); 168 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 169 170 if (!(inode->i_state & I_NEW) && 171 unlikely(inode_wrong_type(inode, fattr->cf_mode))) { 172 CIFS_I(inode)->time = 0; /* force reval */ 173 return -ESTALE; 174 } 175 if (inode->i_state & I_NEW) 176 CIFS_I(inode)->netfs.zero_point = fattr->cf_eof; 177 178 cifs_revalidate_cache(inode, fattr); 179 180 spin_lock(&inode->i_lock); 181 fattr->cf_mtime = timestamp_truncate(fattr->cf_mtime, inode); 182 fattr->cf_atime = timestamp_truncate(fattr->cf_atime, inode); 183 fattr->cf_ctime = timestamp_truncate(fattr->cf_ctime, inode); 184 /* we do not want atime to be less than mtime, it broke some apps */ 185 if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime) < 0) 186 inode_set_atime_to_ts(inode, fattr->cf_mtime); 187 else 188 inode_set_atime_to_ts(inode, fattr->cf_atime); 189 inode_set_mtime_to_ts(inode, fattr->cf_mtime); 190 inode_set_ctime_to_ts(inode, fattr->cf_ctime); 191 inode->i_rdev = fattr->cf_rdev; 192 cifs_nlink_fattr_to_inode(inode, fattr); 193 inode->i_uid = fattr->cf_uid; 194 inode->i_gid = fattr->cf_gid; 195 196 /* if dynperm is set, don't clobber existing mode */ 197 if (inode->i_state & I_NEW || 198 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) 199 inode->i_mode = fattr->cf_mode; 200 201 cifs_i->cifsAttrs = fattr->cf_cifsattrs; 202 cifs_i->reparse_tag = fattr->cf_cifstag; 203 204 if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL) 205 cifs_i->time = 0; 206 else 207 cifs_i->time = jiffies; 208 209 if (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING) 210 set_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags); 211 else 212 clear_bit(CIFS_INO_DELETE_PENDING, &cifs_i->flags); 213 214 cifs_i->netfs.remote_i_size = fattr->cf_eof; 215 /* 216 * Can't safely change the file size here if the client is writing to 217 * it due to potential races. 218 */ 219 if (is_size_safe_to_change(cifs_i, fattr->cf_eof, from_readdir)) { 220 i_size_write(inode, fattr->cf_eof); 221 222 /* 223 * i_blocks is not related to (i_size / i_blksize), 224 * but instead 512 byte (2**9) size is required for 225 * calculating num blocks. 226 */ 227 inode->i_blocks = (512 - 1 + fattr->cf_bytes) >> 9; 228 } 229 230 if (S_ISLNK(fattr->cf_mode) && fattr->cf_symlink_target) { 231 kfree(cifs_i->symlink_target); 232 cifs_i->symlink_target = fattr->cf_symlink_target; 233 fattr->cf_symlink_target = NULL; 234 } 235 spin_unlock(&inode->i_lock); 236 237 if (fattr->cf_flags & CIFS_FATTR_JUNCTION) 238 inode->i_flags |= S_AUTOMOUNT; 239 if (inode->i_state & I_NEW) { 240 cifs_set_netfs_context(inode); 241 cifs_set_ops(inode); 242 } 243 return 0; 244 } 245 246 void 247 cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr) 248 { 249 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 250 251 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) 252 return; 253 254 fattr->cf_uniqueid = iunique(sb, ROOT_I); 255 } 256 257 /* Fill a cifs_fattr struct with info from FILE_UNIX_BASIC_INFO. */ 258 void 259 cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, FILE_UNIX_BASIC_INFO *info, 260 struct cifs_sb_info *cifs_sb) 261 { 262 memset(fattr, 0, sizeof(*fattr)); 263 fattr->cf_uniqueid = le64_to_cpu(info->UniqueId); 264 fattr->cf_bytes = le64_to_cpu(info->NumOfBytes); 265 fattr->cf_eof = le64_to_cpu(info->EndOfFile); 266 267 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime); 268 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastModificationTime); 269 fattr->cf_ctime = cifs_NTtimeToUnix(info->LastStatusChange); 270 /* old POSIX extensions don't get create time */ 271 272 fattr->cf_mode = le64_to_cpu(info->Permissions); 273 274 /* 275 * Since we set the inode type below we need to mask off 276 * to avoid strange results if bits set above. 277 */ 278 fattr->cf_mode &= ~S_IFMT; 279 switch (le32_to_cpu(info->Type)) { 280 case UNIX_FILE: 281 fattr->cf_mode |= S_IFREG; 282 fattr->cf_dtype = DT_REG; 283 break; 284 case UNIX_SYMLINK: 285 fattr->cf_mode |= S_IFLNK; 286 fattr->cf_dtype = DT_LNK; 287 break; 288 case UNIX_DIR: 289 fattr->cf_mode |= S_IFDIR; 290 fattr->cf_dtype = DT_DIR; 291 break; 292 case UNIX_CHARDEV: 293 fattr->cf_mode |= S_IFCHR; 294 fattr->cf_dtype = DT_CHR; 295 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor), 296 le64_to_cpu(info->DevMinor) & MINORMASK); 297 break; 298 case UNIX_BLOCKDEV: 299 fattr->cf_mode |= S_IFBLK; 300 fattr->cf_dtype = DT_BLK; 301 fattr->cf_rdev = MKDEV(le64_to_cpu(info->DevMajor), 302 le64_to_cpu(info->DevMinor) & MINORMASK); 303 break; 304 case UNIX_FIFO: 305 fattr->cf_mode |= S_IFIFO; 306 fattr->cf_dtype = DT_FIFO; 307 break; 308 case UNIX_SOCKET: 309 fattr->cf_mode |= S_IFSOCK; 310 fattr->cf_dtype = DT_SOCK; 311 break; 312 default: 313 /* safest to call it a file if we do not know */ 314 fattr->cf_mode |= S_IFREG; 315 fattr->cf_dtype = DT_REG; 316 cifs_dbg(FYI, "unknown type %d\n", le32_to_cpu(info->Type)); 317 break; 318 } 319 320 fattr->cf_uid = cifs_sb->ctx->linux_uid; 321 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) { 322 u64 id = le64_to_cpu(info->Uid); 323 if (id < ((uid_t)-1)) { 324 kuid_t uid = make_kuid(&init_user_ns, id); 325 if (uid_valid(uid)) 326 fattr->cf_uid = uid; 327 } 328 } 329 330 fattr->cf_gid = cifs_sb->ctx->linux_gid; 331 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) { 332 u64 id = le64_to_cpu(info->Gid); 333 if (id < ((gid_t)-1)) { 334 kgid_t gid = make_kgid(&init_user_ns, id); 335 if (gid_valid(gid)) 336 fattr->cf_gid = gid; 337 } 338 } 339 340 fattr->cf_nlink = le64_to_cpu(info->Nlinks); 341 } 342 343 /* 344 * Fill a cifs_fattr struct with fake inode info. 345 * 346 * Needed to setup cifs_fattr data for the directory which is the 347 * junction to the new submount (ie to setup the fake directory 348 * which represents a DFS referral or reparse mount point). 349 */ 350 static void cifs_create_junction_fattr(struct cifs_fattr *fattr, 351 struct super_block *sb) 352 { 353 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 354 355 cifs_dbg(FYI, "%s: creating fake fattr\n", __func__); 356 357 memset(fattr, 0, sizeof(*fattr)); 358 fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU; 359 fattr->cf_uid = cifs_sb->ctx->linux_uid; 360 fattr->cf_gid = cifs_sb->ctx->linux_gid; 361 ktime_get_coarse_real_ts64(&fattr->cf_mtime); 362 fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime; 363 fattr->cf_nlink = 2; 364 fattr->cf_flags = CIFS_FATTR_JUNCTION; 365 } 366 367 /* Update inode with final fattr data */ 368 static int update_inode_info(struct super_block *sb, 369 struct cifs_fattr *fattr, 370 struct inode **inode) 371 { 372 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 373 int rc = 0; 374 375 if (!*inode) { 376 *inode = cifs_iget(sb, fattr); 377 if (!*inode) 378 rc = -ENOMEM; 379 return rc; 380 } 381 /* We already have inode, update it. 382 * 383 * If file type or uniqueid is different, return error. 384 */ 385 if (unlikely((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) && 386 CIFS_I(*inode)->uniqueid != fattr->cf_uniqueid)) { 387 CIFS_I(*inode)->time = 0; /* force reval */ 388 return -ESTALE; 389 } 390 return cifs_fattr_to_inode(*inode, fattr, false); 391 } 392 393 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 394 static int 395 cifs_get_file_info_unix(struct file *filp) 396 { 397 int rc; 398 unsigned int xid; 399 FILE_UNIX_BASIC_INFO find_data; 400 struct cifs_fattr fattr = {}; 401 struct inode *inode = file_inode(filp); 402 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 403 struct cifsFileInfo *cfile = filp->private_data; 404 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 405 406 xid = get_xid(); 407 408 if (cfile->symlink_target) { 409 fattr.cf_symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL); 410 if (!fattr.cf_symlink_target) { 411 rc = -ENOMEM; 412 goto cifs_gfiunix_out; 413 } 414 } 415 416 rc = CIFSSMBUnixQFileInfo(xid, tcon, cfile->fid.netfid, &find_data); 417 if (!rc) { 418 cifs_unix_basic_to_fattr(&fattr, &find_data, cifs_sb); 419 } else if (rc == -EREMOTE) { 420 cifs_create_junction_fattr(&fattr, inode->i_sb); 421 } else 422 goto cifs_gfiunix_out; 423 424 rc = cifs_fattr_to_inode(inode, &fattr, false); 425 426 cifs_gfiunix_out: 427 free_xid(xid); 428 return rc; 429 } 430 431 static int cifs_get_unix_fattr(const unsigned char *full_path, 432 struct super_block *sb, 433 struct cifs_fattr *fattr, 434 struct inode **pinode, 435 const unsigned int xid) 436 { 437 struct TCP_Server_Info *server; 438 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 439 FILE_UNIX_BASIC_INFO find_data; 440 struct cifs_tcon *tcon; 441 struct tcon_link *tlink; 442 int rc, tmprc; 443 444 cifs_dbg(FYI, "Getting info on %s\n", full_path); 445 446 tlink = cifs_sb_tlink(cifs_sb); 447 if (IS_ERR(tlink)) 448 return PTR_ERR(tlink); 449 tcon = tlink_tcon(tlink); 450 server = tcon->ses->server; 451 452 /* could have done a find first instead but this returns more info */ 453 rc = CIFSSMBUnixQPathInfo(xid, tcon, full_path, &find_data, 454 cifs_sb->local_nls, cifs_remap(cifs_sb)); 455 cifs_dbg(FYI, "%s: query path info: rc = %d\n", __func__, rc); 456 cifs_put_tlink(tlink); 457 458 if (!rc) { 459 cifs_unix_basic_to_fattr(fattr, &find_data, cifs_sb); 460 } else if (rc == -EREMOTE) { 461 cifs_create_junction_fattr(fattr, sb); 462 rc = 0; 463 } else { 464 return rc; 465 } 466 467 if (!*pinode) 468 cifs_fill_uniqueid(sb, fattr); 469 470 /* check for Minshall+French symlinks */ 471 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) { 472 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path); 473 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc); 474 } 475 476 if (S_ISLNK(fattr->cf_mode) && !fattr->cf_symlink_target) { 477 if (!server->ops->query_symlink) 478 return -EOPNOTSUPP; 479 rc = server->ops->query_symlink(xid, tcon, 480 cifs_sb, full_path, 481 &fattr->cf_symlink_target); 482 cifs_dbg(FYI, "%s: query_symlink: %d\n", __func__, rc); 483 } 484 return rc; 485 } 486 487 int cifs_get_inode_info_unix(struct inode **pinode, 488 const unsigned char *full_path, 489 struct super_block *sb, unsigned int xid) 490 { 491 struct cifs_fattr fattr = {}; 492 int rc; 493 494 rc = cifs_get_unix_fattr(full_path, sb, &fattr, pinode, xid); 495 if (rc) 496 goto out; 497 498 rc = update_inode_info(sb, &fattr, pinode); 499 out: 500 kfree(fattr.cf_symlink_target); 501 return rc; 502 } 503 #else 504 static inline int cifs_get_unix_fattr(const unsigned char *full_path, 505 struct super_block *sb, 506 struct cifs_fattr *fattr, 507 struct inode **pinode, 508 const unsigned int xid) 509 { 510 return -EOPNOTSUPP; 511 } 512 513 int cifs_get_inode_info_unix(struct inode **pinode, 514 const unsigned char *full_path, 515 struct super_block *sb, unsigned int xid) 516 { 517 return -EOPNOTSUPP; 518 } 519 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 520 521 static int 522 cifs_sfu_type(struct cifs_fattr *fattr, const char *path, 523 struct cifs_sb_info *cifs_sb, unsigned int xid) 524 { 525 int rc; 526 __u32 oplock; 527 struct tcon_link *tlink; 528 struct cifs_tcon *tcon; 529 struct cifs_fid fid; 530 struct cifs_open_parms oparms; 531 struct cifs_io_parms io_parms = {0}; 532 char *symlink_buf_utf16; 533 unsigned int symlink_len_utf16; 534 char buf[24]; 535 unsigned int bytes_read; 536 char *pbuf; 537 int buf_type = CIFS_NO_BUFFER; 538 539 pbuf = buf; 540 541 fattr->cf_mode &= ~S_IFMT; 542 543 if (fattr->cf_eof == 0) { 544 cifs_dbg(FYI, "Fifo\n"); 545 fattr->cf_mode |= S_IFIFO; 546 fattr->cf_dtype = DT_FIFO; 547 return 0; 548 } else if (fattr->cf_eof > 1 && fattr->cf_eof < 8) { 549 fattr->cf_mode |= S_IFREG; 550 fattr->cf_dtype = DT_REG; 551 return -EINVAL; /* EOPNOTSUPP? */ 552 } 553 554 tlink = cifs_sb_tlink(cifs_sb); 555 if (IS_ERR(tlink)) 556 return PTR_ERR(tlink); 557 tcon = tlink_tcon(tlink); 558 559 oparms = (struct cifs_open_parms) { 560 .tcon = tcon, 561 .cifs_sb = cifs_sb, 562 .desired_access = GENERIC_READ, 563 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR), 564 .disposition = FILE_OPEN, 565 .path = path, 566 .fid = &fid, 567 }; 568 569 if (tcon->ses->server->oplocks) 570 oplock = REQ_OPLOCK; 571 else 572 oplock = 0; 573 rc = tcon->ses->server->ops->open(xid, &oparms, &oplock, NULL); 574 if (rc) { 575 cifs_dbg(FYI, "check sfu type of %s, open rc = %d\n", path, rc); 576 cifs_put_tlink(tlink); 577 return rc; 578 } 579 580 /* Read header */ 581 io_parms.netfid = fid.netfid; 582 io_parms.pid = current->tgid; 583 io_parms.tcon = tcon; 584 io_parms.offset = 0; 585 io_parms.length = 24; 586 587 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms, 588 &bytes_read, &pbuf, &buf_type); 589 if ((rc == 0) && (bytes_read >= 8)) { 590 if (memcmp("IntxBLK\0", pbuf, 8) == 0) { 591 cifs_dbg(FYI, "Block device\n"); 592 fattr->cf_mode |= S_IFBLK; 593 fattr->cf_dtype = DT_BLK; 594 if (bytes_read == 24) { 595 /* we have enough to decode dev num */ 596 __u64 mjr; /* major */ 597 __u64 mnr; /* minor */ 598 mjr = le64_to_cpu(*(__le64 *)(pbuf+8)); 599 mnr = le64_to_cpu(*(__le64 *)(pbuf+16)); 600 fattr->cf_rdev = MKDEV(mjr, mnr); 601 } else if (bytes_read == 16) { 602 /* 603 * Windows NFS server before Windows Server 2012 604 * stores major and minor number in SFU-modified 605 * style, just as 32-bit numbers. Recognize it. 606 */ 607 __u32 mjr; /* major */ 608 __u32 mnr; /* minor */ 609 mjr = le32_to_cpu(*(__le32 *)(pbuf+8)); 610 mnr = le32_to_cpu(*(__le32 *)(pbuf+12)); 611 fattr->cf_rdev = MKDEV(mjr, mnr); 612 } 613 } else if (memcmp("IntxCHR\0", pbuf, 8) == 0) { 614 cifs_dbg(FYI, "Char device\n"); 615 fattr->cf_mode |= S_IFCHR; 616 fattr->cf_dtype = DT_CHR; 617 if (bytes_read == 24) { 618 /* we have enough to decode dev num */ 619 __u64 mjr; /* major */ 620 __u64 mnr; /* minor */ 621 mjr = le64_to_cpu(*(__le64 *)(pbuf+8)); 622 mnr = le64_to_cpu(*(__le64 *)(pbuf+16)); 623 fattr->cf_rdev = MKDEV(mjr, mnr); 624 } else if (bytes_read == 16) { 625 /* 626 * Windows NFS server before Windows Server 2012 627 * stores major and minor number in SFU-modified 628 * style, just as 32-bit numbers. Recognize it. 629 */ 630 __u32 mjr; /* major */ 631 __u32 mnr; /* minor */ 632 mjr = le32_to_cpu(*(__le32 *)(pbuf+8)); 633 mnr = le32_to_cpu(*(__le32 *)(pbuf+12)); 634 fattr->cf_rdev = MKDEV(mjr, mnr); 635 } 636 } else if (memcmp("LnxSOCK", pbuf, 8) == 0) { 637 cifs_dbg(FYI, "Socket\n"); 638 fattr->cf_mode |= S_IFSOCK; 639 fattr->cf_dtype = DT_SOCK; 640 } else if (memcmp("IntxLNK\1", pbuf, 8) == 0) { 641 cifs_dbg(FYI, "Symlink\n"); 642 fattr->cf_mode |= S_IFLNK; 643 fattr->cf_dtype = DT_LNK; 644 if ((fattr->cf_eof > 8) && (fattr->cf_eof % 2 == 0)) { 645 symlink_buf_utf16 = kmalloc(fattr->cf_eof-8 + 1, GFP_KERNEL); 646 if (symlink_buf_utf16) { 647 io_parms.offset = 8; 648 io_parms.length = fattr->cf_eof-8 + 1; 649 buf_type = CIFS_NO_BUFFER; 650 rc = tcon->ses->server->ops->sync_read(xid, &fid, &io_parms, 651 &symlink_len_utf16, 652 &symlink_buf_utf16, 653 &buf_type); 654 /* 655 * Check that read buffer has valid length and does not 656 * contain UTF-16 null codepoint (via UniStrnlen() call) 657 * because Linux cannot process symlink with null byte. 658 */ 659 if ((rc == 0) && 660 (symlink_len_utf16 > 0) && 661 (symlink_len_utf16 < fattr->cf_eof-8 + 1) && 662 (symlink_len_utf16 % 2 == 0) && 663 (UniStrnlen((wchar_t *)symlink_buf_utf16, symlink_len_utf16/2) == symlink_len_utf16/2)) { 664 fattr->cf_symlink_target = 665 cifs_strndup_from_utf16(symlink_buf_utf16, 666 symlink_len_utf16, 667 true, 668 cifs_sb->local_nls); 669 if (!fattr->cf_symlink_target) 670 rc = -ENOMEM; 671 } 672 kfree(symlink_buf_utf16); 673 } else { 674 rc = -ENOMEM; 675 } 676 } 677 } else if (memcmp("LnxFIFO", pbuf, 8) == 0) { 678 cifs_dbg(FYI, "FIFO\n"); 679 fattr->cf_mode |= S_IFIFO; 680 fattr->cf_dtype = DT_FIFO; 681 } else { 682 fattr->cf_mode |= S_IFREG; /* file? */ 683 fattr->cf_dtype = DT_REG; 684 rc = -EOPNOTSUPP; 685 } 686 } else if ((rc == 0) && (bytes_read == 1) && (pbuf[0] == '\0')) { 687 cifs_dbg(FYI, "Socket\n"); 688 fattr->cf_mode |= S_IFSOCK; 689 fattr->cf_dtype = DT_SOCK; 690 } else { 691 fattr->cf_mode |= S_IFREG; /* then it is a file */ 692 fattr->cf_dtype = DT_REG; 693 rc = -EOPNOTSUPP; /* or some unknown SFU type */ 694 } 695 696 tcon->ses->server->ops->close(xid, tcon, &fid); 697 cifs_put_tlink(tlink); 698 return rc; 699 } 700 701 #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */ 702 703 /* 704 * Fetch mode bits as provided by SFU. 705 * 706 * FIXME: Doesn't this clobber the type bit we got from cifs_sfu_type ? 707 */ 708 static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path, 709 struct cifs_sb_info *cifs_sb, unsigned int xid) 710 { 711 #ifdef CONFIG_CIFS_XATTR 712 ssize_t rc; 713 char ea_value[4]; 714 __u32 mode; 715 struct tcon_link *tlink; 716 struct cifs_tcon *tcon; 717 718 tlink = cifs_sb_tlink(cifs_sb); 719 if (IS_ERR(tlink)) 720 return PTR_ERR(tlink); 721 tcon = tlink_tcon(tlink); 722 723 if (tcon->ses->server->ops->query_all_EAs == NULL) { 724 cifs_put_tlink(tlink); 725 return -EOPNOTSUPP; 726 } 727 728 rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path, 729 "SETFILEBITS", ea_value, 4 /* size of buf */, 730 cifs_sb); 731 cifs_put_tlink(tlink); 732 if (rc < 0) 733 return (int)rc; 734 else if (rc > 3) { 735 mode = le32_to_cpu(*((__le32 *)ea_value)); 736 fattr->cf_mode &= ~SFBITS_MASK; 737 cifs_dbg(FYI, "special bits 0%o org mode 0%o\n", 738 mode, fattr->cf_mode); 739 fattr->cf_mode = (mode & SFBITS_MASK) | fattr->cf_mode; 740 cifs_dbg(FYI, "special mode bits 0%o\n", mode); 741 } 742 743 return 0; 744 #else 745 return -EOPNOTSUPP; 746 #endif 747 } 748 749 #define POSIX_TYPE_FILE 0 750 #define POSIX_TYPE_DIR 1 751 #define POSIX_TYPE_SYMLINK 2 752 #define POSIX_TYPE_CHARDEV 3 753 #define POSIX_TYPE_BLKDEV 4 754 #define POSIX_TYPE_FIFO 5 755 #define POSIX_TYPE_SOCKET 6 756 757 #define POSIX_X_OTH 0000001 758 #define POSIX_W_OTH 0000002 759 #define POSIX_R_OTH 0000004 760 #define POSIX_X_GRP 0000010 761 #define POSIX_W_GRP 0000020 762 #define POSIX_R_GRP 0000040 763 #define POSIX_X_USR 0000100 764 #define POSIX_W_USR 0000200 765 #define POSIX_R_USR 0000400 766 #define POSIX_STICKY 0001000 767 #define POSIX_SET_GID 0002000 768 #define POSIX_SET_UID 0004000 769 770 #define POSIX_OTH_MASK 0000007 771 #define POSIX_GRP_MASK 0000070 772 #define POSIX_USR_MASK 0000700 773 #define POSIX_PERM_MASK 0000777 774 #define POSIX_FILETYPE_MASK 0070000 775 776 #define POSIX_FILETYPE_SHIFT 12 777 778 static u32 wire_perms_to_posix(u32 wire) 779 { 780 u32 mode = 0; 781 782 mode |= (wire & POSIX_X_OTH) ? S_IXOTH : 0; 783 mode |= (wire & POSIX_W_OTH) ? S_IWOTH : 0; 784 mode |= (wire & POSIX_R_OTH) ? S_IROTH : 0; 785 mode |= (wire & POSIX_X_GRP) ? S_IXGRP : 0; 786 mode |= (wire & POSIX_W_GRP) ? S_IWGRP : 0; 787 mode |= (wire & POSIX_R_GRP) ? S_IRGRP : 0; 788 mode |= (wire & POSIX_X_USR) ? S_IXUSR : 0; 789 mode |= (wire & POSIX_W_USR) ? S_IWUSR : 0; 790 mode |= (wire & POSIX_R_USR) ? S_IRUSR : 0; 791 mode |= (wire & POSIX_STICKY) ? S_ISVTX : 0; 792 mode |= (wire & POSIX_SET_GID) ? S_ISGID : 0; 793 mode |= (wire & POSIX_SET_UID) ? S_ISUID : 0; 794 795 return mode; 796 } 797 798 static u32 posix_filetypes[] = { 799 S_IFREG, 800 S_IFDIR, 801 S_IFLNK, 802 S_IFCHR, 803 S_IFBLK, 804 S_IFIFO, 805 S_IFSOCK 806 }; 807 808 static u32 wire_filetype_to_posix(u32 wire_type) 809 { 810 if (wire_type >= ARRAY_SIZE(posix_filetypes)) { 811 pr_warn("Unexpected type %u", wire_type); 812 return 0; 813 } 814 return posix_filetypes[wire_type]; 815 } 816 817 umode_t wire_mode_to_posix(u32 wire, bool is_dir) 818 { 819 u32 wire_type; 820 u32 mode; 821 822 wire_type = (wire & POSIX_FILETYPE_MASK) >> POSIX_FILETYPE_SHIFT; 823 /* older servers do not set POSIX file type in the mode field in the response */ 824 if ((wire_type == 0) && is_dir) 825 mode = wire_perms_to_posix(wire) | S_IFDIR; 826 else 827 mode = (wire_perms_to_posix(wire) | wire_filetype_to_posix(wire_type)); 828 return (umode_t)mode; 829 } 830 831 /* Fill a cifs_fattr struct with info from POSIX info struct */ 832 static void smb311_posix_info_to_fattr(struct cifs_fattr *fattr, 833 struct cifs_open_info_data *data, 834 struct super_block *sb) 835 { 836 struct smb311_posix_qinfo *info = &data->posix_fi; 837 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 838 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); 839 840 memset(fattr, 0, sizeof(*fattr)); 841 842 /* no fattr->flags to set */ 843 fattr->cf_cifsattrs = le32_to_cpu(info->DosAttributes); 844 fattr->cf_uniqueid = le64_to_cpu(info->Inode); 845 846 if (info->LastAccessTime) 847 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime); 848 else 849 ktime_get_coarse_real_ts64(&fattr->cf_atime); 850 851 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime); 852 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime); 853 854 if (data->adjust_tz) { 855 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj; 856 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj; 857 } 858 859 /* 860 * The srv fs device id is overridden on network mount so setting 861 * @fattr->cf_rdev isn't needed here. 862 */ 863 fattr->cf_eof = le64_to_cpu(info->EndOfFile); 864 fattr->cf_bytes = le64_to_cpu(info->AllocationSize); 865 fattr->cf_createtime = le64_to_cpu(info->CreationTime); 866 fattr->cf_nlink = le32_to_cpu(info->HardLinks); 867 fattr->cf_mode = wire_mode_to_posix(le32_to_cpu(info->Mode), 868 fattr->cf_cifsattrs & ATTR_DIRECTORY); 869 870 if (cifs_open_data_reparse(data) && 871 cifs_reparse_point_to_fattr(cifs_sb, fattr, data)) 872 goto out_reparse; 873 874 fattr->cf_dtype = S_DT(fattr->cf_mode); 875 876 out_reparse: 877 if (S_ISLNK(fattr->cf_mode)) { 878 if (likely(data->symlink_target)) 879 fattr->cf_eof = strnlen(data->symlink_target, PATH_MAX); 880 fattr->cf_symlink_target = data->symlink_target; 881 data->symlink_target = NULL; 882 } 883 sid_to_id(cifs_sb, &data->posix_owner, fattr, SIDOWNER); 884 sid_to_id(cifs_sb, &data->posix_group, fattr, SIDGROUP); 885 886 cifs_dbg(FYI, "POSIX query info: mode 0x%x uniqueid 0x%llx nlink %d\n", 887 fattr->cf_mode, fattr->cf_uniqueid, fattr->cf_nlink); 888 } 889 890 static void cifs_open_info_to_fattr(struct cifs_fattr *fattr, 891 struct cifs_open_info_data *data, 892 struct super_block *sb) 893 { 894 struct smb2_file_all_info *info = &data->fi; 895 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 896 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); 897 898 memset(fattr, 0, sizeof(*fattr)); 899 fattr->cf_cifsattrs = le32_to_cpu(info->Attributes); 900 if (info->DeletePending) 901 fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING; 902 903 if (info->LastAccessTime) 904 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime); 905 else 906 ktime_get_coarse_real_ts64(&fattr->cf_atime); 907 908 fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime); 909 fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime); 910 911 if (data->adjust_tz) { 912 fattr->cf_ctime.tv_sec += tcon->ses->server->timeAdj; 913 fattr->cf_mtime.tv_sec += tcon->ses->server->timeAdj; 914 } 915 916 fattr->cf_eof = le64_to_cpu(info->EndOfFile); 917 fattr->cf_bytes = le64_to_cpu(info->AllocationSize); 918 fattr->cf_createtime = le64_to_cpu(info->CreationTime); 919 fattr->cf_nlink = le32_to_cpu(info->NumberOfLinks); 920 fattr->cf_uid = cifs_sb->ctx->linux_uid; 921 fattr->cf_gid = cifs_sb->ctx->linux_gid; 922 923 fattr->cf_mode = cifs_sb->ctx->file_mode; 924 if (cifs_open_data_reparse(data) && 925 cifs_reparse_point_to_fattr(cifs_sb, fattr, data)) 926 goto out_reparse; 927 928 if (fattr->cf_cifsattrs & ATTR_DIRECTORY) { 929 fattr->cf_mode = S_IFDIR | cifs_sb->ctx->dir_mode; 930 fattr->cf_dtype = DT_DIR; 931 /* 932 * Server can return wrong NumberOfLinks value for directories 933 * when Unix extensions are disabled - fake it. 934 */ 935 if (!tcon->unix_ext) 936 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK; 937 } else { 938 fattr->cf_mode = S_IFREG | cifs_sb->ctx->file_mode; 939 fattr->cf_dtype = DT_REG; 940 941 /* 942 * Don't accept zero nlink from non-unix servers unless 943 * delete is pending. Instead mark it as unknown. 944 */ 945 if ((fattr->cf_nlink < 1) && !tcon->unix_ext && 946 !info->DeletePending) { 947 cifs_dbg(VFS, "bogus file nlink value %u\n", 948 fattr->cf_nlink); 949 fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK; 950 } 951 } 952 953 /* clear write bits if ATTR_READONLY is set */ 954 if (fattr->cf_cifsattrs & ATTR_READONLY) 955 fattr->cf_mode &= ~(S_IWUGO); 956 957 out_reparse: 958 if (S_ISLNK(fattr->cf_mode)) { 959 if (likely(data->symlink_target)) 960 fattr->cf_eof = strnlen(data->symlink_target, PATH_MAX); 961 fattr->cf_symlink_target = data->symlink_target; 962 data->symlink_target = NULL; 963 } 964 } 965 966 static int 967 cifs_get_file_info(struct file *filp) 968 { 969 int rc; 970 unsigned int xid; 971 struct cifs_open_info_data data = {}; 972 struct cifs_fattr fattr; 973 struct inode *inode = file_inode(filp); 974 struct cifsFileInfo *cfile = filp->private_data; 975 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 976 struct TCP_Server_Info *server = tcon->ses->server; 977 struct dentry *dentry = filp->f_path.dentry; 978 void *page = alloc_dentry_path(); 979 const unsigned char *path; 980 981 if (!server->ops->query_file_info) { 982 free_dentry_path(page); 983 return -ENOSYS; 984 } 985 986 xid = get_xid(); 987 rc = server->ops->query_file_info(xid, tcon, cfile, &data); 988 switch (rc) { 989 case 0: 990 /* TODO: add support to query reparse tag */ 991 data.adjust_tz = false; 992 if (data.symlink_target) { 993 data.reparse_point = true; 994 data.reparse.tag = IO_REPARSE_TAG_SYMLINK; 995 } 996 path = build_path_from_dentry(dentry, page); 997 if (IS_ERR(path)) { 998 rc = PTR_ERR(path); 999 goto cgfi_exit; 1000 } 1001 cifs_open_info_to_fattr(&fattr, &data, inode->i_sb); 1002 if (fattr.cf_flags & CIFS_FATTR_DELETE_PENDING) 1003 cifs_mark_open_handles_for_deleted_file(inode, path); 1004 break; 1005 case -EREMOTE: 1006 cifs_create_junction_fattr(&fattr, inode->i_sb); 1007 break; 1008 case -EOPNOTSUPP: 1009 case -EINVAL: 1010 /* 1011 * FIXME: legacy server -- fall back to path-based call? 1012 * for now, just skip revalidating and mark inode for 1013 * immediate reval. 1014 */ 1015 rc = 0; 1016 CIFS_I(inode)->time = 0; 1017 goto cgfi_exit; 1018 default: 1019 goto cgfi_exit; 1020 } 1021 1022 /* 1023 * don't bother with SFU junk here -- just mark inode as needing 1024 * revalidation. 1025 */ 1026 fattr.cf_uniqueid = CIFS_I(inode)->uniqueid; 1027 fattr.cf_flags |= CIFS_FATTR_NEED_REVAL; 1028 /* if filetype is different, return error */ 1029 rc = cifs_fattr_to_inode(inode, &fattr, false); 1030 cgfi_exit: 1031 cifs_free_open_info(&data); 1032 free_dentry_path(page); 1033 free_xid(xid); 1034 return rc; 1035 } 1036 1037 /* Simple function to return a 64 bit hash of string. Rarely called */ 1038 static __u64 simple_hashstr(const char *str) 1039 { 1040 const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */ 1041 __u64 hash = 0; 1042 1043 while (*str) 1044 hash = (hash + (__u64) *str++) * hash_mult; 1045 1046 return hash; 1047 } 1048 1049 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1050 /** 1051 * cifs_backup_query_path_info - SMB1 fallback code to get ino 1052 * 1053 * Fallback code to get file metadata when we don't have access to 1054 * full_path (EACCES) and have backup creds. 1055 * 1056 * @xid: transaction id used to identify original request in logs 1057 * @tcon: information about the server share we have mounted 1058 * @sb: the superblock stores info such as disk space available 1059 * @full_path: name of the file we are getting the metadata for 1060 * @resp_buf: will be set to cifs resp buf and needs to be freed with 1061 * cifs_buf_release() when done with @data 1062 * @data: will be set to search info result buffer 1063 */ 1064 static int 1065 cifs_backup_query_path_info(int xid, 1066 struct cifs_tcon *tcon, 1067 struct super_block *sb, 1068 const char *full_path, 1069 void **resp_buf, 1070 FILE_ALL_INFO **data) 1071 { 1072 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 1073 struct cifs_search_info info = {0}; 1074 u16 flags; 1075 int rc; 1076 1077 *resp_buf = NULL; 1078 info.endOfSearch = false; 1079 if (tcon->unix_ext) 1080 info.info_level = SMB_FIND_FILE_UNIX; 1081 else if ((tcon->ses->capabilities & 1082 tcon->ses->server->vals->cap_nt_find) == 0) 1083 info.info_level = SMB_FIND_FILE_INFO_STANDARD; 1084 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) 1085 info.info_level = SMB_FIND_FILE_ID_FULL_DIR_INFO; 1086 else /* no srvino useful for fallback to some netapp */ 1087 info.info_level = SMB_FIND_FILE_DIRECTORY_INFO; 1088 1089 flags = CIFS_SEARCH_CLOSE_ALWAYS | 1090 CIFS_SEARCH_CLOSE_AT_END | 1091 CIFS_SEARCH_BACKUP_SEARCH; 1092 1093 rc = CIFSFindFirst(xid, tcon, full_path, 1094 cifs_sb, NULL, flags, &info, false); 1095 if (rc) 1096 return rc; 1097 1098 *resp_buf = (void *)info.ntwrk_buf_start; 1099 *data = (FILE_ALL_INFO *)info.srch_entries_start; 1100 return 0; 1101 } 1102 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1103 1104 static void cifs_set_fattr_ino(int xid, struct cifs_tcon *tcon, struct super_block *sb, 1105 struct inode **inode, const char *full_path, 1106 struct cifs_open_info_data *data, struct cifs_fattr *fattr) 1107 { 1108 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 1109 struct TCP_Server_Info *server = tcon->ses->server; 1110 int rc; 1111 1112 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) { 1113 if (*inode) 1114 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid; 1115 else 1116 fattr->cf_uniqueid = iunique(sb, ROOT_I); 1117 return; 1118 } 1119 1120 /* 1121 * If we have an inode pass a NULL tcon to ensure we don't 1122 * make a round trip to the server. This only works for SMB2+. 1123 */ 1124 rc = server->ops->get_srv_inum(xid, *inode ? NULL : tcon, cifs_sb, full_path, 1125 &fattr->cf_uniqueid, data); 1126 if (rc) { 1127 /* 1128 * If that fails reuse existing ino or generate one 1129 * and disable server ones 1130 */ 1131 if (*inode) 1132 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid; 1133 else { 1134 fattr->cf_uniqueid = iunique(sb, ROOT_I); 1135 cifs_autodisable_serverino(cifs_sb); 1136 } 1137 return; 1138 } 1139 1140 /* If no errors, check for zero root inode (invalid) */ 1141 if (fattr->cf_uniqueid == 0 && strlen(full_path) == 0) { 1142 cifs_dbg(FYI, "Invalid (0) inodenum\n"); 1143 if (*inode) { 1144 /* reuse */ 1145 fattr->cf_uniqueid = CIFS_I(*inode)->uniqueid; 1146 } else { 1147 /* make an ino by hashing the UNC */ 1148 fattr->cf_flags |= CIFS_FATTR_FAKE_ROOT_INO; 1149 fattr->cf_uniqueid = simple_hashstr(tcon->tree_name); 1150 } 1151 } 1152 } 1153 1154 static inline bool is_inode_cache_good(struct inode *ino) 1155 { 1156 return ino && CIFS_CACHE_READ(CIFS_I(ino)) && CIFS_I(ino)->time != 0; 1157 } 1158 1159 static int reparse_info_to_fattr(struct cifs_open_info_data *data, 1160 struct super_block *sb, 1161 const unsigned int xid, 1162 struct cifs_tcon *tcon, 1163 const char *full_path, 1164 struct cifs_fattr *fattr) 1165 { 1166 struct TCP_Server_Info *server = tcon->ses->server; 1167 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 1168 struct kvec rsp_iov, *iov = NULL; 1169 int rsp_buftype = CIFS_NO_BUFFER; 1170 u32 tag = data->reparse.tag; 1171 int rc = 0; 1172 1173 if (!tag && server->ops->query_reparse_point) { 1174 rc = server->ops->query_reparse_point(xid, tcon, cifs_sb, 1175 full_path, &tag, 1176 &rsp_iov, &rsp_buftype); 1177 if (!rc) 1178 iov = &rsp_iov; 1179 } else if (data->reparse.io.buftype != CIFS_NO_BUFFER && 1180 data->reparse.io.iov.iov_base) { 1181 iov = &data->reparse.io.iov; 1182 } 1183 1184 rc = -EOPNOTSUPP; 1185 data->reparse.tag = tag; 1186 if (!data->reparse.tag) { 1187 if (server->ops->query_symlink) { 1188 rc = server->ops->query_symlink(xid, tcon, 1189 cifs_sb, full_path, 1190 &data->symlink_target); 1191 } 1192 if (rc == -EOPNOTSUPP) 1193 data->reparse.tag = IO_REPARSE_TAG_INTERNAL; 1194 } 1195 1196 switch (data->reparse.tag) { 1197 case 0: /* SMB1 symlink */ 1198 break; 1199 case IO_REPARSE_TAG_INTERNAL: 1200 rc = 0; 1201 if (le32_to_cpu(data->fi.Attributes) & ATTR_DIRECTORY) { 1202 cifs_create_junction_fattr(fattr, sb); 1203 goto out; 1204 } 1205 break; 1206 default: 1207 /* Check for cached reparse point data */ 1208 if (data->symlink_target || data->reparse.buf) { 1209 rc = 0; 1210 } else if (iov && server->ops->get_reparse_point_buffer) { 1211 struct reparse_data_buffer *reparse_buf; 1212 u32 reparse_len; 1213 1214 reparse_buf = server->ops->get_reparse_point_buffer(iov, &reparse_len); 1215 rc = parse_reparse_point(reparse_buf, reparse_len, 1216 cifs_sb, full_path, data); 1217 /* 1218 * If the reparse point was not handled but it is the 1219 * name surrogate which points to directory, then treat 1220 * is as a new mount point. Name surrogate reparse point 1221 * represents another named entity in the system. 1222 */ 1223 if (rc == -EOPNOTSUPP && 1224 IS_REPARSE_TAG_NAME_SURROGATE(data->reparse.tag) && 1225 (le32_to_cpu(data->fi.Attributes) & ATTR_DIRECTORY)) { 1226 rc = 0; 1227 cifs_create_junction_fattr(fattr, sb); 1228 goto out; 1229 } 1230 /* 1231 * If the reparse point is unsupported by the Linux SMB 1232 * client then let it process by the SMB server. So mask 1233 * the -EOPNOTSUPP error code. This will allow Linux SMB 1234 * client to send SMB OPEN request to server. If server 1235 * does not support this reparse point too then server 1236 * will return error during open the path. 1237 */ 1238 if (rc == -EOPNOTSUPP) 1239 rc = 0; 1240 } 1241 1242 if (data->reparse.tag == IO_REPARSE_TAG_SYMLINK && !rc) { 1243 bool directory = le32_to_cpu(data->fi.Attributes) & ATTR_DIRECTORY; 1244 rc = smb2_fix_symlink_target_type(&data->symlink_target, directory, cifs_sb); 1245 } 1246 break; 1247 } 1248 1249 if (tcon->posix_extensions) 1250 smb311_posix_info_to_fattr(fattr, data, sb); 1251 else 1252 cifs_open_info_to_fattr(fattr, data, sb); 1253 out: 1254 fattr->cf_cifstag = data->reparse.tag; 1255 free_rsp_buf(rsp_buftype, rsp_iov.iov_base); 1256 return rc; 1257 } 1258 1259 static int cifs_get_fattr(struct cifs_open_info_data *data, 1260 struct super_block *sb, int xid, 1261 const struct cifs_fid *fid, 1262 struct cifs_fattr *fattr, 1263 struct inode **inode, 1264 const char *full_path) 1265 { 1266 struct cifs_open_info_data tmp_data = {}; 1267 struct cifs_tcon *tcon; 1268 struct TCP_Server_Info *server; 1269 struct tcon_link *tlink; 1270 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 1271 void *smb1_backup_rsp_buf = NULL; 1272 int rc = 0; 1273 int tmprc = 0; 1274 1275 tlink = cifs_sb_tlink(cifs_sb); 1276 if (IS_ERR(tlink)) 1277 return PTR_ERR(tlink); 1278 tcon = tlink_tcon(tlink); 1279 server = tcon->ses->server; 1280 1281 /* 1282 * 1. Fetch file metadata if not provided (data) 1283 */ 1284 1285 if (!data) { 1286 rc = server->ops->query_path_info(xid, tcon, cifs_sb, 1287 full_path, &tmp_data); 1288 data = &tmp_data; 1289 } 1290 1291 /* 1292 * 2. Convert it to internal cifs metadata (fattr) 1293 */ 1294 1295 switch (rc) { 1296 case 0: 1297 /* 1298 * If the file is a reparse point, it is more complicated 1299 * since we have to check if its reparse tag matches a known 1300 * special file type e.g. symlink or fifo or char etc. 1301 */ 1302 if (cifs_open_data_reparse(data)) { 1303 rc = reparse_info_to_fattr(data, sb, xid, tcon, 1304 full_path, fattr); 1305 } else { 1306 cifs_open_info_to_fattr(fattr, data, sb); 1307 } 1308 if (!rc && *inode && 1309 (fattr->cf_flags & CIFS_FATTR_DELETE_PENDING)) 1310 cifs_mark_open_handles_for_deleted_file(*inode, full_path); 1311 break; 1312 case -EREMOTE: 1313 /* DFS link, no metadata available on this server */ 1314 cifs_create_junction_fattr(fattr, sb); 1315 rc = 0; 1316 break; 1317 case -EACCES: 1318 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1319 /* 1320 * perm errors, try again with backup flags if possible 1321 * 1322 * For SMB2 and later the backup intent flag 1323 * is already sent if needed on open and there 1324 * is no path based FindFirst operation to use 1325 * to retry with 1326 */ 1327 if (backup_cred(cifs_sb) && is_smb1_server(server)) { 1328 /* for easier reading */ 1329 FILE_ALL_INFO *fi; 1330 FILE_DIRECTORY_INFO *fdi; 1331 SEARCH_ID_FULL_DIR_INFO *si; 1332 1333 rc = cifs_backup_query_path_info(xid, tcon, sb, 1334 full_path, 1335 &smb1_backup_rsp_buf, 1336 &fi); 1337 if (rc) 1338 goto out; 1339 1340 move_cifs_info_to_smb2(&data->fi, fi); 1341 fdi = (FILE_DIRECTORY_INFO *)fi; 1342 si = (SEARCH_ID_FULL_DIR_INFO *)fi; 1343 1344 cifs_dir_info_to_fattr(fattr, fdi, cifs_sb); 1345 fattr->cf_uniqueid = le64_to_cpu(si->UniqueId); 1346 /* uniqueid set, skip get inum step */ 1347 goto handle_mnt_opt; 1348 } else { 1349 /* nothing we can do, bail out */ 1350 goto out; 1351 } 1352 #else 1353 goto out; 1354 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1355 break; 1356 default: 1357 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc); 1358 goto out; 1359 } 1360 1361 /* 1362 * 3. Get or update inode number (fattr->cf_uniqueid) 1363 */ 1364 1365 cifs_set_fattr_ino(xid, tcon, sb, inode, full_path, data, fattr); 1366 1367 /* 1368 * 4. Tweak fattr based on mount options 1369 */ 1370 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1371 handle_mnt_opt: 1372 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1373 /* query for SFU type info if supported and needed */ 1374 if ((fattr->cf_cifsattrs & ATTR_SYSTEM) && 1375 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)) { 1376 tmprc = cifs_sfu_type(fattr, full_path, cifs_sb, xid); 1377 if (tmprc) 1378 cifs_dbg(FYI, "cifs_sfu_type failed: %d\n", tmprc); 1379 } 1380 1381 /* fill in 0777 bits from ACL */ 1382 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) { 1383 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode, 1384 true, full_path, fid); 1385 if (rc == -EREMOTE) 1386 rc = 0; 1387 if (rc) { 1388 cifs_dbg(FYI, "%s: Get mode from SID failed. rc=%d\n", 1389 __func__, rc); 1390 goto out; 1391 } 1392 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { 1393 rc = cifs_acl_to_fattr(cifs_sb, fattr, *inode, 1394 false, full_path, fid); 1395 if (rc == -EREMOTE) 1396 rc = 0; 1397 if (rc) { 1398 cifs_dbg(FYI, "%s: Getting ACL failed with error: %d\n", 1399 __func__, rc); 1400 goto out; 1401 } 1402 } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) 1403 /* fill in remaining high mode bits e.g. SUID, VTX */ 1404 cifs_sfu_mode(fattr, full_path, cifs_sb, xid); 1405 else if (!(tcon->posix_extensions)) 1406 /* clear write bits if ATTR_READONLY is set */ 1407 if (fattr->cf_cifsattrs & ATTR_READONLY) 1408 fattr->cf_mode &= ~(S_IWUGO); 1409 1410 1411 /* check for Minshall+French symlinks */ 1412 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) { 1413 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path); 1414 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc); 1415 } 1416 1417 out: 1418 cifs_buf_release(smb1_backup_rsp_buf); 1419 cifs_put_tlink(tlink); 1420 cifs_free_open_info(&tmp_data); 1421 return rc; 1422 } 1423 1424 int cifs_get_inode_info(struct inode **inode, 1425 const char *full_path, 1426 struct cifs_open_info_data *data, 1427 struct super_block *sb, int xid, 1428 const struct cifs_fid *fid) 1429 { 1430 struct cifs_fattr fattr = {}; 1431 int rc; 1432 1433 if (!data && is_inode_cache_good(*inode)) { 1434 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n"); 1435 return 0; 1436 } 1437 1438 rc = cifs_get_fattr(data, sb, xid, fid, &fattr, inode, full_path); 1439 if (rc) 1440 goto out; 1441 1442 rc = update_inode_info(sb, &fattr, inode); 1443 out: 1444 kfree(fattr.cf_symlink_target); 1445 return rc; 1446 } 1447 1448 static int smb311_posix_get_fattr(struct cifs_open_info_data *data, 1449 struct cifs_fattr *fattr, 1450 const char *full_path, 1451 struct super_block *sb, 1452 const unsigned int xid) 1453 { 1454 struct cifs_open_info_data tmp_data = {}; 1455 struct TCP_Server_Info *server; 1456 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 1457 struct cifs_tcon *tcon; 1458 struct tcon_link *tlink; 1459 int tmprc; 1460 int rc = 0; 1461 1462 tlink = cifs_sb_tlink(cifs_sb); 1463 if (IS_ERR(tlink)) 1464 return PTR_ERR(tlink); 1465 tcon = tlink_tcon(tlink); 1466 server = tcon->ses->server; 1467 1468 /* 1469 * 1. Fetch file metadata if not provided (data) 1470 */ 1471 if (!data) { 1472 rc = server->ops->query_path_info(xid, tcon, cifs_sb, 1473 full_path, &tmp_data); 1474 data = &tmp_data; 1475 } 1476 1477 /* 1478 * 2. Convert it to internal cifs metadata (fattr) 1479 */ 1480 1481 switch (rc) { 1482 case 0: 1483 if (cifs_open_data_reparse(data)) { 1484 rc = reparse_info_to_fattr(data, sb, xid, tcon, 1485 full_path, fattr); 1486 } else { 1487 smb311_posix_info_to_fattr(fattr, data, sb); 1488 } 1489 break; 1490 case -EREMOTE: 1491 /* DFS link, no metadata available on this server */ 1492 cifs_create_junction_fattr(fattr, sb); 1493 rc = 0; 1494 break; 1495 case -EACCES: 1496 /* 1497 * For SMB2 and later the backup intent flag 1498 * is already sent if needed on open and there 1499 * is no path based FindFirst operation to use 1500 * to retry with so nothing we can do, bail out 1501 */ 1502 goto out; 1503 default: 1504 cifs_dbg(FYI, "%s: unhandled err rc %d\n", __func__, rc); 1505 goto out; 1506 } 1507 1508 /* 1509 * 3. Tweak fattr based on mount options 1510 */ 1511 /* check for Minshall+French symlinks */ 1512 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) { 1513 tmprc = check_mf_symlink(xid, tcon, cifs_sb, fattr, full_path); 1514 cifs_dbg(FYI, "check_mf_symlink: %d\n", tmprc); 1515 } 1516 1517 out: 1518 cifs_put_tlink(tlink); 1519 cifs_free_open_info(data); 1520 return rc; 1521 } 1522 1523 int smb311_posix_get_inode_info(struct inode **inode, 1524 const char *full_path, 1525 struct cifs_open_info_data *data, 1526 struct super_block *sb, 1527 const unsigned int xid) 1528 { 1529 struct cifs_fattr fattr = {}; 1530 int rc; 1531 1532 if (!data && is_inode_cache_good(*inode)) { 1533 cifs_dbg(FYI, "No need to revalidate cached inode sizes\n"); 1534 return 0; 1535 } 1536 1537 rc = smb311_posix_get_fattr(data, &fattr, full_path, sb, xid); 1538 if (rc) 1539 goto out; 1540 1541 rc = update_inode_info(sb, &fattr, inode); 1542 if (!rc && fattr.cf_flags & CIFS_FATTR_DELETE_PENDING) 1543 cifs_mark_open_handles_for_deleted_file(*inode, full_path); 1544 out: 1545 kfree(fattr.cf_symlink_target); 1546 return rc; 1547 } 1548 1549 static const struct inode_operations cifs_ipc_inode_ops = { 1550 .lookup = cifs_lookup, 1551 }; 1552 1553 static int 1554 cifs_find_inode(struct inode *inode, void *opaque) 1555 { 1556 struct cifs_fattr *fattr = opaque; 1557 1558 /* [!] The compared values must be the same in struct cifs_fscache_inode_key. */ 1559 1560 /* don't match inode with different uniqueid */ 1561 if (CIFS_I(inode)->uniqueid != fattr->cf_uniqueid) 1562 return 0; 1563 1564 /* use createtime like an i_generation field */ 1565 if (CIFS_I(inode)->createtime != fattr->cf_createtime) 1566 return 0; 1567 1568 /* don't match inode of different type */ 1569 if (inode_wrong_type(inode, fattr->cf_mode)) 1570 return 0; 1571 1572 /* if it's not a directory or has no dentries, then flag it */ 1573 if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry)) 1574 fattr->cf_flags |= CIFS_FATTR_INO_COLLISION; 1575 1576 return 1; 1577 } 1578 1579 static int 1580 cifs_init_inode(struct inode *inode, void *opaque) 1581 { 1582 struct cifs_fattr *fattr = opaque; 1583 1584 CIFS_I(inode)->uniqueid = fattr->cf_uniqueid; 1585 CIFS_I(inode)->createtime = fattr->cf_createtime; 1586 return 0; 1587 } 1588 1589 /* 1590 * walk dentry list for an inode and report whether it has aliases that 1591 * are hashed. We use this to determine if a directory inode can actually 1592 * be used. 1593 */ 1594 static bool 1595 inode_has_hashed_dentries(struct inode *inode) 1596 { 1597 struct dentry *dentry; 1598 1599 spin_lock(&inode->i_lock); 1600 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) { 1601 if (!d_unhashed(dentry) || IS_ROOT(dentry)) { 1602 spin_unlock(&inode->i_lock); 1603 return true; 1604 } 1605 } 1606 spin_unlock(&inode->i_lock); 1607 return false; 1608 } 1609 1610 /* Given fattrs, get a corresponding inode */ 1611 struct inode * 1612 cifs_iget(struct super_block *sb, struct cifs_fattr *fattr) 1613 { 1614 unsigned long hash; 1615 struct inode *inode; 1616 1617 retry_iget5_locked: 1618 cifs_dbg(FYI, "looking for uniqueid=%llu\n", fattr->cf_uniqueid); 1619 1620 /* hash down to 32-bits on 32-bit arch */ 1621 hash = cifs_uniqueid_to_ino_t(fattr->cf_uniqueid); 1622 1623 inode = iget5_locked(sb, hash, cifs_find_inode, cifs_init_inode, fattr); 1624 if (inode) { 1625 /* was there a potentially problematic inode collision? */ 1626 if (fattr->cf_flags & CIFS_FATTR_INO_COLLISION) { 1627 fattr->cf_flags &= ~CIFS_FATTR_INO_COLLISION; 1628 1629 if (inode_has_hashed_dentries(inode)) { 1630 cifs_autodisable_serverino(CIFS_SB(sb)); 1631 iput(inode); 1632 fattr->cf_uniqueid = iunique(sb, ROOT_I); 1633 goto retry_iget5_locked; 1634 } 1635 } 1636 1637 /* can't fail - see cifs_find_inode() */ 1638 cifs_fattr_to_inode(inode, fattr, false); 1639 if (sb->s_flags & SB_NOATIME) 1640 inode->i_flags |= S_NOATIME | S_NOCMTIME; 1641 if (inode->i_state & I_NEW) { 1642 inode->i_ino = hash; 1643 cifs_fscache_get_inode_cookie(inode); 1644 unlock_new_inode(inode); 1645 } 1646 } 1647 1648 return inode; 1649 } 1650 1651 /* gets root inode */ 1652 struct inode *cifs_root_iget(struct super_block *sb) 1653 { 1654 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 1655 struct cifs_fattr fattr = {}; 1656 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); 1657 struct inode *inode = NULL; 1658 unsigned int xid; 1659 char *path = NULL; 1660 int len; 1661 int rc; 1662 1663 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) 1664 && cifs_sb->prepath) { 1665 len = strlen(cifs_sb->prepath); 1666 path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL); 1667 if (path == NULL) 1668 return ERR_PTR(-ENOMEM); 1669 path[0] = '/'; 1670 memcpy(path+1, cifs_sb->prepath, len); 1671 } else { 1672 path = kstrdup("", GFP_KERNEL); 1673 if (path == NULL) 1674 return ERR_PTR(-ENOMEM); 1675 } 1676 1677 xid = get_xid(); 1678 if (tcon->unix_ext) { 1679 rc = cifs_get_unix_fattr(path, sb, &fattr, &inode, xid); 1680 /* some servers mistakenly claim POSIX support */ 1681 if (rc != -EOPNOTSUPP) 1682 goto iget_root; 1683 cifs_dbg(VFS, "server does not support POSIX extensions\n"); 1684 tcon->unix_ext = false; 1685 } 1686 1687 convert_delimiter(path, CIFS_DIR_SEP(cifs_sb)); 1688 if (tcon->posix_extensions) 1689 rc = smb311_posix_get_fattr(NULL, &fattr, path, sb, xid); 1690 else 1691 rc = cifs_get_fattr(NULL, sb, xid, NULL, &fattr, &inode, path); 1692 1693 iget_root: 1694 if (!rc) { 1695 if (fattr.cf_flags & CIFS_FATTR_JUNCTION) { 1696 fattr.cf_flags &= ~CIFS_FATTR_JUNCTION; 1697 cifs_autodisable_serverino(cifs_sb); 1698 } 1699 inode = cifs_iget(sb, &fattr); 1700 } 1701 1702 if (!inode) { 1703 inode = ERR_PTR(rc); 1704 goto out; 1705 } 1706 1707 if (!rc && fattr.cf_flags & CIFS_FATTR_DELETE_PENDING) 1708 cifs_mark_open_handles_for_deleted_file(inode, path); 1709 1710 if (rc && tcon->pipe) { 1711 cifs_dbg(FYI, "ipc connection - fake read inode\n"); 1712 spin_lock(&inode->i_lock); 1713 inode->i_mode |= S_IFDIR; 1714 set_nlink(inode, 2); 1715 inode->i_op = &cifs_ipc_inode_ops; 1716 inode->i_fop = &simple_dir_operations; 1717 inode->i_uid = cifs_sb->ctx->linux_uid; 1718 inode->i_gid = cifs_sb->ctx->linux_gid; 1719 spin_unlock(&inode->i_lock); 1720 } else if (rc) { 1721 iget_failed(inode); 1722 inode = ERR_PTR(rc); 1723 } 1724 1725 out: 1726 kfree(path); 1727 free_xid(xid); 1728 kfree(fattr.cf_symlink_target); 1729 return inode; 1730 } 1731 1732 int 1733 cifs_set_file_info(struct inode *inode, struct iattr *attrs, unsigned int xid, 1734 const char *full_path, __u32 dosattr) 1735 { 1736 bool set_time = false; 1737 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 1738 struct TCP_Server_Info *server; 1739 FILE_BASIC_INFO info_buf; 1740 1741 if (attrs == NULL) 1742 return -EINVAL; 1743 1744 server = cifs_sb_master_tcon(cifs_sb)->ses->server; 1745 if (!server->ops->set_file_info) 1746 return -ENOSYS; 1747 1748 info_buf.Pad = 0; 1749 1750 if (attrs->ia_valid & ATTR_ATIME) { 1751 set_time = true; 1752 info_buf.LastAccessTime = 1753 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime)); 1754 } else 1755 info_buf.LastAccessTime = 0; 1756 1757 if (attrs->ia_valid & ATTR_MTIME) { 1758 set_time = true; 1759 info_buf.LastWriteTime = 1760 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime)); 1761 } else 1762 info_buf.LastWriteTime = 0; 1763 1764 /* 1765 * Samba throws this field away, but windows may actually use it. 1766 * Do not set ctime unless other time stamps are changed explicitly 1767 * (i.e. by utimes()) since we would then have a mix of client and 1768 * server times. 1769 */ 1770 if (set_time && (attrs->ia_valid & ATTR_CTIME)) { 1771 cifs_dbg(FYI, "CIFS - CTIME changed\n"); 1772 info_buf.ChangeTime = 1773 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime)); 1774 } else 1775 info_buf.ChangeTime = 0; 1776 1777 info_buf.CreationTime = 0; /* don't change */ 1778 info_buf.Attributes = cpu_to_le32(dosattr); 1779 1780 return server->ops->set_file_info(inode, full_path, &info_buf, xid); 1781 } 1782 1783 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1784 /* 1785 * Open the given file (if it isn't already), set the DELETE_ON_CLOSE bit 1786 * and rename it to a random name that hopefully won't conflict with 1787 * anything else. 1788 */ 1789 int 1790 cifs_rename_pending_delete(const char *full_path, struct dentry *dentry, 1791 const unsigned int xid) 1792 { 1793 int oplock = 0; 1794 int rc; 1795 struct cifs_fid fid; 1796 struct cifs_open_parms oparms; 1797 struct inode *inode = d_inode(dentry); 1798 struct cifsInodeInfo *cifsInode = CIFS_I(inode); 1799 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 1800 struct tcon_link *tlink; 1801 struct cifs_tcon *tcon; 1802 __u32 dosattr, origattr; 1803 FILE_BASIC_INFO *info_buf = NULL; 1804 1805 tlink = cifs_sb_tlink(cifs_sb); 1806 if (IS_ERR(tlink)) 1807 return PTR_ERR(tlink); 1808 tcon = tlink_tcon(tlink); 1809 1810 /* 1811 * We cannot rename the file if the server doesn't support 1812 * CAP_INFOLEVEL_PASSTHRU 1813 */ 1814 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) { 1815 rc = -EBUSY; 1816 goto out; 1817 } 1818 1819 oparms = (struct cifs_open_parms) { 1820 .tcon = tcon, 1821 .cifs_sb = cifs_sb, 1822 .desired_access = DELETE | FILE_WRITE_ATTRIBUTES, 1823 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR), 1824 .disposition = FILE_OPEN, 1825 .path = full_path, 1826 .fid = &fid, 1827 }; 1828 1829 rc = CIFS_open(xid, &oparms, &oplock, NULL); 1830 if (rc != 0) 1831 goto out; 1832 1833 origattr = cifsInode->cifsAttrs; 1834 if (origattr == 0) 1835 origattr |= ATTR_NORMAL; 1836 1837 dosattr = origattr & ~ATTR_READONLY; 1838 if (dosattr == 0) 1839 dosattr |= ATTR_NORMAL; 1840 dosattr |= ATTR_HIDDEN; 1841 1842 /* set ATTR_HIDDEN and clear ATTR_READONLY, but only if needed */ 1843 if (dosattr != origattr) { 1844 info_buf = kzalloc(sizeof(*info_buf), GFP_KERNEL); 1845 if (info_buf == NULL) { 1846 rc = -ENOMEM; 1847 goto out_close; 1848 } 1849 info_buf->Attributes = cpu_to_le32(dosattr); 1850 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid, 1851 current->tgid); 1852 /* although we would like to mark the file hidden 1853 if that fails we will still try to rename it */ 1854 if (!rc) 1855 cifsInode->cifsAttrs = dosattr; 1856 else 1857 dosattr = origattr; /* since not able to change them */ 1858 } 1859 1860 /* rename the file */ 1861 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL, 1862 cifs_sb->local_nls, 1863 cifs_remap(cifs_sb)); 1864 if (rc != 0) { 1865 rc = -EBUSY; 1866 goto undo_setattr; 1867 } 1868 1869 /* try to set DELETE_ON_CLOSE */ 1870 if (!test_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags)) { 1871 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid, 1872 current->tgid); 1873 /* 1874 * some samba versions return -ENOENT when we try to set the 1875 * file disposition here. Likely a samba bug, but work around 1876 * it for now. This means that some cifsXXX files may hang 1877 * around after they shouldn't. 1878 * 1879 * BB: remove this hack after more servers have the fix 1880 */ 1881 if (rc == -ENOENT) 1882 rc = 0; 1883 else if (rc != 0) { 1884 rc = -EBUSY; 1885 goto undo_rename; 1886 } 1887 set_bit(CIFS_INO_DELETE_PENDING, &cifsInode->flags); 1888 } 1889 1890 out_close: 1891 CIFSSMBClose(xid, tcon, fid.netfid); 1892 out: 1893 kfree(info_buf); 1894 cifs_put_tlink(tlink); 1895 return rc; 1896 1897 /* 1898 * reset everything back to the original state. Don't bother 1899 * dealing with errors here since we can't do anything about 1900 * them anyway. 1901 */ 1902 undo_rename: 1903 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name, 1904 cifs_sb->local_nls, cifs_remap(cifs_sb)); 1905 undo_setattr: 1906 if (dosattr != origattr) { 1907 info_buf->Attributes = cpu_to_le32(origattr); 1908 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid, 1909 current->tgid)) 1910 cifsInode->cifsAttrs = origattr; 1911 } 1912 1913 goto out_close; 1914 } 1915 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1916 1917 /* copied from fs/nfs/dir.c with small changes */ 1918 static void 1919 cifs_drop_nlink(struct inode *inode) 1920 { 1921 spin_lock(&inode->i_lock); 1922 if (inode->i_nlink > 0) 1923 drop_nlink(inode); 1924 spin_unlock(&inode->i_lock); 1925 } 1926 1927 /* 1928 * If d_inode(dentry) is null (usually meaning the cached dentry 1929 * is a negative dentry) then we would attempt a standard SMB delete, but 1930 * if that fails we can not attempt the fall back mechanisms on EACCES 1931 * but will return the EACCES to the caller. Note that the VFS does not call 1932 * unlink on negative dentries currently. 1933 */ 1934 int cifs_unlink(struct inode *dir, struct dentry *dentry) 1935 { 1936 int rc = 0; 1937 unsigned int xid; 1938 const char *full_path; 1939 void *page; 1940 struct inode *inode = d_inode(dentry); 1941 struct cifsInodeInfo *cifs_inode; 1942 struct super_block *sb = dir->i_sb; 1943 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 1944 struct tcon_link *tlink; 1945 struct cifs_tcon *tcon; 1946 __u32 dosattr = 0, origattr = 0; 1947 struct TCP_Server_Info *server; 1948 struct iattr *attrs = NULL; 1949 bool rehash = false; 1950 1951 cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry); 1952 1953 if (unlikely(cifs_forced_shutdown(cifs_sb))) 1954 return -EIO; 1955 1956 /* Unhash dentry in advance to prevent any concurrent opens */ 1957 spin_lock(&dentry->d_lock); 1958 if (!d_unhashed(dentry)) { 1959 __d_drop(dentry); 1960 rehash = true; 1961 } 1962 spin_unlock(&dentry->d_lock); 1963 1964 tlink = cifs_sb_tlink(cifs_sb); 1965 if (IS_ERR(tlink)) 1966 return PTR_ERR(tlink); 1967 tcon = tlink_tcon(tlink); 1968 server = tcon->ses->server; 1969 1970 xid = get_xid(); 1971 page = alloc_dentry_path(); 1972 1973 if (tcon->nodelete) { 1974 rc = -EACCES; 1975 goto unlink_out; 1976 } 1977 1978 /* Unlink can be called from rename so we can not take the 1979 * sb->s_vfs_rename_mutex here */ 1980 full_path = build_path_from_dentry(dentry, page); 1981 if (IS_ERR(full_path)) { 1982 rc = PTR_ERR(full_path); 1983 goto unlink_out; 1984 } 1985 1986 netfs_wait_for_outstanding_io(inode); 1987 cifs_close_deferred_file_under_dentry(tcon, full_path); 1988 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1989 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP & 1990 le64_to_cpu(tcon->fsUnixInfo.Capability))) { 1991 rc = CIFSPOSIXDelFile(xid, tcon, full_path, 1992 SMB_POSIX_UNLINK_FILE_TARGET, cifs_sb->local_nls, 1993 cifs_remap(cifs_sb)); 1994 cifs_dbg(FYI, "posix del rc %d\n", rc); 1995 if ((rc == 0) || (rc == -ENOENT)) 1996 goto psx_del_no_retry; 1997 } 1998 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1999 2000 retry_std_delete: 2001 if (!server->ops->unlink) { 2002 rc = -ENOSYS; 2003 goto psx_del_no_retry; 2004 } 2005 2006 rc = server->ops->unlink(xid, tcon, full_path, cifs_sb, dentry); 2007 2008 psx_del_no_retry: 2009 if (!rc) { 2010 if (inode) { 2011 cifs_mark_open_handles_for_deleted_file(inode, full_path); 2012 cifs_drop_nlink(inode); 2013 } 2014 } else if (rc == -ENOENT) { 2015 if (simple_positive(dentry)) 2016 d_delete(dentry); 2017 } else if (rc == -EBUSY) { 2018 if (server->ops->rename_pending_delete) { 2019 rc = server->ops->rename_pending_delete(full_path, 2020 dentry, xid); 2021 if (rc == 0) { 2022 cifs_mark_open_handles_for_deleted_file(inode, full_path); 2023 cifs_drop_nlink(inode); 2024 } 2025 } 2026 } else if ((rc == -EACCES) && (dosattr == 0) && inode) { 2027 attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); 2028 if (attrs == NULL) { 2029 rc = -ENOMEM; 2030 goto out_reval; 2031 } 2032 2033 /* try to reset dos attributes */ 2034 cifs_inode = CIFS_I(inode); 2035 origattr = cifs_inode->cifsAttrs; 2036 if (origattr == 0) 2037 origattr |= ATTR_NORMAL; 2038 dosattr = origattr & ~ATTR_READONLY; 2039 if (dosattr == 0) 2040 dosattr |= ATTR_NORMAL; 2041 dosattr |= ATTR_HIDDEN; 2042 2043 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr); 2044 if (rc != 0) 2045 goto out_reval; 2046 2047 goto retry_std_delete; 2048 } 2049 2050 /* undo the setattr if we errored out and it's needed */ 2051 if (rc != 0 && dosattr != 0) 2052 cifs_set_file_info(inode, attrs, xid, full_path, origattr); 2053 2054 out_reval: 2055 if (inode) { 2056 cifs_inode = CIFS_I(inode); 2057 cifs_inode->time = 0; /* will force revalidate to get info 2058 when needed */ 2059 inode_set_ctime_current(inode); 2060 } 2061 inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir)); 2062 cifs_inode = CIFS_I(dir); 2063 CIFS_I(dir)->time = 0; /* force revalidate of dir as well */ 2064 unlink_out: 2065 free_dentry_path(page); 2066 kfree(attrs); 2067 free_xid(xid); 2068 cifs_put_tlink(tlink); 2069 if (rehash) 2070 d_rehash(dentry); 2071 return rc; 2072 } 2073 2074 static int 2075 cifs_mkdir_qinfo(struct inode *parent, struct dentry *dentry, umode_t mode, 2076 const char *full_path, struct cifs_sb_info *cifs_sb, 2077 struct cifs_tcon *tcon, const unsigned int xid) 2078 { 2079 int rc = 0; 2080 struct inode *inode = NULL; 2081 2082 if (tcon->posix_extensions) { 2083 rc = smb311_posix_get_inode_info(&inode, full_path, 2084 NULL, parent->i_sb, xid); 2085 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2086 } else if (tcon->unix_ext) { 2087 rc = cifs_get_inode_info_unix(&inode, full_path, parent->i_sb, 2088 xid); 2089 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2090 } else { 2091 rc = cifs_get_inode_info(&inode, full_path, NULL, parent->i_sb, 2092 xid, NULL); 2093 } 2094 2095 if (rc) 2096 return rc; 2097 2098 if (!S_ISDIR(inode->i_mode)) { 2099 /* 2100 * mkdir succeeded, but another client has managed to remove the 2101 * sucker and replace it with non-directory. Return success, 2102 * but don't leave the child in dcache. 2103 */ 2104 iput(inode); 2105 d_drop(dentry); 2106 return 0; 2107 } 2108 /* 2109 * setting nlink not necessary except in cases where we failed to get it 2110 * from the server or was set bogus. Also, since this is a brand new 2111 * inode, no need to grab the i_lock before setting the i_nlink. 2112 */ 2113 if (inode->i_nlink < 2) 2114 set_nlink(inode, 2); 2115 mode &= ~current_umask(); 2116 /* must turn on setgid bit if parent dir has it */ 2117 if (parent->i_mode & S_ISGID) 2118 mode |= S_ISGID; 2119 2120 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2121 if (tcon->unix_ext) { 2122 struct cifs_unix_set_info_args args = { 2123 .mode = mode, 2124 .ctime = NO_CHANGE_64, 2125 .atime = NO_CHANGE_64, 2126 .mtime = NO_CHANGE_64, 2127 .device = 0, 2128 }; 2129 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) { 2130 args.uid = current_fsuid(); 2131 if (parent->i_mode & S_ISGID) 2132 args.gid = parent->i_gid; 2133 else 2134 args.gid = current_fsgid(); 2135 } else { 2136 args.uid = INVALID_UID; /* no change */ 2137 args.gid = INVALID_GID; /* no change */ 2138 } 2139 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args, 2140 cifs_sb->local_nls, 2141 cifs_remap(cifs_sb)); 2142 } else { 2143 #else 2144 { 2145 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2146 struct TCP_Server_Info *server = tcon->ses->server; 2147 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) && 2148 (mode & S_IWUGO) == 0 && server->ops->mkdir_setinfo) 2149 server->ops->mkdir_setinfo(inode, full_path, cifs_sb, 2150 tcon, xid); 2151 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) 2152 inode->i_mode = (mode | S_IFDIR); 2153 2154 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) { 2155 inode->i_uid = current_fsuid(); 2156 if (inode->i_mode & S_ISGID) 2157 inode->i_gid = parent->i_gid; 2158 else 2159 inode->i_gid = current_fsgid(); 2160 } 2161 } 2162 d_instantiate(dentry, inode); 2163 return 0; 2164 } 2165 2166 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2167 static int 2168 cifs_posix_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode, 2169 const char *full_path, struct cifs_sb_info *cifs_sb, 2170 struct cifs_tcon *tcon, const unsigned int xid) 2171 { 2172 int rc = 0; 2173 u32 oplock = 0; 2174 FILE_UNIX_BASIC_INFO *info = NULL; 2175 struct inode *newinode = NULL; 2176 struct cifs_fattr fattr; 2177 2178 info = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL); 2179 if (info == NULL) { 2180 rc = -ENOMEM; 2181 goto posix_mkdir_out; 2182 } 2183 2184 mode &= ~current_umask(); 2185 rc = CIFSPOSIXCreate(xid, tcon, SMB_O_DIRECTORY | SMB_O_CREAT, mode, 2186 NULL /* netfid */, info, &oplock, full_path, 2187 cifs_sb->local_nls, cifs_remap(cifs_sb)); 2188 if (rc == -EOPNOTSUPP) 2189 goto posix_mkdir_out; 2190 else if (rc) { 2191 cifs_dbg(FYI, "posix mkdir returned 0x%x\n", rc); 2192 d_drop(dentry); 2193 goto posix_mkdir_out; 2194 } 2195 2196 if (info->Type == cpu_to_le32(-1)) 2197 /* no return info, go query for it */ 2198 goto posix_mkdir_get_info; 2199 /* 2200 * BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if 2201 * need to set uid/gid. 2202 */ 2203 2204 cifs_unix_basic_to_fattr(&fattr, info, cifs_sb); 2205 cifs_fill_uniqueid(inode->i_sb, &fattr); 2206 newinode = cifs_iget(inode->i_sb, &fattr); 2207 if (!newinode) 2208 goto posix_mkdir_get_info; 2209 2210 d_instantiate(dentry, newinode); 2211 2212 #ifdef CONFIG_CIFS_DEBUG2 2213 cifs_dbg(FYI, "instantiated dentry %p %pd to inode %p\n", 2214 dentry, dentry, newinode); 2215 2216 if (newinode->i_nlink != 2) 2217 cifs_dbg(FYI, "unexpected number of links %d\n", 2218 newinode->i_nlink); 2219 #endif 2220 2221 posix_mkdir_out: 2222 kfree(info); 2223 return rc; 2224 posix_mkdir_get_info: 2225 rc = cifs_mkdir_qinfo(inode, dentry, mode, full_path, cifs_sb, tcon, 2226 xid); 2227 goto posix_mkdir_out; 2228 } 2229 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2230 2231 struct dentry *cifs_mkdir(struct mnt_idmap *idmap, struct inode *inode, 2232 struct dentry *direntry, umode_t mode) 2233 { 2234 int rc = 0; 2235 unsigned int xid; 2236 struct cifs_sb_info *cifs_sb; 2237 struct tcon_link *tlink; 2238 struct cifs_tcon *tcon; 2239 struct TCP_Server_Info *server; 2240 const char *full_path; 2241 void *page; 2242 2243 cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n", 2244 mode, inode); 2245 2246 cifs_sb = CIFS_SB(inode->i_sb); 2247 if (unlikely(cifs_forced_shutdown(cifs_sb))) 2248 return ERR_PTR(-EIO); 2249 tlink = cifs_sb_tlink(cifs_sb); 2250 if (IS_ERR(tlink)) 2251 return ERR_CAST(tlink); 2252 tcon = tlink_tcon(tlink); 2253 2254 xid = get_xid(); 2255 2256 page = alloc_dentry_path(); 2257 full_path = build_path_from_dentry(direntry, page); 2258 if (IS_ERR(full_path)) { 2259 rc = PTR_ERR(full_path); 2260 goto mkdir_out; 2261 } 2262 2263 server = tcon->ses->server; 2264 2265 if ((server->ops->posix_mkdir) && (tcon->posix_extensions)) { 2266 rc = server->ops->posix_mkdir(xid, inode, mode, tcon, full_path, 2267 cifs_sb); 2268 d_drop(direntry); /* for time being always refresh inode info */ 2269 goto mkdir_out; 2270 } 2271 2272 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2273 if (cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP & 2274 le64_to_cpu(tcon->fsUnixInfo.Capability))) { 2275 rc = cifs_posix_mkdir(inode, direntry, mode, full_path, cifs_sb, 2276 tcon, xid); 2277 if (rc != -EOPNOTSUPP) 2278 goto mkdir_out; 2279 } 2280 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2281 2282 if (!server->ops->mkdir) { 2283 rc = -ENOSYS; 2284 goto mkdir_out; 2285 } 2286 2287 /* BB add setting the equivalent of mode via CreateX w/ACLs */ 2288 rc = server->ops->mkdir(xid, inode, mode, tcon, full_path, cifs_sb); 2289 if (rc) { 2290 cifs_dbg(FYI, "cifs_mkdir returned 0x%x\n", rc); 2291 d_drop(direntry); 2292 goto mkdir_out; 2293 } 2294 2295 /* TODO: skip this for smb2/smb3 */ 2296 rc = cifs_mkdir_qinfo(inode, direntry, mode, full_path, cifs_sb, tcon, 2297 xid); 2298 mkdir_out: 2299 /* 2300 * Force revalidate to get parent dir info when needed since cached 2301 * attributes are invalid now. 2302 */ 2303 CIFS_I(inode)->time = 0; 2304 free_dentry_path(page); 2305 free_xid(xid); 2306 cifs_put_tlink(tlink); 2307 return ERR_PTR(rc); 2308 } 2309 2310 int cifs_rmdir(struct inode *inode, struct dentry *direntry) 2311 { 2312 int rc = 0; 2313 unsigned int xid; 2314 struct cifs_sb_info *cifs_sb; 2315 struct tcon_link *tlink; 2316 struct cifs_tcon *tcon; 2317 struct TCP_Server_Info *server; 2318 const char *full_path; 2319 void *page = alloc_dentry_path(); 2320 struct cifsInodeInfo *cifsInode; 2321 2322 cifs_dbg(FYI, "cifs_rmdir, inode = 0x%p\n", inode); 2323 2324 xid = get_xid(); 2325 2326 full_path = build_path_from_dentry(direntry, page); 2327 if (IS_ERR(full_path)) { 2328 rc = PTR_ERR(full_path); 2329 goto rmdir_exit; 2330 } 2331 2332 cifs_sb = CIFS_SB(inode->i_sb); 2333 if (unlikely(cifs_forced_shutdown(cifs_sb))) { 2334 rc = -EIO; 2335 goto rmdir_exit; 2336 } 2337 2338 tlink = cifs_sb_tlink(cifs_sb); 2339 if (IS_ERR(tlink)) { 2340 rc = PTR_ERR(tlink); 2341 goto rmdir_exit; 2342 } 2343 tcon = tlink_tcon(tlink); 2344 server = tcon->ses->server; 2345 2346 if (!server->ops->rmdir) { 2347 rc = -ENOSYS; 2348 cifs_put_tlink(tlink); 2349 goto rmdir_exit; 2350 } 2351 2352 if (tcon->nodelete) { 2353 rc = -EACCES; 2354 cifs_put_tlink(tlink); 2355 goto rmdir_exit; 2356 } 2357 2358 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb); 2359 cifs_put_tlink(tlink); 2360 2361 if (!rc) { 2362 spin_lock(&d_inode(direntry)->i_lock); 2363 i_size_write(d_inode(direntry), 0); 2364 clear_nlink(d_inode(direntry)); 2365 spin_unlock(&d_inode(direntry)->i_lock); 2366 } 2367 2368 cifsInode = CIFS_I(d_inode(direntry)); 2369 /* force revalidate to go get info when needed */ 2370 cifsInode->time = 0; 2371 2372 cifsInode = CIFS_I(inode); 2373 /* 2374 * Force revalidate to get parent dir info when needed since cached 2375 * attributes are invalid now. 2376 */ 2377 cifsInode->time = 0; 2378 2379 inode_set_ctime_current(d_inode(direntry)); 2380 inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); 2381 2382 rmdir_exit: 2383 free_dentry_path(page); 2384 free_xid(xid); 2385 return rc; 2386 } 2387 2388 static int 2389 cifs_do_rename(const unsigned int xid, struct dentry *from_dentry, 2390 const char *from_path, struct dentry *to_dentry, 2391 const char *to_path) 2392 { 2393 struct cifs_sb_info *cifs_sb = CIFS_SB(from_dentry->d_sb); 2394 struct tcon_link *tlink; 2395 struct cifs_tcon *tcon; 2396 struct TCP_Server_Info *server; 2397 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2398 struct cifs_fid fid; 2399 struct cifs_open_parms oparms; 2400 int oplock; 2401 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2402 int rc; 2403 2404 tlink = cifs_sb_tlink(cifs_sb); 2405 if (IS_ERR(tlink)) 2406 return PTR_ERR(tlink); 2407 tcon = tlink_tcon(tlink); 2408 server = tcon->ses->server; 2409 2410 if (!server->ops->rename) 2411 return -ENOSYS; 2412 2413 /* try path-based rename first */ 2414 rc = server->ops->rename(xid, tcon, from_dentry, 2415 from_path, to_path, cifs_sb); 2416 2417 /* 2418 * Don't bother with rename by filehandle unless file is busy and 2419 * source. Note that cross directory moves do not work with 2420 * rename by filehandle to various Windows servers. 2421 */ 2422 if (rc == 0 || rc != -EBUSY) 2423 goto do_rename_exit; 2424 2425 /* Don't fall back to using SMB on SMB 2+ mount */ 2426 if (server->vals->protocol_id != 0) 2427 goto do_rename_exit; 2428 2429 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2430 /* open-file renames don't work across directories */ 2431 if (to_dentry->d_parent != from_dentry->d_parent) 2432 goto do_rename_exit; 2433 2434 /* 2435 * CIFSSMBRenameOpenFile() uses SMB_SET_FILE_RENAME_INFORMATION 2436 * which is SMB PASSTHROUGH level. 2437 */ 2438 if (!(tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU)) 2439 goto do_rename_exit; 2440 2441 oparms = (struct cifs_open_parms) { 2442 .tcon = tcon, 2443 .cifs_sb = cifs_sb, 2444 /* open the file to be renamed -- we need DELETE perms */ 2445 .desired_access = DELETE, 2446 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR), 2447 .disposition = FILE_OPEN, 2448 .path = from_path, 2449 .fid = &fid, 2450 }; 2451 2452 rc = CIFS_open(xid, &oparms, &oplock, NULL); 2453 if (rc == 0) { 2454 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, 2455 (const char *) to_dentry->d_name.name, 2456 cifs_sb->local_nls, cifs_remap(cifs_sb)); 2457 CIFSSMBClose(xid, tcon, fid.netfid); 2458 } 2459 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2460 do_rename_exit: 2461 if (rc == 0) 2462 d_move(from_dentry, to_dentry); 2463 cifs_put_tlink(tlink); 2464 return rc; 2465 } 2466 2467 int 2468 cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir, 2469 struct dentry *source_dentry, struct inode *target_dir, 2470 struct dentry *target_dentry, unsigned int flags) 2471 { 2472 const char *from_name, *to_name; 2473 void *page1, *page2; 2474 struct cifs_sb_info *cifs_sb; 2475 struct tcon_link *tlink; 2476 struct cifs_tcon *tcon; 2477 bool rehash = false; 2478 unsigned int xid; 2479 int rc, tmprc; 2480 int retry_count = 0; 2481 FILE_UNIX_BASIC_INFO *info_buf_source = NULL; 2482 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2483 FILE_UNIX_BASIC_INFO *info_buf_target; 2484 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2485 2486 if (flags & ~RENAME_NOREPLACE) 2487 return -EINVAL; 2488 2489 cifs_sb = CIFS_SB(source_dir->i_sb); 2490 if (unlikely(cifs_forced_shutdown(cifs_sb))) 2491 return -EIO; 2492 2493 /* 2494 * Prevent any concurrent opens on the target by unhashing the dentry. 2495 * VFS already unhashes the target when renaming directories. 2496 */ 2497 if (d_is_positive(target_dentry) && !d_is_dir(target_dentry)) { 2498 if (!d_unhashed(target_dentry)) { 2499 d_drop(target_dentry); 2500 rehash = true; 2501 } 2502 } 2503 2504 tlink = cifs_sb_tlink(cifs_sb); 2505 if (IS_ERR(tlink)) 2506 return PTR_ERR(tlink); 2507 tcon = tlink_tcon(tlink); 2508 2509 page1 = alloc_dentry_path(); 2510 page2 = alloc_dentry_path(); 2511 xid = get_xid(); 2512 2513 from_name = build_path_from_dentry(source_dentry, page1); 2514 if (IS_ERR(from_name)) { 2515 rc = PTR_ERR(from_name); 2516 goto cifs_rename_exit; 2517 } 2518 2519 to_name = build_path_from_dentry(target_dentry, page2); 2520 if (IS_ERR(to_name)) { 2521 rc = PTR_ERR(to_name); 2522 goto cifs_rename_exit; 2523 } 2524 2525 cifs_close_deferred_file_under_dentry(tcon, from_name); 2526 if (d_inode(target_dentry) != NULL) { 2527 netfs_wait_for_outstanding_io(d_inode(target_dentry)); 2528 cifs_close_deferred_file_under_dentry(tcon, to_name); 2529 } 2530 2531 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry, 2532 to_name); 2533 2534 if (rc == -EACCES) { 2535 while (retry_count < 3) { 2536 cifs_close_all_deferred_files(tcon); 2537 rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry, 2538 to_name); 2539 if (rc != -EACCES) 2540 break; 2541 retry_count++; 2542 } 2543 } 2544 2545 if (!rc) 2546 rehash = false; 2547 /* 2548 * No-replace is the natural behavior for CIFS, so skip unlink hacks. 2549 */ 2550 if (flags & RENAME_NOREPLACE) 2551 goto cifs_rename_exit; 2552 2553 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2554 if (rc == -EEXIST && tcon->unix_ext) { 2555 /* 2556 * Are src and dst hardlinks of same inode? We can only tell 2557 * with unix extensions enabled. 2558 */ 2559 info_buf_source = 2560 kmalloc_array(2, sizeof(FILE_UNIX_BASIC_INFO), 2561 GFP_KERNEL); 2562 if (info_buf_source == NULL) { 2563 rc = -ENOMEM; 2564 goto cifs_rename_exit; 2565 } 2566 2567 info_buf_target = info_buf_source + 1; 2568 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, from_name, 2569 info_buf_source, 2570 cifs_sb->local_nls, 2571 cifs_remap(cifs_sb)); 2572 if (tmprc != 0) 2573 goto unlink_target; 2574 2575 tmprc = CIFSSMBUnixQPathInfo(xid, tcon, to_name, 2576 info_buf_target, 2577 cifs_sb->local_nls, 2578 cifs_remap(cifs_sb)); 2579 2580 if (tmprc == 0 && (info_buf_source->UniqueId == 2581 info_buf_target->UniqueId)) { 2582 /* same file, POSIX says that this is a noop */ 2583 rc = 0; 2584 goto cifs_rename_exit; 2585 } 2586 } 2587 /* 2588 * else ... BB we could add the same check for Windows by 2589 * checking the UniqueId via FILE_INTERNAL_INFO 2590 */ 2591 2592 unlink_target: 2593 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2594 2595 /* Try unlinking the target dentry if it's not negative */ 2596 if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) { 2597 if (d_is_dir(target_dentry)) 2598 tmprc = cifs_rmdir(target_dir, target_dentry); 2599 else 2600 tmprc = cifs_unlink(target_dir, target_dentry); 2601 if (tmprc) 2602 goto cifs_rename_exit; 2603 rc = cifs_do_rename(xid, source_dentry, from_name, 2604 target_dentry, to_name); 2605 if (!rc) 2606 rehash = false; 2607 } 2608 2609 /* force revalidate to go get info when needed */ 2610 CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0; 2611 2612 cifs_rename_exit: 2613 if (rehash) 2614 d_rehash(target_dentry); 2615 kfree(info_buf_source); 2616 free_dentry_path(page2); 2617 free_dentry_path(page1); 2618 free_xid(xid); 2619 cifs_put_tlink(tlink); 2620 return rc; 2621 } 2622 2623 static bool 2624 cifs_dentry_needs_reval(struct dentry *dentry) 2625 { 2626 struct inode *inode = d_inode(dentry); 2627 struct cifsInodeInfo *cifs_i = CIFS_I(inode); 2628 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 2629 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); 2630 struct cached_fid *cfid = NULL; 2631 2632 if (cifs_i->time == 0) 2633 return true; 2634 2635 if (CIFS_CACHE_READ(cifs_i)) 2636 return false; 2637 2638 if (!lookupCacheEnabled) 2639 return true; 2640 2641 if (!open_cached_dir_by_dentry(tcon, dentry->d_parent, &cfid)) { 2642 if (cfid->time && cifs_i->time > cfid->time) { 2643 close_cached_dir(cfid); 2644 return false; 2645 } 2646 close_cached_dir(cfid); 2647 } 2648 /* 2649 * depending on inode type, check if attribute caching disabled for 2650 * files or directories 2651 */ 2652 if (S_ISDIR(inode->i_mode)) { 2653 if (!cifs_sb->ctx->acdirmax) 2654 return true; 2655 if (!time_in_range(jiffies, cifs_i->time, 2656 cifs_i->time + cifs_sb->ctx->acdirmax)) 2657 return true; 2658 } else { /* file */ 2659 if (!cifs_sb->ctx->acregmax) 2660 return true; 2661 if (!time_in_range(jiffies, cifs_i->time, 2662 cifs_i->time + cifs_sb->ctx->acregmax)) 2663 return true; 2664 } 2665 2666 /* hardlinked files w/ noserverino get "special" treatment */ 2667 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) && 2668 S_ISREG(inode->i_mode) && inode->i_nlink != 1) 2669 return true; 2670 2671 return false; 2672 } 2673 2674 /** 2675 * cifs_wait_bit_killable - helper for functions that are sleeping on bit locks 2676 * 2677 * @key: currently unused 2678 * @mode: the task state to sleep in 2679 */ 2680 static int 2681 cifs_wait_bit_killable(struct wait_bit_key *key, int mode) 2682 { 2683 schedule(); 2684 if (signal_pending_state(mode, current)) 2685 return -ERESTARTSYS; 2686 return 0; 2687 } 2688 2689 int 2690 cifs_revalidate_mapping(struct inode *inode) 2691 { 2692 int rc; 2693 struct cifsInodeInfo *cifs_inode = CIFS_I(inode); 2694 unsigned long *flags = &cifs_inode->flags; 2695 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 2696 2697 /* swapfiles are not supposed to be shared */ 2698 if (IS_SWAPFILE(inode)) 2699 return 0; 2700 2701 rc = wait_on_bit_lock_action(flags, CIFS_INO_LOCK, cifs_wait_bit_killable, 2702 TASK_KILLABLE|TASK_FREEZABLE_UNSAFE); 2703 if (rc) 2704 return rc; 2705 2706 if (test_and_clear_bit(CIFS_INO_INVALID_MAPPING, flags)) { 2707 /* for cache=singleclient, do not invalidate */ 2708 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE) 2709 goto skip_invalidate; 2710 2711 cifs_inode->netfs.zero_point = cifs_inode->netfs.remote_i_size; 2712 rc = filemap_invalidate_inode(inode, true, 0, LLONG_MAX); 2713 if (rc) { 2714 cifs_dbg(VFS, "%s: invalidate inode %p failed with rc %d\n", 2715 __func__, inode, rc); 2716 set_bit(CIFS_INO_INVALID_MAPPING, flags); 2717 } 2718 } 2719 2720 skip_invalidate: 2721 clear_bit_unlock(CIFS_INO_LOCK, flags); 2722 smp_mb__after_atomic(); 2723 wake_up_bit(flags, CIFS_INO_LOCK); 2724 2725 return rc; 2726 } 2727 2728 int 2729 cifs_zap_mapping(struct inode *inode) 2730 { 2731 set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(inode)->flags); 2732 return cifs_revalidate_mapping(inode); 2733 } 2734 2735 int cifs_revalidate_file_attr(struct file *filp) 2736 { 2737 int rc = 0; 2738 struct dentry *dentry = file_dentry(filp); 2739 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2740 struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data; 2741 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2742 2743 if (!cifs_dentry_needs_reval(dentry)) 2744 return rc; 2745 2746 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2747 if (tlink_tcon(cfile->tlink)->unix_ext) 2748 rc = cifs_get_file_info_unix(filp); 2749 else 2750 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2751 rc = cifs_get_file_info(filp); 2752 2753 return rc; 2754 } 2755 2756 int cifs_revalidate_dentry_attr(struct dentry *dentry) 2757 { 2758 unsigned int xid; 2759 int rc = 0; 2760 struct inode *inode = d_inode(dentry); 2761 struct super_block *sb = dentry->d_sb; 2762 const char *full_path; 2763 void *page; 2764 int count = 0; 2765 2766 if (inode == NULL) 2767 return -ENOENT; 2768 2769 if (!cifs_dentry_needs_reval(dentry)) 2770 return rc; 2771 2772 xid = get_xid(); 2773 2774 page = alloc_dentry_path(); 2775 full_path = build_path_from_dentry(dentry, page); 2776 if (IS_ERR(full_path)) { 2777 rc = PTR_ERR(full_path); 2778 goto out; 2779 } 2780 2781 cifs_dbg(FYI, "Update attributes: %s inode 0x%p count %d dentry: 0x%p d_time %ld jiffies %ld\n", 2782 full_path, inode, inode->i_count.counter, 2783 dentry, cifs_get_time(dentry), jiffies); 2784 2785 again: 2786 if (cifs_sb_master_tcon(CIFS_SB(sb))->posix_extensions) { 2787 rc = smb311_posix_get_inode_info(&inode, full_path, 2788 NULL, sb, xid); 2789 } else if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext) { 2790 rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid); 2791 } else { 2792 rc = cifs_get_inode_info(&inode, full_path, NULL, sb, 2793 xid, NULL); 2794 } 2795 if (rc == -EAGAIN && count++ < 10) 2796 goto again; 2797 out: 2798 free_dentry_path(page); 2799 free_xid(xid); 2800 2801 return rc; 2802 } 2803 2804 int cifs_revalidate_file(struct file *filp) 2805 { 2806 int rc; 2807 struct inode *inode = file_inode(filp); 2808 2809 rc = cifs_revalidate_file_attr(filp); 2810 if (rc) 2811 return rc; 2812 2813 return cifs_revalidate_mapping(inode); 2814 } 2815 2816 /* revalidate a dentry's inode attributes */ 2817 int cifs_revalidate_dentry(struct dentry *dentry) 2818 { 2819 int rc; 2820 struct inode *inode = d_inode(dentry); 2821 2822 rc = cifs_revalidate_dentry_attr(dentry); 2823 if (rc) 2824 return rc; 2825 2826 return cifs_revalidate_mapping(inode); 2827 } 2828 2829 int cifs_getattr(struct mnt_idmap *idmap, const struct path *path, 2830 struct kstat *stat, u32 request_mask, unsigned int flags) 2831 { 2832 struct dentry *dentry = path->dentry; 2833 struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb); 2834 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); 2835 struct inode *inode = d_inode(dentry); 2836 int rc; 2837 2838 if (unlikely(cifs_forced_shutdown(CIFS_SB(inode->i_sb)))) 2839 return -EIO; 2840 2841 /* 2842 * We need to be sure that all dirty pages are written and the server 2843 * has actual ctime, mtime and file length. 2844 */ 2845 if ((request_mask & (STATX_CTIME | STATX_MTIME | STATX_SIZE | STATX_BLOCKS)) && 2846 !CIFS_CACHE_READ(CIFS_I(inode)) && 2847 inode->i_mapping && inode->i_mapping->nrpages != 0) { 2848 rc = filemap_fdatawait(inode->i_mapping); 2849 if (rc) { 2850 mapping_set_error(inode->i_mapping, rc); 2851 return rc; 2852 } 2853 } 2854 2855 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_FORCE_SYNC) 2856 CIFS_I(inode)->time = 0; /* force revalidate */ 2857 2858 /* 2859 * If the caller doesn't require syncing, only sync if 2860 * necessary (e.g. due to earlier truncate or setattr 2861 * invalidating the cached metadata) 2862 */ 2863 if (((flags & AT_STATX_SYNC_TYPE) != AT_STATX_DONT_SYNC) || 2864 (CIFS_I(inode)->time == 0)) { 2865 rc = cifs_revalidate_dentry_attr(dentry); 2866 if (rc) 2867 return rc; 2868 } 2869 2870 generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat); 2871 stat->blksize = cifs_sb->ctx->bsize; 2872 stat->ino = CIFS_I(inode)->uniqueid; 2873 2874 /* old CIFS Unix Extensions doesn't return create time */ 2875 if (CIFS_I(inode)->createtime) { 2876 stat->result_mask |= STATX_BTIME; 2877 stat->btime = 2878 cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime)); 2879 } 2880 2881 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | STATX_ATTR_ENCRYPTED); 2882 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_COMPRESSED) 2883 stat->attributes |= STATX_ATTR_COMPRESSED; 2884 if (CIFS_I(inode)->cifsAttrs & FILE_ATTRIBUTE_ENCRYPTED) 2885 stat->attributes |= STATX_ATTR_ENCRYPTED; 2886 2887 /* 2888 * If on a multiuser mount without unix extensions or cifsacl being 2889 * enabled, and the admin hasn't overridden them, set the ownership 2890 * to the fsuid/fsgid of the current process. 2891 */ 2892 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) && 2893 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) && 2894 !tcon->unix_ext) { 2895 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)) 2896 stat->uid = current_fsuid(); 2897 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)) 2898 stat->gid = current_fsgid(); 2899 } 2900 return 0; 2901 } 2902 2903 int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start, 2904 u64 len) 2905 { 2906 struct cifsInodeInfo *cifs_i = CIFS_I(inode); 2907 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_i->netfs.inode.i_sb); 2908 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); 2909 struct TCP_Server_Info *server = tcon->ses->server; 2910 struct cifsFileInfo *cfile; 2911 int rc; 2912 2913 if (unlikely(cifs_forced_shutdown(cifs_sb))) 2914 return -EIO; 2915 2916 /* 2917 * We need to be sure that all dirty pages are written as they 2918 * might fill holes on the server. 2919 */ 2920 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping && 2921 inode->i_mapping->nrpages != 0) { 2922 rc = filemap_fdatawait(inode->i_mapping); 2923 if (rc) { 2924 mapping_set_error(inode->i_mapping, rc); 2925 return rc; 2926 } 2927 } 2928 2929 cfile = find_readable_file(cifs_i, false); 2930 if (cfile == NULL) 2931 return -EINVAL; 2932 2933 if (server->ops->fiemap) { 2934 rc = server->ops->fiemap(tcon, cfile, fei, start, len); 2935 cifsFileInfo_put(cfile); 2936 return rc; 2937 } 2938 2939 cifsFileInfo_put(cfile); 2940 return -EOPNOTSUPP; 2941 } 2942 2943 void cifs_setsize(struct inode *inode, loff_t offset) 2944 { 2945 struct cifsInodeInfo *cifs_i = CIFS_I(inode); 2946 2947 spin_lock(&inode->i_lock); 2948 i_size_write(inode, offset); 2949 spin_unlock(&inode->i_lock); 2950 2951 /* Cached inode must be refreshed on truncate */ 2952 cifs_i->time = 0; 2953 truncate_pagecache(inode, offset); 2954 } 2955 2956 static int 2957 cifs_set_file_size(struct inode *inode, struct iattr *attrs, 2958 unsigned int xid, const char *full_path, struct dentry *dentry) 2959 { 2960 int rc; 2961 struct cifsFileInfo *open_file; 2962 struct cifsInodeInfo *cifsInode = CIFS_I(inode); 2963 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 2964 struct tcon_link *tlink = NULL; 2965 struct cifs_tcon *tcon = NULL; 2966 struct TCP_Server_Info *server; 2967 2968 /* 2969 * To avoid spurious oplock breaks from server, in the case of 2970 * inodes that we already have open, avoid doing path based 2971 * setting of file size if we can do it by handle. 2972 * This keeps our caching token (oplock) and avoids timeouts 2973 * when the local oplock break takes longer to flush 2974 * writebehind data than the SMB timeout for the SetPathInfo 2975 * request would allow 2976 */ 2977 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY); 2978 if (open_file) { 2979 tcon = tlink_tcon(open_file->tlink); 2980 server = tcon->ses->server; 2981 if (server->ops->set_file_size) 2982 rc = server->ops->set_file_size(xid, tcon, open_file, 2983 attrs->ia_size, false); 2984 else 2985 rc = -ENOSYS; 2986 cifsFileInfo_put(open_file); 2987 cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc); 2988 } else 2989 rc = -EINVAL; 2990 2991 if (!rc) 2992 goto set_size_out; 2993 2994 if (tcon == NULL) { 2995 tlink = cifs_sb_tlink(cifs_sb); 2996 if (IS_ERR(tlink)) 2997 return PTR_ERR(tlink); 2998 tcon = tlink_tcon(tlink); 2999 server = tcon->ses->server; 3000 } 3001 3002 /* 3003 * Set file size by pathname rather than by handle either because no 3004 * valid, writeable file handle for it was found or because there was 3005 * an error setting it by handle. 3006 */ 3007 if (server->ops->set_path_size) 3008 rc = server->ops->set_path_size(xid, tcon, full_path, 3009 attrs->ia_size, cifs_sb, false, dentry); 3010 else 3011 rc = -ENOSYS; 3012 cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc); 3013 3014 if (tlink) 3015 cifs_put_tlink(tlink); 3016 3017 set_size_out: 3018 if (rc == 0) { 3019 netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true); 3020 cifs_setsize(inode, attrs->ia_size); 3021 /* 3022 * i_blocks is not related to (i_size / i_blksize), but instead 3023 * 512 byte (2**9) size is required for calculating num blocks. 3024 * Until we can query the server for actual allocation size, 3025 * this is best estimate we have for blocks allocated for a file 3026 * Number of blocks must be rounded up so size 1 is not 0 blocks 3027 */ 3028 inode->i_blocks = (512 - 1 + attrs->ia_size) >> 9; 3029 3030 /* 3031 * The man page of truncate says if the size changed, 3032 * then the st_ctime and st_mtime fields for the file 3033 * are updated. 3034 */ 3035 attrs->ia_ctime = attrs->ia_mtime = current_time(inode); 3036 attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME; 3037 } 3038 3039 return rc; 3040 } 3041 3042 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 3043 static int 3044 cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) 3045 { 3046 int rc; 3047 unsigned int xid; 3048 const char *full_path; 3049 void *page = alloc_dentry_path(); 3050 struct inode *inode = d_inode(direntry); 3051 struct cifsInodeInfo *cifsInode = CIFS_I(inode); 3052 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 3053 struct tcon_link *tlink; 3054 struct cifs_tcon *pTcon; 3055 struct cifs_unix_set_info_args *args = NULL; 3056 struct cifsFileInfo *open_file; 3057 3058 cifs_dbg(FYI, "setattr_unix on file %pd attrs->ia_valid=0x%x\n", 3059 direntry, attrs->ia_valid); 3060 3061 xid = get_xid(); 3062 3063 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) 3064 attrs->ia_valid |= ATTR_FORCE; 3065 3066 rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs); 3067 if (rc < 0) 3068 goto out; 3069 3070 full_path = build_path_from_dentry(direntry, page); 3071 if (IS_ERR(full_path)) { 3072 rc = PTR_ERR(full_path); 3073 goto out; 3074 } 3075 3076 /* 3077 * Attempt to flush data before changing attributes. We need to do 3078 * this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the 3079 * ownership or mode then we may also need to do this. Here, we take 3080 * the safe way out and just do the flush on all setattr requests. If 3081 * the flush returns error, store it to report later and continue. 3082 * 3083 * BB: This should be smarter. Why bother flushing pages that 3084 * will be truncated anyway? Also, should we error out here if 3085 * the flush returns error? 3086 */ 3087 rc = filemap_write_and_wait(inode->i_mapping); 3088 if (is_interrupt_error(rc)) { 3089 rc = -ERESTARTSYS; 3090 goto out; 3091 } 3092 3093 mapping_set_error(inode->i_mapping, rc); 3094 rc = 0; 3095 3096 if (attrs->ia_valid & ATTR_SIZE) { 3097 rc = cifs_set_file_size(inode, attrs, xid, full_path, direntry); 3098 if (rc != 0) 3099 goto out; 3100 } 3101 3102 /* skip mode change if it's just for clearing setuid/setgid */ 3103 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) 3104 attrs->ia_valid &= ~ATTR_MODE; 3105 3106 args = kmalloc(sizeof(*args), GFP_KERNEL); 3107 if (args == NULL) { 3108 rc = -ENOMEM; 3109 goto out; 3110 } 3111 3112 /* set up the struct */ 3113 if (attrs->ia_valid & ATTR_MODE) 3114 args->mode = attrs->ia_mode; 3115 else 3116 args->mode = NO_CHANGE_64; 3117 3118 if (attrs->ia_valid & ATTR_UID) 3119 args->uid = attrs->ia_uid; 3120 else 3121 args->uid = INVALID_UID; /* no change */ 3122 3123 if (attrs->ia_valid & ATTR_GID) 3124 args->gid = attrs->ia_gid; 3125 else 3126 args->gid = INVALID_GID; /* no change */ 3127 3128 if (attrs->ia_valid & ATTR_ATIME) 3129 args->atime = cifs_UnixTimeToNT(attrs->ia_atime); 3130 else 3131 args->atime = NO_CHANGE_64; 3132 3133 if (attrs->ia_valid & ATTR_MTIME) 3134 args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime); 3135 else 3136 args->mtime = NO_CHANGE_64; 3137 3138 if (attrs->ia_valid & ATTR_CTIME) 3139 args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime); 3140 else 3141 args->ctime = NO_CHANGE_64; 3142 3143 args->device = 0; 3144 open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY); 3145 if (open_file) { 3146 u16 nfid = open_file->fid.netfid; 3147 u32 npid = open_file->pid; 3148 pTcon = tlink_tcon(open_file->tlink); 3149 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args, nfid, npid); 3150 cifsFileInfo_put(open_file); 3151 } else { 3152 tlink = cifs_sb_tlink(cifs_sb); 3153 if (IS_ERR(tlink)) { 3154 rc = PTR_ERR(tlink); 3155 goto out; 3156 } 3157 pTcon = tlink_tcon(tlink); 3158 rc = CIFSSMBUnixSetPathInfo(xid, pTcon, full_path, args, 3159 cifs_sb->local_nls, 3160 cifs_remap(cifs_sb)); 3161 cifs_put_tlink(tlink); 3162 } 3163 3164 if (rc) 3165 goto out; 3166 3167 if ((attrs->ia_valid & ATTR_SIZE) && 3168 attrs->ia_size != i_size_read(inode)) { 3169 truncate_setsize(inode, attrs->ia_size); 3170 netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true); 3171 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size); 3172 } 3173 3174 setattr_copy(&nop_mnt_idmap, inode, attrs); 3175 mark_inode_dirty(inode); 3176 3177 /* force revalidate when any of these times are set since some 3178 of the fs types (eg ext3, fat) do not have fine enough 3179 time granularity to match protocol, and we do not have a 3180 a way (yet) to query the server fs's time granularity (and 3181 whether it rounds times down). 3182 */ 3183 if (attrs->ia_valid & (ATTR_MTIME | ATTR_CTIME)) 3184 cifsInode->time = 0; 3185 out: 3186 kfree(args); 3187 free_dentry_path(page); 3188 free_xid(xid); 3189 return rc; 3190 } 3191 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 3192 3193 static int 3194 cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) 3195 { 3196 unsigned int xid; 3197 kuid_t uid = INVALID_UID; 3198 kgid_t gid = INVALID_GID; 3199 struct inode *inode = d_inode(direntry); 3200 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 3201 struct cifsInodeInfo *cifsInode = CIFS_I(inode); 3202 struct cifsFileInfo *wfile; 3203 struct cifs_tcon *tcon; 3204 const char *full_path; 3205 void *page = alloc_dentry_path(); 3206 int rc = -EACCES; 3207 __u32 dosattr = 0; 3208 __u64 mode = NO_CHANGE_64; 3209 bool posix = cifs_sb_master_tcon(cifs_sb)->posix_extensions; 3210 3211 xid = get_xid(); 3212 3213 cifs_dbg(FYI, "setattr on file %pd attrs->ia_valid 0x%x\n", 3214 direntry, attrs->ia_valid); 3215 3216 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) 3217 attrs->ia_valid |= ATTR_FORCE; 3218 3219 rc = setattr_prepare(&nop_mnt_idmap, direntry, attrs); 3220 if (rc < 0) 3221 goto cifs_setattr_exit; 3222 3223 full_path = build_path_from_dentry(direntry, page); 3224 if (IS_ERR(full_path)) { 3225 rc = PTR_ERR(full_path); 3226 goto cifs_setattr_exit; 3227 } 3228 3229 /* 3230 * Attempt to flush data before changing attributes. We need to do 3231 * this for ATTR_SIZE and ATTR_MTIME. If the flush of the data 3232 * returns error, store it to report later and continue. 3233 * 3234 * BB: This should be smarter. Why bother flushing pages that 3235 * will be truncated anyway? Also, should we error out here if 3236 * the flush returns error? Do we need to check for ATTR_MTIME_SET flag? 3237 */ 3238 if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) { 3239 rc = filemap_write_and_wait(inode->i_mapping); 3240 if (is_interrupt_error(rc)) { 3241 rc = -ERESTARTSYS; 3242 goto cifs_setattr_exit; 3243 } 3244 mapping_set_error(inode->i_mapping, rc); 3245 } 3246 3247 rc = 0; 3248 3249 if ((attrs->ia_valid & ATTR_MTIME) && 3250 !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) { 3251 rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile); 3252 if (!rc) { 3253 tcon = tlink_tcon(wfile->tlink); 3254 rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid); 3255 cifsFileInfo_put(wfile); 3256 if (rc) 3257 goto cifs_setattr_exit; 3258 } else if (rc != -EBADF) 3259 goto cifs_setattr_exit; 3260 else 3261 rc = 0; 3262 } 3263 3264 if (attrs->ia_valid & ATTR_SIZE) { 3265 rc = cifs_set_file_size(inode, attrs, xid, full_path, direntry); 3266 if (rc != 0) 3267 goto cifs_setattr_exit; 3268 } 3269 3270 if (attrs->ia_valid & ATTR_UID) 3271 uid = attrs->ia_uid; 3272 3273 if (attrs->ia_valid & ATTR_GID) 3274 gid = attrs->ia_gid; 3275 3276 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) || 3277 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)) { 3278 if (uid_valid(uid) || gid_valid(gid)) { 3279 mode = NO_CHANGE_64; 3280 rc = id_mode_to_cifs_acl(inode, full_path, &mode, 3281 uid, gid); 3282 if (rc) { 3283 cifs_dbg(FYI, "%s: Setting id failed with error: %d\n", 3284 __func__, rc); 3285 goto cifs_setattr_exit; 3286 } 3287 } 3288 } else 3289 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)) 3290 attrs->ia_valid &= ~(ATTR_UID | ATTR_GID); 3291 3292 /* skip mode change if it's just for clearing setuid/setgid */ 3293 if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) 3294 attrs->ia_valid &= ~ATTR_MODE; 3295 3296 if (attrs->ia_valid & ATTR_MODE) { 3297 mode = attrs->ia_mode; 3298 rc = 0; 3299 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) || 3300 (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) || 3301 posix) { 3302 rc = id_mode_to_cifs_acl(inode, full_path, &mode, 3303 INVALID_UID, INVALID_GID); 3304 if (rc) { 3305 cifs_dbg(FYI, "%s: Setting ACL failed with error: %d\n", 3306 __func__, rc); 3307 goto cifs_setattr_exit; 3308 } 3309 3310 /* 3311 * In case of CIFS_MOUNT_CIFS_ACL, we cannot support all modes. 3312 * Pick up the actual mode bits that were set. 3313 */ 3314 if (mode != attrs->ia_mode) 3315 attrs->ia_mode = mode; 3316 } else 3317 if (((mode & S_IWUGO) == 0) && 3318 (cifsInode->cifsAttrs & ATTR_READONLY) == 0) { 3319 3320 dosattr = cifsInode->cifsAttrs | ATTR_READONLY; 3321 3322 /* fix up mode if we're not using dynperm */ 3323 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM) == 0) 3324 attrs->ia_mode = inode->i_mode & ~S_IWUGO; 3325 } else if ((mode & S_IWUGO) && 3326 (cifsInode->cifsAttrs & ATTR_READONLY)) { 3327 3328 dosattr = cifsInode->cifsAttrs & ~ATTR_READONLY; 3329 /* Attributes of 0 are ignored */ 3330 if (dosattr == 0) 3331 dosattr |= ATTR_NORMAL; 3332 3333 /* reset local inode permissions to normal */ 3334 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) { 3335 attrs->ia_mode &= ~(S_IALLUGO); 3336 if (S_ISDIR(inode->i_mode)) 3337 attrs->ia_mode |= 3338 cifs_sb->ctx->dir_mode; 3339 else 3340 attrs->ia_mode |= 3341 cifs_sb->ctx->file_mode; 3342 } 3343 } else if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) { 3344 /* ignore mode change - ATTR_READONLY hasn't changed */ 3345 attrs->ia_valid &= ~ATTR_MODE; 3346 } 3347 } 3348 3349 if (attrs->ia_valid & (ATTR_MTIME|ATTR_ATIME|ATTR_CTIME) || 3350 ((attrs->ia_valid & ATTR_MODE) && dosattr)) { 3351 rc = cifs_set_file_info(inode, attrs, xid, full_path, dosattr); 3352 /* BB: check for rc = -EOPNOTSUPP and switch to legacy mode */ 3353 3354 /* Even if error on time set, no sense failing the call if 3355 the server would set the time to a reasonable value anyway, 3356 and this check ensures that we are not being called from 3357 sys_utimes in which case we ought to fail the call back to 3358 the user when the server rejects the call */ 3359 if ((rc) && (attrs->ia_valid & 3360 (ATTR_MODE | ATTR_GID | ATTR_UID | ATTR_SIZE))) 3361 rc = 0; 3362 } 3363 3364 /* do not need local check to inode_check_ok since the server does 3365 that */ 3366 if (rc) 3367 goto cifs_setattr_exit; 3368 3369 if ((attrs->ia_valid & ATTR_SIZE) && 3370 attrs->ia_size != i_size_read(inode)) { 3371 truncate_setsize(inode, attrs->ia_size); 3372 netfs_resize_file(&cifsInode->netfs, attrs->ia_size, true); 3373 fscache_resize_cookie(cifs_inode_cookie(inode), attrs->ia_size); 3374 } 3375 3376 setattr_copy(&nop_mnt_idmap, inode, attrs); 3377 mark_inode_dirty(inode); 3378 3379 cifs_setattr_exit: 3380 free_xid(xid); 3381 free_dentry_path(page); 3382 return rc; 3383 } 3384 3385 int 3386 cifs_setattr(struct mnt_idmap *idmap, struct dentry *direntry, 3387 struct iattr *attrs) 3388 { 3389 struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb); 3390 int rc, retries = 0; 3391 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 3392 struct cifs_tcon *pTcon = cifs_sb_master_tcon(cifs_sb); 3393 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 3394 3395 if (unlikely(cifs_forced_shutdown(cifs_sb))) 3396 return -EIO; 3397 3398 do { 3399 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 3400 if (pTcon->unix_ext) 3401 rc = cifs_setattr_unix(direntry, attrs); 3402 else 3403 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 3404 rc = cifs_setattr_nounix(direntry, attrs); 3405 retries++; 3406 } while (is_retryable_error(rc) && retries < 2); 3407 3408 /* BB: add cifs_setattr_legacy for really old servers */ 3409 return rc; 3410 } 3411