diff options
Diffstat (limited to 'fs/udf')
-rw-r--r-- | fs/udf/balloc.c | 2 | ||||
-rw-r--r-- | fs/udf/file.c | 35 | ||||
-rw-r--r-- | fs/udf/inode.c | 13 | ||||
-rw-r--r-- | fs/udf/super.c | 53 | ||||
-rw-r--r-- | fs/udf/udftime.c | 8 |
5 files changed, 47 insertions, 64 deletions
diff --git a/fs/udf/balloc.c b/fs/udf/balloc.c index 87e87dcd3f..ab26176f6b 100644 --- a/fs/udf/balloc.c +++ b/fs/udf/balloc.c | |||
@@ -689,7 +689,7 @@ static int udf_table_new_block(struct super_block *sb, | |||
689 | uint32_t spread = 0xFFFFFFFF, nspread = 0xFFFFFFFF; | 689 | uint32_t spread = 0xFFFFFFFF, nspread = 0xFFFFFFFF; |
690 | uint32_t newblock = 0, adsize; | 690 | uint32_t newblock = 0, adsize; |
691 | uint32_t elen, goal_elen = 0; | 691 | uint32_t elen, goal_elen = 0; |
692 | kernel_lb_addr eloc, goal_eloc; | 692 | kernel_lb_addr eloc, uninitialized_var(goal_eloc); |
693 | struct extent_position epos, goal_epos; | 693 | struct extent_position epos, goal_epos; |
694 | int8_t etype; | 694 | int8_t etype; |
695 | 695 | ||
diff --git a/fs/udf/file.c b/fs/udf/file.c index 5d7a4ea277..7c7a1b39d5 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
@@ -76,36 +76,29 @@ static int udf_adinicb_writepage(struct page *page, struct writeback_control *wb | |||
76 | return 0; | 76 | return 0; |
77 | } | 77 | } |
78 | 78 | ||
79 | static int udf_adinicb_prepare_write(struct file *file, struct page *page, | 79 | static int udf_adinicb_write_end(struct file *file, |
80 | unsigned offset, unsigned to) | 80 | struct address_space *mapping, |
81 | loff_t pos, unsigned len, unsigned copied, | ||
82 | struct page *page, void *fsdata) | ||
81 | { | 83 | { |
82 | kmap(page); | 84 | struct inode *inode = mapping->host; |
83 | return 0; | 85 | unsigned offset = pos & (PAGE_CACHE_SIZE - 1); |
84 | } | 86 | char *kaddr; |
85 | |||
86 | static int udf_adinicb_commit_write(struct file *file, struct page *page, | ||
87 | unsigned offset, unsigned to) | ||
88 | { | ||
89 | struct inode *inode = page->mapping->host; | ||
90 | char *kaddr = page_address(page); | ||
91 | 87 | ||
88 | kaddr = kmap_atomic(page, KM_USER0); | ||
92 | memcpy(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + offset, | 89 | memcpy(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + offset, |
93 | kaddr + offset, to - offset); | 90 | kaddr + offset, copied); |
94 | mark_inode_dirty(inode); | 91 | kunmap_atomic(kaddr, KM_USER0); |
95 | SetPageUptodate(page); | 92 | |
96 | kunmap(page); | 93 | return simple_write_end(file, mapping, pos, len, copied, page, fsdata); |
97 | /* only one page here */ | ||
98 | if (to > inode->i_size) | ||
99 | inode->i_size = to; | ||
100 | return 0; | ||
101 | } | 94 | } |
102 | 95 | ||
103 | const struct address_space_operations udf_adinicb_aops = { | 96 | const struct address_space_operations udf_adinicb_aops = { |
104 | .readpage = udf_adinicb_readpage, | 97 | .readpage = udf_adinicb_readpage, |
105 | .writepage = udf_adinicb_writepage, | 98 | .writepage = udf_adinicb_writepage, |
106 | .sync_page = block_sync_page, | 99 | .sync_page = block_sync_page, |
107 | .prepare_write = udf_adinicb_prepare_write, | 100 | .write_begin = simple_write_begin, |
108 | .commit_write = udf_adinicb_commit_write, | 101 | .write_end = udf_adinicb_write_end, |
109 | }; | 102 | }; |
110 | 103 | ||
111 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | 104 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 1652b2c665..6ff8151984 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -133,10 +133,13 @@ static int udf_readpage(struct file *file, struct page *page) | |||
133 | return block_read_full_page(page, udf_get_block); | 133 | return block_read_full_page(page, udf_get_block); |
134 | } | 134 | } |
135 | 135 | ||
136 | static int udf_prepare_write(struct file *file, struct page *page, | 136 | static int udf_write_begin(struct file *file, struct address_space *mapping, |
137 | unsigned from, unsigned to) | 137 | loff_t pos, unsigned len, unsigned flags, |
138 | struct page **pagep, void **fsdata) | ||
138 | { | 139 | { |
139 | return block_prepare_write(page, from, to, udf_get_block); | 140 | *pagep = NULL; |
141 | return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata, | ||
142 | udf_get_block); | ||
140 | } | 143 | } |
141 | 144 | ||
142 | static sector_t udf_bmap(struct address_space *mapping, sector_t block) | 145 | static sector_t udf_bmap(struct address_space *mapping, sector_t block) |
@@ -148,8 +151,8 @@ const struct address_space_operations udf_aops = { | |||
148 | .readpage = udf_readpage, | 151 | .readpage = udf_readpage, |
149 | .writepage = udf_writepage, | 152 | .writepage = udf_writepage, |
150 | .sync_page = block_sync_page, | 153 | .sync_page = block_sync_page, |
151 | .prepare_write = udf_prepare_write, | 154 | .write_begin = udf_write_begin, |
152 | .commit_write = generic_commit_write, | 155 | .write_end = generic_write_end, |
153 | .bmap = udf_bmap, | 156 | .bmap = udf_bmap, |
154 | }; | 157 | }; |
155 | 158 | ||
diff --git a/fs/udf/super.c b/fs/udf/super.c index c68a6e730b..4360c7a057 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -134,7 +134,7 @@ static void udf_destroy_inode(struct inode *inode) | |||
134 | kmem_cache_free(udf_inode_cachep, UDF_I(inode)); | 134 | kmem_cache_free(udf_inode_cachep, UDF_I(inode)); |
135 | } | 135 | } |
136 | 136 | ||
137 | static void init_once(void *foo, struct kmem_cache *cachep, unsigned long flags) | 137 | static void init_once(struct kmem_cache *cachep, void *foo) |
138 | { | 138 | { |
139 | struct udf_inode_info *ei = (struct udf_inode_info *)foo; | 139 | struct udf_inode_info *ei = (struct udf_inode_info *)foo; |
140 | 140 | ||
@@ -913,8 +913,7 @@ static int udf_load_partdesc(struct super_block *sb, struct buffer_head *bh) | |||
913 | UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table = | 913 | UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table = |
914 | udf_iget(sb, loc); | 914 | udf_iget(sb, loc); |
915 | if (!UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table) { | 915 | if (!UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table) { |
916 | udf_debug("cannot load unallocSpaceTable (part %d)\n", | 916 | udf_debug("cannot load unallocSpaceTable (part %d)\n", i); |
917 | i); | ||
918 | return 1; | 917 | return 1; |
919 | } | 918 | } |
920 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_TABLE; | 919 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_TABLE; |
@@ -944,8 +943,7 @@ static int udf_load_partdesc(struct super_block *sb, struct buffer_head *bh) | |||
944 | UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table = | 943 | UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table = |
945 | udf_iget(sb, loc); | 944 | udf_iget(sb, loc); |
946 | if (!UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table) { | 945 | if (!UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table) { |
947 | udf_debug("cannot load freedSpaceTable (part %d)\n", | 946 | udf_debug("cannot load freedSpaceTable (part %d)\n", i); |
948 | i); | ||
949 | return 1; | 947 | return 1; |
950 | } | 948 | } |
951 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_TABLE; | 949 | UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_TABLE; |
@@ -1293,19 +1291,16 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) | |||
1293 | 1291 | ||
1294 | if (!UDF_SB_LASTBLOCK(sb)) { | 1292 | if (!UDF_SB_LASTBLOCK(sb)) { |
1295 | udf_debug("Unable to determine Lastblock (For " | 1293 | udf_debug("Unable to determine Lastblock (For " |
1296 | "Virtual Partition)\n"); | 1294 | "Virtual Partition)\n"); |
1297 | return 1; | 1295 | return 1; |
1298 | } | 1296 | } |
1299 | 1297 | ||
1300 | for (j = 0; j < UDF_SB_NUMPARTS(sb); j++) { | 1298 | for (j = 0; j < UDF_SB_NUMPARTS(sb); j++) { |
1301 | if (j != i && UDF_SB_PARTVSN(sb, i) == | 1299 | if (j != i && |
1302 | UDF_SB_PARTVSN(sb, j) && | 1300 | UDF_SB_PARTVSN(sb, i) == UDF_SB_PARTVSN(sb, j) && |
1303 | UDF_SB_PARTNUM(sb, i) == | 1301 | UDF_SB_PARTNUM(sb, i) == UDF_SB_PARTNUM(sb, j)) { |
1304 | UDF_SB_PARTNUM(sb, j)) { | ||
1305 | ino.partitionReferenceNum = j; | 1302 | ino.partitionReferenceNum = j; |
1306 | ino.logicalBlockNum = | 1303 | ino.logicalBlockNum = UDF_SB_LASTBLOCK(sb) - UDF_SB_PARTROOT(sb, j); |
1307 | UDF_SB_LASTBLOCK(sb) - | ||
1308 | UDF_SB_PARTROOT(sb, j); | ||
1309 | break; | 1304 | break; |
1310 | } | 1305 | } |
1311 | } | 1306 | } |
@@ -1318,9 +1313,9 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) | |||
1318 | 1313 | ||
1319 | if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP15) { | 1314 | if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP15) { |
1320 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = | 1315 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = |
1321 | udf_ext0_offset(UDF_SB_VAT(sb)); | 1316 | udf_ext0_offset(UDF_SB_VAT(sb)); |
1322 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = | 1317 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = |
1323 | (UDF_SB_VAT(sb)->i_size - 36) >> 2; | 1318 | (UDF_SB_VAT(sb)->i_size - 36) >> 2; |
1324 | } else if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP20) { | 1319 | } else if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP20) { |
1325 | struct buffer_head *bh = NULL; | 1320 | struct buffer_head *bh = NULL; |
1326 | uint32_t pos; | 1321 | uint32_t pos; |
@@ -1330,19 +1325,15 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) | |||
1330 | if (!bh) | 1325 | if (!bh) |
1331 | return 1; | 1326 | return 1; |
1332 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = | 1327 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = |
1333 | le16_to_cpu(((struct | 1328 | le16_to_cpu(((struct virtualAllocationTable20 *)bh->b_data + |
1334 | virtualAllocationTable20 *)bh->b_data + | 1329 | udf_ext0_offset(UDF_SB_VAT(sb)))->lengthHeader) + |
1335 | udf_ext0_offset(UDF_SB_VAT(sb)))-> | 1330 | udf_ext0_offset(UDF_SB_VAT(sb)); |
1336 | lengthHeader) + | 1331 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = (UDF_SB_VAT(sb)->i_size - |
1337 | udf_ext0_offset(UDF_SB_VAT(sb)); | 1332 | UDF_SB_TYPEVIRT(sb, i).s_start_offset) >> 2; |
1338 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = | ||
1339 | (UDF_SB_VAT(sb)->i_size - | ||
1340 | UDF_SB_TYPEVIRT(sb, i).s_start_offset) >> 2; | ||
1341 | brelse(bh); | 1333 | brelse(bh); |
1342 | } | 1334 | } |
1343 | UDF_SB_PARTROOT(sb, i) = udf_get_pblock(sb, 0, i, 0); | 1335 | UDF_SB_PARTROOT(sb, i) = udf_get_pblock(sb, 0, i, 0); |
1344 | UDF_SB_PARTLEN(sb, i) = UDF_SB_PARTLEN(sb, | 1336 | UDF_SB_PARTLEN(sb, i) = UDF_SB_PARTLEN(sb, ino.partitionReferenceNum); |
1345 | ino.partitionReferenceNum); | ||
1346 | } | 1337 | } |
1347 | } | 1338 | } |
1348 | return 0; | 1339 | return 0; |
@@ -1357,21 +1348,17 @@ static void udf_open_lvid(struct super_block *sb) | |||
1357 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; | 1348 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; |
1358 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | 1349 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; |
1359 | if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) | 1350 | if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) |
1360 | UDF_SB_LVID(sb)->recordingDateAndTime = | 1351 | UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time); |
1361 | cpu_to_lets(cpu_time); | ||
1362 | UDF_SB_LVID(sb)->integrityType = LVID_INTEGRITY_TYPE_OPEN; | 1352 | UDF_SB_LVID(sb)->integrityType = LVID_INTEGRITY_TYPE_OPEN; |
1363 | 1353 | ||
1364 | UDF_SB_LVID(sb)->descTag.descCRC = | 1354 | UDF_SB_LVID(sb)->descTag.descCRC = cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag), |
1365 | cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag), | 1355 | le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0)); |
1366 | le16_to_cpu(UDF_SB_LVID(sb)->descTag. | ||
1367 | descCRCLength), 0)); | ||
1368 | 1356 | ||
1369 | UDF_SB_LVID(sb)->descTag.tagChecksum = 0; | 1357 | UDF_SB_LVID(sb)->descTag.tagChecksum = 0; |
1370 | for (i = 0; i < 16; i++) | 1358 | for (i = 0; i < 16; i++) |
1371 | if (i != 4) | 1359 | if (i != 4) |
1372 | UDF_SB_LVID(sb)->descTag.tagChecksum += | 1360 | UDF_SB_LVID(sb)->descTag.tagChecksum += |
1373 | ((uint8_t *) & | 1361 | ((uint8_t *) &(UDF_SB_LVID(sb)->descTag))[i]; |
1374 | (UDF_SB_LVID(sb)->descTag))[i]; | ||
1375 | 1362 | ||
1376 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 1363 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); |
1377 | } | 1364 | } |
diff --git a/fs/udf/udftime.c b/fs/udf/udftime.c index 3fd80eb66a..adcb87c2da 100644 --- a/fs/udf/udftime.c +++ b/fs/udf/udftime.c | |||
@@ -108,10 +108,10 @@ time_t *udf_stamp_to_time(time_t *dest, long *dest_usec, kernel_timestamp src) | |||
108 | *dest = year_seconds[src.year - EPOCH_YEAR]; | 108 | *dest = year_seconds[src.year - EPOCH_YEAR]; |
109 | *dest -= offset * 60; | 109 | *dest -= offset * 60; |
110 | 110 | ||
111 | yday = ((__mon_yday[__isleap (src.year)] | 111 | yday = ((__mon_yday[__isleap(src.year)][src.month - 1]) + src.day - 1); |
112 | [src.month - 1]) + (src.day - 1)); | 112 | *dest += (((yday * 24) + src.hour) * 60 + src.minute) * 60 + src.second; |
113 | *dest += ( ( (yday * 24) + src.hour ) * 60 + src.minute ) * 60 + src.second; | 113 | *dest_usec = src.centiseconds * 10000 + |
114 | *dest_usec = src.centiseconds * 10000 + src.hundredsOfMicroseconds * 100 + src.microseconds; | 114 | src.hundredsOfMicroseconds * 100 + src.microseconds; |
115 | return dest; | 115 | return dest; |
116 | } | 116 | } |
117 | 117 | ||