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