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