root/fs/cifs/dir.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. renew_parental_timestamps
  2. cifs_build_path_to_root
  3. build_path_from_dentry
  4. build_path_from_dentry_optional_prefix
  5. check_name
  6. cifs_do_create
  7. cifs_atomic_open
  8. cifs_create
  9. cifs_mknod
  10. cifs_lookup
  11. cifs_d_revalidate
  12. cifs_ci_hash
  13. cifs_ci_compare

   1 /*
   2  *   fs/cifs/dir.c
   3  *
   4  *   vfs operations that deal with dentries
   5  *
   6  *   Copyright (C) International Business Machines  Corp., 2002,2009
   7  *   Author(s): Steve French (sfrench@us.ibm.com)
   8  *
   9  *   This library is free software; you can redistribute it and/or modify
  10  *   it under the terms of the GNU Lesser General Public License as published
  11  *   by the Free Software Foundation; either version 2.1 of the License, or
  12  *   (at your option) any later version.
  13  *
  14  *   This library is distributed in the hope that it will be useful,
  15  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  16  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  17  *   the GNU Lesser General Public License for more details.
  18  *
  19  *   You should have received a copy of the GNU Lesser General Public License
  20  *   along with this library; if not, write to the Free Software
  21  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  22  */
  23 #include <linux/fs.h>
  24 #include <linux/stat.h>
  25 #include <linux/slab.h>
  26 #include <linux/namei.h>
  27 #include <linux/mount.h>
  28 #include <linux/file.h>
  29 #include "cifsfs.h"
  30 #include "cifspdu.h"
  31 #include "cifsglob.h"
  32 #include "cifsproto.h"
  33 #include "cifs_debug.h"
  34 #include "cifs_fs_sb.h"
  35 #include "cifs_unicode.h"
  36 
  37 static void
  38 renew_parental_timestamps(struct dentry *direntry)
  39 {
  40         /* BB check if there is a way to get the kernel to do this or if we
  41            really need this */
  42         do {
  43                 cifs_set_time(direntry, jiffies);
  44                 direntry = direntry->d_parent;
  45         } while (!IS_ROOT(direntry));
  46 }
  47 
  48 char *
  49 cifs_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
  50                         struct cifs_tcon *tcon, int add_treename)
  51 {
  52         int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
  53         int dfsplen;
  54         char *full_path = NULL;
  55 
  56         /* if no prefix path, simply set path to the root of share to "" */
  57         if (pplen == 0) {
  58                 full_path = kzalloc(1, GFP_KERNEL);
  59                 return full_path;
  60         }
  61 
  62         if (add_treename)
  63                 dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1);
  64         else
  65                 dfsplen = 0;
  66 
  67         full_path = kmalloc(dfsplen + pplen + 1, GFP_KERNEL);
  68         if (full_path == NULL)
  69                 return full_path;
  70 
  71         if (dfsplen)
  72                 memcpy(full_path, tcon->treeName, dfsplen);
  73         full_path[dfsplen] = CIFS_DIR_SEP(cifs_sb);
  74         memcpy(full_path + dfsplen + 1, vol->prepath, pplen);
  75         convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
  76         return full_path;
  77 }
  78 
  79 /* Note: caller must free return buffer */
  80 char *
  81 build_path_from_dentry(struct dentry *direntry)
  82 {
  83         struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
  84         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
  85         bool prefix = tcon->Flags & SMB_SHARE_IS_IN_DFS;
  86 
  87         return build_path_from_dentry_optional_prefix(direntry,
  88                                                       prefix);
  89 }
  90 
  91 char *
  92 build_path_from_dentry_optional_prefix(struct dentry *direntry, bool prefix)
  93 {
  94         struct dentry *temp;
  95         int namelen;
  96         int dfsplen;
  97         int pplen = 0;
  98         char *full_path;
  99         char dirsep;
 100         struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
 101         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
 102         unsigned seq;
 103 
 104         dirsep = CIFS_DIR_SEP(cifs_sb);
 105         if (prefix)
 106                 dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1);
 107         else
 108                 dfsplen = 0;
 109 
 110         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
 111                 pplen = cifs_sb->prepath ? strlen(cifs_sb->prepath) + 1 : 0;
 112 
 113 cifs_bp_rename_retry:
 114         namelen = dfsplen + pplen;
 115         seq = read_seqbegin(&rename_lock);
 116         rcu_read_lock();
 117         for (temp = direntry; !IS_ROOT(temp);) {
 118                 namelen += (1 + temp->d_name.len);
 119                 temp = temp->d_parent;
 120                 if (temp == NULL) {
 121                         cifs_dbg(VFS, "corrupt dentry\n");
 122                         rcu_read_unlock();
 123                         return NULL;
 124                 }
 125         }
 126         rcu_read_unlock();
 127 
 128         full_path = kmalloc(namelen+1, GFP_ATOMIC);
 129         if (full_path == NULL)
 130                 return full_path;
 131         full_path[namelen] = 0; /* trailing null */
 132         rcu_read_lock();
 133         for (temp = direntry; !IS_ROOT(temp);) {
 134                 spin_lock(&temp->d_lock);
 135                 namelen -= 1 + temp->d_name.len;
 136                 if (namelen < 0) {
 137                         spin_unlock(&temp->d_lock);
 138                         break;
 139                 } else {
 140                         full_path[namelen] = dirsep;
 141                         strncpy(full_path + namelen + 1, temp->d_name.name,
 142                                 temp->d_name.len);
 143                         cifs_dbg(FYI, "name: %s\n", full_path + namelen);
 144                 }
 145                 spin_unlock(&temp->d_lock);
 146                 temp = temp->d_parent;
 147                 if (temp == NULL) {
 148                         cifs_dbg(VFS, "corrupt dentry\n");
 149                         rcu_read_unlock();
 150                         kfree(full_path);
 151                         return NULL;
 152                 }
 153         }
 154         rcu_read_unlock();
 155         if (namelen != dfsplen + pplen || read_seqretry(&rename_lock, seq)) {
 156                 cifs_dbg(FYI, "did not end path lookup where expected. namelen=%ddfsplen=%d\n",
 157                          namelen, dfsplen);
 158                 /* presumably this is only possible if racing with a rename
 159                 of one of the parent directories  (we can not lock the dentries
 160                 above us to prevent this, but retrying should be harmless) */
 161                 kfree(full_path);
 162                 goto cifs_bp_rename_retry;
 163         }
 164         /* DIR_SEP already set for byte  0 / vs \ but not for
 165            subsequent slashes in prepath which currently must
 166            be entered the right way - not sure if there is an alternative
 167            since the '\' is a valid posix character so we can not switch
 168            those safely to '/' if any are found in the middle of the prepath */
 169         /* BB test paths to Windows with '/' in the midst of prepath */
 170 
 171         if (pplen) {
 172                 int i;
 173 
 174                 cifs_dbg(FYI, "using cifs_sb prepath <%s>\n", cifs_sb->prepath);
 175                 memcpy(full_path+dfsplen+1, cifs_sb->prepath, pplen-1);
 176                 full_path[dfsplen] = dirsep;
 177                 for (i = 0; i < pplen-1; i++)
 178                         if (full_path[dfsplen+1+i] == '/')
 179                                 full_path[dfsplen+1+i] = CIFS_DIR_SEP(cifs_sb);
 180         }
 181 
 182         if (dfsplen) {
 183                 strncpy(full_path, tcon->treeName, dfsplen);
 184                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) {
 185                         int i;
 186                         for (i = 0; i < dfsplen; i++) {
 187                                 if (full_path[i] == '\\')
 188                                         full_path[i] = '/';
 189                         }
 190                 }
 191         }
 192         return full_path;
 193 }
 194 
 195 /*
 196  * Don't allow path components longer than the server max.
 197  * Don't allow the separator character in a path component.
 198  * The VFS will not allow "/", but "\" is allowed by posix.
 199  */
 200 static int
 201 check_name(struct dentry *direntry, struct cifs_tcon *tcon)
 202 {
 203         struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
 204         int i;
 205 
 206         if (unlikely(tcon->fsAttrInfo.MaxPathNameComponentLength &&
 207                      direntry->d_name.len >
 208                      le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength)))
 209                 return -ENAMETOOLONG;
 210 
 211         if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)) {
 212                 for (i = 0; i < direntry->d_name.len; i++) {
 213                         if (direntry->d_name.name[i] == '\\') {
 214                                 cifs_dbg(FYI, "Invalid file name\n");
 215                                 return -EINVAL;
 216                         }
 217                 }
 218         }
 219         return 0;
 220 }
 221 
 222 
 223 /* Inode operations in similar order to how they appear in Linux file fs.h */
 224 
 225 static int
 226 cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
 227                struct tcon_link *tlink, unsigned oflags, umode_t mode,
 228                __u32 *oplock, struct cifs_fid *fid)
 229 {
 230         int rc = -ENOENT;
 231         int create_options = CREATE_NOT_DIR;
 232         int desired_access;
 233         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 234         struct cifs_tcon *tcon = tlink_tcon(tlink);
 235         char *full_path = NULL;
 236         FILE_ALL_INFO *buf = NULL;
 237         struct inode *newinode = NULL;
 238         int disposition;
 239         struct TCP_Server_Info *server = tcon->ses->server;
 240         struct cifs_open_parms oparms;
 241 
 242         *oplock = 0;
 243         if (tcon->ses->server->oplocks)
 244                 *oplock = REQ_OPLOCK;
 245 
 246         full_path = build_path_from_dentry(direntry);
 247         if (full_path == NULL) {
 248                 rc = -ENOMEM;
 249                 goto out;
 250         }
 251 
 252         if (tcon->unix_ext && cap_unix(tcon->ses) && !tcon->broken_posix_open &&
 253             (CIFS_UNIX_POSIX_PATH_OPS_CAP &
 254                         le64_to_cpu(tcon->fsUnixInfo.Capability))) {
 255                 rc = cifs_posix_open(full_path, &newinode, inode->i_sb, mode,
 256                                      oflags, oplock, &fid->netfid, xid);
 257                 switch (rc) {
 258                 case 0:
 259                         if (newinode == NULL) {
 260                                 /* query inode info */
 261                                 goto cifs_create_get_file_info;
 262                         }
 263 
 264                         if (S_ISDIR(newinode->i_mode)) {
 265                                 CIFSSMBClose(xid, tcon, fid->netfid);
 266                                 iput(newinode);
 267                                 rc = -EISDIR;
 268                                 goto out;
 269                         }
 270 
 271                         if (!S_ISREG(newinode->i_mode)) {
 272                                 /*
 273                                  * The server may allow us to open things like
 274                                  * FIFOs, but the client isn't set up to deal
 275                                  * with that. If it's not a regular file, just
 276                                  * close it and proceed as if it were a normal
 277                                  * lookup.
 278                                  */
 279                                 CIFSSMBClose(xid, tcon, fid->netfid);
 280                                 goto cifs_create_get_file_info;
 281                         }
 282                         /* success, no need to query */
 283                         goto cifs_create_set_dentry;
 284 
 285                 case -ENOENT:
 286                         goto cifs_create_get_file_info;
 287 
 288                 case -EIO:
 289                 case -EINVAL:
 290                         /*
 291                          * EIO could indicate that (posix open) operation is not
 292                          * supported, despite what server claimed in capability
 293                          * negotiation.
 294                          *
 295                          * POSIX open in samba versions 3.3.1 and earlier could
 296                          * incorrectly fail with invalid parameter.
 297                          */
 298                         tcon->broken_posix_open = true;
 299                         break;
 300 
 301                 case -EREMOTE:
 302                 case -EOPNOTSUPP:
 303                         /*
 304                          * EREMOTE indicates DFS junction, which is not handled
 305                          * in posix open.  If either that or op not supported
 306                          * returned, follow the normal lookup.
 307                          */
 308                         break;
 309 
 310                 default:
 311                         goto out;
 312                 }
 313                 /*
 314                  * fallthrough to retry, using older open call, this is case
 315                  * where server does not support this SMB level, and falsely
 316                  * claims capability (also get here for DFS case which should be
 317                  * rare for path not covered on files)
 318                  */
 319         }
 320 
 321         desired_access = 0;
 322         if (OPEN_FMODE(oflags) & FMODE_READ)
 323                 desired_access |= GENERIC_READ; /* is this too little? */
 324         if (OPEN_FMODE(oflags) & FMODE_WRITE)
 325                 desired_access |= GENERIC_WRITE;
 326 
 327         disposition = FILE_OVERWRITE_IF;
 328         if ((oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
 329                 disposition = FILE_CREATE;
 330         else if ((oflags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC))
 331                 disposition = FILE_OVERWRITE_IF;
 332         else if ((oflags & O_CREAT) == O_CREAT)
 333                 disposition = FILE_OPEN_IF;
 334         else
 335                 cifs_dbg(FYI, "Create flag not set in create function\n");
 336 
 337         /*
 338          * BB add processing to set equivalent of mode - e.g. via CreateX with
 339          * ACLs
 340          */
 341 
 342         if (!server->ops->open) {
 343                 rc = -ENOSYS;
 344                 goto out;
 345         }
 346 
 347         buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
 348         if (buf == NULL) {
 349                 rc = -ENOMEM;
 350                 goto out;
 351         }
 352 
 353         /*
 354          * if we're not using unix extensions, see if we need to set
 355          * ATTR_READONLY on the create call
 356          */
 357         if (!tcon->unix_ext && (mode & S_IWUGO) == 0)
 358                 create_options |= CREATE_OPTION_READONLY;
 359 
 360         if (backup_cred(cifs_sb))
 361                 create_options |= CREATE_OPEN_BACKUP_INTENT;
 362 
 363         oparms.tcon = tcon;
 364         oparms.cifs_sb = cifs_sb;
 365         oparms.desired_access = desired_access;
 366         oparms.create_options = create_options;
 367         oparms.disposition = disposition;
 368         oparms.path = full_path;
 369         oparms.fid = fid;
 370         oparms.reconnect = false;
 371         oparms.mode = mode;
 372         rc = server->ops->open(xid, &oparms, oplock, buf);
 373         if (rc) {
 374                 cifs_dbg(FYI, "cifs_create returned 0x%x\n", rc);
 375                 goto out;
 376         }
 377 
 378         /*
 379          * If Open reported that we actually created a file then we now have to
 380          * set the mode if possible.
 381          */
 382         if ((tcon->unix_ext) && (*oplock & CIFS_CREATE_ACTION)) {
 383                 struct cifs_unix_set_info_args args = {
 384                                 .mode   = mode,
 385                                 .ctime  = NO_CHANGE_64,
 386                                 .atime  = NO_CHANGE_64,
 387                                 .mtime  = NO_CHANGE_64,
 388                                 .device = 0,
 389                 };
 390 
 391                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
 392                         args.uid = current_fsuid();
 393                         if (inode->i_mode & S_ISGID)
 394                                 args.gid = inode->i_gid;
 395                         else
 396                                 args.gid = current_fsgid();
 397                 } else {
 398                         args.uid = INVALID_UID; /* no change */
 399                         args.gid = INVALID_GID; /* no change */
 400                 }
 401                 CIFSSMBUnixSetFileInfo(xid, tcon, &args, fid->netfid,
 402                                        current->tgid);
 403         } else {
 404                 /*
 405                  * BB implement mode setting via Windows security
 406                  * descriptors e.g.
 407                  */
 408                 /* CIFSSMBWinSetPerms(xid,tcon,path,mode,-1,-1,nls);*/
 409 
 410                 /* Could set r/o dos attribute if mode & 0222 == 0 */
 411         }
 412 
 413 cifs_create_get_file_info:
 414         /* server might mask mode so we have to query for it */
 415         if (tcon->unix_ext)
 416                 rc = cifs_get_inode_info_unix(&newinode, full_path, inode->i_sb,
 417                                               xid);
 418         else {
 419                 rc = cifs_get_inode_info(&newinode, full_path, buf, inode->i_sb,
 420                                          xid, fid);
 421                 if (newinode) {
 422                         if (server->ops->set_lease_key)
 423                                 server->ops->set_lease_key(newinode, fid);
 424                         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
 425                                 newinode->i_mode = mode;
 426                         if ((*oplock & CIFS_CREATE_ACTION) &&
 427                             (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)) {
 428                                 newinode->i_uid = current_fsuid();
 429                                 if (inode->i_mode & S_ISGID)
 430                                         newinode->i_gid = inode->i_gid;
 431                                 else
 432                                         newinode->i_gid = current_fsgid();
 433                         }
 434                 }
 435         }
 436 
 437 cifs_create_set_dentry:
 438         if (rc != 0) {
 439                 cifs_dbg(FYI, "Create worked, get_inode_info failed rc = %d\n",
 440                          rc);
 441                 goto out_err;
 442         }
 443 
 444         if (S_ISDIR(newinode->i_mode)) {
 445                 rc = -EISDIR;
 446                 goto out_err;
 447         }
 448 
 449         d_drop(direntry);
 450         d_add(direntry, newinode);
 451 
 452 out:
 453         kfree(buf);
 454         kfree(full_path);
 455         return rc;
 456 
 457 out_err:
 458         if (server->ops->close)
 459                 server->ops->close(xid, tcon, fid);
 460         if (newinode)
 461                 iput(newinode);
 462         goto out;
 463 }
 464 
 465 int
 466 cifs_atomic_open(struct inode *inode, struct dentry *direntry,
 467                  struct file *file, unsigned oflags, umode_t mode)
 468 {
 469         int rc;
 470         unsigned int xid;
 471         struct tcon_link *tlink;
 472         struct cifs_tcon *tcon;
 473         struct TCP_Server_Info *server;
 474         struct cifs_fid fid;
 475         struct cifs_pending_open open;
 476         __u32 oplock;
 477         struct cifsFileInfo *file_info;
 478 
 479         /*
 480          * Posix open is only called (at lookup time) for file create now. For
 481          * opens (rather than creates), because we do not know if it is a file
 482          * or directory yet, and current Samba no longer allows us to do posix
 483          * open on dirs, we could end up wasting an open call on what turns out
 484          * to be a dir. For file opens, we wait to call posix open till
 485          * cifs_open.  It could be added to atomic_open in the future but the
 486          * performance tradeoff of the extra network request when EISDIR or
 487          * EACCES is returned would have to be weighed against the 50% reduction
 488          * in network traffic in the other paths.
 489          */
 490         if (!(oflags & O_CREAT)) {
 491                 struct dentry *res;
 492 
 493                 /*
 494                  * Check for hashed negative dentry. We have already revalidated
 495                  * the dentry and it is fine. No need to perform another lookup.
 496                  */
 497                 if (!d_in_lookup(direntry))
 498                         return -ENOENT;
 499 
 500                 res = cifs_lookup(inode, direntry, 0);
 501                 if (IS_ERR(res))
 502                         return PTR_ERR(res);
 503 
 504                 return finish_no_open(file, res);
 505         }
 506 
 507         xid = get_xid();
 508 
 509         cifs_dbg(FYI, "parent inode = 0x%p name is: %pd and dentry = 0x%p\n",
 510                  inode, direntry, direntry);
 511 
 512         tlink = cifs_sb_tlink(CIFS_SB(inode->i_sb));
 513         if (IS_ERR(tlink)) {
 514                 rc = PTR_ERR(tlink);
 515                 goto out_free_xid;
 516         }
 517 
 518         tcon = tlink_tcon(tlink);
 519 
 520         rc = check_name(direntry, tcon);
 521         if (rc)
 522                 goto out;
 523 
 524         server = tcon->ses->server;
 525 
 526         if (server->ops->new_lease_key)
 527                 server->ops->new_lease_key(&fid);
 528 
 529         cifs_add_pending_open(&fid, tlink, &open);
 530 
 531         rc = cifs_do_create(inode, direntry, xid, tlink, oflags, mode,
 532                             &oplock, &fid);
 533 
 534         if (rc) {
 535                 cifs_del_pending_open(&open);
 536                 goto out;
 537         }
 538 
 539         if ((oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
 540                 file->f_mode |= FMODE_CREATED;
 541 
 542         rc = finish_open(file, direntry, generic_file_open);
 543         if (rc) {
 544                 if (server->ops->close)
 545                         server->ops->close(xid, tcon, &fid);
 546                 cifs_del_pending_open(&open);
 547                 goto out;
 548         }
 549 
 550         if (file->f_flags & O_DIRECT &&
 551             CIFS_SB(inode->i_sb)->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
 552                 if (CIFS_SB(inode->i_sb)->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
 553                         file->f_op = &cifs_file_direct_nobrl_ops;
 554                 else
 555                         file->f_op = &cifs_file_direct_ops;
 556                 }
 557 
 558         file_info = cifs_new_fileinfo(&fid, file, tlink, oplock);
 559         if (file_info == NULL) {
 560                 if (server->ops->close)
 561                         server->ops->close(xid, tcon, &fid);
 562                 cifs_del_pending_open(&open);
 563                 rc = -ENOMEM;
 564         }
 565 
 566 out:
 567         cifs_put_tlink(tlink);
 568 out_free_xid:
 569         free_xid(xid);
 570         return rc;
 571 }
 572 
 573 int cifs_create(struct inode *inode, struct dentry *direntry, umode_t mode,
 574                 bool excl)
 575 {
 576         int rc;
 577         unsigned int xid = get_xid();
 578         /*
 579          * BB below access is probably too much for mknod to request
 580          *    but we have to do query and setpathinfo so requesting
 581          *    less could fail (unless we want to request getatr and setatr
 582          *    permissions (only).  At least for POSIX we do not have to
 583          *    request so much.
 584          */
 585         unsigned oflags = O_EXCL | O_CREAT | O_RDWR;
 586         struct tcon_link *tlink;
 587         struct cifs_tcon *tcon;
 588         struct TCP_Server_Info *server;
 589         struct cifs_fid fid;
 590         __u32 oplock;
 591 
 592         cifs_dbg(FYI, "cifs_create parent inode = 0x%p name is: %pd and dentry = 0x%p\n",
 593                  inode, direntry, direntry);
 594 
 595         tlink = cifs_sb_tlink(CIFS_SB(inode->i_sb));
 596         rc = PTR_ERR(tlink);
 597         if (IS_ERR(tlink))
 598                 goto out_free_xid;
 599 
 600         tcon = tlink_tcon(tlink);
 601         server = tcon->ses->server;
 602 
 603         if (server->ops->new_lease_key)
 604                 server->ops->new_lease_key(&fid);
 605 
 606         rc = cifs_do_create(inode, direntry, xid, tlink, oflags, mode,
 607                             &oplock, &fid);
 608         if (!rc && server->ops->close)
 609                 server->ops->close(xid, tcon, &fid);
 610 
 611         cifs_put_tlink(tlink);
 612 out_free_xid:
 613         free_xid(xid);
 614         return rc;
 615 }
 616 
 617 int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
 618                 dev_t device_number)
 619 {
 620         int rc = -EPERM;
 621         unsigned int xid;
 622         struct cifs_sb_info *cifs_sb;
 623         struct tcon_link *tlink;
 624         struct cifs_tcon *tcon;
 625         char *full_path = NULL;
 626 
 627         if (!old_valid_dev(device_number))
 628                 return -EINVAL;
 629 
 630         cifs_sb = CIFS_SB(inode->i_sb);
 631         tlink = cifs_sb_tlink(cifs_sb);
 632         if (IS_ERR(tlink))
 633                 return PTR_ERR(tlink);
 634 
 635         tcon = tlink_tcon(tlink);
 636 
 637         xid = get_xid();
 638 
 639         full_path = build_path_from_dentry(direntry);
 640         if (full_path == NULL) {
 641                 rc = -ENOMEM;
 642                 goto mknod_out;
 643         }
 644 
 645         rc = tcon->ses->server->ops->make_node(xid, inode, direntry, tcon,
 646                                                full_path, mode,
 647                                                device_number);
 648 
 649 mknod_out:
 650         kfree(full_path);
 651         free_xid(xid);
 652         cifs_put_tlink(tlink);
 653         return rc;
 654 }
 655 
 656 struct dentry *
 657 cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
 658             unsigned int flags)
 659 {
 660         unsigned int xid;
 661         int rc = 0; /* to get around spurious gcc warning, set to zero here */
 662         struct cifs_sb_info *cifs_sb;
 663         struct tcon_link *tlink;
 664         struct cifs_tcon *pTcon;
 665         struct inode *newInode = NULL;
 666         char *full_path = NULL;
 667 
 668         xid = get_xid();
 669 
 670         cifs_dbg(FYI, "parent inode = 0x%p name is: %pd and dentry = 0x%p\n",
 671                  parent_dir_inode, direntry, direntry);
 672 
 673         /* check whether path exists */
 674 
 675         cifs_sb = CIFS_SB(parent_dir_inode->i_sb);
 676         tlink = cifs_sb_tlink(cifs_sb);
 677         if (IS_ERR(tlink)) {
 678                 free_xid(xid);
 679                 return ERR_CAST(tlink);
 680         }
 681         pTcon = tlink_tcon(tlink);
 682 
 683         rc = check_name(direntry, pTcon);
 684         if (unlikely(rc)) {
 685                 cifs_put_tlink(tlink);
 686                 free_xid(xid);
 687                 return ERR_PTR(rc);
 688         }
 689 
 690         /* can not grab the rename sem here since it would
 691         deadlock in the cases (beginning of sys_rename itself)
 692         in which we already have the sb rename sem */
 693         full_path = build_path_from_dentry(direntry);
 694         if (full_path == NULL) {
 695                 cifs_put_tlink(tlink);
 696                 free_xid(xid);
 697                 return ERR_PTR(-ENOMEM);
 698         }
 699 
 700         if (d_really_is_positive(direntry)) {
 701                 cifs_dbg(FYI, "non-NULL inode in lookup\n");
 702         } else {
 703                 cifs_dbg(FYI, "NULL inode in lookup\n");
 704         }
 705         cifs_dbg(FYI, "Full path: %s inode = 0x%p\n",
 706                  full_path, d_inode(direntry));
 707 
 708         if (pTcon->unix_ext) {
 709                 rc = cifs_get_inode_info_unix(&newInode, full_path,
 710                                               parent_dir_inode->i_sb, xid);
 711         } else {
 712                 rc = cifs_get_inode_info(&newInode, full_path, NULL,
 713                                 parent_dir_inode->i_sb, xid, NULL);
 714         }
 715 
 716         if (rc == 0) {
 717                 /* since paths are not looked up by component - the parent
 718                    directories are presumed to be good here */
 719                 renew_parental_timestamps(direntry);
 720         } else if (rc == -ENOENT) {
 721                 cifs_set_time(direntry, jiffies);
 722                 newInode = NULL;
 723         } else {
 724                 if (rc != -EACCES) {
 725                         cifs_dbg(FYI, "Unexpected lookup error %d\n", rc);
 726                         /* We special case check for Access Denied - since that
 727                         is a common return code */
 728                 }
 729                 newInode = ERR_PTR(rc);
 730         }
 731         kfree(full_path);
 732         cifs_put_tlink(tlink);
 733         free_xid(xid);
 734         return d_splice_alias(newInode, direntry);
 735 }
 736 
 737 static int
 738 cifs_d_revalidate(struct dentry *direntry, unsigned int flags)
 739 {
 740         struct inode *inode;
 741 
 742         if (flags & LOOKUP_RCU)
 743                 return -ECHILD;
 744 
 745         if (d_really_is_positive(direntry)) {
 746                 inode = d_inode(direntry);
 747                 if ((flags & LOOKUP_REVAL) && !CIFS_CACHE_READ(CIFS_I(inode)))
 748                         CIFS_I(inode)->time = 0; /* force reval */
 749 
 750                 if (cifs_revalidate_dentry(direntry))
 751                         return 0;
 752                 else {
 753                         /*
 754                          * If the inode wasn't known to be a dfs entry when
 755                          * the dentry was instantiated, such as when created
 756                          * via ->readdir(), it needs to be set now since the
 757                          * attributes will have been updated by
 758                          * cifs_revalidate_dentry().
 759                          */
 760                         if (IS_AUTOMOUNT(inode) &&
 761                            !(direntry->d_flags & DCACHE_NEED_AUTOMOUNT)) {
 762                                 spin_lock(&direntry->d_lock);
 763                                 direntry->d_flags |= DCACHE_NEED_AUTOMOUNT;
 764                                 spin_unlock(&direntry->d_lock);
 765                         }
 766 
 767                         return 1;
 768                 }
 769         }
 770 
 771         /*
 772          * This may be nfsd (or something), anyway, we can't see the
 773          * intent of this. So, since this can be for creation, drop it.
 774          */
 775         if (!flags)
 776                 return 0;
 777 
 778         /*
 779          * Drop the negative dentry, in order to make sure to use the
 780          * case sensitive name which is specified by user if this is
 781          * for creation.
 782          */
 783         if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))
 784                 return 0;
 785 
 786         if (time_after(jiffies, cifs_get_time(direntry) + HZ) || !lookupCacheEnabled)
 787                 return 0;
 788 
 789         return 1;
 790 }
 791 
 792 /* static int cifs_d_delete(struct dentry *direntry)
 793 {
 794         int rc = 0;
 795 
 796         cifs_dbg(FYI, "In cifs d_delete, name = %pd\n", direntry);
 797 
 798         return rc;
 799 }     */
 800 
 801 const struct dentry_operations cifs_dentry_ops = {
 802         .d_revalidate = cifs_d_revalidate,
 803         .d_automount = cifs_dfs_d_automount,
 804 /* d_delete:       cifs_d_delete,      */ /* not needed except for debugging */
 805 };
 806 
 807 static int cifs_ci_hash(const struct dentry *dentry, struct qstr *q)
 808 {
 809         struct nls_table *codepage = CIFS_SB(dentry->d_sb)->local_nls;
 810         unsigned long hash;
 811         wchar_t c;
 812         int i, charlen;
 813 
 814         hash = init_name_hash(dentry);
 815         for (i = 0; i < q->len; i += charlen) {
 816                 charlen = codepage->char2uni(&q->name[i], q->len - i, &c);
 817                 /* error out if we can't convert the character */
 818                 if (unlikely(charlen < 0))
 819                         return charlen;
 820                 hash = partial_name_hash(cifs_toupper(c), hash);
 821         }
 822         q->hash = end_name_hash(hash);
 823 
 824         return 0;
 825 }
 826 
 827 static int cifs_ci_compare(const struct dentry *dentry,
 828                 unsigned int len, const char *str, const struct qstr *name)
 829 {
 830         struct nls_table *codepage = CIFS_SB(dentry->d_sb)->local_nls;
 831         wchar_t c1, c2;
 832         int i, l1, l2;
 833 
 834         /*
 835          * We make the assumption here that uppercase characters in the local
 836          * codepage are always the same length as their lowercase counterparts.
 837          *
 838          * If that's ever not the case, then this will fail to match it.
 839          */
 840         if (name->len != len)
 841                 return 1;
 842 
 843         for (i = 0; i < len; i += l1) {
 844                 /* Convert characters in both strings to UTF-16. */
 845                 l1 = codepage->char2uni(&str[i], len - i, &c1);
 846                 l2 = codepage->char2uni(&name->name[i], name->len - i, &c2);
 847 
 848                 /*
 849                  * If we can't convert either character, just declare it to
 850                  * be 1 byte long and compare the original byte.
 851                  */
 852                 if (unlikely(l1 < 0 && l2 < 0)) {
 853                         if (str[i] != name->name[i])
 854                                 return 1;
 855                         l1 = 1;
 856                         continue;
 857                 }
 858 
 859                 /*
 860                  * Here, we again ass|u|me that upper/lowercase versions of
 861                  * a character are the same length in the local NLS.
 862                  */
 863                 if (l1 != l2)
 864                         return 1;
 865 
 866                 /* Now compare uppercase versions of these characters */
 867                 if (cifs_toupper(c1) != cifs_toupper(c2))
 868                         return 1;
 869         }
 870 
 871         return 0;
 872 }
 873 
 874 const struct dentry_operations cifs_ci_dentry_ops = {
 875         .d_revalidate = cifs_d_revalidate,
 876         .d_hash = cifs_ci_hash,
 877         .d_compare = cifs_ci_compare,
 878         .d_automount = cifs_dfs_d_automount,
 879 };

/* [<][>][^][v][top][bottom][index][help] */