Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
c9dba577
Commit
c9dba577
authored
Apr 26, 2004
by
Anton Altaparmakov
Browse files
Options
Browse Files
Download
Plain Diff
Merge cantab.net:/home/src/bklinux-2.6
into cantab.net:/home/src/ntfs-2.6
parents
09b9f933
0de89e24
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
260 additions
and
136 deletions
+260
-136
fs/ntfs/ChangeLog
fs/ntfs/ChangeLog
+19
-0
fs/ntfs/Makefile
fs/ntfs/Makefile
+2
-2
fs/ntfs/compress.c
fs/ntfs/compress.c
+6
-7
fs/ntfs/inode.c
fs/ntfs/inode.c
+9
-66
fs/ntfs/inode.h
fs/ntfs/inode.h
+44
-9
fs/ntfs/mft.h
fs/ntfs/mft.h
+9
-6
fs/ntfs/ntfs.h
fs/ntfs/ntfs.h
+1
-6
fs/ntfs/super.c
fs/ntfs/super.c
+60
-34
fs/ntfs/time.h
fs/ntfs/time.h
+100
-0
fs/ntfs/volume.h
fs/ntfs/volume.h
+10
-6
No files found.
fs/ntfs/ChangeLog
View file @
c9dba577
...
...
@@ -19,6 +19,25 @@ ToDo:
sufficient for synchronisation here. We then just need to make sure
ntfs_readpage/writepage/truncate interoperate properly with us.
2.1.8-WIP
- Use get_bh() instead of manual atomic_inc() in fs/ntfs/compress.c.
- Modify fs/ntfs/time.c::ntfs2utc(), get_current_ntfs_time(), and
utc2ntfs() to work with struct timespec instead of time_t on the
Linux UTC time side thus preserving the full precision of the NTFS
time and only loosing up to 99 nano-seconds in the Linux UTC time.
- Move fs/ntfs/time.c to fs/ntfs/time.h and make the time functions
static inline.
- Remove unused ntfs_dirty_inode().
- Cleanup super operations declaration in fs/ntfs/super.c.
- Wrap flush_dcache_mft_record_page() in #ifdef NTFS_RW.
- Add NInoTestSetFoo() and NInoTestClearFoo() macro magic to
fs/ntfs/inode.h and use it to declare NInoTest{Set,Clear}Dirty.
- Move typedefs for ntfs_attr and test_t from fs/ntfs/inode.c to
fs/ntfs/inode.h so they can be used elsewhere.
- Determine the mft mirror size as the number of mirrored mft records
and store it in ntfs_volume->mftmirr_size (fs/ntfs/super.c).
2.1.7 - Enable NFS exporting of mounted NTFS volumes.
- Set i_generation in the VFS inode from the seq_no of the NTFS inode.
...
...
fs/ntfs/Makefile
View file @
c9dba577
...
...
@@ -3,9 +3,9 @@
obj-$(CONFIG_NTFS_FS)
+=
ntfs.o
ntfs-objs
:=
aops.o attrib.o compress.o debug.o dir.o file.o inode.o mft.o
\
mst.o namei.o super.o sysctl.o
time.o
unistr.o upcase.o
mst.o namei.o super.o sysctl.o unistr.o upcase.o
EXTRA_CFLAGS
=
-DNTFS_VERSION
=
\"
2.1.
7
\"
EXTRA_CFLAGS
=
-DNTFS_VERSION
=
\"
2.1.
8-WIP
\"
ifeq
($(CONFIG_NTFS_DEBUG),y)
EXTRA_CFLAGS
+=
-DDEBUG
...
...
fs/ntfs/compress.c
View file @
c9dba577
...
...
@@ -2,7 +2,7 @@
* compress.c - NTFS kernel compressed attributes handling.
* Part of the Linux-NTFS project.
*
* Copyright (c) 2001-200
3
Anton Altaparmakov
* Copyright (c) 2001-200
4
Anton Altaparmakov
* Copyright (c) 2002 Richard Russon
*
* This program/include file is free software; you can redistribute it and/or
...
...
@@ -10,13 +10,13 @@
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (in the main directory of the Linux-NTFS
* along with this program (in the main directory of the Linux-NTFS
* distribution in the file COPYING); if not, write to the Free Software
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
...
...
@@ -357,7 +357,7 @@ static int ntfs_decompress(struct page *dest_pages[], int *dest_index,
continue
;
}
/*
/*
* We have a phrase token. Make sure it is not the first tag in
* the sb as this is illegal and would confuse the code below.
*/
...
...
@@ -643,7 +643,7 @@ int ntfs_read_compressed_block(struct page *page)
unlock_buffer
(
tbh
);
continue
;
}
atomic_inc
(
&
tbh
->
b_count
);
get_bh
(
tbh
);
tbh
->
b_end_io
=
end_buffer_read_sync
;
submit_bh
(
READ
,
tbh
);
}
...
...
@@ -943,4 +943,3 @@ int ntfs_read_compressed_block(struct page *page)
kfree
(
pages
);
return
-
EIO
;
}
fs/ntfs/inode.c
View file @
c9dba577
...
...
@@ -8,13 +8,13 @@
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (in the main directory of the Linux-NTFS
* along with this program (in the main directory of the Linux-NTFS
* distribution in the file COPYING); if not, write to the Free Software
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
...
...
@@ -29,26 +29,7 @@
#include "dir.h"
#include "inode.h"
#include "attrib.h"
/**
* ntfs_attr - ntfs in memory attribute structure
* @mft_no: mft record number of the base mft record of this attribute
* @name: Unicode name of the attribute (NULL if unnamed)
* @name_len: length of @name in Unicode characters (0 if unnamed)
* @type: attribute type (see layout.h)
*
* This structure exists only to provide a small structure for the
* ntfs_{attr_}iget()/ntfs_test_inode()/ntfs_init_locked_inode() mechanism.
*
* NOTE: Elements are ordered by size to make the structure as compact as
* possible on all architectures.
*/
typedef
struct
{
unsigned
long
mft_no
;
uchar_t
*
name
;
u32
name_len
;
ATTR_TYPES
type
;
}
ntfs_attr
;
#include "time.h"
/**
* ntfs_test_inode - compare two (possibly fake) inodes for equality
...
...
@@ -66,7 +47,7 @@ typedef struct {
* NOTE: This function runs with the inode_lock spin lock held so it is not
* allowed to sleep.
*/
static
int
ntfs_test_inode
(
struct
inode
*
vi
,
ntfs_attr
*
na
)
int
ntfs_test_inode
(
struct
inode
*
vi
,
ntfs_attr
*
na
)
{
ntfs_inode
*
ni
;
...
...
@@ -150,7 +131,6 @@ static int ntfs_init_locked_inode(struct inode *vi, ntfs_attr *na)
return
0
;
}
typedef
int
(
*
test_t
)(
struct
inode
*
,
void
*
);
typedef
int
(
*
set_t
)(
struct
inode
*
,
void
*
);
static
int
ntfs_read_locked_inode
(
struct
inode
*
vi
);
static
int
ntfs_read_locked_attr_inode
(
struct
inode
*
base_vi
,
struct
inode
*
vi
);
...
...
@@ -380,7 +360,7 @@ inline ntfs_inode *ntfs_new_extent_inode(struct super_block *sb,
* Search all file name attributes in the inode described by the attribute
* search context @ctx and check if any of the names are in the $Extend system
* directory.
*
*
* Return values:
* 1: file is in $Extend directory
* 0: file is not in $Extend directory
...
...
@@ -590,21 +570,18 @@ static int ntfs_read_locked_inode(struct inode *vi)
* mtime is the last change of the data within the file. Not changed
* when only metadata is changed, e.g. a rename doesn't affect mtime.
*/
vi
->
i_mtime
.
tv_sec
=
ntfs2utc
(
si
->
last_data_change_time
);
vi
->
i_mtime
.
tv_nsec
=
0
;
vi
->
i_mtime
=
ntfs2utc
(
si
->
last_data_change_time
);
/*
* ctime is the last change of the metadata of the file. This obviously
* always changes, when mtime is changed. ctime can be changed on its
* own, mtime is then not changed, e.g. when a file is renamed.
*/
vi
->
i_ctime
.
tv_sec
=
ntfs2utc
(
si
->
last_mft_change_time
);
vi
->
i_ctime
.
tv_nsec
=
0
;
vi
->
i_ctime
=
ntfs2utc
(
si
->
last_mft_change_time
);
/*
* Last access to the data within the file. Not changed during a rename
* for example but changed whenever the file is written to.
*/
vi
->
i_atime
.
tv_sec
=
ntfs2utc
(
si
->
last_access_time
);
vi
->
i_atime
.
tv_nsec
=
0
;
vi
->
i_atime
=
ntfs2utc
(
si
->
last_access_time
);
/* Find the attribute list attribute if present. */
reinit_attr_search_ctx
(
ctx
);
...
...
@@ -1738,39 +1715,6 @@ void ntfs_read_inode_mount(struct inode *vi)
goto
out_now
;
}
/**
* ntfs_dirty_inode - mark the inode's metadata dirty
* @vi: inode to mark dirty
*
* This is called from fs/inode.c::__mark_inode_dirty(), when the inode itself
* is being marked dirty. An example is when update_atime() is invoked.
*
* We mark the inode dirty by setting both the page in which the mft record
* resides and the buffer heads in that page which correspond to the mft record
* dirty. This ensures that the changes will eventually be propagated to disk
* when the inode is set dirty.
*
* FIXME: Can we do that with the buffer heads? I am not too sure. Because if we
* do that we need to make sure that the kernel will not write out those buffer
* heads or we are screwed as it will write corrupt data to disk. The only way
* a mft record can be written correctly is by mst protecting it, writting it
* synchronously and fast mst deprotecting it. During this period, obviously,
* the mft record must be marked as not uptodate, be locked for writing or
* whatever, so that nobody attempts anything stupid.
*
* FIXME: Do we need to check that the fs is not mounted read only? And what
* about the inode? Anything else?
*
* FIXME: As we are only a read only driver it is safe to just return here for
* the moment.
*/
void
ntfs_dirty_inode
(
struct
inode
*
vi
)
{
ntfs_debug
(
"Entering for inode 0x%lx."
,
vi
->
i_ino
);
NInoSetDirty
(
NTFS_I
(
vi
));
return
;
}
/**
* ntfs_commit_inode - write out a dirty inode
* @ni: inode to write out
...
...
@@ -2029,4 +1973,3 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
}
#endif
fs/ntfs/inode.h
View file @
c9dba577
...
...
@@ -2,7 +2,7 @@
* inode.h - Defines for inode structures NTFS Linux kernel driver. Part of
* the Linux-NTFS project.
*
* Copyright (c) 2001-200
3
Anton Altaparmakov
* Copyright (c) 2001-200
4
Anton Altaparmakov
* Copyright (c) 2002 Richard Russon
*
* This program/include file is free software; you can redistribute it and/or
...
...
@@ -10,13 +10,13 @@
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (in the main directory of the Linux-NTFS
* along with this program (in the main directory of the Linux-NTFS
* distribution in the file COPYING); if not, write to the Free Software
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
...
...
@@ -181,8 +181,22 @@ static inline void NInoClear##flag(ntfs_inode *ni) \
clear_bit(NI_##flag, &(ni)->state); \
}
/*
* As above for NInoTestSetFoo() and NInoTestClearFoo().
*/
#define TAS_NINO_FNS(flag) \
static inline int NInoTestSet##flag(ntfs_inode *ni) \
{ \
return test_and_set_bit(NI_##flag, &(ni)->state); \
} \
static inline int NInoTestClear##flag(ntfs_inode *ni) \
{ \
return test_and_clear_bit(NI_##flag, &(ni)->state); \
}
/* Emit the ntfs inode bitops functions. */
NINO_FNS
(
Dirty
)
TAS_NINO_FNS
(
Dirty
)
NINO_FNS
(
AttrList
)
NINO_FNS
(
AttrListNonResident
)
NINO_FNS
(
Attr
)
...
...
@@ -219,6 +233,30 @@ static inline struct inode *VFS_I(ntfs_inode *ni)
return
&
((
big_ntfs_inode
*
)
ni
)
->
vfs_inode
;
}
/**
* ntfs_attr - ntfs in memory attribute structure
* @mft_no: mft record number of the base mft record of this attribute
* @name: Unicode name of the attribute (NULL if unnamed)
* @name_len: length of @name in Unicode characters (0 if unnamed)
* @type: attribute type (see layout.h)
*
* This structure exists only to provide a small structure for the
* ntfs_{attr_}iget()/ntfs_test_inode()/ntfs_init_locked_inode() mechanism.
*
* NOTE: Elements are ordered by size to make the structure as compact as
* possible on all architectures.
*/
typedef
struct
{
unsigned
long
mft_no
;
uchar_t
*
name
;
u32
name_len
;
ATTR_TYPES
type
;
}
ntfs_attr
;
typedef
int
(
*
test_t
)(
struct
inode
*
,
void
*
);
extern
int
ntfs_test_inode
(
struct
inode
*
vi
,
ntfs_attr
*
na
);
extern
struct
inode
*
ntfs_iget
(
struct
super_block
*
sb
,
unsigned
long
mft_no
);
extern
struct
inode
*
ntfs_attr_iget
(
struct
inode
*
base_vi
,
ATTR_TYPES
type
,
uchar_t
*
name
,
u32
name_len
);
...
...
@@ -233,8 +271,6 @@ extern void ntfs_clear_extent_inode(ntfs_inode *ni);
extern
void
ntfs_read_inode_mount
(
struct
inode
*
vi
);
extern
void
ntfs_dirty_inode
(
struct
inode
*
vi
);
extern
void
ntfs_put_inode
(
struct
inode
*
vi
);
extern
int
ntfs_show_options
(
struct
seq_file
*
sf
,
struct
vfsmount
*
mnt
);
...
...
@@ -245,7 +281,6 @@ extern void ntfs_truncate(struct inode *vi);
extern
int
ntfs_setattr
(
struct
dentry
*
dentry
,
struct
iattr
*
attr
);
#endif
#endif
/* _LINUX_NTFS_FS_INODE_H */
#endif
/* NTFS_RW */
#endif
/* _LINUX_NTFS_INODE_H */
fs/ntfs/mft.h
View file @
c9dba577
...
...
@@ -2,20 +2,20 @@
* mft.h - Defines for mft record handling in NTFS Linux kernel driver.
* Part of the Linux-NTFS project.
*
* Copyright (c) 2001
,2002
Anton Altaparmakov.
* Copyright (c) 2001
-2004
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
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (in the main directory of the Linux-NTFS
* along with this program (in the main directory of the Linux-NTFS
* distribution in the file COPYING); if not, write to the Free Software
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
...
...
@@ -43,7 +43,9 @@ static inline void unmap_extent_mft_record(ntfs_inode *ni)
return
;
}
/*
#ifdef NTFS_RW
/**
* flush_dcache_mft_record_page - flush_dcache_page() for mft records
* @ni: ntfs inode structure of mft record
*
...
...
@@ -57,5 +59,6 @@ static inline void flush_dcache_mft_record_page(ntfs_inode *ni)
flush_dcache_page
(
ni
->
page
);
}
#endif
/*
_LINUX_NTFS_MFT_H
*/
#endif
/*
NTFS_RW
*/
#endif
/* _LINUX_NTFS_MFT_H */
fs/ntfs/ntfs.h
View file @
c9dba577
...
...
@@ -2,7 +2,7 @@
* ntfs.h - Defines for NTFS Linux kernel driver. Part of the Linux-NTFS
* project.
*
* Copyright (c) 2001
,2002
Anton Altaparmakov.
* Copyright (c) 2001
-2004
Anton Altaparmakov.
* Copyright (C) 2002 Richard Russon.
*
* This program/include file is free software; you can redistribute it and/or
...
...
@@ -180,11 +180,6 @@ extern int post_read_mst_fixup(NTFS_RECORD *b, const u32 size);
extern
int
pre_write_mst_fixup
(
NTFS_RECORD
*
b
,
const
u32
size
);
extern
void
post_write_mst_fixup
(
NTFS_RECORD
*
b
);
/* From fs/ntfs/time.c */
extern
inline
s64
utc2ntfs
(
const
time_t
time
);
extern
inline
s64
get_current_ntfs_time
(
void
);
extern
time_t
ntfs2utc
(
const
s64
time
);
/* From fs/ntfs/unistr.c */
extern
BOOL
ntfs_are_names_equal
(
const
uchar_t
*
s1
,
size_t
s1_len
,
const
uchar_t
*
s2
,
size_t
s2_len
,
...
...
fs/ntfs/super.c
View file @
c9dba577
...
...
@@ -9,13 +9,13 @@
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (in the main directory of the Linux-NTFS
* along with this program (in the main directory of the Linux-NTFS
* distribution in the file COPYING); if not, write to the Free Software
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
...
...
@@ -102,7 +102,7 @@ static BOOL parse_options(ntfs_volume *vol, char *opt)
if (*v) \
goto needs_val; \
} \
}
}
#define NTFS_GETOPT(option, variable) \
if (!strcmp(p, option)) { \
if (!v || !*v) \
...
...
@@ -110,14 +110,14 @@ static BOOL parse_options(ntfs_volume *vol, char *opt)
variable = simple_strtoul(ov = v, &v, 0); \
if (*v) \
goto needs_val; \
}
}
#define NTFS_GETOPT_BOOL(option, variable) \
if (!strcmp(p, option)) { \
BOOL val; \
if (!simple_getbool(v, &val)) \
goto needs_bool; \
variable = val; \
}
}
#define NTFS_GETOPT_OPTIONS_ARRAY(option, variable, opt_array) \
if (!strcmp(p, option)) { \
int _i; \
...
...
@@ -400,7 +400,7 @@ static BOOL is_boot_sector_ntfs(const struct super_block *sb,
le32_to_cpu
(
b
->
bpb
.
large_sectors
)
||
b
->
bpb
.
fats
)
goto
not_ntfs
;
/* Check clusters per file mft record value is valid. */
if
((
u8
)
b
->
clusters_per_mft_record
<
0xe1
||
if
((
u8
)
b
->
clusters_per_mft_record
<
0xe1
||
(
u8
)
b
->
clusters_per_mft_record
>
0xf7
)
switch
(
b
->
clusters_per_mft_record
)
{
case
1
:
case
2
:
case
4
:
case
8
:
case
16
:
case
32
:
case
64
:
...
...
@@ -409,7 +409,7 @@ static BOOL is_boot_sector_ntfs(const struct super_block *sb,
goto
not_ntfs
;
}
/* Check clusters per index block value is valid. */
if
((
u8
)
b
->
clusters_per_index_record
<
0xe1
||
if
((
u8
)
b
->
clusters_per_index_record
<
0xe1
||
(
u8
)
b
->
clusters_per_index_record
>
0xf7
)
switch
(
b
->
clusters_per_index_record
)
{
case
1
:
case
2
:
case
4
:
case
8
:
case
16
:
case
32
:
case
64
:
...
...
@@ -529,7 +529,7 @@ static struct buffer_head *read_ntfs_boot_sector(struct super_block *sb,
* parse_ntfs_boot_sector - parse the boot sector and store the data in @vol
* @vol: volume structure to initialise with data from boot sector
* @b: boot sector to parse
*
*
* Parse the ntfs boot sector @b and store all imporant information therein in
* the ntfs super block @vol. Return TRUE on success and FALSE on error.
*/
...
...
@@ -592,10 +592,10 @@ static BOOL parse_ntfs_boot_sector(ntfs_volume *vol, const NTFS_BOOT_SECTOR *b)
ntfs_debug
(
"vol->mft_record_size_mask = 0x%x"
,
vol
->
mft_record_size_mask
);
ntfs_debug
(
"vol->mft_record_size_bits = %i (0x%x)"
,
vol
->
mft_record_size_bits
,
vol
->
mft_record_size_bits
);
vol
->
mft_record_size_bits
,
vol
->
mft_record_size_bits
);
clusters_per_index_record
=
b
->
clusters_per_index_record
;
ntfs_debug
(
"clusters_per_index_record = %i (0x%x)"
,
clusters_per_index_record
,
clusters_per_index_record
);
clusters_per_index_record
,
clusters_per_index_record
);
if
(
clusters_per_index_record
>
0
)
vol
->
index_record_size
=
vol
->
cluster_size
<<
(
ffs
(
clusters_per_index_record
)
-
1
);
...
...
@@ -610,7 +610,7 @@ static BOOL parse_ntfs_boot_sector(ntfs_volume *vol, const NTFS_BOOT_SECTOR *b)
vol
->
index_record_size_mask
=
vol
->
index_record_size
-
1
;
vol
->
index_record_size_bits
=
ffs
(
vol
->
index_record_size
)
-
1
;
ntfs_debug
(
"vol->index_record_size = %i (0x%x)"
,
vol
->
index_record_size
,
vol
->
index_record_size
);
vol
->
index_record_size
,
vol
->
index_record_size
);
ntfs_debug
(
"vol->index_record_size_mask = 0x%x"
,
vol
->
index_record_size_mask
);
ntfs_debug
(
"vol->index_record_size_bits = %i (0x%x)"
,
...
...
@@ -657,6 +657,20 @@ static BOOL parse_ntfs_boot_sector(ntfs_volume *vol, const NTFS_BOOT_SECTOR *b)
}
vol
->
mftmirr_lcn
=
ll
;
ntfs_debug
(
"vol->mftmirr_lcn = 0x%Lx"
,
(
long
long
)
vol
->
mftmirr_lcn
);
/*
* Work out the size of the mft mirror in number of mft records. If the
* cluster size is less than or equal to the size taken by four mft
* records, the mft mirror stores the first four mft records. If the
* cluster size is bigger than the size taken by four mft records, the
* mft mirror contains as many mft records as will fit into one
* cluster.
*/
if
(
vol
->
cluster_size
<=
(
4
<<
vol
->
mft_record_size_bits
))
vol
->
mftmirr_size
=
4
;
else
vol
->
mftmirr_size
=
vol
->
cluster_size
>>
vol
->
mft_record_size_bits
;
ntfs_debug
(
"vol->mftmirr_size = %i"
,
vol
->
mftmirr_size
);
vol
->
serial_no
=
le64_to_cpu
(
b
->
volume_serial_number
);
ntfs_debug
(
"vol->serial_no = 0x%Lx"
,
(
unsigned
long
long
)
vol
->
serial_no
);
...
...
@@ -920,7 +934,7 @@ static BOOL load_system_files(ntfs_volume *vol)
/*
* Get the inode for the attribute definitions file and parse the
* attribute definitions.
*/
*/
tmp_ino
=
ntfs_iget
(
sb
,
FILE_AttrDef
);
if
(
IS_ERR
(
tmp_ino
)
||
is_bad_inode
(
tmp_ino
))
{
if
(
!
IS_ERR
(
tmp_ino
))
...
...
@@ -1321,24 +1335,36 @@ struct super_operations ntfs_mount_sops = {
struct
super_operations
ntfs_sops
=
{
.
alloc_inode
=
ntfs_alloc_big_inode
,
/* VFS: Allocate new inode. */
.
destroy_inode
=
ntfs_destroy_big_inode
,
/* VFS: Deallocate inode. */
//.dirty_inode = ntfs_dirty_inode, /* VFS: Called from
// __mark_inode_dirty(). */
//.write_inode = NULL, /* VFS: Write dirty inode to disk. */
.
put_inode
=
ntfs_put_inode
,
/* VFS: Called just before the inode
reference count is decreased. */
//.delete_inode = NULL, /* VFS: Delete inode from disk. Called
// when i_count becomes 0 and i_nlink
// is also 0. */
.
put_super
=
ntfs_put_super
,
/* Syscall: umount. */
//write_super = NULL, /* Flush dirty super block to disk. */
//write_super_lockfs = NULL, /* ? */
//unlockfs = NULL, /* ? */
.
statfs
=
ntfs_statfs
,
/* Syscall: statfs */
.
remount_fs
=
ntfs_remount
,
/* Syscall: mount -o remount. */
.
put_inode
=
ntfs_put_inode
,
/* VFS: Called just before
the inode reference count
is decreased. */
#ifdef NTFS_RW
//.dirty_inode = NULL, /* VFS: Called from
// __mark_inode_dirty(). */
//.write_inode = NULL, /* VFS: Write dirty inode to
// disk. */
//.drop_inode = NULL, /* VFS: Called just after the
// inode reference count has
// been decreased to zero.
// NOTE: The inode lock is
// held. See fs/inode.c::
// generic_drop_inode(). */
//.delete_inode = NULL, /* VFS: Delete inode from disk.
// Called when i_count becomes
// 0 and i_nlink is also 0. */
//.write_super = NULL, /* Flush dirty super block to
// disk. */
//.write_super_lockfs = NULL, /* ? */
//.unlockfs = NULL, /* ? */
#endif
.
put_super
=
ntfs_put_super
,
/* Syscall: umount. */
.
statfs
=
ntfs_statfs
,
/* Syscall: statfs */
.
remount_fs
=
ntfs_remount
,
/* Syscall: mount -o remount. */
.
clear_inode
=
ntfs_clear_big_inode
,
/* VFS: Called when an inode is
removed from memory. */
//.umount_begin = NULL, /* Forced umount. */
.
show_options
=
ntfs_show_options
,
/* Show mount options in proc. */
//.umount_begin = NULL, /* Forced umount. */
.
show_options
=
ntfs_show_options
,
/* Show mount options in
proc. */
};
...
...
@@ -1474,7 +1500,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent)
ntfs_error
(
sb
,
"Not an NTFS volume."
);
goto
err_out_now
;
}
/*
* Extract the data from the boot sector and setup the ntfs super block
* using it.
...
...
@@ -1489,7 +1515,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent)
goto
err_out_now
;
}
/*
/*
* TODO: When we start coping with sector sizes different from
* NTFS_BLOCK_SIZE, we now probably need to set the blocksize of the
* device (probably to NTFS_BLOCK_SIZE).
...
...
@@ -1500,7 +1526,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent)
/*
* Ntfs allows 63 bits for the file size, i.e. correct would be:
*
sb->s_maxbytes = ~0ULL >> 1;
* sb->s_maxbytes = ~0ULL >> 1;
* But the kernel uses a long as the page cache page index which on
* 32-bit architectures is only 32-bits. MAX_LFS_FILESIZE is kernel
* defined to the maximum the page cache page index can cope with
...
...
@@ -1757,7 +1783,7 @@ static int __init init_ntfs_fs(void)
}
ntfs_inode_cache
=
kmem_cache_create
(
ntfs_inode_cache_name
,
sizeof
(
ntfs_inode
),
0
,
sizeof
(
ntfs_inode
),
0
,
SLAB_HWCACHE_ALIGN
|
SLAB_RECLAIM_ACCOUNT
,
NULL
,
NULL
);
if
(
!
ntfs_inode_cache
)
{
printk
(
KERN_CRIT
"NTFS: Failed to create %s!
\n
"
,
...
...
@@ -1766,7 +1792,7 @@ static int __init init_ntfs_fs(void)
}
ntfs_big_inode_cache
=
kmem_cache_create
(
ntfs_big_inode_cache_name
,
sizeof
(
big_ntfs_inode
),
0
,
sizeof
(
big_ntfs_inode
),
0
,
SLAB_HWCACHE_ALIGN
|
SLAB_RECLAIM_ACCOUNT
,
ntfs_big_inode_init_once
,
NULL
);
if
(
!
ntfs_big_inode_cache
)
{
...
...
fs/ntfs/time.
c
→
fs/ntfs/time.
h
View file @
c9dba577
/*
* time.
c - NTFS time conversion functions.
Part of the Linux-NTFS project.
* time.
h - NTFS time conversion functions.
Part of the Linux-NTFS project.
*
* Copyright (c) 2001 Anton Altaparmakov.
* Copyright (c) 2001
-2004
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
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (in the main directory of the Linux-NTFS
* along with this program (in the main directory of the Linux-NTFS
* distribution in the file COPYING); if not, write to the Free Software
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/sched.h>
/* For CURRENT_TIME. */
#ifndef _LINUX_NTFS_TIME_H
#define _LINUX_NTFS_TIME_H
#include <linux/time.h>
/* For current_kernel_time(). */
#include <asm/div64.h>
/* For do_div(). */
#include "
ntfs
.h"
#include "
endian
.h"
#define NTFS_TIME_OFFSET ((s64)(369 * 365 + 89) * 24 * 3600 * 10000000)
/**
* utc2ntfs - convert Linux time to NTFS time
* @t
ime: Linux time to convert to NTFS
* utc2ntfs - convert Linux
UTC
time to NTFS time
* @t
s: Linux UTC time to convert to NTFS time
*
* Convert the Linux
time @time to its corresponding NTFS time and return that
* in little endian format.
* Convert the Linux
UTC time @ts to its corresponding NTFS time and return
*
that
in little endian format.
*
* Linux stores time in a long at present and measures it as the number of
* 1-second intervals since 1st January 1970, 00:00:00 UTC.
* Linux stores time in a struct timespec consisting of a time_t (long at
* present) tv_sec and a long tv_nsec where tv_sec is the number of 1-second
* intervals since 1st January 1970, 00:00:00 UTC and tv_nsec is the number of
* 1-nano-second intervals since the value of tv_sec.
*
* NTFS uses Microsoft's standard time format which is stored in a s64 and is
* measured as the number of 100
nano-second intervals since 1st January 1601,
* measured as the number of 100
-
nano-second intervals since 1st January 1601,
* 00:00:00 UTC.
*/
inline
s64
utc2ntfs
(
const
time_t
time
)
static
inline
s64
utc2ntfs
(
const
struct
timespec
ts
)
{
/* Convert to 100ns intervals and then add the NTFS time offset. */
return
cpu_to_sle64
((
s64
)
time
*
10000000
+
NTFS_TIME_OFFSET
);
/*
* Convert the seconds to 100ns intervals, add the nano-seconds
* converted to 100ns intervals, and then add the NTFS time offset.
*/
return
cpu_to_sle64
((
s64
)
ts
.
tv_sec
*
10000000
+
ts
.
tv_nsec
/
100
+
NTFS_TIME_OFFSET
);
}
/**
...
...
@@ -52,31 +61,40 @@ inline s64 utc2ntfs(const time_t time)
* Get the current time from the Linux kernel, convert it to its corresponding
* NTFS time and return that in little endian format.
*/
inline
s64
get_current_ntfs_time
(
void
)
static
inline
s64
get_current_ntfs_time
(
void
)
{
/* ignores leap second */
return
utc2ntfs
(
get_seconds
())
+
xtime
.
tv_nsec
/
1000
;
return
utc2ntfs
(
current_kernel_time
());
}
/**
* ntfs2utc - convert NTFS time to Linux time
* @time:
NTFS time (little endian) to convert to Linux
* @time:
NTFS time (little endian) to convert to Linux UTC
*
* Convert the little endian NTFS time @time to its corresponding Linux
time
* and return that in cpu format.
* Convert the little endian NTFS time @time to its corresponding Linux
UTC
*
time
and return that in cpu format.
*
* Linux stores time in a long at present and measures it as the number of
* 1-second intervals since 1st January 1970, 00:00:00 UTC.
* Linux stores time in a struct timespec consisting of a time_t (long at
* present) tv_sec and a long tv_nsec where tv_sec is the number of 1-second
* intervals since 1st January 1970, 00:00:00 UTC and tv_nsec is the number of
* 1-nano-second intervals since the value of tv_sec.
*
* NTFS uses Microsoft's standard time format which is stored in a s64 and is
* measured as the number of 100 nano-second intervals since 1st January 1601,
* 00:00:00 UTC.
*/
inline
time_t
ntfs2utc
(
const
s64
time
)
static
inline
struct
timespec
ntfs2utc
(
const
s64
time
)
{
/* Subtract the NTFS time offset, then convert to 1s intervals. */
struct
timespec
ts
;
/* Subtract the NTFS time offset. */
s64
t
=
sle64_to_cpu
(
time
)
-
NTFS_TIME_OFFSET
;
do_div
(
t
,
10000000
);
return
(
time_t
)
t
;
/*
* Convert the time to 1-second intervals and the remainder to
* 1-nano-second intervals.
*/
ts
.
tv_nsec
=
do_div
(
t
,
10000000
)
*
100
;
ts
.
tv_sec
=
t
;
return
ts
;
}
#endif
/* _LINUX_NTFS_TIME_H */
fs/ntfs/volume.h
View file @
c9dba577
...
...
@@ -2,7 +2,7 @@
* volume.h - Defines for volume structures in NTFS Linux kernel driver. Part
* of the Linux-NTFS project.
*
* Copyright (c) 2001
,2002
Anton Altaparmakov.
* Copyright (c) 2001
-2004
Anton Altaparmakov.
* Copyright (c) 2002 Richard Russon.
*
* This program/include file is free software; you can redistribute it and/or
...
...
@@ -10,13 +10,13 @@
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* This program/include file is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (in the main directory of the Linux-NTFS
* along with this program (in the main directory of the Linux-NTFS
* distribution in the file COPYING); if not, write to the Free Software
* Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
...
...
@@ -25,6 +25,7 @@
#define _LINUX_NTFS_VOLUME_H
#include "types.h"
#include "layout.h"
/*
* The NTFS in memory super block structure.
...
...
@@ -83,13 +84,17 @@ typedef struct {
bits in mft bitmap. */
struct
inode
*
mftmirr_ino
;
/* The VFS inode of $MFTMirr. */
int
mftmirr_size
;
/* Size of mft mirror in mft records. */
struct
inode
*
lcnbmp_ino
;
/* The VFS inode of $Bitmap. */
struct
rw_semaphore
lcnbmp_lock
;
/* Lock for serializing accesses to the
cluster bitmap ($Bitmap/$DATA). */
struct
inode
*
vol_ino
;
/* The VFS inode of $Volume. */
unsigned
long
vol_flags
;
/* Volume flags (VOLUME_*). */
VOLUME_FLAGS
vol_flags
;
/* Volume flags (VOLUME_*). */
u8
major_ver
;
/* Ntfs major version of volume. */
u8
minor_ver
;
/* Ntfs minor version of volume. */
struct
inode
*
root_ino
;
/* The VFS inode of the root
directory. */
struct
inode
*
secure_ino
;
/* The VFS inode of $Secure (NTFS3.0+
...
...
@@ -133,4 +138,3 @@ NVOL_FNS(ShowSystemFiles)
NVOL_FNS
(
CaseSensitive
)
#endif
/* _LINUX_NTFS_VOLUME_H */
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