]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs/adfs: inode: fix adfs_mode2atts()
authorRussell King <rmk+kernel@armlinux.org.uk>
Mon, 9 Dec 2019 11:08:23 +0000 (11:08 +0000)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 21 Jan 2020 01:12:40 +0000 (20:12 -0500)
Fix adfs_mode2atts() to actually update the file permissions on the
media rather than using the current inode mode.  Note also that
directories do not have read/write permissions stored on the media.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/adfs/inode.c

index 18a1d478669beafd41921e5f0f25ed3a34213c63..212a56fc7911ad21e08b4fee2225dd266726d11e 100644 (file)
@@ -126,29 +126,29 @@ adfs_atts2mode(struct super_block *sb, struct inode *inode)
  * Convert Linux permission to ADFS attribute.  We try to do the reverse
  * of atts2mode, but there is not a 1:1 translation.
  */
-static int
-adfs_mode2atts(struct super_block *sb, struct inode *inode)
+static int adfs_mode2atts(struct super_block *sb, struct inode *inode,
+                         umode_t ia_mode)
 {
+       struct adfs_sb_info *asb = ADFS_SB(sb);
        umode_t mode;
        int attr;
-       struct adfs_sb_info *asb = ADFS_SB(sb);
 
        /* FIXME: should we be able to alter a link? */
        if (S_ISLNK(inode->i_mode))
                return ADFS_I(inode)->attr;
 
+       /* Directories do not have read/write permissions on the media */
        if (S_ISDIR(inode->i_mode))
-               attr = ADFS_NDA_DIRECTORY;
-       else
-               attr = 0;
+               return ADFS_NDA_DIRECTORY;
 
-       mode = inode->i_mode & asb->s_owner_mask;
+       attr = 0;
+       mode = ia_mode & asb->s_owner_mask;
        if (mode & S_IRUGO)
                attr |= ADFS_NDA_OWNER_READ;
        if (mode & S_IWUGO)
                attr |= ADFS_NDA_OWNER_WRITE;
 
-       mode = inode->i_mode & asb->s_other_mask;
+       mode = ia_mode & asb->s_other_mask;
        mode &= ~asb->s_owner_mask;
        if (mode & S_IRUGO)
                attr |= ADFS_NDA_PUBLIC_READ;
@@ -328,7 +328,7 @@ adfs_notify_change(struct dentry *dentry, struct iattr *attr)
        if (ia_valid & ATTR_CTIME)
                inode->i_ctime = attr->ia_ctime;
        if (ia_valid & ATTR_MODE) {
-               ADFS_I(inode)->attr = adfs_mode2atts(sb, inode);
+               ADFS_I(inode)->attr = adfs_mode2atts(sb, inode, attr->ia_mode);
                inode->i_mode = adfs_atts2mode(sb, inode);
        }