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