]> err.no Git - linux-2.6/blobdiff - fs/cifs/inode.c
[PATCH] Clean up struct flock definitions
[linux-2.6] / fs / cifs / inode.c
index d73b0aa86775e6ca4c73f33ce8c1bd47433e2e03..8d336a90025584a6fb524001ef71c123b6d881ec 100644 (file)
@@ -44,7 +44,8 @@ int cifs_get_inode_info_unix(struct inode **pinode,
        cFYI(1, (" Getting info on %s ", search_path));
        /* could have done a find first instead but this returns more info */
        rc = CIFSSMBUnixQPathInfo(xid, pTcon, search_path, &findData,
-                                 cifs_sb->local_nls);
+                                 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
+                                       CIFS_MOUNT_MAP_SPECIAL_CHR);
 /*     dump_mem("\nUnixQPathInfo return data", &findData,
                 sizeof(findData)); */
        if (rc) {
@@ -63,7 +64,9 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                        strncat(tmp_path, search_path, MAX_PATHCONF);
                        rc = connect_to_dfs_path(xid, pTcon->ses,
                                                 /* treename + */ tmp_path,
-                                                cifs_sb->local_nls);
+                                                cifs_sb->local_nls, 
+                                                cifs_sb->mnt_cifs_flags & 
+                                                   CIFS_MOUNT_MAP_SPECIAL_CHR);
                        kfree(tmp_path);
 
                        /* BB fix up inode etc. */
@@ -79,12 +82,12 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                /* get new inode */
                if (*pinode == NULL) {
                        *pinode = new_inode(sb);
-                       if(*pinode == NULL) 
+                       if (*pinode == NULL) 
                                return -ENOMEM;
                        /* Is an i_ino of zero legal? */
                        /* Are there sanity checks we can use to ensure that
                           the server is really filling in that field? */
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
                                (*pinode)->i_ino =
                                        (unsigned long)findData.UniqueId;
                        } /* note ino incremented to unique num in new_inode */
@@ -131,7 +134,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                inode->i_gid = le64_to_cpu(findData.Gid);
                inode->i_nlink = le64_to_cpu(findData.Nlinks);
 
