|
@@ -7354,11 +7354,15 @@ static int btrfs_set_page_dirty(struct page *page)
|
|
|
static int btrfs_permission(struct inode *inode, int mask)
|
|
|
{
|
|
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
|
+ umode_t mode = inode->i_mode;
|
|
|
|
|
|
- if (btrfs_root_readonly(root) && (mask & MAY_WRITE))
|
|
|
- return -EROFS;
|
|
|
- if ((BTRFS_I(inode)->flags & BTRFS_INODE_READONLY) && (mask & MAY_WRITE))
|
|
|
- return -EACCES;
|
|
|
+ if (mask & MAY_WRITE &&
|
|
|
+ (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))) {
|
|
|
+ if (btrfs_root_readonly(root))
|
|
|
+ return -EROFS;
|
|
|
+ if (BTRFS_I(inode)->flags & BTRFS_INODE_READONLY)
|
|
|
+ return -EACCES;
|
|
|
+ }
|
|
|
return generic_permission(inode, mask);
|
|
|
}
|
|
|
|