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
nexedi
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