Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=066fcb06d3e27c258bc229bb688ced2b16daa6c2
Commit:     066fcb06d3e27c258bc229bb688ced2b16daa6c2
Parent:     38e2aff670b681b6cc267aca307633cbcb48864b
Author:     Steve French <[EMAIL PROTECTED]>
AuthorDate: Fri Mar 23 00:45:08 2007 +0000
Committer:  Steve French <[EMAIL PROTECTED]>
CommitDate: Fri Mar 23 00:45:08 2007 +0000

    [CIFS] Allow reset of file to ATTR_NORMAL when archive bit not set
    
    When a file had a dos attribute of 0x1 (readonly - but dos attribute
    of archive was not set) - doing chmod 0777 or equivalent would
    try to set a dos attribute of 0 (which some servers ignore)
    rather than ATTR_NORMAL (0x20) which most servers accept.
    Does not affect servers which support the CIFS Unix Extensions.
    
    Acked-by: Prasad Potluri <[EMAIL PROTECTED]>
    Acked-by: Shirish Pargaonkar <[EMAIL PROTECTED]>
    Signed-off-by: Steve French <[EMAIL PROTECTED]>
---
 fs/cifs/CHANGES |    5 ++++-
 fs/cifs/inode.c |   15 ++++++++++++---
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES
index 1cbe561..5d1f487 100644
--- a/fs/cifs/CHANGES
+++ b/fs/cifs/CHANGES
@@ -6,7 +6,10 @@ on smp system corrupts sequence number. Do not reread 
unnecessarily partial page
 (which we are about to overwrite anyway) when writing out file opened rw.
 When DOS attribute of file on non-Unix server's file changes on the server side
 from read-only back to read-write, reflect this change in default file mode
-(we had been leaving a file's mode read-only until the inode were reloaded)
+(we had been leaving a file's mode read-only until the inode were reloaded).
+Allow setting of attribute back to ATTR_NORMAL (removing readonly dos attribute
+when archive dos attribute not set and we are changing mode back to writeable
+on server which does not support the Unix Extensions).
 
 Version 1.47
 ------------
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index e75a844..f414526 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -1196,6 +1196,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr 
*attrs)
        struct cifsFileInfo *open_file = NULL;
        FILE_BASIC_INFO time_buf;
        int set_time = FALSE;
+       int set_dosattr = FALSE;
        __u64 mode = 0xFFFFFFFFFFFFFFFFULL;
        __u64 uid = 0xFFFFFFFFFFFFFFFFULL;
        __u64 gid = 0xFFFFFFFFFFFFFFFFULL;
@@ -1332,15 +1333,23 @@ int cifs_setattr(struct dentry *direntry, struct iattr 
*attrs)
        else if (attrs->ia_valid & ATTR_MODE) {
                rc = 0;
                if ((mode & S_IWUGO) == 0) /* not writeable */ {
-                       if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0)
+                       if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0) {
+                               set_dosattr = TRUE;
                                time_buf.Attributes =
                                        cpu_to_le32(cifsInode->cifsAttrs |
                                                    ATTR_READONLY);
+                       }
                } else if ((mode & S_IWUGO) == S_IWUGO) {
-                       if (cifsInode->cifsAttrs & ATTR_READONLY)
+                       if (cifsInode->cifsAttrs & ATTR_READONLY) {
+                               set_dosattr = TRUE;
                                time_buf.Attributes =
                                        cpu_to_le32(cifsInode->cifsAttrs &
                                                    (~ATTR_READONLY));
+                               /* Windows ignores set to zero */
+                               if(time_buf.Attributes == 0)
+                                       time_buf.Attributes |= 
+                                               cpu_to_le32(ATTR_NORMAL);
+                       }
                }
                /* BB to be implemented -
                   via Windows security descriptors or streams */
@@ -1378,7 +1387,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr 
*attrs)
        } else
                time_buf.ChangeTime = 0;
 
-       if (set_time || time_buf.Attributes) {
+       if (set_time || set_dosattr) {
                time_buf.CreationTime = 0;      /* do not change */
                /* In the future we should experiment - try setting timestamps
                   via Handle (SetFileInfo) instead of by path */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to