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