Commit 0196be12 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for_v5.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs

Pull UDF, quota, reiserfs, ext2 fixes and cleanups from Jan Kara:
 "A few assorted fixes and cleanups for udf, quota, reiserfs, and ext2"

* tag 'for_v5.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
  fs/reiserfs: remove unused macros
  fs/quota: remove unused macro
  udf: Clarify meaning of f_files in udf_statfs
  udf: Allow writing to 'Rewritable' partitions
  udf: Disallow R/W mode for disk with Metadata partition
  udf: Fix meaning of ENTITYID_FLAGS_* macros to be really bitwise-or flags
  udf: Fix free space reporting for metadata and virtual partitions
  udf: Update header files to UDF 2.60
  udf: Move OSTA Identifier Suffix macros from ecma_167.h to osta_udf.h
  udf: Fix spelling in EXT_NEXT_EXTENT_ALLOCDESCS
  ext2: Adjust indentation in ext2_fill_super
  quota: avoid time_t in v1_disk_dqblk definition
  reiserfs: Fix spurious unlock in reiserfs_fill_super() error handling
  reiserfs: Fix memory leak of journal device string
  ext2: set proper errno in error case of ext2_fill_super()
parents 91f1a956 154a4dcf
...@@ -1073,9 +1073,9 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) ...@@ -1073,9 +1073,9 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
if (EXT2_BLOCKS_PER_GROUP(sb) == 0) if (EXT2_BLOCKS_PER_GROUP(sb) == 0)
goto cantfind_ext2; goto cantfind_ext2;
sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) -
le32_to_cpu(es->s_first_data_block) - 1) le32_to_cpu(es->s_first_data_block) - 1)
/ EXT2_BLOCKS_PER_GROUP(sb)) + 1; / EXT2_BLOCKS_PER_GROUP(sb)) + 1;
db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) /
EXT2_DESC_PER_BLOCK(sb); EXT2_DESC_PER_BLOCK(sb);
sbi->s_group_desc = kmalloc_array (db_count, sbi->s_group_desc = kmalloc_array (db_count,
...@@ -1138,6 +1138,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) ...@@ -1138,6 +1138,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
ext2_count_dirs(sb), GFP_KERNEL); ext2_count_dirs(sb), GFP_KERNEL);
} }
if (err) { if (err) {
ret = err;
ext2_msg(sb, KERN_ERR, "error: insufficient memory"); ext2_msg(sb, KERN_ERR, "error: insufficient memory");
goto failed_mount3; goto failed_mount3;
} }
......
...@@ -22,8 +22,6 @@ MODULE_AUTHOR("Jan Kara"); ...@@ -22,8 +22,6 @@ MODULE_AUTHOR("Jan Kara");
MODULE_DESCRIPTION("Quota format v2 support"); MODULE_DESCRIPTION("Quota format v2 support");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
#define __QUOTA_V2_PARANOIA
static void v2r0_mem2diskdqb(void *dp, struct dquot *dquot); static void v2r0_mem2diskdqb(void *dp, struct dquot *dquot);
static void v2r0_disk2memdqb(struct dquot *dquot, void *dp); static void v2r0_disk2memdqb(struct dquot *dquot, void *dp);
static int v2r0_is_id(void *dp, struct dquot *dquot); static int v2r0_is_id(void *dp, struct dquot *dquot);
......
...@@ -25,8 +25,10 @@ struct v1_disk_dqblk { ...@@ -25,8 +25,10 @@ struct v1_disk_dqblk {
__u32 dqb_ihardlimit; /* absolute limit on allocated inodes */ __u32 dqb_ihardlimit; /* absolute limit on allocated inodes */
__u32 dqb_isoftlimit; /* preferred inode limit */ __u32 dqb_isoftlimit; /* preferred inode limit */
__u32 dqb_curinodes; /* current # allocated inodes */ __u32 dqb_curinodes; /* current # allocated inodes */
time_t dqb_btime; /* time limit for excessive disk use */
time_t dqb_itime; /* time limit for excessive inode use */ /* below fields differ in length on 32-bit vs 64-bit architectures */
unsigned long dqb_btime; /* time limit for excessive disk use */
unsigned long dqb_itime; /* time limit for excessive inode use */
}; };
#define v1_dqoff(UID) ((loff_t)((UID) * sizeof (struct v1_disk_dqblk))) #define v1_dqoff(UID) ((loff_t)((UID) * sizeof (struct v1_disk_dqblk)))
......
...@@ -56,8 +56,6 @@ ...@@ -56,8 +56,6 @@
/* gets a struct reiserfs_journal_list * from a list head */ /* gets a struct reiserfs_journal_list * from a list head */
#define JOURNAL_LIST_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \ #define JOURNAL_LIST_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
j_list)) j_list))
#define JOURNAL_WORK_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
j_working_list))
/* must be correct to keep the desc and commit structs at 4k */ /* must be correct to keep the desc and commit structs at 4k */
#define JOURNAL_TRANS_HALF 1018 #define JOURNAL_TRANS_HALF 1018
......
...@@ -63,7 +63,6 @@ static int show_version(struct seq_file *m, void *unused) ...@@ -63,7 +63,6 @@ static int show_version(struct seq_file *m, void *unused)
#define MAP( i ) D4C( objectid_map( sb, rs )[ i ] ) #define MAP( i ) D4C( objectid_map( sb, rs )[ i ] )
#define DJF( x ) le32_to_cpu( rs -> x ) #define DJF( x ) le32_to_cpu( rs -> x )
#define DJV( x ) le32_to_cpu( s_v1 -> x )
#define DJP( x ) le32_to_cpu( jp -> x ) #define DJP( x ) le32_to_cpu( jp -> x )
#define JF( x ) ( r -> s_journal -> x ) #define JF( x ) ( r -> s_journal -> x )
......
...@@ -918,12 +918,6 @@ int comp_items(const struct item_head *stored_ih, const struct treepath *path) ...@@ -918,12 +918,6 @@ int comp_items(const struct item_head *stored_ih, const struct treepath *path)
return memcmp(stored_ih, ih, IH_SIZE); return memcmp(stored_ih, ih, IH_SIZE);
} }
/* unformatted nodes are not logged anymore, ever. This is safe now */
#define held_by_others(bh) (atomic_read(&(bh)->b_count) > 1)
/* block can not be forgotten as it is in I/O or held by someone */
#define block_in_use(bh) (buffer_locked(bh) || (held_by_others(bh)))
/* prepare for delete or cut of direct item */ /* prepare for delete or cut of direct item */
static inline int prepare_for_direct_item(struct treepath *path, static inline int prepare_for_direct_item(struct treepath *path,
struct item_head *le_ih, struct item_head *le_ih,
......
...@@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s) ...@@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s)
reiserfs_write_unlock(s); reiserfs_write_unlock(s);
mutex_destroy(&REISERFS_SB(s)->lock); mutex_destroy(&REISERFS_SB(s)->lock);
destroy_workqueue(REISERFS_SB(s)->commit_wq); destroy_workqueue(REISERFS_SB(s)->commit_wq);
kfree(REISERFS_SB(s)->s_jdev);
kfree(s->s_fs_info); kfree(s->s_fs_info);
s->s_fs_info = NULL; s->s_fs_info = NULL;
} }
...@@ -1947,7 +1948,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) ...@@ -1947,7 +1948,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
if (!sbi->s_jdev) { if (!sbi->s_jdev) {
SWARN(silent, s, "", "Cannot allocate memory for " SWARN(silent, s, "", "Cannot allocate memory for "
"journal device name"); "journal device name");
goto error; goto error_unlocked;
} }
} }
#ifdef CONFIG_QUOTA #ifdef CONFIG_QUOTA
...@@ -2240,6 +2241,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) ...@@ -2240,6 +2241,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
kfree(qf_names[j]); kfree(qf_names[j]);
} }
#endif #endif
kfree(sbi->s_jdev);
kfree(sbi); kfree(sbi);
s->s_fs_info = NULL; s->s_fs_info = NULL;
......
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
* This file is based on ECMA-167 3rd edition (June 1997) * This file is based on ECMA-167 3rd edition (June 1997)
* http://www.ecma.ch * http://www.ecma.ch
* *
* Copyright (c) 2001-2002 Ben Fennema <bfennema@falcon.csc.calpoly.edu> * Copyright (c) 2001-2002 Ben Fennema
* Copyright (c) 2017-2019 Pali Rohár <pali.rohar@gmail.com>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
...@@ -32,11 +33,19 @@ ...@@ -32,11 +33,19 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
/**
* @file
* ECMA-167r3 defines and structure definitions
*/
#include <linux/types.h> #include <linux/types.h>
#ifndef _ECMA_167_H #ifndef _ECMA_167_H
#define _ECMA_167_H 1 #define _ECMA_167_H 1
/* Character sets and coding - d-characters (ECMA 167r3 1/7.2) */
typedef uint8_t dchars;
/* Character set specification (ECMA 167r3 1/7.2.1) */ /* Character set specification (ECMA 167r3 1/7.2.1) */
struct charspec { struct charspec {
uint8_t charSetType; uint8_t charSetType;
...@@ -54,6 +63,7 @@ struct charspec { ...@@ -54,6 +63,7 @@ struct charspec {
#define CHARSPEC_TYPE_CS7 0x07 /* (1/7.2.9) */ #define CHARSPEC_TYPE_CS7 0x07 /* (1/7.2.9) */
#define CHARSPEC_TYPE_CS8 0x08 /* (1/7.2.10) */ #define CHARSPEC_TYPE_CS8 0x08 /* (1/7.2.10) */
/* Fixed-length character fields - d-string (EMCA 167r3 1/7.2.12) */
typedef uint8_t dstring; typedef uint8_t dstring;
/* Timestamp (ECMA 167r3 1/7.3) */ /* Timestamp (ECMA 167r3 1/7.3) */
...@@ -85,22 +95,8 @@ struct regid { ...@@ -85,22 +95,8 @@ struct regid {
} __packed; } __packed;
/* Flags (ECMA 167r3 1/7.4.1) */ /* Flags (ECMA 167r3 1/7.4.1) */
#define ENTITYID_FLAGS_DIRTY 0x00 #define ENTITYID_FLAGS_DIRTY 0x01
#define ENTITYID_FLAGS_PROTECTED 0x01 #define ENTITYID_FLAGS_PROTECTED 0x02
/* OSTA UDF 2.1.5.2 */
#define UDF_ID_COMPLIANT "*OSTA UDF Compliant"
/* OSTA UDF 2.1.5.3 */
struct domainEntityIDSuffix {
uint16_t revision;
uint8_t flags;
uint8_t reserved[5];
};
/* OSTA UDF 2.1.5.3 */
#define ENTITYIDSUFFIX_FLAGS_HARDWRITEPROTECT 0
#define ENTITYIDSUFFIX_FLAGS_SOFTWRITEPROTECT 1
/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */ /* Volume Structure Descriptor (ECMA 167r3 2/9.1) */
#define VSD_STD_ID_LEN 5 #define VSD_STD_ID_LEN 5
...@@ -202,6 +198,13 @@ struct NSRDesc { ...@@ -202,6 +198,13 @@ struct NSRDesc {
uint8_t structData[2040]; uint8_t structData[2040];
} __packed; } __packed;
/* Generic Descriptor */
struct genericDesc {
struct tag descTag;
__le32 volDescSeqNum;
uint8_t reserved[492];
} __packed;
/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */ /* Primary Volume Descriptor (ECMA 167r3 3/10.1) */
struct primaryVolDesc { struct primaryVolDesc {
struct tag descTag; struct tag descTag;
...@@ -316,7 +319,7 @@ struct genericPartitionMap { ...@@ -316,7 +319,7 @@ struct genericPartitionMap {
/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */ /* Partition Map Type (ECMA 167r3 3/10.7.1.1) */
#define GP_PARTITION_MAP_TYPE_UNDEF 0x00 #define GP_PARTITION_MAP_TYPE_UNDEF 0x00
#define GP_PARTIITON_MAP_TYPE_1 0x01 #define GP_PARTITION_MAP_TYPE_1 0x01
#define GP_PARTITION_MAP_TYPE_2 0x02 #define GP_PARTITION_MAP_TYPE_2 0x02
/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */ /* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */
...@@ -723,6 +726,7 @@ struct appUseExtAttr { ...@@ -723,6 +726,7 @@ struct appUseExtAttr {
#define EXTATTR_DEV_SPEC 12 #define EXTATTR_DEV_SPEC 12
#define EXTATTR_IMP_USE 2048 #define EXTATTR_IMP_USE 2048
#define EXTATTR_APP_USE 65536 #define EXTATTR_APP_USE 65536
#define EXTATTR_SUBTYPE 1
/* Unallocated Space Entry (ECMA 167r3 4/14.11) */ /* Unallocated Space Entry (ECMA 167r3 4/14.11) */
struct unallocSpaceEntry { struct unallocSpaceEntry {
...@@ -754,10 +758,12 @@ struct partitionIntegrityEntry { ...@@ -754,10 +758,12 @@ struct partitionIntegrityEntry {
/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
/* Extent Length (ECMA 167r3 4/14.14.1.1) */ /* Extent Length (ECMA 167r3 4/14.14.1.1) */
#define EXT_LENGTH_MASK 0x3FFFFFFF
#define EXT_TYPE_MASK 0xC0000000
#define EXT_RECORDED_ALLOCATED 0x00000000 #define EXT_RECORDED_ALLOCATED 0x00000000
#define EXT_NOT_RECORDED_ALLOCATED 0x40000000 #define EXT_NOT_RECORDED_ALLOCATED 0x40000000
#define EXT_NOT_RECORDED_NOT_ALLOCATED 0x80000000 #define EXT_NOT_RECORDED_NOT_ALLOCATED 0x80000000
#define EXT_NEXT_EXTENT_ALLOCDECS 0xC0000000 #define EXT_NEXT_EXTENT_ALLOCDESCS 0xC0000000
/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */ /* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
...@@ -774,7 +780,7 @@ struct pathComponent { ...@@ -774,7 +780,7 @@ struct pathComponent {
uint8_t componentType; uint8_t componentType;
uint8_t lengthComponentIdent; uint8_t lengthComponentIdent;
__le16 componentFileVersionNum; __le16 componentFileVersionNum;
dstring componentIdent[0]; dchars componentIdent[0];
} __packed; } __packed;
/* File Entry (ECMA 167r3 4/14.17) */ /* File Entry (ECMA 167r3 4/14.17) */
......
...@@ -1981,10 +1981,10 @@ int udf_setup_indirect_aext(struct inode *inode, udf_pblk_t block, ...@@ -1981,10 +1981,10 @@ int udf_setup_indirect_aext(struct inode *inode, udf_pblk_t block,
__udf_add_aext(inode, &nepos, &cp_loc, cp_len, 1); __udf_add_aext(inode, &nepos, &cp_loc, cp_len, 1);
udf_write_aext(inode, epos, &nepos.block, udf_write_aext(inode, epos, &nepos.block,
sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDECS, 0); sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDESCS, 0);
} else { } else {
__udf_add_aext(inode, epos, &nepos.block, __udf_add_aext(inode, epos, &nepos.block,
sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDECS, 0); sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDESCS, 0);
} }
brelse(epos->bh); brelse(epos->bh);
...@@ -2143,7 +2143,7 @@ int8_t udf_next_aext(struct inode *inode, struct extent_position *epos, ...@@ -2143,7 +2143,7 @@ int8_t udf_next_aext(struct inode *inode, struct extent_position *epos,
unsigned int indirections = 0; unsigned int indirections = 0;
while ((etype = udf_current_aext(inode, epos, eloc, elen, inc)) == while ((etype = udf_current_aext(inode, epos, eloc, elen, inc)) ==
(EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { (EXT_NEXT_EXTENT_ALLOCDESCS >> 30)) {
udf_pblk_t block; udf_pblk_t block;
if (++indirections > UDF_MAX_INDIR_EXTS) { if (++indirections > UDF_MAX_INDIR_EXTS) {
......
/* /*
* osta_udf.h * osta_udf.h
* *
* This file is based on OSTA UDF(tm) 2.50 (April 30, 2003) * This file is based on OSTA UDF(tm) 2.60 (March 1, 2005)
* http://www.osta.org * http://www.osta.org
* *
* Copyright (c) 2001-2004 Ben Fennema <bfennema@falcon.csc.calpoly.edu> * Copyright (c) 2001-2004 Ben Fennema
* Copyright (c) 2017-2019 Pali Rohár <pali.rohar@gmail.com>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
...@@ -32,38 +33,57 @@ ...@@ -32,38 +33,57 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
/**
* @file
* OSTA-UDF defines and structure definitions
*/
#include "ecma_167.h" #include "ecma_167.h"
#ifndef _OSTA_UDF_H #ifndef _OSTA_UDF_H
#define _OSTA_UDF_H 1 #define _OSTA_UDF_H 1
/* OSTA CS0 Charspec (UDF 2.50 2.1.2) */ /* OSTA CS0 Charspec (UDF 2.60 2.1.2) */
#define UDF_CHAR_SET_TYPE 0 #define UDF_CHAR_SET_TYPE 0
#define UDF_CHAR_SET_INFO "OSTA Compressed Unicode" #define UDF_CHAR_SET_INFO "OSTA Compressed Unicode"
/* Entity Identifier (UDF 2.50 2.1.5) */ /* Entity Identifier (UDF 2.60 2.1.5) */
/* Identifiers (UDF 2.50 2.1.5.2) */ /* Identifiers (UDF 2.60 2.1.5.2) */
/* Implementation Use Extended Attribute (UDF 2.60 3.3.4.5) */
/* Virtual Allocation Table (UDF 1.50 2.2.10) */
/* Logical Volume Extended Information (UDF 1.50 Errata, DCN 5003, 3.3.4.5.1.3) */
/* OS2EA (UDF 1.50 3.3.4.5.3.1) */
/* MacUniqueIDTable (UDF 1.50 3.3.4.5.4.3) */
/* MacResourceFork (UDF 1.50 3.3.4.5.4.4) */
#define UDF_ID_DEVELOPER "*Linux UDFFS" #define UDF_ID_DEVELOPER "*Linux UDFFS"
#define UDF_ID_COMPLIANT "*OSTA UDF Compliant" #define UDF_ID_COMPLIANT "*OSTA UDF Compliant"
#define UDF_ID_LV_INFO "*UDF LV Info" #define UDF_ID_LV_INFO "*UDF LV Info"
#define UDF_ID_FREE_EA "*UDF FreeEASpace" #define UDF_ID_FREE_EA "*UDF FreeEASpace"
#define UDF_ID_FREE_APP_EA "*UDF FreeAppEASpace" #define UDF_ID_FREE_APP_EA "*UDF FreeAppEASpace"
#define UDF_ID_DVD_CGMS "*UDF DVD CGMS Info" #define UDF_ID_DVD_CGMS "*UDF DVD CGMS Info"
#define UDF_ID_VAT_LVEXTENSION "*UDF VAT LVExtension"
#define UDF_ID_OS2_EA "*UDF OS/2 EA" #define UDF_ID_OS2_EA "*UDF OS/2 EA"
#define UDF_ID_OS2_EA_LENGTH "*UDF OS/2 EALength" #define UDF_ID_OS2_EA_LENGTH "*UDF OS/2 EALength"
#define UDF_ID_MAC_VOLUME "*UDF Mac VolumeInfo" #define UDF_ID_MAC_VOLUME "*UDF Mac VolumeInfo"
#define UDF_ID_MAC_FINDER "*UDF Mac FinderInfo" #define UDF_ID_MAC_FINDER "*UDF Mac FinderInfo"
#define UDF_ID_MAC_UNIQUE "*UDF Mac UniqueIDTable" #define UDF_ID_MAC_UNIQUE "*UDF Mac UniqueIDTable"
#define UDF_ID_MAC_RESOURCE "*UDF Mac ResourceFork" #define UDF_ID_MAC_RESOURCE "*UDF Mac ResourceFork"
#define UDF_ID_OS400_DIRINFO "*UDF OS/400 DirInfo"
#define UDF_ID_VIRTUAL "*UDF Virtual Partition" #define UDF_ID_VIRTUAL "*UDF Virtual Partition"
#define UDF_ID_SPARABLE "*UDF Sparable Partition" #define UDF_ID_SPARABLE "*UDF Sparable Partition"
#define UDF_ID_ALLOC "*UDF Virtual Alloc Tbl" #define UDF_ID_ALLOC "*UDF Virtual Alloc Tbl"
#define UDF_ID_SPARING "*UDF Sparing Table" #define UDF_ID_SPARING "*UDF Sparing Table"
#define UDF_ID_METADATA "*UDF Metadata Partition" #define UDF_ID_METADATA "*UDF Metadata Partition"
/* Identifier Suffix (UDF 2.50 2.1.5.3) */ /* Identifier Suffix (UDF 2.60 2.1.5.3) */
#define IS_DF_HARD_WRITE_PROTECT 0x01 #define DOMAIN_FLAGS_HARD_WRITE_PROTECT 0x01
#define IS_DF_SOFT_WRITE_PROTECT 0x02 #define DOMAIN_FLAGS_SOFT_WRITE_PROTECT 0x02
struct domainIdentSuffix {
__le16 UDFRevision;
uint8_t domainFlags;
uint8_t reserved[5];
} __packed;
struct UDFIdentSuffix { struct UDFIdentSuffix {
__le16 UDFRevision; __le16 UDFRevision;
...@@ -75,15 +95,15 @@ struct UDFIdentSuffix { ...@@ -75,15 +95,15 @@ struct UDFIdentSuffix {
struct impIdentSuffix { struct impIdentSuffix {
uint8_t OSClass; uint8_t OSClass;
uint8_t OSIdentifier; uint8_t OSIdentifier;
uint8_t reserved[6]; uint8_t impUse[6];
} __packed; } __packed;
struct appIdentSuffix { struct appIdentSuffix {
uint8_t impUse[8]; uint8_t impUse[8];
} __packed; } __packed;
/* Logical Volume Integrity Descriptor (UDF 2.50 2.2.6) */ /* Logical Volume Integrity Descriptor (UDF 2.60 2.2.6) */
/* Implementation Use (UDF 2.50 2.2.6.4) */ /* Implementation Use (UDF 2.60 2.2.6.4) */
struct logicalVolIntegrityDescImpUse { struct logicalVolIntegrityDescImpUse {
struct regid impIdent; struct regid impIdent;
__le32 numFiles; __le32 numFiles;
...@@ -94,8 +114,8 @@ struct logicalVolIntegrityDescImpUse { ...@@ -94,8 +114,8 @@ struct logicalVolIntegrityDescImpUse {
uint8_t impUse[0]; uint8_t impUse[0];
} __packed; } __packed;
/* Implementation Use Volume Descriptor (UDF 2.50 2.2.7) */ /* Implementation Use Volume Descriptor (UDF 2.60 2.2.7) */
/* Implementation Use (UDF 2.50 2.2.7.2) */ /* Implementation Use (UDF 2.60 2.2.7.2) */
struct impUseVolDescImpUse { struct impUseVolDescImpUse {
struct charspec LVICharset; struct charspec LVICharset;
dstring logicalVolIdent[128]; dstring logicalVolIdent[128];
...@@ -115,7 +135,7 @@ struct udfPartitionMap2 { ...@@ -115,7 +135,7 @@ struct udfPartitionMap2 {
__le16 partitionNum; __le16 partitionNum;
} __packed; } __packed;
/* Virtual Partition Map (UDF 2.50 2.2.8) */ /* Virtual Partition Map (UDF 2.60 2.2.8) */
struct virtualPartitionMap { struct virtualPartitionMap {
uint8_t partitionMapType; uint8_t partitionMapType;
uint8_t partitionMapLength; uint8_t partitionMapLength;
...@@ -126,7 +146,7 @@ struct virtualPartitionMap { ...@@ -126,7 +146,7 @@ struct virtualPartitionMap {
uint8_t reserved2[24]; uint8_t reserved2[24];
} __packed; } __packed;
/* Sparable Partition Map (UDF 2.50 2.2.9) */ /* Sparable Partition Map (UDF 2.60 2.2.9) */
struct sparablePartitionMap { struct sparablePartitionMap {
uint8_t partitionMapType; uint8_t partitionMapType;
uint8_t partitionMapLength; uint8_t partitionMapLength;
...@@ -141,7 +161,7 @@ struct sparablePartitionMap { ...@@ -141,7 +161,7 @@ struct sparablePartitionMap {
__le32 locSparingTable[4]; __le32 locSparingTable[4];
} __packed; } __packed;
/* Metadata Partition Map (UDF 2.4.0 2.2.10) */ /* Metadata Partition Map (UDF 2.60 2.2.10) */
struct metadataPartitionMap { struct metadataPartitionMap {
uint8_t partitionMapType; uint8_t partitionMapType;
uint8_t partitionMapLength; uint8_t partitionMapLength;
...@@ -160,14 +180,14 @@ struct metadataPartitionMap { ...@@ -160,14 +180,14 @@ struct metadataPartitionMap {
/* Virtual Allocation Table (UDF 1.5 2.2.10) */ /* Virtual Allocation Table (UDF 1.5 2.2.10) */
struct virtualAllocationTable15 { struct virtualAllocationTable15 {
__le32 VirtualSector[0]; __le32 vatEntry[0];
struct regid vatIdent; struct regid vatIdent;
__le32 previousVATICBLoc; __le32 previousVATICBLoc;
} __packed; } __packed;
#define ICBTAG_FILE_TYPE_VAT15 0x00U #define ICBTAG_FILE_TYPE_VAT15 0x00U
/* Virtual Allocation Table (UDF 2.50 2.2.11) */ /* Virtual Allocation Table (UDF 2.60 2.2.11) */
struct virtualAllocationTable20 { struct virtualAllocationTable20 {
__le16 lengthHeader; __le16 lengthHeader;
__le16 lengthImpUse; __le16 lengthImpUse;
...@@ -175,9 +195,9 @@ struct virtualAllocationTable20 { ...@@ -175,9 +195,9 @@ struct virtualAllocationTable20 {
__le32 previousVATICBLoc; __le32 previousVATICBLoc;
__le32 numFiles; __le32 numFiles;
__le32 numDirs; __le32 numDirs;
__le16 minReadRevision; __le16 minUDFReadRev;
__le16 minWriteRevision; __le16 minUDFWriteRev;
__le16 maxWriteRevision; __le16 maxUDFWriteRev;
__le16 reserved; __le16 reserved;
uint8_t impUse[0]; uint8_t impUse[0];
__le32 vatEntry[0]; __le32 vatEntry[0];
...@@ -185,7 +205,7 @@ struct virtualAllocationTable20 { ...@@ -185,7 +205,7 @@ struct virtualAllocationTable20 {
#define ICBTAG_FILE_TYPE_VAT20 0xF8U #define ICBTAG_FILE_TYPE_VAT20 0xF8U
/* Sparing Table (UDF 2.50 2.2.12) */ /* Sparing Table (UDF 2.60 2.2.12) */
struct sparingEntry { struct sparingEntry {
__le32 origLocation; __le32 origLocation;
__le32 mappedLocation; __le32 mappedLocation;
...@@ -201,12 +221,12 @@ struct sparingTable { ...@@ -201,12 +221,12 @@ struct sparingTable {
mapEntry[0]; mapEntry[0];
} __packed; } __packed;
/* Metadata File (and Metadata Mirror File) (UDF 2.50 2.2.13.1) */ /* Metadata File (and Metadata Mirror File) (UDF 2.60 2.2.13.1) */
#define ICBTAG_FILE_TYPE_MAIN 0xFA #define ICBTAG_FILE_TYPE_MAIN 0xFA
#define ICBTAG_FILE_TYPE_MIRROR 0xFB #define ICBTAG_FILE_TYPE_MIRROR 0xFB
#define ICBTAG_FILE_TYPE_BITMAP 0xFC #define ICBTAG_FILE_TYPE_BITMAP 0xFC
/* struct struct long_ad ICB - ADImpUse (UDF 2.50 2.2.4.3) */ /* struct struct long_ad ICB - ADImpUse (UDF 2.60 2.2.4.3) */
struct allocDescImpUse { struct allocDescImpUse {
__le16 flags; __le16 flags;
uint8_t impUse[4]; uint8_t impUse[4];
...@@ -214,17 +234,17 @@ struct allocDescImpUse { ...@@ -214,17 +234,17 @@ struct allocDescImpUse {
#define AD_IU_EXT_ERASED 0x0001 #define AD_IU_EXT_ERASED 0x0001
/* Real-Time Files (UDF 2.50 6.11) */ /* Real-Time Files (UDF 2.60 6.11) */
#define ICBTAG_FILE_TYPE_REALTIME 0xF9U #define ICBTAG_FILE_TYPE_REALTIME 0xF9U
/* Implementation Use Extended Attribute (UDF 2.50 3.3.4.5) */ /* Implementation Use Extended Attribute (UDF 2.60 3.3.4.5) */
/* FreeEASpace (UDF 2.50 3.3.4.5.1.1) */ /* FreeEASpace (UDF 2.60 3.3.4.5.1.1) */
struct freeEaSpace { struct freeEaSpace {
__le16 headerChecksum; __le16 headerChecksum;
uint8_t freeEASpace[0]; uint8_t freeEASpace[0];
} __packed; } __packed;
/* DVD Copyright Management Information (UDF 2.50 3.3.4.5.1.2) */ /* DVD Copyright Management Information (UDF 2.60 3.3.4.5.1.2) */
struct DVDCopyrightImpUse { struct DVDCopyrightImpUse {
__le16 headerChecksum; __le16 headerChecksum;
uint8_t CGMSInfo; uint8_t CGMSInfo;
...@@ -232,20 +252,35 @@ struct DVDCopyrightImpUse { ...@@ -232,20 +252,35 @@ struct DVDCopyrightImpUse {
uint8_t protectionSystemInfo[4]; uint8_t protectionSystemInfo[4];
} __packed; } __packed;
/* Application Use Extended Attribute (UDF 2.50 3.3.4.6) */ /* Logical Volume Extended Information (UDF 1.50 Errata, DCN 5003, 3.3.4.5.1.3) */
/* FreeAppEASpace (UDF 2.50 3.3.4.6.1) */ struct LVExtensionEA {
__le16 headerChecksum;
__le64 verificationID;
__le32 numFiles;
__le32 numDirs;
dstring logicalVolIdent[128];
} __packed;
/* Application Use Extended Attribute (UDF 2.60 3.3.4.6) */
/* FreeAppEASpace (UDF 2.60 3.3.4.6.1) */
struct freeAppEASpace { struct freeAppEASpace {
__le16 headerChecksum; __le16 headerChecksum;
uint8_t freeEASpace[0]; uint8_t freeEASpace[0];
} __packed; } __packed;
/* UDF Defined System Stream (UDF 2.50 3.3.7) */ /* UDF Defined System Stream (UDF 2.60 3.3.7) */
#define UDF_ID_UNIQUE_ID "*UDF Unique ID Mapping Data" #define UDF_ID_UNIQUE_ID "*UDF Unique ID Mapping Data"
#define UDF_ID_NON_ALLOC "*UDF Non-Allocatable Space" #define UDF_ID_NON_ALLOC "*UDF Non-Allocatable Space"
#define UDF_ID_POWER_CAL "*UDF Power Cal Table" #define UDF_ID_POWER_CAL "*UDF Power Cal Table"
#define UDF_ID_BACKUP "*UDF Backup" #define UDF_ID_BACKUP "*UDF Backup"
/* Operating System Identifiers (UDF 2.50 6.3) */ /* UDF Defined Non-System Streams (UDF 2.60 3.3.8) */
#define UDF_ID_MAC_RESOURCE_FORK_STREAM "*UDF Macintosh Resource Fork"
/* #define UDF_ID_OS2_EA "*UDF OS/2 EA" */
#define UDF_ID_NT_ACL "*UDF NT ACL"
#define UDF_ID_UNIX_ACL "*UDF UNIX ACL"
/* Operating System Identifiers (UDF 2.60 6.3) */
#define UDF_OS_CLASS_UNDEF 0x00U #define UDF_OS_CLASS_UNDEF 0x00U
#define UDF_OS_CLASS_DOS 0x01U #define UDF_OS_CLASS_DOS 0x01U
#define UDF_OS_CLASS_OS2 0x02U #define UDF_OS_CLASS_OS2 0x02U
...@@ -270,6 +305,7 @@ struct freeAppEASpace { ...@@ -270,6 +305,7 @@ struct freeAppEASpace {
#define UDF_OS_ID_LINUX 0x05U #define UDF_OS_ID_LINUX 0x05U
#define UDF_OS_ID_MKLINUX 0x06U #define UDF_OS_ID_MKLINUX 0x06U
#define UDF_OS_ID_FREEBSD 0x07U #define UDF_OS_ID_FREEBSD 0x07U
#define UDF_OS_ID_NETBSD 0x08U
#define UDF_OS_ID_WIN9X 0x00U #define UDF_OS_ID_WIN9X 0x00U
#define UDF_OS_ID_WINNT 0x00U #define UDF_OS_ID_WINNT 0x00U
#define UDF_OS_ID_OS400 0x00U #define UDF_OS_ID_OS400 0x00U
......
...@@ -767,20 +767,20 @@ static int udf_check_vsd(struct super_block *sb) ...@@ -767,20 +767,20 @@ static int udf_check_vsd(struct super_block *sb)
static int udf_verify_domain_identifier(struct super_block *sb, static int udf_verify_domain_identifier(struct super_block *sb,
struct regid *ident, char *dname) struct regid *ident, char *dname)
{ {
struct domainEntityIDSuffix *suffix; struct domainIdentSuffix *suffix;
if (memcmp(ident->ident, UDF_ID_COMPLIANT, strlen(UDF_ID_COMPLIANT))) { if (memcmp(ident->ident, UDF_ID_COMPLIANT, strlen(UDF_ID_COMPLIANT))) {
udf_warn(sb, "Not OSTA UDF compliant %s descriptor.\n", dname); udf_warn(sb, "Not OSTA UDF compliant %s descriptor.\n", dname);
goto force_ro; goto force_ro;
} }
if (ident->flags & (1 << ENTITYID_FLAGS_DIRTY)) { if (ident->flags & ENTITYID_FLAGS_DIRTY) {
udf_warn(sb, "Possibly not OSTA UDF compliant %s descriptor.\n", udf_warn(sb, "Possibly not OSTA UDF compliant %s descriptor.\n",
dname); dname);
goto force_ro; goto force_ro;
} }
suffix = (struct domainEntityIDSuffix *)ident->identSuffix; suffix = (struct domainIdentSuffix *)ident->identSuffix;
if (suffix->flags & (1 << ENTITYIDSUFFIX_FLAGS_HARDWRITEPROTECT) || if ((suffix->domainFlags & DOMAIN_FLAGS_HARD_WRITE_PROTECT) ||
suffix->flags & (1 << ENTITYIDSUFFIX_FLAGS_SOFTWRITEPROTECT)) { (suffix->domainFlags & DOMAIN_FLAGS_SOFT_WRITE_PROTECT)) {
if (!sb_rdonly(sb)) { if (!sb_rdonly(sb)) {
udf_warn(sb, "Descriptor for %s marked write protected." udf_warn(sb, "Descriptor for %s marked write protected."
" Forcing read only mount.\n", dname); " Forcing read only mount.\n", dname);
...@@ -1035,7 +1035,6 @@ static int check_partition_desc(struct super_block *sb, ...@@ -1035,7 +1035,6 @@ static int check_partition_desc(struct super_block *sb,
switch (le32_to_cpu(p->accessType)) { switch (le32_to_cpu(p->accessType)) {
case PD_ACCESS_TYPE_READ_ONLY: case PD_ACCESS_TYPE_READ_ONLY:
case PD_ACCESS_TYPE_WRITE_ONCE: case PD_ACCESS_TYPE_WRITE_ONCE:
case PD_ACCESS_TYPE_REWRITABLE:
case PD_ACCESS_TYPE_NONE: case PD_ACCESS_TYPE_NONE:
goto force_ro; goto force_ro;
} }
...@@ -1063,7 +1062,8 @@ static int check_partition_desc(struct super_block *sb, ...@@ -1063,7 +1062,8 @@ static int check_partition_desc(struct super_block *sb,
goto force_ro; goto force_ro;
if (map->s_partition_type == UDF_VIRTUAL_MAP15 || if (map->s_partition_type == UDF_VIRTUAL_MAP15 ||
map->s_partition_type == UDF_VIRTUAL_MAP20) map->s_partition_type == UDF_VIRTUAL_MAP20 ||
map->s_partition_type == UDF_METADATA_MAP25)
goto force_ro; goto force_ro;
return 0; return 0;
...@@ -2402,6 +2402,10 @@ static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -2402,6 +2402,10 @@ static int udf_statfs(struct dentry *dentry, struct kstatfs *buf)
buf->f_blocks = sbi->s_partmaps[sbi->s_partition].s_partition_len; buf->f_blocks = sbi->s_partmaps[sbi->s_partition].s_partition_len;
buf->f_bfree = udf_count_free(sb); buf->f_bfree = udf_count_free(sb);
buf->f_bavail = buf->f_bfree; buf->f_bavail = buf->f_bfree;
/*
* Let's pretend each free block is also a free 'inode' since UDF does
* not have separate preallocated table of inodes.
*/
buf->f_files = (lvidiu != NULL ? (le32_to_cpu(lvidiu->numFiles) + buf->f_files = (lvidiu != NULL ? (le32_to_cpu(lvidiu->numFiles) +
le32_to_cpu(lvidiu->numDirs)) : 0) le32_to_cpu(lvidiu->numDirs)) : 0)
+ buf->f_bfree; + buf->f_bfree;
...@@ -2492,17 +2496,29 @@ static unsigned int udf_count_free_table(struct super_block *sb, ...@@ -2492,17 +2496,29 @@ static unsigned int udf_count_free_table(struct super_block *sb,
static unsigned int udf_count_free(struct super_block *sb) static unsigned int udf_count_free(struct super_block *sb)
{ {
unsigned int accum = 0; unsigned int accum = 0;
struct udf_sb_info *sbi; struct udf_sb_info *sbi = UDF_SB(sb);
struct udf_part_map *map; struct udf_part_map *map;
unsigned int part = sbi->s_partition;
int ptype = sbi->s_partmaps[part].s_partition_type;
if (ptype == UDF_METADATA_MAP25) {
part = sbi->s_partmaps[part].s_type_specific.s_metadata.
s_phys_partition_ref;
} else if (ptype == UDF_VIRTUAL_MAP15 || ptype == UDF_VIRTUAL_MAP20) {
/*
* Filesystems with VAT are append-only and we cannot write to
* them. Let's just report 0 here.
*/
return 0;
}
sbi = UDF_SB(sb);
if (sbi->s_lvid_bh) { if (sbi->s_lvid_bh) {
struct logicalVolIntegrityDesc *lvid = struct logicalVolIntegrityDesc *lvid =
(struct logicalVolIntegrityDesc *) (struct logicalVolIntegrityDesc *)
sbi->s_lvid_bh->b_data; sbi->s_lvid_bh->b_data;
if (le32_to_cpu(lvid->numOfPartitions) > sbi->s_partition) { if (le32_to_cpu(lvid->numOfPartitions) > part) {
accum = le32_to_cpu( accum = le32_to_cpu(
lvid->freeSpaceTable[sbi->s_partition]); lvid->freeSpaceTable[part]);
if (accum == 0xFFFFFFFF) if (accum == 0xFFFFFFFF)
accum = 0; accum = 0;
} }
...@@ -2511,7 +2527,7 @@ static unsigned int udf_count_free(struct super_block *sb) ...@@ -2511,7 +2527,7 @@ static unsigned int udf_count_free(struct super_block *sb)
if (accum) if (accum)
return accum; return accum;
map = &sbi->s_partmaps[sbi->s_partition]; map = &sbi->s_partmaps[part];
if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) {
accum += udf_count_free_bitmap(sb, accum += udf_count_free_bitmap(sb,
map->s_uspace.s_bitmap); map->s_uspace.s_bitmap);
......
...@@ -241,7 +241,7 @@ int udf_truncate_extents(struct inode *inode) ...@@ -241,7 +241,7 @@ int udf_truncate_extents(struct inode *inode)
while ((etype = udf_current_aext(inode, &epos, &eloc, while ((etype = udf_current_aext(inode, &epos, &eloc,
&elen, 0)) != -1) { &elen, 0)) != -1) {
if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { if (etype == (EXT_NEXT_EXTENT_ALLOCDESCS >> 30)) {
udf_write_aext(inode, &epos, &neloc, nelen, 0); udf_write_aext(inode, &epos, &neloc, nelen, 0);
if (indirect_ext_len) { if (indirect_ext_len) {
/* We managed to free all extents in the /* We managed to free all extents in the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment