Whamcloud - gitweb
Fix up permissions of existing directories and files if needed.
authoradilger <adilger>
Thu, 19 Feb 2004 23:10:37 +0000 (23:10 +0000)
committeradilger <adilger>
Thu, 19 Feb 2004 23:10:37 +0000 (23:10 +0000)
b=2661

lustre/lvfs/lvfs_linux.c

index 935548e..b59039f 100644 (file)
@@ -193,9 +193,16 @@ struct dentry *simple_mknod(struct dentry *dir, char *name, int mode)
                 GOTO(out_up, dchild);
 
         if (dchild->d_inode) {
-                if (!S_ISREG(dchild->d_inode->i_mode))
+                int old_mode = dchild->d_inode->i_mode;
+                if (!S_ISREG(old_mode))
                         GOTO(out_err, err = -EEXIST);
 
+                /* Fixup file permissions if necessary */
+                if ((old_mode & S_IALLUGO) != (mode & S_IALLUGO)) {
+                        dchild->d_inode->i_mode = (mode & S_IALLUGO) |
+                                                  (old_mode & ~S_IALLUGO);
+                        mark_inode_dirty(dchild->d_inode);
+                }
                 GOTO(out_up, dchild);
         }
 
@@ -228,9 +235,16 @@ struct dentry *simple_mkdir(struct dentry *dir, char *name, int mode)
                 GOTO(out_up, dchild);
 
         if (dchild->d_inode) {
-                if (!S_ISDIR(dchild->d_inode->i_mode))
+                int old_mode = dchild->d_inode->i_mode;
+                if (!S_ISDIR(old_mode))
                         GOTO(out_err, err = -ENOTDIR);
 
+                /* Fixup directory permissions if necessary */
+                if ((old_mode & S_IALLUGO) != (mode & S_IALLUGO)) {
+                        dchild->d_inode->i_mode = (mode & S_IALLUGO) |
+                                                  (old_mode & ~S_IALLUGO);
+                        mark_inode_dirty(dchild->d_inode);
+                }
                 GOTO(out_up, dchild);
         }