-               if(is_size_safe_to_change(cifsInfo)) {
+               if (is_size_safe_to_change(cifsInfo)) {
                /* can not safely change the file size here if the
                   client is writing to it due to potential races */
 
@@ -159,7 +162,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                if (S_ISREG(inode->i_mode)) {
                        cFYI(1, (" File inode "));
                        inode->i_op = &cifs_file_inode_ops;
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
                                inode->i_fop = &cifs_file_direct_ops;
                        else
                                inode->i_fop = &cifs_file_ops;
@@ -195,22 +198,23 @@ int cifs_get_inode_info(struct inode **pinode,
        pTcon = cifs_sb->tcon;
        cFYI(1,("Getting info on %s ", search_path));
 
-       if((pfindData == NULL) && (*pinode != NULL)) {
-               if(CIFS_I(*pinode)->clientCanCacheRead) {
+       if ((pfindData == NULL) && (*pinode != NULL)) {
+               if (CIFS_I(*pinode)->clientCanCacheRead) {
                        cFYI(1,("No need to revalidate cached inode sizes"));
                        return rc;
                }
        }
 
        /* if file info not passed in then get it from server */
-       if(pfindData == NULL) {
+       if (pfindData == NULL) {
                buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
-               if(buf == NULL)
+               if (buf == NULL)
                        return -ENOMEM;
                pfindData = (FILE_ALL_INFO *)buf;
                /* could do find first instead but this returns more info */
                rc = CIFSSMBQPathInfo(xid, pTcon, search_path, pfindData,
-                             cifs_sb->local_nls);
+                             cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & 
+                               CIFS_MOUNT_MAP_SPECIAL_CHR);
        }
        /* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */
        if (rc) {
@@ -230,7 +234,9 @@ int cifs_get_inode_info(struct inode **pinode,
                        strncat(tmp_path, search_path, MAX_PATHCONF);
                        rc = connect_to_dfs_path(xid, pTcon->ses,
                                                 /* treename + */ tmp_path,
-                                                cifs_sb->local_nls);
+                                                cifs_sb->local_nls, 
+                                                cifs_sb->mnt_cifs_flags & 
+                                                  CIFS_MOUNT_MAP_SPECIAL_CHR);
                        kfree(tmp_path);
                        /* BB fix up inode etc. */
                } else if (rc) {
@@ -262,14 +268,16 @@ int cifs_get_inode_info(struct inode **pinode,
                           IndexNumber field is not guaranteed unique? */
 
 #ifdef CONFIG_CIFS_EXPERIMENTAL                
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM){
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM){
                                int rc1 = 0;
                                __u64 inode_num;
 
                                rc1 = CIFSGetSrvInodeNumber(xid, pTcon, 
                                        search_path, &inode_num, 
-                                       cifs_sb->local_nls);
-                               if(rc1) {
+                                       cifs_sb->local_nls,
+                                       cifs_sb->mnt_cifs_flags &
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
+                               if (rc1) {
                                        cFYI(1,("GetSrvInodeNum rc %d", rc1));
                                        /* BB EOPNOSUPP disable SERVER_INUM? */
                                } else /* do we need cast or hash to ino? */
@@ -347,7 +355,7 @@ int cifs_get_inode_info(struct inode **pinode,
                if (S_ISREG(inode->i_mode)) {
                        cFYI(1, (" File inode "));
                        inode->i_op = &cifs_file_inode_ops;
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
                                inode->i_fop = &cifs_file_direct_ops;
                        else
                                inode->i_fop = &cifs_file_ops;
@@ -410,10 +418,12 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                FreeXid(xid);
                return -ENOMEM;
        }
-       rc = CIFSSMBDelFile(xid, pTcon, full_path, cifs_sb->local_nls);
+       rc = CIFSSMBDelFile(xid, pTcon, full_path, cifs_sb->local_nls,
+                       cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
 
        if (!rc) {
-               direntry->d_inode->i_nlink--;
+               if (direntry->d_inode)
+                       direntry->d_inode->i_nlink--;
        } else if (rc == -ENOENT) {
                d_drop(direntry);
        } else if (rc == -ETXTBSY) {
@@ -422,12 +432,17 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
 
                rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, DELETE,
                                 CREATE_NOT_DIR | CREATE_DELETE_ON_CLOSE,
-                                &netfid, &oplock, NULL, cifs_sb->local_nls);
+                                &netfid, &oplock, NULL, cifs_sb->local_nls,
+                                cifs_sb->mnt_cifs_flags & 
+                                       CIFS_MOUNT_MAP_SPECIAL_CHR);
                if (rc==0) {
                        CIFSSMBRenameOpenFile(xid, pTcon, netfid, NULL,
-                                             cifs_sb->local_nls);
+                                             cifs_sb->local_nls, 
+                                             cifs_sb->mnt_cifs_flags & 
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
                        CIFSSMBClose(xid, pTcon, netfid);
-                       direntry->d_inode->i_nlink--;
+                       if (direntry->d_inode)
+                               direntry->d_inode->i_nlink--;
                }
        } else if (rc == -EACCES) {
                /* try only if r/o attribute set in local lookup data? */
@@ -439,7 +454,9 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                        if (!(pTcon->ses->flags & CIFS_SES_NT4))
                                rc = CIFSSMBSetTimes(xid, pTcon, full_path,
                                                     pinfo_buf,
-                                                    cifs_sb->local_nls);
+                                                    cifs_sb->local_nls,
+                                                    cifs_sb->mnt_cifs_flags & 
+                                                       CIFS_MOUNT_MAP_SPECIAL_CHR);
                        else
                                rc = -EOPNOTSUPP;
 
@@ -461,7 +478,9 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                                                 FILE_OPEN, SYNCHRONIZE |
                                                 FILE_WRITE_ATTRIBUTES, 0,
                                                 &netfid, &oplock, NULL,
-                                                cifs_sb->local_nls);
+                                                cifs_sb->local_nls,
+                                                cifs_sb->mnt_cifs_flags & 
+                                                   CIFS_MOUNT_MAP_SPECIAL_CHR);
                                if (rc==0) {
                                        rc = CIFSSMBSetFileTimes(xid, pTcon,
                                                                 pinfo_buf,
@@ -472,10 +491,13 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                        kfree(pinfo_buf);
                }
                if (rc==0) {
-                       rc = CIFSSMBDelFile(xid, pTcon, full_path,
-                                           cifs_sb->local_nls);
+                       rc = CIFSSMBDelFile(xid, pTcon, full_path, 
+                                           cifs_sb->local_nls, 
+                                           cifs_sb->mnt_cifs_flags & 
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
                        if (!rc) {
-                               direntry->d_inode->i_nlink--;
+                               if (direntry->d_inode)
+                                       direntry->d_inode->i_nlink--;
                        } else if (rc == -ETXTBSY) {
                                int oplock = FALSE;
                                __u16 netfid;
@@ -485,23 +507,30 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
                                                 CREATE_NOT_DIR |
                                                 CREATE_DELETE_ON_CLOSE,
                                                 &netfid, &oplock, NULL,
-                                                cifs_sb->local_nls);
+                                                cifs_sb->local_nls, 
+                                                cifs_sb->mnt_cifs_flags & 
+                                                   CIFS_MOUNT_MAP_SPECIAL_CHR);
                                if (rc==0) {
                                        CIFSSMBRenameOpenFile(xid, pTcon,
                                                netfid, NULL,
-                                               cifs_sb->local_nls);
+                                               cifs_sb->local_nls,
+                                               cifs_sb->mnt_cifs_flags &
+                                                   CIFS_MOUNT_MAP_SPECIAL_CHR);
                                        CIFSSMBClose(xid, pTcon, netfid);
-                                       direntry->d_inode->i_nlink--;
+                                       if (direntry->d_inode)
+                                               direntry->d_inode->i_nlink--;
                                }
                        /* BB if rc = -ETXTBUSY goto the rename logic BB */
                        }
                }
        }
-       cifsInode = CIFS_I(direntry->d_inode);
-       cifsInode->time = 0;    /* will force revalidate to get info when
-                                  needed */
-       direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime =
-               current_fs_time(inode->i_sb);
+       if (direntry->d_inode) {
+               cifsInode = CIFS_I(direntry->d_inode);
+               cifsInode->time = 0;    /* will force revalidate to get info
+                                          when needed */
+               direntry->d_inode->i_ctime = current_fs_time(inode->i_sb);
+       }
+       inode->i_ctime = inode->i_mtime = current_fs_time(inode->i_sb);
        cifsInode = CIFS_I(inode);
        cifsInode->time = 0;    /* force revalidate of dir as well */
 
@@ -534,7 +563,8 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
                return -ENOMEM;
        }
        /* BB add setting the equivalent of mode via CreateX w/ACLs */
-       rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls);
+       rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls,
+                         cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
        if (rc) {
                cFYI(1, ("cifs_mkdir returned 0x%x ", rc));
                d_drop(direntry);
@@ -552,18 +582,22 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
                if (direntry->d_inode)
                        direntry->d_inode->i_nlink = 2;
                if (cifs_sb->tcon->ses->capabilities & CAP_UNIX)
-                       if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
+                       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
                                CIFSSMBUnixSetPerms(xid, pTcon, full_path,
                                                    mode,
                                                    (__u64)current->euid,
                                                    (__u64)current->egid,
                                                    0 /* dev_t */,
-                                                   cifs_sb->local_nls);
+                                                   cifs_sb->local_nls,
+                                                   cifs_sb->mnt_cifs_flags &
+                                                   CIFS_MOUNT_MAP_SPECIAL_CHR);
                        } else {
                                CIFSSMBUnixSetPerms(xid, pTcon, full_path,
                                                    mode, (__u64)-1,
                                                    (__u64)-1, 0 /* dev_t */,
-                                                   cifs_sb->local_nls);
+                                                   cifs_sb->local_nls,
+                                                   cifs_sb->mnt_cifs_flags & 
+                                                   CIFS_MOUNT_MAP_SPECIAL_CHR);
                        }
                else {
                        /* BB to be implemented via Windows secrty descriptors
@@ -600,7 +634,8 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
                return -ENOMEM;
        }
 
-       rc = CIFSSMBRmDir(xid, pTcon, full_path, cifs_sb->local_nls);
+       rc = CIFSSMBRmDir(xid, pTcon, full_path, cifs_sb->local_nls,
+                         cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
 
        if (!rc) {
                inode->i_nlink--;
@@ -653,7 +688,9 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry,
        }
 
        rc = CIFSSMBRename(xid, pTcon, fromName, toName,
-                          cifs_sb_source->local_nls);
+                          cifs_sb_source->local_nls,
+                          cifs_sb_source->mnt_cifs_flags &
+                               CIFS_MOUNT_MAP_SPECIAL_CHR);
        if (rc == -EEXIST) {
                /* check if they are the same file because rename of hardlinked
                   files is a noop */
@@ -665,11 +702,16 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry,
                if (info_buf_source != NULL) {
                        info_buf_target = info_buf_source + 1;
                        rc = CIFSSMBUnixQPathInfo(xid, pTcon, fromName,
-                               info_buf_source, cifs_sb_source->local_nls);
+                               info_buf_source, cifs_sb_source->local_nls, 
+                               cifs_sb_source->mnt_cifs_flags &
+                                       CIFS_MOUNT_MAP_SPECIAL_CHR);
                        if (rc == 0) {
                                rc = CIFSSMBUnixQPathInfo(xid, pTcon, toName,
                                                info_buf_target,
-                                               cifs_sb_target->local_nls);
+                                               cifs_sb_target->local_nls,
+                                               /* remap based on source sb */
+                                               cifs_sb_source->mnt_cifs_flags &
+                                                   CIFS_MOUNT_MAP_SPECIAL_CHR);
                        }
                        if ((rc == 0) &&
                            (info_buf_source->UniqueId ==
@@ -685,7 +727,9 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry,
                                cifs_unlink(target_inode, target_direntry);
                                rc = CIFSSMBRename(xid, pTcon, fromName,
                                                   toName,
-                                                  cifs_sb_source->local_nls);
+                                                  cifs_sb_source->local_nls,
+                                                  cifs_sb_source->mnt_cifs_flags
+                                                  & CIFS_MOUNT_MAP_SPECIAL_CHR);
                        }
                        kfree(info_buf_source);
                } /* if we can not get memory just leave rc as EEXIST */
