-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEq1nRK9aeMoq1VSgcnJ2qBz9kQNkFAl4zANcACgkQnJ2qBz9k QNkyBQgA5/ppAhSC7Snc6BDm5PMiOJjN+FhYB1W9bHbkRlKfTetJxQTxbPpokZPq A+99KuuNb3Uay2XWqan2pwZ90/9SIUZT8HnwNYwEHh33Nt76A1ybqqM0IAk+RWus KjW7Jg/xCbbFKQX/estngjIlniUQ0WP7VTTwS/NPnvsIYNEpWJQvyIecm2DZhWGS fmbn5x7PYnyveADd2Tf9z0iOKKI0ysLYksUlx+Ndg3fwPaWsI57tgUZL0Tzf552S cCsRjQrcnhjuHTDEhH9HOGQlu45U4bBNkXKKoc1HUrp58UyTY2Rnn/QCM8jkTpzB 7NwoFyqPtWguJTFDsUH1rmqQisYoMQ== =1v6t -----END PGP SIGNATURE----- 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()
This commit is contained in:
commit
0196be12aa
|
@ -1073,9 +1073,9 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
|
|||
|
||||
if (EXT2_BLOCKS_PER_GROUP(sb) == 0)
|
||||
goto cantfind_ext2;
|
||||
sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) -
|
||||
le32_to_cpu(es->s_first_data_block) - 1)
|
||||
/ EXT2_BLOCKS_PER_GROUP(sb)) + 1;
|
||||
sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) -
|
||||
le32_to_cpu(es->s_first_data_block) - 1)
|
||||
/ EXT2_BLOCKS_PER_GROUP(sb)) + 1;
|
||||
db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) /
|
||||
EXT2_DESC_PER_BLOCK(sb);
|
||||
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)
|
|||
ext2_count_dirs(sb), GFP_KERNEL);
|
||||
}
|
||||
if (err) {
|
||||
ret = err;
|
||||
ext2_msg(sb, KERN_ERR, "error: insufficient memory");
|
||||
goto failed_mount3;
|
||||
}
|
||||
|
|
|
@ -22,8 +22,6 @@ MODULE_AUTHOR("Jan Kara");
|
|||
MODULE_DESCRIPTION("Quota format v2 support");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#define __QUOTA_V2_PARANOIA
|
||||
|
||||
static void v2r0_mem2diskdqb(void *dp, struct dquot *dquot);
|
||||
static void v2r0_disk2memdqb(struct dquot *dquot, void *dp);
|
||||
static int v2r0_is_id(void *dp, struct dquot *dquot);
|
||||
|
|
|
@ -25,8 +25,10 @@ struct v1_disk_dqblk {
|
|||
__u32 dqb_ihardlimit; /* absolute limit on allocated inodes */
|
||||
__u32 dqb_isoftlimit; /* preferred inode limit */
|
||||
__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)))
|
||||
|
|
|
@ -56,8 +56,6 @@
|
|||
/* gets a struct reiserfs_journal_list * from a list head */
|
||||
#define JOURNAL_LIST_ENTRY(h) (list_entry((h), struct reiserfs_journal_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 */
|
||||
#define JOURNAL_TRANS_HALF 1018
|
||||
|
|
|
@ -63,7 +63,6 @@ static int show_version(struct seq_file *m, void *unused)
|
|||
#define MAP( i ) D4C( objectid_map( sb, rs )[ i ] )
|
||||
|
||||
#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 JF( x ) ( r -> s_journal -> x )
|
||||
|
||||
|
|
|
@ -918,12 +918,6 @@ int comp_items(const struct item_head *stored_ih, const struct treepath *path)
|
|||
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 */
|
||||
static inline int prepare_for_direct_item(struct treepath *path,
|
||||
struct item_head *le_ih,
|
||||
|
|
|
@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s)
|
|||
reiserfs_write_unlock(s);
|
||||
mutex_destroy(&REISERFS_SB(s)->lock);
|
||||
destroy_workqueue(REISERFS_SB(s)->commit_wq);
|
||||
kfree(REISERFS_SB(s)->s_jdev);
|
||||
kfree(s->s_fs_info);
|
||||
s->s_fs_info = NULL;
|
||||
}
|
||||
|
@ -1947,7 +1948,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
|
|||
if (!sbi->s_jdev) {
|
||||
SWARN(silent, s, "", "Cannot allocate memory for "
|
||||
"journal device name");
|
||||
goto error;
|
||||
goto error_unlocked;
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_QUOTA
|
||||
|
@ -2240,6 +2241,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
|
|||
kfree(qf_names[j]);
|
||||
}
|
||||
#endif
|
||||
kfree(sbi->s_jdev);
|
||||
kfree(sbi);
|
||||
|
||||
s->s_fs_info = NULL;
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
* This file is based on ECMA-167 3rd edition (June 1997)
|
||||
* 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.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -32,11 +33,19 @@
|
|||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* ECMA-167r3 defines and structure definitions
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifndef _ECMA_167_H
|
||||
#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) */
|
||||
struct charspec {
|
||||
uint8_t charSetType;
|
||||
|
@ -54,6 +63,7 @@ struct charspec {
|
|||
#define CHARSPEC_TYPE_CS7 0x07 /* (1/7.2.9) */
|
||||
#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;
|
||||
|
||||
/* Timestamp (ECMA 167r3 1/7.3) */
|
||||
|
@ -85,22 +95,8 @@ struct regid {
|
|||
} __packed;
|
||||
|
||||
/* Flags (ECMA 167r3 1/7.4.1) */
|
||||
#define ENTITYID_FLAGS_DIRTY 0x00
|
||||
#define ENTITYID_FLAGS_PROTECTED 0x01
|
||||
|
||||
/* 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
|
||||
#define ENTITYID_FLAGS_DIRTY 0x01
|
||||
#define ENTITYID_FLAGS_PROTECTED 0x02
|
||||
|
||||
/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */
|
||||
#define VSD_STD_ID_LEN 5
|
||||
|
@ -202,6 +198,13 @@ struct NSRDesc {
|
|||
uint8_t structData[2040];
|
||||
} __packed;
|
||||
|
||||
/* Generic Descriptor */
|
||||
struct genericDesc {
|
||||
struct tag descTag;
|
||||
__le32 volDescSeqNum;
|
||||
uint8_t reserved[492];
|
||||
} __packed;
|
||||
|
||||
/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */
|
||||
struct primaryVolDesc {
|
||||
struct tag descTag;
|
||||
|
@ -316,7 +319,7 @@ struct genericPartitionMap {
|
|||
|
||||
/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */
|
||||
#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
|
||||
|
||||
/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */
|
||||
|
@ -723,6 +726,7 @@ struct appUseExtAttr {
|
|||
#define EXTATTR_DEV_SPEC 12
|
||||
#define EXTATTR_IMP_USE 2048
|
||||
#define EXTATTR_APP_USE 65536
|
||||
#define EXTATTR_SUBTYPE 1
|
||||
|
||||
/* Unallocated Space Entry (ECMA 167r3 4/14.11) */
|
||||
struct unallocSpaceEntry {
|
||||
|
@ -754,10 +758,12 @@ struct partitionIntegrityEntry {
|
|||
/* Short Allocation Descriptor (ECMA 167r3 4/14.14.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_NOT_RECORDED_ALLOCATED 0x40000000
|
||||
#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) */
|
||||
|
||||
|
@ -774,7 +780,7 @@ struct pathComponent {
|
|||
uint8_t componentType;
|
||||
uint8_t lengthComponentIdent;
|
||||
__le16 componentFileVersionNum;
|
||||
dstring componentIdent[0];
|
||||
dchars componentIdent[0];
|
||||
} __packed;
|
||||
|
||||
/* File Entry (ECMA 167r3 4/14.17) */
|
||||
|
|
|
@ -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_write_aext(inode, epos, &nepos.block,
|
||||
sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDECS, 0);
|
||||
sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDESCS, 0);
|
||||
} else {
|
||||
__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);
|
||||
|
@ -2143,7 +2143,7 @@ int8_t udf_next_aext(struct inode *inode, struct extent_position *epos,
|
|||
unsigned int indirections = 0;
|
||||
|
||||
while ((etype = udf_current_aext(inode, epos, eloc, elen, inc)) ==
|
||||
(EXT_NEXT_EXTENT_ALLOCDECS >> 30)) {
|
||||
(EXT_NEXT_EXTENT_ALLOCDESCS >> 30)) {
|
||||
udf_pblk_t block;
|
||||
|
||||
if (++indirections > UDF_MAX_INDIR_EXTS) {
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
/*
|
||||
* 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
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -32,38 +33,57 @@
|
|||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* OSTA-UDF defines and structure definitions
|
||||
*/
|
||||
|
||||
#include "ecma_167.h"
|
||||
|
||||
#ifndef _OSTA_UDF_H
|
||||
#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_INFO "OSTA Compressed Unicode"
|
||||
|
||||
/* Entity Identifier (UDF 2.50 2.1.5) */
|
||||
/* Identifiers (UDF 2.50 2.1.5.2) */
|
||||
/* Entity Identifier (UDF 2.60 2.1.5) */
|
||||
/* 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_COMPLIANT "*OSTA UDF Compliant"
|
||||
#define UDF_ID_LV_INFO "*UDF LV Info"
|
||||
#define UDF_ID_FREE_EA "*UDF FreeEASpace"
|
||||
#define UDF_ID_FREE_APP_EA "*UDF FreeAppEASpace"
|
||||
#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_LENGTH "*UDF OS/2 EALength"
|
||||
#define UDF_ID_MAC_VOLUME "*UDF Mac VolumeInfo"
|
||||
#define UDF_ID_MAC_FINDER "*UDF Mac FinderInfo"
|
||||
#define UDF_ID_MAC_UNIQUE "*UDF Mac UniqueIDTable"
|
||||
#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_SPARABLE "*UDF Sparable Partition"
|
||||
#define UDF_ID_ALLOC "*UDF Virtual Alloc Tbl"
|
||||
#define UDF_ID_SPARING "*UDF Sparing Table"
|
||||
#define UDF_ID_METADATA "*UDF Metadata Partition"
|
||||
|
||||
/* Identifier Suffix (UDF 2.50 2.1.5.3) */
|
||||
#define IS_DF_HARD_WRITE_PROTECT 0x01
|
||||
#define IS_DF_SOFT_WRITE_PROTECT 0x02
|
||||
/* Identifier Suffix (UDF 2.60 2.1.5.3) */
|
||||
#define DOMAIN_FLAGS_HARD_WRITE_PROTECT 0x01
|
||||
#define DOMAIN_FLAGS_SOFT_WRITE_PROTECT 0x02
|
||||
|
||||
struct domainIdentSuffix {
|
||||
__le16 UDFRevision;
|
||||
uint8_t domainFlags;
|
||||
uint8_t reserved[5];
|
||||
} __packed;
|
||||
|
||||
struct UDFIdentSuffix {
|
||||
__le16 UDFRevision;
|
||||
|
@ -75,15 +95,15 @@ struct UDFIdentSuffix {
|
|||
struct impIdentSuffix {
|
||||
uint8_t OSClass;
|
||||
uint8_t OSIdentifier;
|
||||
uint8_t reserved[6];
|
||||
uint8_t impUse[6];
|
||||
} __packed;
|
||||
|
||||
struct appIdentSuffix {
|
||||
uint8_t impUse[8];
|
||||
} __packed;
|
||||
|
||||
/* Logical Volume Integrity Descriptor (UDF 2.50 2.2.6) */
|
||||
/* Implementation Use (UDF 2.50 2.2.6.4) */
|
||||
/* Logical Volume Integrity Descriptor (UDF 2.60 2.2.6) */
|
||||
/* Implementation Use (UDF 2.60 2.2.6.4) */
|
||||
struct logicalVolIntegrityDescImpUse {
|
||||
struct regid impIdent;
|
||||
__le32 numFiles;
|
||||
|
@ -94,8 +114,8 @@ struct logicalVolIntegrityDescImpUse {
|
|||
uint8_t impUse[0];
|
||||
} __packed;
|
||||
|
||||
/* Implementation Use Volume Descriptor (UDF 2.50 2.2.7) */
|
||||
/* Implementation Use (UDF 2.50 2.2.7.2) */
|
||||
/* Implementation Use Volume Descriptor (UDF 2.60 2.2.7) */
|
||||
/* Implementation Use (UDF 2.60 2.2.7.2) */
|
||||
struct impUseVolDescImpUse {
|
||||
struct charspec LVICharset;
|
||||
dstring logicalVolIdent[128];
|
||||
|
@ -115,7 +135,7 @@ struct udfPartitionMap2 {
|
|||
__le16 partitionNum;
|
||||
} __packed;
|
||||
|
||||
/* Virtual Partition Map (UDF 2.50 2.2.8) */
|
||||
/* Virtual Partition Map (UDF 2.60 2.2.8) */
|
||||
struct virtualPartitionMap {
|
||||
uint8_t partitionMapType;
|
||||
uint8_t partitionMapLength;
|
||||
|
@ -126,7 +146,7 @@ struct virtualPartitionMap {
|
|||
uint8_t reserved2[24];
|
||||
} __packed;
|
||||
|
||||
/* Sparable Partition Map (UDF 2.50 2.2.9) */
|
||||
/* Sparable Partition Map (UDF 2.60 2.2.9) */
|
||||
struct sparablePartitionMap {
|
||||
uint8_t partitionMapType;
|
||||
uint8_t partitionMapLength;
|
||||
|
@ -141,7 +161,7 @@ struct sparablePartitionMap {
|
|||
__le32 locSparingTable[4];
|
||||
} __packed;
|
||||
|
||||
/* Metadata Partition Map (UDF 2.4.0 2.2.10) */
|
||||
/* Metadata Partition Map (UDF 2.60 2.2.10) */
|
||||
struct metadataPartitionMap {
|
||||
uint8_t partitionMapType;
|
||||
uint8_t partitionMapLength;
|
||||
|
@ -160,14 +180,14 @@ struct metadataPartitionMap {
|
|||
|
||||
/* Virtual Allocation Table (UDF 1.5 2.2.10) */
|
||||
struct virtualAllocationTable15 {
|
||||
__le32 VirtualSector[0];
|
||||
__le32 vatEntry[0];
|
||||
struct regid vatIdent;
|
||||
__le32 previousVATICBLoc;
|
||||
} __packed;
|
||||
|
||||
#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 {
|
||||
__le16 lengthHeader;
|
||||
__le16 lengthImpUse;
|
||||
|
@ -175,9 +195,9 @@ struct virtualAllocationTable20 {
|
|||
__le32 previousVATICBLoc;
|
||||
__le32 numFiles;
|
||||
__le32 numDirs;
|
||||
__le16 minReadRevision;
|
||||
__le16 minWriteRevision;
|
||||
__le16 maxWriteRevision;
|
||||
__le16 minUDFReadRev;
|
||||
__le16 minUDFWriteRev;
|
||||
__le16 maxUDFWriteRev;
|
||||
__le16 reserved;
|
||||
uint8_t impUse[0];
|
||||
__le32 vatEntry[0];
|
||||
|
@ -185,7 +205,7 @@ struct virtualAllocationTable20 {
|
|||
|
||||
#define ICBTAG_FILE_TYPE_VAT20 0xF8U
|
||||
|
||||
/* Sparing Table (UDF 2.50 2.2.12) */
|
||||
/* Sparing Table (UDF 2.60 2.2.12) */
|
||||
struct sparingEntry {
|
||||
__le32 origLocation;
|
||||
__le32 mappedLocation;
|
||||
|
@ -201,12 +221,12 @@ struct sparingTable {
|
|||
mapEntry[0];
|
||||
} __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_MIRROR 0xFB
|
||||
#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 {
|
||||
__le16 flags;
|
||||
uint8_t impUse[4];
|
||||
|
@ -214,17 +234,17 @@ struct allocDescImpUse {
|
|||
|
||||
#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
|
||||
|
||||
/* Implementation Use Extended Attribute (UDF 2.50 3.3.4.5) */
|
||||
/* FreeEASpace (UDF 2.50 3.3.4.5.1.1) */
|
||||
/* Implementation Use Extended Attribute (UDF 2.60 3.3.4.5) */
|
||||
/* FreeEASpace (UDF 2.60 3.3.4.5.1.1) */
|
||||
struct freeEaSpace {
|
||||
__le16 headerChecksum;
|
||||
uint8_t freeEASpace[0];
|
||||
} __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 {
|
||||
__le16 headerChecksum;
|
||||
uint8_t CGMSInfo;
|
||||
|
@ -232,20 +252,35 @@ struct DVDCopyrightImpUse {
|
|||
uint8_t protectionSystemInfo[4];
|
||||
} __packed;
|
||||
|
||||
/* Application Use Extended Attribute (UDF 2.50 3.3.4.6) */
|
||||
/* FreeAppEASpace (UDF 2.50 3.3.4.6.1) */
|
||||
/* Logical Volume Extended Information (UDF 1.50 Errata, DCN 5003, 3.3.4.5.1.3) */
|
||||
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 {
|
||||
__le16 headerChecksum;
|
||||
uint8_t freeEASpace[0];
|
||||
} __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_NON_ALLOC "*UDF Non-Allocatable Space"
|
||||
#define UDF_ID_POWER_CAL "*UDF Power Cal Table"
|
||||
#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_DOS 0x01U
|
||||
#define UDF_OS_CLASS_OS2 0x02U
|
||||
|
@ -270,6 +305,7 @@ struct freeAppEASpace {
|
|||
#define UDF_OS_ID_LINUX 0x05U
|
||||
#define UDF_OS_ID_MKLINUX 0x06U
|
||||
#define UDF_OS_ID_FREEBSD 0x07U
|
||||
#define UDF_OS_ID_NETBSD 0x08U
|
||||
#define UDF_OS_ID_WIN9X 0x00U
|
||||
#define UDF_OS_ID_WINNT 0x00U
|
||||
#define UDF_OS_ID_OS400 0x00U
|
||||
|
|
|
@ -767,20 +767,20 @@ static int udf_check_vsd(struct super_block *sb)
|
|||
static int udf_verify_domain_identifier(struct super_block *sb,
|
||||
struct regid *ident, char *dname)
|
||||
{
|
||||
struct domainEntityIDSuffix *suffix;
|
||||
struct domainIdentSuffix *suffix;
|
||||
|
||||
if (memcmp(ident->ident, UDF_ID_COMPLIANT, strlen(UDF_ID_COMPLIANT))) {
|
||||
udf_warn(sb, "Not OSTA UDF compliant %s descriptor.\n", dname);
|
||||
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",
|
||||
dname);
|
||||
goto force_ro;
|
||||
}
|
||||
suffix = (struct domainEntityIDSuffix *)ident->identSuffix;
|
||||
if (suffix->flags & (1 << ENTITYIDSUFFIX_FLAGS_HARDWRITEPROTECT) ||
|
||||
suffix->flags & (1 << ENTITYIDSUFFIX_FLAGS_SOFTWRITEPROTECT)) {
|
||||
suffix = (struct domainIdentSuffix *)ident->identSuffix;
|
||||
if ((suffix->domainFlags & DOMAIN_FLAGS_HARD_WRITE_PROTECT) ||
|
||||
(suffix->domainFlags & DOMAIN_FLAGS_SOFT_WRITE_PROTECT)) {
|
||||
if (!sb_rdonly(sb)) {
|
||||
udf_warn(sb, "Descriptor for %s marked write protected."
|
||||
" Forcing read only mount.\n", dname);
|
||||
|
@ -1035,7 +1035,6 @@ static int check_partition_desc(struct super_block *sb,
|
|||
switch (le32_to_cpu(p->accessType)) {
|
||||
case PD_ACCESS_TYPE_READ_ONLY:
|
||||
case PD_ACCESS_TYPE_WRITE_ONCE:
|
||||
case PD_ACCESS_TYPE_REWRITABLE:
|
||||
case PD_ACCESS_TYPE_NONE:
|
||||
goto force_ro;
|
||||
}
|
||||
|
@ -1063,7 +1062,8 @@ static int check_partition_desc(struct super_block *sb,
|
|||
goto force_ro;
|
||||
|
||||
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;
|
||||
|
||||
return 0;
|
||||
|
@ -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_bfree = udf_count_free(sb);
|
||||
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) +
|
||||
le32_to_cpu(lvidiu->numDirs)) : 0)
|
||||
+ buf->f_bfree;
|
||||
|
@ -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)
|
||||
{
|
||||
unsigned int accum = 0;
|
||||
struct udf_sb_info *sbi;
|
||||
struct udf_sb_info *sbi = UDF_SB(sb);
|
||||
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) {
|
||||
struct logicalVolIntegrityDesc *lvid =
|
||||
(struct logicalVolIntegrityDesc *)
|
||||
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(
|
||||
lvid->freeSpaceTable[sbi->s_partition]);
|
||||
lvid->freeSpaceTable[part]);
|
||||
if (accum == 0xFFFFFFFF)
|
||||
accum = 0;
|
||||
}
|
||||
|
@ -2511,7 +2527,7 @@ static unsigned int udf_count_free(struct super_block *sb)
|
|||
if (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) {
|
||||
accum += udf_count_free_bitmap(sb,
|
||||
map->s_uspace.s_bitmap);
|
||||
|
|
|
@ -241,7 +241,7 @@ int udf_truncate_extents(struct inode *inode)
|
|||
|
||||
while ((etype = udf_current_aext(inode, &epos, &eloc,
|
||||
&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);
|
||||
if (indirect_ext_len) {
|
||||
/* We managed to free all extents in the
|
||||
|
|
Loading…
Reference in New Issue