aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf')
-rw-r--r--fs/udf/balloc.c2
-rw-r--r--fs/udf/file.c35
-rw-r--r--fs/udf/inode.c13
-rw-r--r--fs/udf/super.c53
-rw-r--r--fs/udf/udftime.c8
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
79static int udf_adinicb_prepare_write(struct file *file, struct page *page, 79static 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
86static 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
103const struct address_space_operations udf_adinicb_aops = { 96const 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
111static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, 104static 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
136static int udf_prepare_write(struct file *file, struct page *page, 136static 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
142static sector_t udf_bmap(struct address_space *mapping, sector_t block) 145static 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
137static void init_once(void *foo, struct kmem_cache *cachep, unsigned long flags) 137static 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