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