@@ -705,10 +749,14 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry,
                   might not right be right access to request */
                rc = CIFSSMBOpen(xid, pTcon, fromName, FILE_OPEN, GENERIC_READ,
                                 CREATE_NOT_DIR, &netfid, &oplock, NULL,
-                                cifs_sb_source->local_nls);
+                                cifs_sb_source->local_nls, 
+                                cifs_sb_source->mnt_cifs_flags & 
+                                       CIFS_MOUNT_MAP_SPECIAL_CHR);
                if (rc==0) {
                        CIFSSMBRenameOpenFile(xid, pTcon, netfid, toName,
-                                             cifs_sb_source->local_nls);
+                                             cifs_sb_source->local_nls, 
+                                             cifs_sb_source->mnt_cifs_flags &
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
                        CIFSSMBClose(xid, pTcon, netfid);
                }
        }
@@ -962,7 +1010,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
                           it by handle */
                        rc = CIFSSMBSetEOF(xid, pTcon, full_path,
                                           attrs->ia_size, FALSE,
-                                          cifs_sb->local_nls);
+                                          cifs_sb->local_nls, 
+                                          cifs_sb->mnt_cifs_flags &
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
                        cFYI(1, (" SetEOF by path (setattrs) rc = %d", rc));
                }
 
@@ -999,7 +1049,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
        if ((cifs_sb->tcon->ses->capabilities & CAP_UNIX)
            && (attrs->ia_valid & (ATTR_MODE | ATTR_GID | ATTR_UID)))
                rc = CIFSSMBUnixSetPerms(xid, pTcon, full_path, mode, uid, gid,
-                                        0 /* dev_t */, cifs_sb->local_nls);
+                                        0 /* dev_t */, cifs_sb->local_nls,
+                                        cifs_sb->mnt_cifs_flags & 
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
        else if (attrs->ia_valid & ATTR_MODE) {
                if ((mode & S_IWUGO) == 0) /* not writeable */ {
                        if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0)
@@ -1048,7 +1100,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
                   via Handle (SetFileInfo) instead of by path */
                if (!(pTcon->ses->flags & CIFS_SES_NT4))
                        rc = CIFSSMBSetTimes(xid, pTcon, full_path, &time_buf,
-                                            cifs_sb->local_nls);
+                                            cifs_sb->local_nls,
+                                            cifs_sb->mnt_cifs_flags &
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
                else
                        rc = -EOPNOTSUPP;
 
@@ -1063,7 +1117,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
                        rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN,
                                         SYNCHRONIZE | FILE_WRITE_ATTRIBUTES,
                                         CREATE_NOT_DIR, &netfid, &oplock,
-                                        NULL, cifs_sb->local_nls);
+                                        NULL, cifs_sb->local_nls,
+                                        cifs_sb->mnt_cifs_flags &
+                                               CIFS_MOUNT_MAP_SPECIAL_CHR);
                        if (rc==0) {
                                rc = CIFSSMBSetFileTimes(xid, pTcon, &time_buf,
                                                         netfid);