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