[patch][linux-cifs-client] fix a regression in cifs caused during lookup intent code patch

Shirish Pargaonkar shirishpargaonkar at gmail.com
Fri May 1 22:44:39 GMT 2009


Second attempt at the patch to fix regression in cifs

- Remove adding open file entry twice to lists in case of posix opens

- fill file info in cifs_create only if creating file without posix open


diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index 461750e..11431ed 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -281,6 +281,7 @@ cifs_create(struct inode *inode, struct dentry
*direntry, int mode,
        int create_options = CREATE_NOT_DIR;
        int oplock = 0;
        int oflags;
+       bool posix_create = false;
        /*
         * BB below access is probably too much for mknod to request
         *    but we have to do query and setpathinfo so requesting
@@ -328,11 +329,13 @@ cifs_create(struct inode *inode, struct dentry
*direntry, int mode,
                   negotation.  EREMOTE indicates DFS junction, which is not
                   handled in posix open */

-               if ((rc == 0) && (newinode == NULL))
-                       goto cifs_create_get_file_info; /* query inode info */
-               else if (rc == 0) /* success, no need to query */
-                       goto cifs_create_set_dentry;
-               else if ((rc != -EIO) && (rc != -EREMOTE) &&
+               if (rc == 0) {
+                       posix_create = true;
+                       if (newinode == NULL) /* query inode info */
+                               goto cifs_create_get_file_info;
+                       else /* success, no need to query */
+                               goto cifs_create_set_dentry;
+               } else if ((rc != -EIO) && (rc != -EREMOTE) &&
                         (rc != -EOPNOTSUPP)) /* path not found or net err */
                        goto cifs_create_out;
                /* else fallthrough to retry, using older open call, this is
@@ -464,7 +467,7 @@ cifs_create_set_dentry:
        if ((nd == NULL) || (!(nd->flags & LOOKUP_OPEN))) {
                /* mknod case - do not leave file open */
                CIFSSMBClose(xid, tcon, fileHandle);
-       } else if (newinode) {
+       } else if (!(posix_create) && (newinode)) {
                        cifs_fill_fileinfo(newinode, fileHandle,
                                        cifs_sb->tcon, write_only);
        }
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 50ca088..38c06f8 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -129,15 +129,12 @@ static inline int
cifs_posix_open_inode_helper(struct inode *inode,
                        struct file *file, struct cifsInodeInfo *pCifsInode,
                        struct cifsFileInfo *pCifsFile, int oplock, u16 netfid)
 {
-       struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
-/*     struct timespec temp; */   /* BB REMOVEME BB */

        file->private_data = kmalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
        if (file->private_data == NULL)
                return -ENOMEM;
        pCifsFile = cifs_init_private(file->private_data, inode, file, netfid);
        write_lock(&GlobalSMBSeslock);
-       list_add(&pCifsFile->tlist, &cifs_sb->tcon->openFileList);

        pCifsInode = CIFS_I(file->f_path.dentry->d_inode);
        if (pCifsInode == NULL) {
@@ -145,17 +142,6 @@ static inline int
cifs_posix_open_inode_helper(struct inode *inode,
                return -EINVAL;
        }

-       /* want handles we can use to read with first
-          in the list so we do not have to walk the
-          list to search for one in write_begin */
-       if ((file->f_flags & O_ACCMODE) == O_WRONLY) {
-               list_add_tail(&pCifsFile->flist,
-                             &pCifsInode->openFileList);
-       } else {
-               list_add(&pCifsFile->flist,
-                        &pCifsInode->openFileList);
-       }
-
        if (pCifsInode->clientCanCacheRead) {
                /* we have the inode open somewhere else
                   no need to discard cache data */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cthon.regression.patch
Type: application/octet-stream
Size: 2984 bytes
Desc: not available
Url : http://lists.samba.org/archive/linux-cifs-client/attachments/20090501/167230a6/cthon.regression.obj


More information about the linux-cifs-client mailing list