udf: Init/maintain file entry checkpoint field
authorSteve Nickel <snickel58@gmail.com>
Tue, 14 Feb 2012 05:28:42 +0000 (00:28 -0500)
committerJan Kara <jack@suse.cz>
Wed, 29 Feb 2012 20:53:46 +0000 (21:53 +0100)
In accordance with ECMA 1.67 Part 4, 14.9.15, the checkpoint field
should be initialized to 1 at creation. (Zero is *not* a valid value.)

Signed-off-by: Steven P. Nickel <snickel@focusinfo.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/ialloc.c
fs/udf/inode.c
fs/udf/udf_i.h

index 05ab481..7e5aae4 100644 (file)
@@ -116,6 +116,7 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)
        iinfo->i_lenEAttr = 0;
        iinfo->i_lenAlloc = 0;
        iinfo->i_use = 0;
+       iinfo->i_checkpoint = 1;
        if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_AD_IN_ICB))
                iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
        else if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
index 7699df7..91c6f23 100644 (file)
@@ -1358,6 +1358,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
                iinfo->i_unique = le64_to_cpu(fe->uniqueID);
                iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
                iinfo->i_lenAlloc = le32_to_cpu(fe->lengthAllocDescs);
+               iinfo->i_checkpoint = le32_to_cpu(fe->checkpoint);
                offset = sizeof(struct fileEntry) + iinfo->i_lenEAttr;
        } else {
                inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
@@ -1379,6 +1380,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
                iinfo->i_unique = le64_to_cpu(efe->uniqueID);
                iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr);
                iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs);
+               iinfo->i_checkpoint = le32_to_cpu(efe->checkpoint);
                offset = sizeof(struct extendedFileEntry) +
                                                        iinfo->i_lenEAttr;
        }
@@ -1607,6 +1609,7 @@ static int udf_update_inode(struct inode *inode, int do_sync)
                fe->uniqueID = cpu_to_le64(iinfo->i_unique);
                fe->lengthExtendedAttr = cpu_to_le32(iinfo->i_lenEAttr);
                fe->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc);
+               fe->checkpoint = cpu_to_le32(iinfo->i_checkpoint);
                fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE);
                crclen = sizeof(struct fileEntry);
        } else {
@@ -1646,6 +1649,7 @@ static int udf_update_inode(struct inode *inode, int do_sync)
                efe->uniqueID = cpu_to_le64(iinfo->i_unique);
                efe->lengthExtendedAttr = cpu_to_le32(iinfo->i_lenEAttr);
                efe->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc);
+               efe->checkpoint = cpu_to_le32(iinfo->i_checkpoint);
                efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE);
                crclen = sizeof(struct extendedFileEntry);
        }
index d1bd31e..bb8309d 100644 (file)
@@ -23,6 +23,7 @@ struct udf_inode_info {
        __u64                   i_lenExtents;
        __u32                   i_next_alloc_block;
        __u32                   i_next_alloc_goal;
+       __u32                   i_checkpoint;
        unsigned                i_alloc_type : 3;
        unsigned                i_efe : 1;      /* extendedFileEntry */
        unsigned                i_use : 1;      /* unallocSpaceEntry */