Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci-2.6.23
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci-2.6.23
Commits
a0646a1f
Commit
a0646a1f
authored
Mar 23, 2006
by
Anton Altaparmakov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
NTFS: Add support for sparse files which have a compression unit of 0.
Signed-off-by:
Anton Altaparmakov
<
aia21@cantab.net
>
parent
949763b2
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
75 additions
and
38 deletions
+75
-38
fs/ntfs/ChangeLog
fs/ntfs/ChangeLog
+1
-0
fs/ntfs/attrib.c
fs/ntfs/attrib.c
+17
-8
fs/ntfs/inode.c
fs/ntfs/inode.c
+45
-23
fs/ntfs/layout.h
fs/ntfs/layout.h
+12
-7
No files found.
fs/ntfs/ChangeLog
View file @
a0646a1f
...
...
@@ -31,6 +31,7 @@ ToDo/Notes:
- Fix comparison of $MFT and $MFTMirr to not bail out when there are
unused, invalid mft records which are the same in both $MFT and
$MFTMirr.
- Add support for sparse files which have a compression unit of 0.
2.1.26 - Minor bug fixes and updates.
...
...
fs/ntfs/attrib.c
View file @
a0646a1f
...
...
@@ -1695,7 +1695,9 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni, const u32 data_size)
a
->
data
.
non_resident
.
initialized_size
=
cpu_to_sle64
(
attr_size
);
if
(
NInoSparse
(
ni
)
||
NInoCompressed
(
ni
))
{
a
->
data
.
non_resident
.
compression_unit
=
4
;
a
->
data
.
non_resident
.
compression_unit
=
0
;
if
(
NInoCompressed
(
ni
)
||
vol
->
major_ver
<
3
)
a
->
data
.
non_resident
.
compression_unit
=
4
;
a
->
data
.
non_resident
.
compressed_size
=
a
->
data
.
non_resident
.
allocated_size
;
}
else
...
...
@@ -1714,13 +1716,20 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni, const u32 data_size)
ni
->
allocated_size
=
new_size
;
if
(
NInoSparse
(
ni
)
||
NInoCompressed
(
ni
))
{
ni
->
itype
.
compressed
.
size
=
ni
->
allocated_size
;
ni
->
itype
.
compressed
.
block_size
=
1U
<<
(
a
->
data
.
non_resident
.
compression_unit
+
vol
->
cluster_size_bits
);
ni
->
itype
.
compressed
.
block_size_bits
=
ffs
(
ni
->
itype
.
compressed
.
block_size
)
-
1
;
ni
->
itype
.
compressed
.
block_clusters
=
1U
<<
a
->
data
.
non_resident
.
compression_unit
;
if
(
a
->
data
.
non_resident
.
compression_unit
)
{
ni
->
itype
.
compressed
.
block_size
=
1U
<<
(
a
->
data
.
non_resident
.
compression_unit
+
vol
->
cluster_size_bits
);
ni
->
itype
.
compressed
.
block_size_bits
=
ffs
(
ni
->
itype
.
compressed
.
block_size
)
-
1
;
ni
->
itype
.
compressed
.
block_clusters
=
1U
<<
a
->
data
.
non_resident
.
compression_unit
;
}
else
{
ni
->
itype
.
compressed
.
block_size
=
0
;
ni
->
itype
.
compressed
.
block_size_bits
=
0
;
ni
->
itype
.
compressed
.
block_clusters
=
0
;
}
vi
->
i_blocks
=
ni
->
itype
.
compressed
.
size
>>
9
;
}
else
vi
->
i_blocks
=
ni
->
allocated_size
>>
9
;
...
...
fs/ntfs/inode.c
View file @
a0646a1f
/**
* inode.c - NTFS kernel inode handling. Part of the Linux-NTFS project.
*
* Copyright (c) 2001-200
5
Anton Altaparmakov
* Copyright (c) 2001-200
6
Anton Altaparmakov
*
* This program/include file is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
...
...
@@ -24,8 +24,10 @@
#include <linux/smp_lock.h>
#include <linux/quotaops.h>
#include <linux/mount.h>
#include <linux/mutex.h>
#include "aops.h"
#include "attrib.h"
#include "dir.h"
#include "debug.h"
#include "inode.h"
...
...
@@ -1064,10 +1066,10 @@ skip_large_dir_stuff:
if
(
a
->
non_resident
)
{
NInoSetNonResident
(
ni
);
if
(
NInoCompressed
(
ni
)
||
NInoSparse
(
ni
))
{
if
(
a
->
data
.
non_resident
.
compression_unit
!=
4
)
{
if
(
NInoCompressed
(
ni
)
&&
a
->
data
.
non_resident
.
compression_unit
!=
4
)
{
ntfs_error
(
vi
->
i_sb
,
"Found "
"nonstandard "
"non
-
standard "
"compression unit (%u "
"instead of 4). "
"Cannot handle this."
,
...
...
@@ -1076,16 +1078,26 @@ skip_large_dir_stuff:
err
=
-
EOPNOTSUPP
;
goto
unm_err_out
;
}
ni
->
itype
.
compressed
.
block_clusters
=
1U
<<
a
->
data
.
non_resident
.
compression_unit
;
ni
->
itype
.
compressed
.
block_size
=
1U
<<
(
a
->
data
.
non_resident
.
compression_unit
+
vol
->
cluster_size_bits
);
ni
->
itype
.
compressed
.
block_size_bits
=
ffs
(
ni
->
itype
.
compressed
.
block_size
)
-
1
;
if
(
a
->
data
.
non_resident
.
compression_unit
)
{
ni
->
itype
.
compressed
.
block_size
=
1U
<<
(
a
->
data
.
non_resident
.
compression_unit
+
vol
->
cluster_size_bits
);
ni
->
itype
.
compressed
.
block_size_bits
=
ffs
(
ni
->
itype
.
compressed
.
block_size
)
-
1
;
ni
->
itype
.
compressed
.
block_clusters
=
1U
<<
a
->
data
.
non_resident
.
compression_unit
;
}
else
{
ni
->
itype
.
compressed
.
block_size
=
0
;
ni
->
itype
.
compressed
.
block_size_bits
=
0
;
ni
->
itype
.
compressed
.
block_clusters
=
0
;
}
ni
->
itype
.
compressed
.
size
=
sle64_to_cpu
(
a
->
data
.
non_resident
.
compressed_size
);
...
...
@@ -1338,8 +1350,9 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
goto
unm_err_out
;
}
if
(
NInoCompressed
(
ni
)
||
NInoSparse
(
ni
))
{
if
(
a
->
data
.
non_resident
.
compression_unit
!=
4
)
{
ntfs_error
(
vi
->
i_sb
,
"Found nonstandard "
if
(
NInoCompressed
(
ni
)
&&
a
->
data
.
non_resident
.
compression_unit
!=
4
)
{
ntfs_error
(
vi
->
i_sb
,
"Found non-standard "
"compression unit (%u instead "
"of 4). Cannot handle this."
,
a
->
data
.
non_resident
.
...
...
@@ -1347,13 +1360,22 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
err
=
-
EOPNOTSUPP
;
goto
unm_err_out
;
}
ni
->
itype
.
compressed
.
block_clusters
=
1U
<<
a
->
data
.
non_resident
.
compression_unit
;
ni
->
itype
.
compressed
.
block_size
=
1U
<<
(
a
->
data
.
non_resident
.
compression_unit
+
vol
->
cluster_size_bits
);
ni
->
itype
.
compressed
.
block_size_bits
=
ffs
(
ni
->
itype
.
compressed
.
block_size
)
-
1
;
if
(
a
->
data
.
non_resident
.
compression_unit
)
{
ni
->
itype
.
compressed
.
block_size
=
1U
<<
(
a
->
data
.
non_resident
.
compression_unit
+
vol
->
cluster_size_bits
);
ni
->
itype
.
compressed
.
block_size_bits
=
ffs
(
ni
->
itype
.
compressed
.
block_size
)
-
1
;
ni
->
itype
.
compressed
.
block_clusters
=
1U
<<
a
->
data
.
non_resident
.
compression_unit
;
}
else
{
ni
->
itype
.
compressed
.
block_size
=
0
;
ni
->
itype
.
compressed
.
block_size_bits
=
0
;
ni
->
itype
.
compressed
.
block_clusters
=
0
;
}
ni
->
itype
.
compressed
.
size
=
sle64_to_cpu
(
a
->
data
.
non_resident
.
compressed_size
);
}
...
...
fs/ntfs/layout.h
View file @
a0646a1f
...
...
@@ -769,7 +769,7 @@ typedef struct {
compressed. (This effectively limits the
compression unit size to be a power of two
clusters.) WinNT4 only uses a value of 4.
Sparse files
also have this set to 4
. */
Sparse files
have this set to 0 on XPSP2
. */
/* 35*/
u8
reserved
[
5
];
/* Align to 8-byte boundary. */
/* The sizes below are only used when lowest_vcn is zero, as otherwise it would
be difficult to keep them up-to-date.*/
...
...
@@ -1076,16 +1076,21 @@ typedef struct {
/* 20*/
sle64
last_access_time
;
/* Time this mft record was last
accessed. */
/* 28*/
sle64
allocated_size
;
/* Byte size of on-disk allocated space
for the
data attribute. So for
normal $DATA, this is the
for the
unnamed data attribute. So
for
normal $DATA, this is the
allocated_size from the unnamed
$DATA attribute and for compressed
and/or sparse $DATA, this is the
compressed_size from the unnamed
$DATA attribute. NOTE: This is a
multiple of the cluster size. */
/* 30*/
sle64
data_size
;
/* Byte size of actual data in data
attribute. */
$DATA attribute. For a directory or
other inode without an unnamed $DATA
attribute, this is always 0. NOTE:
This is a multiple of the cluster
size. */
/* 30*/
sle64
data_size
;
/* Byte size of actual data in unnamed
data attribute. For a directory or
other inode without an unnamed $DATA
attribute, this is always 0. */
/* 38*/
FILE_ATTR_FLAGS
file_attributes
;
/* Flags describing the file. */
/* 3c*/
union
{
/* 3c*/
struct
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment