* [PATCH-2.6.6-rc2-bk] NTFS 2.1.7 release: Implement NFS exporting
@ 2004-04-23 20:03 Anton Altaparmakov
2004-04-26 15:59 ` Bill Davidsen
0 siblings, 1 reply; 3+ messages in thread
From: Anton Altaparmakov @ 2004-04-23 20:03 UTC (permalink / raw)
To: Linus Torvalds, Andrew Morton; +Cc: linux-kernel
Linus, please do a
bk pull http://linux-ntfs.bkbits.net/ntfs-2.6
Thanks! This update implements NFS exporting of mounted NTFS volumes
which people have been requesting for a while. Also, there are some minor
updates and white space cleanups. This has been tested including forcing
a server reboot while clients have open files on an NTFS volume NFS
exported by the server.
Best regards,
Anton
--
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
Unix Support, Computing Service, University of Cambridge, CB2 3QH, UK
Linux NTFS maintainer / IRC: #ntfs on irc.freenode.net
WWW: http://linux-ntfs.sf.net/, http://www-stu.christs.cam.ac.uk/~aia21/
===================================================================
This will update the following files:
Documentation/filesystems/ntfs.txt | 2
fs/ntfs/ChangeLog | 27 +++
fs/ntfs/Makefile | 4
fs/ntfs/aops.c | 25 +--
fs/ntfs/attrib.c | 9 -
fs/ntfs/dir.c | 8 -
fs/ntfs/inode.c | 35 +++--
fs/ntfs/layout.h | 4
fs/ntfs/namei.c | 250 +++++++++++++++++++++++++++++++------
fs/ntfs/super.c | 48 ++++++-
fs/ntfs/unistr.c | 7 -
11 files changed, 338 insertions(+), 81 deletions(-)
through these ChangeSets:
<aia21@cantab.net> (04/02/08 1.1557.9.1)
NTFS: Set i_generation in VFS inode from seq_no in NTFS inode.
<aia21@cantab.net> (04/02/09 1.1557.17.2)
NTFS: Make ntfs_lookup() NFS export safe, i.e. use d_splice_alias(), etc.
<aia21@cantab.net> (04/02/09 1.1557.17.3)
NTFS: Make it compile...
<aia21@cantab.net> (04/02/11 1.1557.35.2)
NTFS: Release 2.1.7 - Enable NFS exporting of mounted NTFS volumes.
- Implement ntfs_get_parent() and ntfs_get_dentry() as the NTFS specific
export operations ->get_parent() and ->get_dentry() respectively.
<aia21@cantab.net> (04/02/12 1.1557.5.73)
NTFS: Add missing return -EOPNOTSUPP; in fs/ntfs/aops.c::ntfs_commit_nonresident_write().
<aia21@cantab.net> (04/02/26 1.1608.20.1)
NTFS: Fix off by one error in ntfs_get_parent().
<aia21@cantab.net> (04/03/15 1.1630.6.2)
NTFS: Enforce no atime and no dir atime updates at mount/remount time
as they are not implemented yet anyway.
<aia21@cantab.net> (04/04/23 1.1907)
NTFS: Move a few assignments after a NULL check in fs/ntfs/attrib.c.
<aia21@cantab.net> (04/04/23 1.1908)
NTFS: Finally fix NFS exporting of mounted NTFS volumes by checking the
return of d_splice_alias() and acting accordingly rather than just
ignoring the returned dentry.
the combined GNU diff -urNp:
diff -urNp linux-2.6.6-rc2-bk/Documentation/filesystems/ntfs.txt linux-2.6.6-rc2-bk-ntfs-2.1.7/Documentation/filesystems/ntfs.txt
--- linux-2.6.6-rc2-bk/Documentation/filesystems/ntfs.txt 2004-04-23 20:14:43.100894872 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/Documentation/filesystems/ntfs.txt 2004-04-23 20:21:39.545585656 +0100
@@ -272,6 +272,8 @@ ChangeLog
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
+2.1.7:
+ - Enable NFS exporting of mounted NTFS volumes.
2.1.6:
- Fix minor bug in handling of compressed directories that fixes the
erroneous "du" and "stat" output people reported.
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/aops.c linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/aops.c
--- linux-2.6.6-rc2-bk/fs/ntfs/aops.c 2004-04-23 20:15:49.588787176 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/aops.c 2004-04-23 20:22:02.994020952 +0100
@@ -1,8 +1,8 @@
/**
* aops.c - NTFS kernel address space operations and page cache handling.
- * Part of the Linux-NTFS project.
+ * Part of the Linux-NTFS project.
*
- * Copyright (c) 2001-2003 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
*/
@@ -572,11 +572,11 @@ static int ntfs_write_block(struct write
// Again for each page do:
// - wait_on_page_locked()
// - Check (PageUptodate(page) &&
- // !PageError(page))
+ // !PageError(page))
// Update initialized size in the attribute and
// in the inode.
// Again, for each page do:
- // __set_page_dirty_buffers();
+ // __set_page_dirty_buffers();
// page_cache_release()
// We don't need to wait on the writes.
// Update iblock.
@@ -1112,11 +1112,11 @@ static int ntfs_prepare_nonresident_writ
// Again for each page do:
// - wait_on_page_locked()
// - Check (PageUptodate(page) &&
- // !PageError(page))
+ // !PageError(page))
// Update initialized size in the attribute and
// in the inode.
// Again, for each page do:
- // __set_page_dirty_buffers();
+ // __set_page_dirty_buffers();
// page_cache_release()
// We don't need to wait on the writes.
// Update iblock.
@@ -1188,7 +1188,7 @@ lock_retry_remap:
// TODO: Instantiate the hole.
// clear_buffer_new(bh);
// unmap_underlying_metadata(bh->b_bdev,
- // bh->b_blocknr);
+ // bh->b_blocknr);
// For non-uptodate buffers, need to
// zero out the region outside the
// request in this bh or all bhs,
@@ -1279,7 +1279,7 @@ lock_retry_remap:
if (PageUptodate(page)) {
if (!buffer_uptodate(bh))
set_buffer_uptodate(bh);
- continue;
+ continue;
}
/*
* The page is not uptodate. The buffer is mapped. If it is not
@@ -1525,6 +1525,7 @@ static int ntfs_commit_nonresident_write
if (pos > vi->i_size) {
ntfs_error(vi->i_sb, "Writing beyond the existing file size is "
"not supported yet. Sorry.");
+ return -EOPNOTSUPP;
// vi->i_size = pos;
// mark_inode_dirty(vi);
}
@@ -1708,7 +1709,7 @@ static int ntfs_commit_write(struct file
/*
* Bring the out of bounds area(s) uptodate by copying data
* from the mft record to the page.
- */
+ */
if (from > 0)
memcpy(kaddr, kattr, from);
if (to < bytes)
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/attrib.c linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/attrib.c
--- linux-2.6.6-rc2-bk/fs/ntfs/attrib.c 2004-04-23 20:16:52.395239144 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/attrib.c 2004-04-23 20:22:43.383880760 +0100
@@ -1235,11 +1235,11 @@ int load_attribute_list(ntfs_volume *vol
u8 *al_end = al + initialized_size;
run_list_element *rl;
struct buffer_head *bh;
- struct super_block *sb = vol->sb;
- unsigned long block_size = sb->s_blocksize;
+ struct super_block *sb;
+ unsigned long block_size;
unsigned long block, max_block;
int err = 0;
- unsigned char block_size_bits = sb->s_blocksize_bits;
+ unsigned char block_size_bits;
ntfs_debug("Entering.");
if (!vol || !run_list || !al || size <= 0 || initialized_size < 0 ||
@@ -1249,6 +1249,9 @@ int load_attribute_list(ntfs_volume *vol
memset(al, 0, size);
return 0;
}
+ sb = vol->sb;
+ block_size = sb->s_blocksize;
+ block_size_bits = sb->s_blocksize_bits;
down_read(&run_list->lock);
rl = run_list->rl;
/* Read all clusters specified by the run list one run at a time. */
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/ChangeLog linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/ChangeLog
--- linux-2.6.6-rc2-bk/fs/ntfs/ChangeLog 2004-04-23 20:13:59.842471152 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/ChangeLog 2004-04-23 20:21:10.812953680 +0100
@@ -1,6 +1,5 @@
ToDo:
- Find and fix bugs.
- - Enable NFS exporting of NTFS.
- Implement aops->set_page_dirty() in order to take control of buffer
dirtying. Not having it means if page_has_buffers(), all buffers
will be dirtied with the page. And if not they won't be. That is
@@ -20,6 +19,26 @@ ToDo:
sufficient for synchronisation here. We then just need to make sure
ntfs_readpage/writepage/truncate interoperate properly with us.
+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.
+ - Make ntfs_lookup() NFS export safe, i.e. use d_splice_alias(), etc.
+ - Implement ->get_dentry() in fs/ntfs/namei.c::ntfs_get_dentry() as the
+ default doesn't allow inode number 0 which is a valid inode on NTFS
+ and even if it did allow that it uses iget() instead of ntfs_iget()
+ which makes it useless for us.
+ - Implement ->get_parent() in fs/ntfs/namei.c::ntfs_get_parent() as the
+ default just returns -EACCES which is not very useful.
+ - Define export operations (->s_export_op) for NTFS (ntfs_export_ops)
+ and set them up in the super block at mount time (super.c) this
+ allows mounted NTFS volumes to be exported via NFS.
+ - Add missing return -EOPNOTSUPP; in
+ fs/ntfs/aops.c::ntfs_commit_nonresident_write().
+ - Enforce no atime and no dir atime updates at mount/remount time as
+ they are not implemented yet anyway.
+ - Move a few assignments in fs/ntfs/attrib.c::load_attribute_list() to
+ after a NULL check. Thanks to Dave Jones for pointing this out.
+
2.1.6 - Fix minor bug in handling of compressed directories.
- Fix bug in handling of compressed directories. A compressed
@@ -60,6 +79,10 @@ ToDo:
- Reduce function local stack usage from 0x3d4 bytes to just noise in
fs/ntfs/upcase.c. (Randy Dunlap <rddunlap@osdl.ord>)
- Remove compiler warnings for newer gcc.
+ - Pages are no longer kmapped by mm/filemap.c::generic_file_write()
+ around calls to ->{prepare,commit}_write. Adapt NTFS appropriately
+ in fs/ntfs/aops.c::ntfs_prepare_nonresident_write() by using
+ kmap_atomic(KM_USER0).
2.1.0 - First steps towards write support: implement file overwrite.
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/dir.c linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/dir.c
--- linux-2.6.6-rc2-bk/fs/ntfs/dir.c 2004-04-23 20:14:02.513065160 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/dir.c 2004-04-23 20:21:20.101541600 +0100
@@ -1,7 +1,7 @@
/**
* dir.c - NTFS kernel directory operations. Part of the Linux-NTFS project.
*
- * Copyright (c) 2001-2003 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
@@ -200,7 +200,8 @@ found_it:
"and if that doesn't find any "
"errors please report you saw "
"this message to "
- "linux-ntfs-dev@lists.sf.net.");
+ "linux-ntfs-dev@lists."
+ "sourceforge.net.");
goto dir_err_out;
}
@@ -457,7 +458,8 @@ found_it2:
"and if that doesn't find any "
"errors please report you saw "
"this message to "
- "linux-ntfs-dev@lists.sf.net.");
+ "linux-ntfs-dev@lists."
+ "sourceforge.net.");
ntfs_unmap_page(page);
goto dir_err_out;
}
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/inode.c linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/inode.c
--- linux-2.6.6-rc2-bk/fs/ntfs/inode.c 2004-04-23 20:16:13.117210312 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/inode.c 2004-04-23 20:22:15.165170656 +0100
@@ -196,7 +196,7 @@ struct inode *ntfs_iget(struct super_blo
}
/*
* There is no point in keeping bad inodes around if the failure was
- * due to ENOMEM. We want to be able to retry again layer.
+ * due to ENOMEM. We want to be able to retry again later.
*/
if (err == -ENOMEM) {
iput(vi);
@@ -533,7 +533,7 @@ static int ntfs_read_locked_inode(struct
}
/* Transfer information from mft record into vfs and ntfs inodes. */
- ni->seq_no = le16_to_cpu(m->sequence_number);
+ vi->i_generation = ni->seq_no = le16_to_cpu(m->sequence_number);
/*
* FIXME: Keep in mind that link_count is two for files which have both
@@ -1109,7 +1109,7 @@ static int ntfs_read_locked_attr_inode(s
vi->i_mtime = base_vi->i_mtime;
vi->i_ctime = base_vi->i_ctime;
vi->i_atime = base_vi->i_atime;
- ni->seq_no = base_ni->seq_no;
+ vi->i_generation = ni->seq_no = base_ni->seq_no;
/* Set inode type to zero but preserve permissions. */
vi->i_mode = base_vi->i_mode & ~S_IFMT;
@@ -1137,7 +1137,8 @@ static int ntfs_read_locked_attr_inode(s
"the attribute is resident (mft_no "
"0x%lx, type 0x%x, name_len %i). "
"Please report you saw this message "
- "to linux-ntfs-dev@lists.sf.net",
+ "to linux-ntfs-dev@lists."
+ "sourceforge.net",
vi->i_ino, ni->type, ni->name_len);
goto unm_err_out;
}
@@ -1157,8 +1158,9 @@ static int ntfs_read_locked_attr_inode(s
"type 0x%x, name_len %i). "
"Please report you saw this "
"message to linux-ntfs-dev@"
- "lists.sf.net", vi->i_ino,
- ni->type, ni->name_len);
+ "lists.sourceforge.net",
+ vi->i_ino, ni->type,
+ ni->name_len);
goto unm_err_out;
}
NInoSetCompressed(ni);
@@ -1169,7 +1171,8 @@ static int ntfs_read_locked_attr_inode(s
"(mft_no 0x%lx, type 0x%x, "
"name_len %i). Please report "
"you saw this message to "
- "linux-ntfs-dev@lists.sf.net",
+ "linux-ntfs-dev@lists."
+ "sourceforge.net",
vi->i_ino, ni->type,
ni->name_len);
goto unm_err_out;
@@ -1224,8 +1227,9 @@ static int ntfs_read_locked_attr_inode(s
"type 0x%x, name_len %i). "
"Please report you saw this "
"message to linux-ntfs-dev@"
- "lists.sf.net", vi->i_ino,
- ni->type, ni->name_len);
+ "lists.sourceforge.net",
+ vi->i_ino, ni->type,
+ ni->name_len);
goto unm_err_out;
}
NInoSetEncrypted(ni);
@@ -1238,8 +1242,9 @@ static int ntfs_read_locked_attr_inode(s
"type 0x%x, name_len %i). "
"Please report you saw this "
"message to linux-ntfs-dev@"
- "lists.sf.net", vi->i_ino,
- ni->type, ni->name_len);
+ "lists.sourceforge.net",
+ vi->i_ino, ni->type,
+ ni->name_len);
goto unm_err_out;
}
NInoSetSparse(ni);
@@ -1414,7 +1419,7 @@ void ntfs_read_inode_mount(struct inode
}
/* Need this to sanity check attribute list references to $MFT. */
- ni->seq_no = le16_to_cpu(m->sequence_number);
+ vi->i_generation = ni->seq_no = le16_to_cpu(m->sequence_number);
/* Provides readpage() and sync_page() for map_mft_record(). */
vi->i_mapping->a_ops = &ntfs_mft_aops;
@@ -1541,7 +1546,8 @@ void ntfs_read_inode_mount(struct inode
"of $MFT is not in the base "
"mft record. Please report "
"you saw this message to "
- "linux-ntfs-dev@lists.sf.net");
+ "linux-ntfs-dev@lists."
+ "sourceforge.net");
goto put_err_out;
} else {
/* Sequence numbers must match. */
@@ -1662,7 +1668,8 @@ void ntfs_read_inode_mount(struct inode
"Run chkdsk and if no errors "
"are found, please report you "
"saw this message to "
- "linux-ntfs-dev@lists.sf.net");
+ "linux-ntfs-dev@lists."
+ "sourceforge.net");
put_attr_search_ctx(ctx);
/* Revert to the safe super operations. */
sb->s_op = &ntfs_mount_sops;
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/layout.h linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/layout.h
--- linux-2.6.6-rc2-bk/fs/ntfs/layout.h 2004-04-23 20:14:44.597667328 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/layout.h 2004-04-23 20:21:40.348463600 +0100
@@ -2,7 +2,7 @@
* layout.h - All NTFS associated on-disk structures. Part of the Linux-NTFS
* project.
*
- * Copyright (c) 2001-2003 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
@@ -941,7 +941,7 @@ typedef struct {
modified. */
/* 18*/ s64 last_mft_change_time; /* Time this mft record was last
modified. */
-/* 20*/ s64 last_access_time; /* Last time this mft record was
+/* 20*/ s64 last_access_time; /* Time this mft record was last
accessed. */
/* 28*/ s64 allocated_size; /* Byte size of allocated space for the
data attribute. NOTE: Is a multiple
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/Makefile linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/Makefile
--- linux-2.6.6-rc2-bk/fs/ntfs/Makefile 2004-04-23 20:14:46.906316360 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/Makefile 2004-04-23 20:21:41.361309624 +0100
@@ -5,7 +5,7 @@ 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
-EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.6\"
+EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.7\"
ifeq ($(CONFIG_NTFS_DEBUG),y)
EXTRA_CFLAGS += -DDEBUG
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/namei.c linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/namei.c
--- linux-2.6.6-rc2-bk/fs/ntfs/namei.c 2004-04-23 20:15:49.464806024 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/namei.c 2004-04-23 20:22:02.816048008 +0100
@@ -2,7 +2,7 @@
* namei.c - NTFS kernel directory inode operations. Part of the Linux-NTFS
* project.
*
- * Copyright (c) 2001-2003 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
@@ -21,6 +21,7 @@
*/
#include <linux/dcache.h>
+#include <linux/security.h>
#include "ntfs.h"
#include "dir.h"
@@ -41,16 +42,17 @@
* @dir_ino looking for the converted Unicode name. If the name is found in the
* directory, the corresponding inode is loaded by calling ntfs_iget() on its
* inode number and the inode is associated with the dentry @dent via a call to
- * d_add().
+ * d_splice_alias().
*
* If the name is not found in the directory, a NULL inode is inserted into the
- * dentry @dent. The dentry is then termed a negative dentry.
+ * dentry @dent via a call to d_add(). The dentry is then termed a negative
+ * dentry.
*
* Only if an actual error occurs, do we return an error via ERR_PTR().
*
* In order to handle the case insensitivity issues of NTFS with regards to the
* dcache and the dcache requiring only one dentry per directory, we deal with
- * dentry aliases that only differ in case in ->ntfs_lookup() while maintining
+ * dentry aliases that only differ in case in ->ntfs_lookup() while maintaining
* a case sensitive dcache. This means that we get the full benefit of dcache
* speed when the file/directory is looked up with the same case as returned by
* ->ntfs_readdir() but that a lookup for any other case (or for the short file
@@ -70,15 +72,18 @@
* 1) @dent perfectly matches (i.e. including case) a directory entry with a
* file name in the WIN32 or POSIX namespaces. In this case
* ntfs_lookup_inode_by_name() will return with name set to NULL and we
- * just d_add() @dent.
+ * just d_splice_alias() @dent.
* 2) @dent matches (not including case) a directory entry with a file name in
* the WIN32 namespace. In this case ntfs_lookup_inode_by_name() will return
* with name set to point to a kmalloc()ed ntfs_name structure containing
* the properly cased little endian Unicode name. We convert the name to the
* current NLS code page, search if a dentry with this name already exists
- * and if so return that instead of @dent. The VFS will then destroy the old
- * @dent and use the one we returned. If a dentry is not found, we allocate
- * a new one, d_add() it, and return it as above.
+ * and if so return that instead of @dent. At this point things are
+ * complicated by the possibility of 'disconnected' dentries due to NFS
+ * which we deal with appropriately (see the code comments). The VFS will
+ * then destroy the old @dent and use the one we returned. If a dentry is
+ * not found, we allocate a new one, d_splice_alias() it, and return it as
+ * above.
* 3) @dent matches either perfectly or not (i.e. we don't care about case) a
* directory entry with a file name in the DOS namespace. In this case
* ntfs_lookup_inode_by_name() will return with name set to point to a
@@ -88,7 +93,8 @@
* name. We then convert the name to the current NLS code page, and proceed
* searching for a dentry with this name, etc, as in case 2), above.
*/
-static struct dentry *ntfs_lookup(struct inode *dir_ino, struct dentry *dent, struct nameidata *nd)
+static struct dentry *ntfs_lookup(struct inode *dir_ino, struct dentry *dent,
+ struct nameidata *nd)
{
ntfs_volume *vol = NTFS_SB(dir_ino->i_sb);
struct inode *dent_inode;
@@ -120,9 +126,8 @@ static struct dentry *ntfs_lookup(struct
dent_ino == FILE_MFT) {
/* Perfect WIN32/POSIX match. -- Case 1. */
if (!name) {
- d_add(dent, dent_inode);
ntfs_debug("Done.");
- return NULL;
+ return d_splice_alias(dent_inode, dent);
}
/*
* We are too indented. Handle imperfect
@@ -132,7 +137,7 @@ static struct dentry *ntfs_lookup(struct
}
ntfs_error(vol->sb, "Found stale reference to inode "
"0x%lx (reference sequence number = "
- "0x%x, inode sequence number = 0x%x, "
+ "0x%x, inode sequence number = 0x%x), "
"returning -EIO. Run chkdsk.",
dent_ino, MSEQNO(mref),
NTFS_I(dent_inode)->seq_no);
@@ -162,7 +167,7 @@ static struct dentry *ntfs_lookup(struct
// TODO: Consider moving this lot to a separate function! (AIA)
handle_name:
{
- struct dentry *real_dent;
+ struct dentry *real_dent, *new_dent;
MFT_RECORD *m;
attr_search_context *ctx;
ntfs_inode *ni = NTFS_I(dent_inode);
@@ -173,8 +178,7 @@ handle_name:
if (name->type != FILE_NAME_DOS) { /* Case 2. */
nls_name.len = (unsigned)ntfs_ucstonls(vol,
(uchar_t*)&name->name, name->len,
- (unsigned char**)&nls_name.name,
- name->len * 3 + 1);
+ (unsigned char**)&nls_name.name, 0);
kfree(name);
} else /* if (name->type == FILE_NAME_DOS) */ { /* Case 3. */
FILE_NAME_ATTR *fn;
@@ -225,8 +229,7 @@ handle_name:
/* Convert the found WIN32 name to current NLS code page. */
nls_name.len = (unsigned)ntfs_ucstonls(vol,
(uchar_t*)&fn->file_name, fn->file_name_length,
- (unsigned char**)&nls_name.name,
- fn->file_name_length * 3 + 1);
+ (unsigned char**)&nls_name.name, 0);
put_attr_search_ctx(ctx);
unmap_mft_record(ni);
@@ -256,8 +259,12 @@ handle_name:
err = -ENOMEM;
goto err_out;
}
- d_add(real_dent, dent_inode);
- return real_dent;
+ new_dent = d_splice_alias(dent_inode, real_dent);
+ if (new_dent)
+ dput(real_dent);
+ else
+ new_dent = real_dent;
+ return new_dent;
}
kfree(nls_name.name);
/* Matching dentry exists, check if it is negative. */
@@ -266,14 +273,54 @@ handle_name:
/*
* Already have the inode and the dentry attached, decrement
* the reference count to balance the ntfs_iget() we did
- * earlier on.
+ * earlier on. We found the dentry using d_lookup() so it
+ * cannot be disconnected and thus we do not need to worry
+ * about any NFS/disconnectedness issues here.
*/
iput(dent_inode);
return real_dent;
}
- /* Negative dentry: instantiate it. */
- d_instantiate(real_dent, dent_inode);
- return real_dent;
+ /*
+ * Negative dentry: instantiate it unless the inode is a directory and
+ * has a 'disconnected' dentry (i.e. IS_ROOT and DCACHE_DISCONNECTED),
+ * in which case d_move() that in place of the found dentry.
+ */
+ if (!S_ISDIR(dent_inode->i_mode)) {
+ /* Not a directory; everything is easy. */
+ d_instantiate(real_dent, dent_inode);
+ return real_dent;
+ }
+ spin_lock(&dcache_lock);
+ if (list_empty(&dent_inode->i_dentry)) {
+ /*
+ * Directory without a 'disconnected' dentry; we need to do
+ * d_instantiate() by hand because it takes dcache_lock which
+ * we already hold.
+ */
+ list_add(&real_dent->d_alias, &dent_inode->i_dentry);
+ real_dent->d_inode = dent_inode;
+ spin_unlock(&dcache_lock);
+ security_d_instantiate(real_dent, dent_inode);
+ return real_dent;
+ }
+ /*
+ * Directory with a 'disconnected' dentry; get a reference to the
+ * 'disconnected' dentry.
+ */
+ new_dent = list_entry(dent_inode->i_dentry.next, struct dentry,
+ d_alias);
+ dget_locked(new_dent);
+ spin_unlock(&dcache_lock);
+ /* Do security vodoo. */
+ security_d_instantiate(real_dent, dent_inode);
+ /* Move new_dent in place of real_dent. */
+ d_move(new_dent, real_dent);
+ /* Balance the ntfs_iget() we did above. */
+ iput(dent_inode);
+ /* Throw away real_dent. */
+ dput(real_dent);
+ /* Use new_dent as the actual dentry. */
+ return new_dent;
eio_err_out:
ntfs_error(vol->sb, "Illegal file name attribute. Run chkdsk.");
@@ -288,10 +335,139 @@ err_out:
}
}
-/*
+/**
* Inode operations for directories.
*/
struct inode_operations ntfs_dir_inode_ops = {
.lookup = ntfs_lookup, /* VFS: Lookup directory. */
};
+/**
+ * ntfs_get_parent - find the dentry of the parent of a given directory dentry
+ * @child_dent: dentry of the directory whose parent directory to find
+ *
+ * Find the dentry for the parent directory of the directory specified by the
+ * dentry @child_dent. This function is called from
+ * fs/exportfs/expfs.c::find_exported_dentry() which in turn is called from the
+ * default ->decode_fh() which is export_decode_fh() in the same file.
+ *
+ * The code is based on the ext3 ->get_parent() implementation found in
+ * fs/ext3/namei.c::ext3_get_parent().
+ *
+ * Note: ntfs_get_parent() is called with @child_dent->d_inode->i_sem down.
+ *
+ * Return the dentry of the parent directory on success or the error code on
+ * error (IS_ERR() is true).
+ */
+struct dentry *ntfs_get_parent(struct dentry *child_dent)
+{
+ struct inode *vi = child_dent->d_inode;
+ ntfs_inode *ni = NTFS_I(vi);
+ MFT_RECORD *mrec;
+ attr_search_context *ctx;
+ ATTR_RECORD *attr;
+ FILE_NAME_ATTR *fn;
+ struct inode *parent_vi;
+ struct dentry *parent_dent;
+ unsigned long parent_ino;
+
+ ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
+ /* Get the mft record of the inode belonging to the child dentry. */
+ mrec = map_mft_record(ni);
+ if (unlikely(IS_ERR(mrec)))
+ return (struct dentry *)mrec;
+ /* Find the first file name attribute in the mft record. */
+ ctx = get_attr_search_ctx(ni, mrec);
+ if (unlikely(!ctx)) {
+ unmap_mft_record(ni);
+ return ERR_PTR(-ENOMEM);
+ }
+try_next:
+ if (unlikely(!lookup_attr(AT_FILE_NAME, NULL, 0, IGNORE_CASE, 0,
+ NULL, 0, ctx))) {
+ put_attr_search_ctx(ctx);
+ unmap_mft_record(ni);
+ ntfs_error(vi->i_sb, "Inode 0x%lx does not have a file name "
+ "attribute. Run chkdsk.", vi->i_ino);
+ return ERR_PTR(-ENOENT);
+ }
+ attr = ctx->attr;
+ if (unlikely(attr->non_resident))
+ goto try_next;
+ fn = (FILE_NAME_ATTR *)((u8 *)attr +
+ le16_to_cpu(attr->data.resident.value_offset));
+ if (unlikely((u8 *)fn + le32_to_cpu(attr->data.resident.value_length) >
+ (u8*)attr + le32_to_cpu(attr->length)))
+ goto try_next;
+ /* Get the inode number of the parent directory. */
+ parent_ino = MREF_LE(fn->parent_directory);
+ /* Release the search context and the mft record of the child. */
+ put_attr_search_ctx(ctx);
+ unmap_mft_record(ni);
+ /* Get the inode of the parent directory. */
+ parent_vi = ntfs_iget(vi->i_sb, parent_ino);
+ if (unlikely(IS_ERR(parent_vi) || is_bad_inode(parent_vi))) {
+ if (!IS_ERR(parent_vi))
+ iput(parent_vi);
+ ntfs_error(vi->i_sb, "Failed to get parent directory inode "
+ "0x%lx of child inode 0x%lx.", parent_ino,
+ vi->i_ino);
+ return ERR_PTR(-EACCES);
+ }
+ /* Finally get a dentry for the parent directory and return it. */
+ parent_dent = d_alloc_anon(parent_vi);
+ if (unlikely(!parent_dent)) {
+ iput(parent_vi);
+ return ERR_PTR(-ENOMEM);
+ }
+ ntfs_debug("Done for inode 0x%lx.", vi->i_ino);
+ return parent_dent;
+}
+
+/**
+ * ntfs_get_dentry - find a dentry for the inode from a file handle sub-fragment
+ * @sb: super block identifying the mounted ntfs volume
+ * @fh: the file handle sub-fragment
+ *
+ * Find a dentry for the inode given a file handle sub-fragment. This function
+ * is called from fs/exportfs/expfs.c::find_exported_dentry() which in turn is
+ * called from the default ->decode_fh() which is export_decode_fh() in the
+ * same file. The code is closely based on the default ->get_dentry() helper
+ * fs/exportfs/expfs.c::get_object().
+ *
+ * The @fh contains two 32-bit unsigned values, the first one is the inode
+ * number and the second one is the inode generation.
+ *
+ * Return the dentry on success or the error code on error (IS_ERR() is true).
+ */
+struct dentry *ntfs_get_dentry(struct super_block *sb, void *fh)
+{
+ struct inode *vi;
+ struct dentry *dent;
+ unsigned long ino = ((u32 *)fh)[0];
+ u32 gen = ((u32 *)fh)[1];
+
+ ntfs_debug("Entering for inode 0x%lx, generation 0x%x.", ino, gen);
+ vi = ntfs_iget(sb, ino);
+ if (unlikely(IS_ERR(vi))) {
+ ntfs_error(sb, "Failed to get inode 0x%lx.", ino);
+ return (struct dentry *)vi;
+ }
+ if (unlikely(is_bad_inode(vi) || vi->i_generation != gen)) {
+ /* We didn't find the right inode. */
+ ntfs_error(sb, "Inode 0x%lx, bad count: %d %d or version 0x%x "
+ "0x%x.", vi->i_ino, vi->i_nlink,
+ atomic_read(&vi->i_count), vi->i_generation,
+ gen);
+ iput(vi);
+ return ERR_PTR(-ESTALE);
+ }
+ /* Now find a dentry. If possible, get a well-connected one. */
+ dent = d_alloc_anon(vi);
+ if (unlikely(!dent)) {
+ iput(vi);
+ return ERR_PTR(-ENOMEM);
+ }
+ ntfs_debug("Done for inode 0x%lx, generation 0x%x.", ino, gen);
+ return dent;
+}
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/super.c linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/super.c
--- linux-2.6.6-rc2-bk/fs/ntfs/super.c 2004-04-23 20:15:28.881935096 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/super.c 2004-04-23 20:21:53.621445800 +0100
@@ -1,7 +1,7 @@
/*
* super.c - NTFS kernel super block handling. Part of the Linux-NTFS project.
*
- * Copyright (c) 2001-2003 Anton Altaparmakov
+ * Copyright (c) 2001-2004 Anton Altaparmakov
* Copyright (c) 2001,2002 Richard Russon
*
* This program/include file is free software; you can redistribute it and/or
@@ -323,6 +323,9 @@ static int ntfs_remount(struct super_blo
return -EROFS;
}
}
+ // TODO: For now we enforce no atime and dir atime updates as they are
+ // not implemented.
+ *flags |= MS_NOATIME | MS_NODIRATIME;
#endif
// FIXME/TODO: If left like this we will have problems with rw->ro and
@@ -1338,6 +1341,40 @@ struct super_operations ntfs_sops = {
.show_options = ntfs_show_options, /* Show mount options in proc. */
};
+
+/**
+ * Declarations for NTFS specific export operations (fs/ntfs/namei.c).
+ */
+extern struct dentry *ntfs_get_parent(struct dentry *child_dent);
+extern struct dentry *ntfs_get_dentry(struct super_block *sb, void *fh);
+
+/**
+ * Export operations allowing NFS exporting of mounted NTFS partitions.
+ *
+ * We use the default ->decode_fh() and ->encode_fh() for now. Note that they
+ * use 32 bits to store the inode number which is an unsigned long so on 64-bit
+ * architectures is usually 64 bits so it would all fail horribly on huge
+ * volumes. I guess we need to define our own encode and decode fh functions
+ * that store 64-bit inode numbers at some point but for now we will ignore the
+ * problem...
+ *
+ * We also use the default ->get_name() helper (used by ->decode_fh() via
+ * fs/exportfs/expfs.c::find_exported_dentry()) as that is completely fs
+ * independent.
+ *
+ * The default ->get_parent() just returns -EACCES so we have to provide our
+ * own and the default ->get_dentry() is incompatible with NTFS due to not
+ * allowing the inode number 0 which is used in NTFS for the system file $MFT
+ * and due to using iget() whereas NTFS needs ntfs_iget().
+ */
+static struct export_operations ntfs_export_ops = {
+ .get_parent = ntfs_get_parent, /* Find the parent of a given
+ directory. */
+ .get_dentry = ntfs_get_dentry, /* Find a dentry for the inode
+ given a file handle
+ sub-fragment. */
+};
+
/**
* ntfs_fill_super - mount an ntfs files system
* @sb: super block of ntfs file system to mount
@@ -1366,6 +1403,10 @@ static int ntfs_fill_super(struct super_
ntfs_debug("Entering.");
#ifndef NTFS_RW
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
+#else
+ // TODO: For now we enforce no atime and dir atime updates as they are
+ // not implemented.
+ sb->s_flags |= MS_NOATIME | MS_NODIRATIME;
#endif
/* Allocate a new ntfs_volume and place it in sb->s_fs_info. */
sb->s_fs_info = kmalloc(sizeof(ntfs_volume), GFP_NOFS);
@@ -1544,6 +1585,7 @@ static int ntfs_fill_super(struct super_
default_upcase = NULL;
}
up(&ntfs_lock);
+ sb->s_export_op = &ntfs_export_ops;
return 0;
}
ntfs_error(sb, "Failed to allocate root directory.");
@@ -1788,13 +1830,13 @@ static void __exit exit_ntfs_fs(void)
printk(KERN_CRIT "NTFS: This causes memory to leak! There is "
"probably a BUG in the driver! Please report "
"you saw this message to "
- "linux-ntfs-dev@lists.sf.net\n");
+ "linux-ntfs-dev@lists.sourceforge.net\n");
/* Unregister the ntfs sysctls. */
ntfs_sysctl(0);
}
MODULE_AUTHOR("Anton Altaparmakov <aia21@cantab.net>");
-MODULE_DESCRIPTION("NTFS 1.2/3.x driver - Copyright (c) 2001-2003 Anton Altaparmakov");
+MODULE_DESCRIPTION("NTFS 1.2/3.x driver - Copyright (c) 2001-2004 Anton Altaparmakov");
MODULE_LICENSE("GPL");
#ifdef DEBUG
MODULE_PARM(debug_msgs, "i");
diff -urNp linux-2.6.6-rc2-bk/fs/ntfs/unistr.c linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/unistr.c
--- linux-2.6.6-rc2-bk/fs/ntfs/unistr.c 2004-04-23 20:15:26.274331512 +0100
+++ linux-2.6.6-rc2-bk-ntfs-2.1.7/fs/ntfs/unistr.c 2004-04-23 20:21:53.319491704 +0100
@@ -1,7 +1,7 @@
/*
* unistr.c - NTFS Unicode string handling. Part of the Linux-NTFS project.
*
- * Copyright (c) 2001-2003 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
@@ -305,8 +305,9 @@ conversion_err:
* Convert the input little endian, 2-byte Unicode string @ins, of length
* @ins_len into the string format dictated by the loaded NLS.
*
- * If @outs is NULL, this function allocates the string and the caller is
- * responsible for calling kfree(@outs); when finished with it.
+ * If *@outs is NULL, this function allocates the string and the caller is
+ * responsible for calling kfree(*@outs); when finished with it. In this case
+ * @outs_len is ignored and can be 0.
*
* On success the function returns the number of bytes written to the output
* string *@outs (>= 0), not counting the terminating NULL byte. If the output
===================================================================
This BitKeeper patch contains the following changesets:
1.1908
## Wrapped with gzip_uu ##
M'XL( ,!6B4 ]56;6_B1A#^C'_%**>3X Z<?;$-IN)TO2.YII>F$;E\1HN]
M!A>SB^QU$E3ZWSMK$Q+@TC116ZE@99W=G7EFGGEFQ!NX+F3>;XA4,.J\@9]T
M8?J-2"@C)JZ2!K=&6N/6\4POY'&11\?*)$6'N8	Y?"1#.XD7G1;U"7;W?,
M:BG[C=')E^OS'T>.,QC YYE04WDE#0P&CM'YC<CBXJ,PLTPKU^1"%0MIA!OI
MQ7I[=<T(8?CU:9<3/UC3@'C==41C2H5'94R8UPL\IXK]XT/,NPX\XC%.*67,
M7S,>$.8,@;HT)#T@WC$^C ,-^HSU/?:>T#XAL.\0WC/H$.<3_+-Q?W8BN/AV
M>M6'TU2)+%M!DM[!Q>D5R+NESDVJIJ 36.A2&1E75^%&9^5"%C!90323T=S>
M,3.)GG)IREQ9@WA<++,TDF.1I:)HMD"H&$14^1-1I/,8WQ MQRQDCN9"P6]E
M8=!).E4ZW_C<>$3D6"J3KUSG*S#N!SWG\J&:3N>%'\<A@C@?X-/7=5)46CI6
M8B%3-UK3L$L(Q2\GH1^N"9+(UCVO)[GHAJ'T8Y\(_Z X!VZV-?<9XWR-#KF_
M"UA'?ZZGWX$DP3I.@B04M.L3F?!NXCT-^>!H#]3SJ.]7NC^X:O7_^E@.Q?Y$
M+!@))3[C;,UI+^S5HN?^ON8Y_^\U?[V,A9%63C5-OT(GOZT>E,?E(6.OT-@9
M[P%S&AWX1=]($)#(6Q!%@?)>H)8+2-461AB3IQ,WZO<S+>)Q_6]IY#A+"X/-
M8[33 !")P581<'%]?EYWG@OP#2.<%W@#A@)A?M8*.S/1.2QUJDS=1FD!NC3N
MCA8V2MU3PHO:X&D=[+0!8P'U>$A"5&37#RH5\/ E(N#0H?Q?D<'_9NC5$^0)
ME6[H?H5&AV$ U#G#O\PIC#!I!(7)R\ALH.&=!1AG6L_+97-SE"H=2W@7I_D8
M7]O[%G9M.XW&9KL*#IM-H*^XY0PIZR'DD')BD>NE83\;'O=(M-[&%6*[0FC]
MX Q9P##>,Q9P"-!6R=NQ/8+!7QGG4F3CC8=&(TV@>6_7LOCQLC3-W3LR*Z0]
M>N1_>\&>;P*^/\; >+=*JEX:%76QG)33YM$)*JFJKVW-FD!R]S:[<X_:<)-V
M/J0V3$3%H>';J5$;RSS7>;,^+R9M.#I[L(18HQR5-C 3]7Q),UFQ#4<5H4?;
M,>+"J%0HVWE<S \ />(#?Q+P5*#7V(Z7*;;B4N26!ZR\C+ 95YM,-GAU6-@'
MT2S-XOTL:]M*,=7UQT$,/>I9XNIEA[@A#K3G2!OB#*_,J^5O\=[&?)3$1DRU
MLCN5STK-N%^[Y+5+;LMAY5*J+)W+;-4\NQJ?C$;(4JO5@M]WJ?L.:7N!W]/N
M5:G^89&Z5LV>U]LO_'[)VS 1,41V+/7A;6P?S,K^\KW/XE$I=EFZ?\4<U+R-
FH$&EU'IYEO#GV0HL6]N?WM6$+,K%H)NPL,M]ZOP)C8[7LN0+
This BitKeeper patch contains the following changesets:
1.1907
## Wrapped with gzip_uu ##
M'XL( ,%6B4 [5476^;,!1]QK_B2GU;!?$UA@ 55==V7VK61>GR'!GC!+0$
M*NRDVL2/GR%;LH;M8=5F6[K2]=&YQ_<>^0SF6C6)(TK!D)S!^UJ;Q)&B,B+S
M*F5L:E;7-C4JZHT:Z4:.*K/4+O-"8N^FPL@"=JK1B8.>?\B8KX\J<69OWLTG
MKV>$I"G<%*):J0=E($V)J9N=6.?Z2IAB75>>:42E-\H(3]:;]@!M&:7,[@#'
M/@W"%D/*QZW$'%%P5#EE/ HYZ;5?'34_)^"4,Y]&&&/4,C]$G]P">AC3,5 ^
MLH?Y@"RQAP7G%!-*X900SA%<2J[AW^J^(1+N/[]]2.!CO5,@8*F>0&A=KJJ-
MJHP&L32JL?G[^60"LE#R"Y05+'4_@I$PIBDS3WKD#NS#*"/38Y>)^Y>+$"HH
MN83KN_:T0(OQF%*TVZ=Q$+?4+MZ&F<"<AK&,>"1E'@RZ-N3Y.0U$&@;8\LBV
MI3?'*;+SR(N%#/WP.R%6A%WCP.>\Y3SF<6^+&)^9@H9)@'\T10BN_U],L;?#
MP A'&W0CWW?O$[C-4W_L"*>#1K[ !K?(_ @8^6!C;*.C3;.5!O3V436+;%U;
M%[[2V05QME6G4.5@7[V"_F:ARV_JHN/@#+#CZ.,1*@O1_ )=9*71%QTN0/!M
MK0Q2V-5K][*O< 3:M,YL=B]@7\4YX1EB?M ?OJ6^>7J[29>!5($0$?D.*]IE
%50 %
This BitKeeper patch contains the following changesets:
1.1630.6.2
## Wrapped with gzip_uu ##
M'XL( ,-6B4 ]V676O;,!2&KZU?<:!W*[&/)%O^&"G]W!;ZD9*VUT6UY28L
MMH.E- 3\XZ<XH5F3!MJNV\5L@Y$LWO.><QX)[\&=5G7BR)%DE.S!CTJ;Q$EE
M:>2#6RICIP959:>\854H3]>I5YI<=Y@KB/UV+4TZA"=5Z\2A+G^>,?.)2IS!
MV?>[BZ,!(=TNG QE^:ANE(%NEYBJ?I+C3!]*,QQ7I6MJ6>I"&>FF5=$\+VT8
M(K-W0$..@6BH0#]L4II1*GVJ,F1^)'S2>C]<>WXIX".G 46*@=]0*@(DIT!=
M*CBZPF6 OH?<HP%03 *6\' ?,4&$35'89]!!<@R?Z_V$I'!U^^TF@;,RK^I4
M05F!-*-"@2RSQ2 ;U:N)Z2231FD[@J*:EL:K5?N&Q5>K(S68H9J#K!<J!D;%
M9*P*51J5P=QF(,OY3,Y=<@ZV#H*1ZW532.>=%R$HD1S \7F3ZQ8)3T\GJG;3
MAL8AXJ+@'.,@;M#6P6^D$@KQ ;F2R*(HWJKOELRZ=0'CK/'1CZ*7 9?N+ZK'
M5T*B:+)<Y+&D88 JYV'N[PZY%MH(RFD41RV^6TL7&'_<RS:S.[PPRJR7B(J&
M,11\R2[WM[!E_Q[;/P36XFI%W@CLLA%]Z-2S]K$ 7F_WY ,4][@ 1IS.9V3C
MP-O2^9VG%>T;-+UK*^UFZ<56LAQ9<*@5H&$<^BN2PG>0%/X/)"W/D1TDK0KV
M(8Y8 )PXG@>W_=-^ O"MJJV5&<P4J-?R>R6Y]?G="FTDXA+G2SZ6CQJ:+ES>
MW%_UCVY[EV?0+ >GO4$[_DIZU'8;?+*GQEK];4OZH7.@[]_DZ_GO(!VJ]*>>
1%EW!PR"D3))?3;GS&8<(
This BitKeeper patch contains the following changesets:
1.1608.20.1
## Wrapped with gzip_uu ##
M'XL( ,16B4 [5476L;,1!\MG[%0E[L&M_M2KH/'=BD29JVI+3&:9Z-?"?;
M1VR=N9/3&N['5W%*3.Q22&BU L%*#+,S@\[@KC%UUM&EYL3.X%/5N*R3:^OT
M++#&^=:DJGPK7%9K$S9U'EHW;P8\B)F_&VN7+^'!U$W6H4 \=]QN8[+.Y,/'
MNR_O)XP-AW"YU'9A;HV#X9"YJG[0JZ(YUVZYJFS@:FV;M7$ZR*MU^_RTY8C<
M5T2)P"AN*4:9M#D51%J2*9#+-)9LS_W\P/DE@$3.)2I.%+4\$3%G5T"!ATH#
MC@$!RA!YR&,@F4G*(NHC9HAPC I]@@&R"_BWY"]9#E^_7]]F<%W^A&H^A]D.
M*FO U'550VGA4>_IPKCI1M?&NFXO8#?@)TD%&Q]D98-7+L90(QO!Q4T[;_:F
MAE:O31GD+:D$D7P)5)%JT0_"VU2F1NA$*1,5$>KH1* 3F-_BQR2%0M5*F43Q
M/@M'#Q\3\586I^;_F041%Y($>A8I)?L(B/2%]T)EJ/[F/?T7[U_E^I.$WV!0
M_]AO[^+X6,TW!.%** '$/C\=G7(.W:U=E?=FM>MVMRF\Z\TM]&%E!)^Z:IIO
MMEWM7#T8%=I/7INF+#S%P"NS-=.5L0NW[,'H\#_D2Y/?-]OUD)-2?%8D[!==
'*[3!=P0
This BitKeeper patch contains the following changesets:
1.1557.5.73
## Wrapped with gzip_uu ##
M'XL( ,56B4 [5684_C1A#]'/^*J>Y+N+LXNVNOG02!R 'M(2A$$(1.515M
M[$WB8GNM]08:U?WOG;7#<5Q("ZAG1UYG//-FYNT;R^_@NI1ZT!*)8-1Y!Y]5
M:0:M2.1&3-U<&C1=*H6F[D)ELEOJJ)N;6=EA;N#@LY$PT0+NI"X'+>IZ7RUF
M5<A!Z_+XE^NSX:7C[.W!X4+D<WDE#>SM.4;I.Y'&Y8$PBU3EKM$B+S-IA!NI
MK/KJ6C%"&)Z<AA[A044#XH=51&-*A4]E3)C?"WRGKOW@L>:G #YAE)&^1QBO
MN,^Y[QP!=2GGH<O=T /B=PGK4@:4#'AOX-$/A P(@>]1X0.##G$^P?];_*$3
MP?GXYZL!#.,8LJ0LDWP.6IJESJ%S?#$ZOQA?78]&NY#D,"MK]KM"%:4;#0;V
MSP2S9HF9Y"K7LDQBF9O)O4Z,;.^XSBEP+Z#$&3WR[W1>>3@.$<39AT^GU4/^
M!NQ,S2O:#PFA>'JDS_L5P2.HXEDPZPL:<B)G7CCS-[A\!NAAIRCA/1I4C)'
M>YJT:?JYC,P:A1\R&LO $Y3/MF=<HWR3SO-9Y8?$[]<ZW:C,ZO7MK6^*<VOK
MA'H^97[%^ZP7-B+U-N1)@ZWR#'Z4/*^+6!@)41V:JKF55;,_%]#1]_4/93+:
MY.X-6COQ?&!.J_."<7!:\/J). DY^!9_).:R!*$EY J0J+G4<)N)HI Q3%>0
M9=U9DDHT6-BYS*5.HHDU/6#9]$*K91Y#)-*T1.:AL_]7H66!J!^;(OYNO%W
M?D1AZE$'3*)5H1-D-5U9F&VCO<9ZKA-;X]*28^-MW1-A5)9$[=-?)]=7QY<$
M>_U6SPWN=V)^S4@YXK;(#E09IZ[2\]\>9/;[,Y/ED1[M4^XQWJM\'@:-FOO!
M4S%[ Y]M%3/UH$/9#Y'S2Z0%_ZDCBW.SP#]0%B+"Z4BER)>%G8WF9;)E-AJ6
MWC 81QY0G Z\P'O<<D !:P-J!F8AX2S)EW]V:G&AM/Z0D7&=(VX#>!T AZI8
MZ62^,-".=@#)HAW[VH%A;E0.P]0(%%HF;M6=<X3<,^>$VCG$R/$B*2WH7(NL
MF^11NHPEV#D M,=):70R71H<&F3-EK)0A<0;82 Q<)^D*4REQ5F6<K9,/P(Z
MP\W)^//%]1B&YU_@9GAY.3P??]E%9[-0^%3>R08JR8HT0>1[H7'7S0I+Z]N>
MZBM""CNV=1BZ/U8)[74IF<";.-%(A]*K3:Z0HK!7DU0O+3RZ7;S\9-\-QUHK
MW2[P;F<''7NL=JR7M>-D4DHSL1X33&)6D^ER-L-/H?;.+E:*K_*ZUF;]-VQT
MZ:U=>R]%Q\VK0YJU]0 _773VIY-IJJ+;7#>.?=HXUBNZ12HWR(#<12/WFH3/
G# &&AJSN>;VV6O"^^_C-%RUD=%LNLSW\P.#2E]SY!_=X4=]+"@
This BitKeeper patch contains the following changesets:
1.1557.35.2
## Wrapped with gzip_uu ##
M'XL( ,96B4 [U;>W/;-A+_6_H4J'OI28Y%\R7JD;$GKBWG?+&=C.Q<;Z;I
M<"@2E-A0I(8@)7M._>ZW"X"B2$E^-8Z=,24"6.QB'_CM OF9?&$TZ=><P-&U
M^L_D7S%+^S77B5)GI$0TA5?#.(97AY-X2@]9XAY&J<]:NF+5H>VSD[H3,J<)
MZ]<TQ5B]2>]GM%\;#CY\N3P9UNM'1^1TXD1C>D-3<G143^-D[H0>>^^DDS".
ME#1Q(C:EJ:.X\72YZKK4556'W[;6,=2VM=0LU>PL7<W3-,?4J*?J9M<RZYSW
M]P7/90*FJFN:UC9-55T:;<M2ZV=$4[1VNZ,8;44GJGFHZH>:1G2C;YK]=N>M
MJO95E52IDK<=TE+KOY+OR_QIW277M^<W?3*D(748);JB*3 5&43.**3D^OR&
MT+M9G*1!-":Q3Z9Q%J74XZ/(/ ZS*64*4&F1B^DLI%,:I01U9(]I:L^<!+XW
MFL2)O.*M!^^2>WS+2#JA@A2;43?P Q=($3DCB6<T<=(@CAAI'6_0$Z]6Q!**
M)-)@3L-[I?Z1&*9N].J?"]776\_\J==51ZT?DU\_+L]B-T/1.#>'?A!2=L]2
M.F7<'I7T+EUJO8ZJ:O!KJ+UV;ZG"C[;LM%6+=E1?I];(&QFC#;T^A;(T(U4S
M3%/O+8&DI@FV?-'K4,AX&8^W<6$M/=_R>XX&S%#?Z/CF)A>;A-8FU71SV>[I
MW4YYTBOG&T5^M\RI=98^=;516VMKIJ<:HTV#WB13F1'F4RMB>D&BN-NFTY:^
MVO.[K@]BCL#41\;N^001,9G:TSJJU3:7IFY5)PNBV*/;IS.7(]<S_*[E6EU/
M=7L=??=T.9D\%N@HG;K45+6MER>,G"D-MDZHZ\NNV:6&T^GU:-MKJTY[]X0Y
MF?4)#75IFEVMHD"6@7]MG]!<.M2BJCI2#>JH>K?;VSUA3J:B/ZW3ZY@\^#YN
MXAB5OZ.7;<;DIWJ9IO4T0^^UC:5IJ5V+!VM3RZ.T2C0>I?7>SBBMOU:4_C+S
MG)02/TYDB$Y$P,90)R+")])*%OP?A*[/3UCU%P3$"[UC$KW..>C7:\_=)M :
M-D*-5/X+8]FFKG?%,G!VP^A"K%"[L%YB'S;TLFZUOF[NU"WT:>D_7KD\\E:4
MNR'C"W1Y9A!8!1W_7O"_+]OZ+W2+]- 4BOV_LC,'$:D$IWY_%QBHUPCQJ.]D
M84J\F++HGREQPC!>$!Y(291-1S0A*EE, D!Z 2,. 64$GFR/(\X>DD&,0.<T
M(H%/ J &?02E=.*D^"9CE)$ F. \@F\X'HK)61.OD8R8: J[%).#P),8UU4&
MXF\1?(52'A2\P#(;@O^9L11,(,T21#Z#D]/3P4TA<!2GB'GOD14_"SD+9["%
M1G0+;FJTCIDM7MOQK,G9YOIK<$96+:R9+QD#4P=^IB2;H0 (T'B$)Z,P=K\1
M6#IN!R0-II0T9/!O0K^ <1*XQ&RKK8#CD%'.)+3- P>-K!P6<CA0B0K/ AN[
M8T(%;*A=K<NAN=[MR6C?Z3PG(I"6]L,#@@!&.P)"+N!+XD$7(P'^&?SW=GAB
MGYY?GGRX(4>D=89:M/\S&-Y<?+H^^KK'6?JZ5](;AU45I3T#K^U6V0JO&:II
MJ)H.:NXN3=7HF5Q?5JXOM4>T3E^U^NW=^FJ3EO$J^F(^GX#%6>)2T-J8\O3U
M(Q' <H>RN&@OT92)FL(_9)^<QK/[)!A/4M( -P26M18:-SF)4@B&)V'J0*2!
M\!7/(=BK(MK#0Z_7^,]>&$3978NGU1Z=OP\#EC)E+V^M2*3L-=_!]);*&8#'
MWR"S;CT2)5?LYUD0?+<%E2&X]/G.4M4MLRU@@-I]AA%IL$=JWQ_D/6!$F"SL
MA !2NI>8D::97)'\*36Y!T'Z(5U65;EW@'2X)0 =2R-&81$X;+.[:)X'K>/
M!N8/2 0?L623-^%WW"_MD$9H;IH&"19G$YXO,SC.I:YW.)>ZWGT-+G5(%#AY
M4W\-\FV3>SU_OG 1.!W+:G,Z^'PYG2=[6YYA"QL6WM8KE[U@BU5__!9['MP!
M=H0ECQ'F. 3H((93I+_IK^%OO1Y?>OZH0>SV,HJ@:'#]Z6IPI9#?*%DX"*TX
M3N(@'#X"$ 2PYXP=8#,$5)"4 9-$EI70^:QBPFYEEHL)H$Q3AQ6$W+[;%<HT
M.E5=&@_H4C=?2YO?K?CX/4J/HM:RPW[DDKXH83-X"!"/P_U]_ BFI!OUK_PK
M6%1%>LCF(#'PN*2"7<QP\)MLAV\.&0>8)@$: 2%BZ")Z(KGW[B0(/2YIOU8K
M4RCZ+R8Q6U$L7H/MXN1 !TF=5_A ;+O&2#%L@[S4#F0,HWN>*J'G"")K_"F$
MW$(.0OPL<E%QF"JYD(W ,#^)IS@(5E^H5WSP&29DR**=YR2%3F6Z!0D09&$5
M6@43(E]K'7O4A:A@^Y-B)).F9*^WY0D5V !!F*[(Q;F%E]@+AXT YWN8R&)/
M>I<:&VEE;NO<0&$ALPC3WY6$J5&DF_BMY WYC-=Q2OM;G*60=!&DD_4%!BEM
M'OQPSV*0('KQ(LK)#7FVNMO.UM0;03[INIA#2PN@20*?7)&^(S'QHG%Q8P^&
M0\%3FF24\WY89_#93?-I]JLB5)H+_IOU_]5KLE44"_;G :0W6R1\5Z^)*H#H
M%F$WG@-=-.8!['ZUJ_-;>S@X_30\(_M3D Q>.6F:P+(XB3NQW1B2W[L49D_O
MH.GD]G:XZH[]X-WYQ>7 OCZY&MC82O;]Z%V5.R&0/0^*EEPJV81?H3&+6#".
M0&402\=RQ9'W=Q 7A" >'67CQMX V$JPFH/.)V9Y$V;*W@%9(1&4[G"??!!5
M #+UL1+AQHF7*U0,&U&<"TF!E^-KOHJ2/P755,-U@76;.C,;J-B"2B/BZQ?X
MI)%%8? -(F:N9^S?;#8!=(C2!ZFJLBE7^G MF/A!PE+N2@1MGN#J!J,LI;FK
M%0((KD CP!3:2TEAZ1UP=D X#U7^?H+69I. ]<!*;Q4GYQC$L#_?#ALML:-C
MTU]UX-V.P!KZ5;)A''_+9IR/QLFMO;*( W+]Y?+R@*@'Y.+#]:?AP#X]N1G@
M=P1DJS;.E6!KEFV*@\WOGL?RX/I6L,R-&5TCO6L=2X,M\8[O )_&$1!E ?<N
M5-PX1FN0\L(8/P(BC:JI-QN-K L//LE;E"FDFF6GL>W.,DG:<P ,Y+05 L9
MM6/?9Q0FJC(CJ,%<;TE(#?UQ0@"IQ^FD28Z/<'(8GO.R9;SLNU6\-3\I52=W
MA#YA@(5[PMI<#0?G]N6@X4>MX]RG\^[2$_.#6;YO</62/+PXT@DVG91[HYQO
MMVWL,(T-L9XB#P^E1>E4Q!,V.E@+1[L<?T6A299+"/;VR)%Q>*U)6CJ._VEC
M'"JG%H"D:^^VVC@OI4H;%V$$]KI[# < @QX#)KC<DF*0EH3'D2"^9V/UT[4=
M<(PR)V7'7QN5B_4$WM="2BFHG\41?22@2UJE7>.O+:!1KH $C1LK(B;@",@1
M,1>0NA=B@7C4\A-GC*"$PT8V KBX7C;F[A?X]WS'0).5]6&<6M:'^4!_ @-%
M8-])?H4F=S HX.QN#JM($>E5 -[?08I(K@(67XP4D58!%DD))[HAH&XPWA)>
M+"8J92@3&H(N=F)@[!N/_@0[+P B3@7JX,$&4D^ 8(N8&'IKA(<@.>#@\90=
MK&W%:(P!*[3![4N$Q3Q<,1 S\C9Z@A=&,NEZ %4^C!Y?"!WE.LEF;K>VL-M]
M#&'S./ H4VV(LA-<+85E8EX#WN5H>-F-6G^KOZ!G> KR%UITOYX(G0[6%LT
M\H8[/J\FC7G1J%8)RBC+ W&81]D'X!>7M32P%*ME_!:!9XVMGXXX.R+00=#]
M#7,[#P_V5JFIJ%^+R@J/JR71+PII8390-82./GGCX3]8#+S_)<07*U"O5-;$
M1V Y^B;:G#2>!B[L>8[7^$6T<IK-@PWFQ0"YFB)*[PK/-[<GEX-B:[F.%^4H
M"MY[X9-9S%@P"NF!W',6- Q;X X1^![W8KD VW:4;5M)=0_Y^YO'(R8E*>=[
MR'HE2IX%5BI1S[IE4D\\#X1S9N]CYH5*G(Q_SVM%?VR[<&*H7573=577K*6N
M:^VN/-9OE^KY6J]O&KNK4J]R*N3F9[)L5#J"79W @CTT_HT'O0CH^=LH7BA-
M//$W49 =Y2,I_ \\-;K "SU$X\,&&]4Q?MZ+<>GAZP) +0WXB#P2PWB7R!"S
M6IT5V<KI-+@"F/CAH;+:(FLRL*U>'*#7">>!?C2J]%N]*/?#Z(^)8]XM_[[9
M2X"G]7[BS69/X>_K/<6;HN=?[R3XPG*^A<7@6M5,CL@OE37 XGVGI_$*LGCN
M+MU7*O9?(U'[[_0Z<C@^KSZ=?8',[&QP<SJ\^'Q[\>FZL<>5I2GZH:'<$2\!
M))4 ''RZM3Q\-E"^*H9G UK/-);"X(7G6L\X?M>[I-5^I<.!*& 3L&)9\RA7
MW,"XGW@YYB,1U^"^NS.C4ZJD4V#X,^J&3NX]JUL>>6%[V\V02D%:0B3(*RG$
M]Q<7V=X]1N&I6 M=!*74B69). C((9.9\'9 +6KS*U=O-%=QE?""I[CZ ^-Y
M<1MI >0"0,NOIC P([J9S!<7C2)2AG0L1L1IF0B)D1ZFUT$*&WF6X%TA!A-D
M/+VT3#$)# #PO(BSD%]%(KX3A&02)PD@ @YM)]F8 ^;<?@ RD'&&8'<!_%"8
M&/CTQ+X"'D[B!2!>+BT772P% =">IS8\&>%""^D$LR4!&5[I83'D&+,X - Q
MRM)\U7#610",@M!R;9#>+(D!P4P512GTXH0@W*9R\G"Z2D$ NS!1R"]K;AXX
MSZS0RQ,<O,K%\/ ./#3%=,CG,L,0.J,1+_JL)31ESE9%[ZT7KD"@!>:/<WX*
M!T+/ X\O.Q+#E7=6!QI;<RY@*XB0,7 X/,KC]73NE?+8+XJ%V>0[Z(;IK=UR
MXZL6B,MMJW177.@4>>X_KLYO.36T T$_8TA57G!;3"@ 7B8(H"FQ]8MN"FP.
MAMDF;>YR/7C6'M_T5D78C;,D>7!,2+58]/C^^$!B7U#=DN$7C>54'V9=_;\0
8=T+=;RR;'M$N7O[PO/K_ 9XAB&J!,@
This BitKeeper patch contains the following changesets:
1.1557.17.3
## Wrapped with gzip_uu ##
M'XL( ,=6B4 [646V_:0!"%G[V_8JJ\$$6L]^I;"TH3>D'I!4'SC+;V$%M@
M.[*7I%']X[N !"HT#XU:KZ619F>/SIY/]AG<MM@DGBF,X.0,/M:M3;S45-9\
MIQ5:UYK6M6OY>5VBWS:I7]E%VQ<T(&YO8FR:PP,V;>)Q*O<=^W2/B3=]]^'V
MT]LI(8,!7.>FNL,96A@,B*V;![/*VDMC\U5=4=N8JBW1&IK69;<?[01CPBW-
M0\ETT/& J;!+><:Y41PS)E04*++U?GGP_+N <@(QES+B82>9$!$9 :=<ZY#R
MD$I@RF?"9S%PE0B1:'W!6,(8'*O"!8<^(U?P;\U?DQ2^?'L_2^"S62(4%IS*
M?;%"2BFY >=8!F1RB(_T__(AA!E&AG!UTRW:+3R_,B46-.UX'#+&W9(LUG''
MG&'112I":<(X1IUI9O1)$"<R^Y"5<'?J>!A%X9;YT>"&_$M=G$)^UH7DL9(=
M5V&@MZAE<,Q81<\REM 7_X4Q(BXI0/DGR+O$OD*_>=R^#MKD.+P7<!\+">Z;
M+JITM<X0WJR*:OW#;S%=-X5]HOF0C$2T&1GOBE<LH/=J-A_/1N-I+\/*SHNJ
MSK _+.:EJ^?G\).,) LW1W;%R^[0SE=UNL2L5^'C?'/J_/7AUY#FF"[;=3E0
/@5X(S1?D%T^IK-1R!
This BitKeeper patch contains the following changesets:
1.1557.17.2
## Wrapped with gzip_uu ##
M'XL( ,A6B4 [U8;7/:2!+^C'[%W&Y=%KQ8S$A" E).V3'96RI9)V4[=Q^N
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
+O?\ PP6)%/X5
This BitKeeper patch contains the following changesets:
1.1557.9.1
## Wrapped with gzip_uu ##
M'XL( ,E6B4 \66;8_:.!#'7^-/8;5O[EHE>!P[#U14^]RNNM>N8+<]G59"
MQG&6:$E"$[.K5OGPYP38)4!TM[2](PC#.)GQS&_^-B_Q=:'R7D?$@@)ZB=]G
MA>YUI$BU&-NITL8TR#)CZDZR1'6+7'93'146M5UDYBZ%EA-\K_*BUP';>;3H
M;S/5ZPQ.WUU?' X0ZO?Q\42DMVJH-.[WD<[R>S$-BP.A)],LM74NTB)16M@R
M2\K'6TM*"#47!\\AW"W!)<PK)80 @H$*"66^R]"1_5<V36.5W\7J(9;?#]3T
M3MBS!UN%<WLV;?ICQI]/&/.Y4]+ HQXZP6 #YYX=V( )ZQ+:)3X&O\=XC_+7
MA/0(P75]#I[J@E\S;!%TA']N*L=(XH]79\,>KBH5CVY5JG*AXRS%<8H_GPW-
MD(4*1WF6X$)]':59-5$]LIBQT0=LT@) ET\E1]8S7P@10=!;?/2AC(H:>'?A
M["*[+2'P" %S.23@04G,RRW#R(T" 1XG*G*\B&T5;(>C%0WPF<-922@0OQGT
M#W&GHGBJ=L0$KXR4A#$'#BPDSGB;T;:;M8B,D)+Z@>\V(RZ**'<%9.58AD[D
MN]+U0R)-[[1'7+EI!/1,BB[CS8!3\2V;:WNR*Z);^D 4<P.I?!>($- >\='/
M>D@:E)1"P&L%;@&HE+@_8?1O"0,$X-# Z,TEODF_UIM#FE)S>IS]]U*[GH5"
M+S13]=XG;.4/]=M(X'*[8'OHZ)Q2S!"UP?:PA;^<7Z(;U+%VJEM/U*;"*]-2
MY5E4_UI7^DT#ZZK)-Z@^2T+M3)L2>D)*?>.U1NJY3:+,L&PE"MB"7TBT/I%,
M66NRM<A;T*[2VH/LB4D3G5<?IW]>#0Y'QV<7A^^&N(^MDPK2Z//I8'C^Z6/_
MYD5-WS+L;UXTB"TWB0U@S]J!VH$U=J U"=+ #Q82)-X6,*\5F(,MYY< ^Y%S
MKMI,6\ NT]^'*W?<BNQBZ-S'UMO&^OHX-:;EFOIXJL =Z6PD9_/?DMH^5ZE4
MHW2>C%7^^QMT @"T<K@<_]'C6!3F\4=+Y8&!5WM8C#^^IO4N7!T<&VWXO'.I
MO0_7SR6'>)0:+X[9>1;G4MV(P68?TN#_VCBJKJH7UM)6JVSVZ:N L0KB8NB^
MPI2\ZG8*E^&I*/1(2*F*8J3C1+WI=,STE?EFMORXP$FD<:YDEH?X013U[4__
8O>5$R;MBGO0YY8QYW$=_ S#(15S3"P
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH-2.6.6-rc2-bk] NTFS 2.1.7 release: Implement NFS exporting
2004-04-23 20:03 [PATCH-2.6.6-rc2-bk] NTFS 2.1.7 release: Implement NFS exporting Anton Altaparmakov
@ 2004-04-26 15:59 ` Bill Davidsen
2004-04-26 16:01 ` Anton Altaparmakov
0 siblings, 1 reply; 3+ messages in thread
From: Bill Davidsen @ 2004-04-26 15:59 UTC (permalink / raw)
To: Anton Altaparmakov; +Cc: Linus Torvalds, Andrew Morton, linux-kernel
Anton Altaparmakov wrote:
> Linus, please do a
>
> bk pull http://linux-ntfs.bkbits.net/ntfs-2.6
>
> Thanks! This update implements NFS exporting of mounted NTFS volumes
> which people have been requesting for a while. Also, there are some minor
> updates and white space cleanups. This has been tested including forcing
> a server reboot while clients have open files on an NTFS volume NFS
> exported by the server.
Sounds like tha answer to the maiden's prayer. And if it will allow both
NFS and SMB access to the same data, I know some people who will find
it most useful.
--
-bill davidsen (davidsen@tmr.com)
"The secret to procrastination is to put things off until the
last possible moment - but no longer" -me
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH-2.6.6-rc2-bk] NTFS 2.1.7 release: Implement NFS exporting
2004-04-26 15:59 ` Bill Davidsen
@ 2004-04-26 16:01 ` Anton Altaparmakov
0 siblings, 0 replies; 3+ messages in thread
From: Anton Altaparmakov @ 2004-04-26 16:01 UTC (permalink / raw)
To: Bill Davidsen; +Cc: Linus Torvalds, Andrew Morton, linux-kernel
On Mon, 2004-04-26 at 16:59, Bill Davidsen wrote:
> Anton Altaparmakov wrote:
> > Linus, please do a
> >
> > bk pull http://linux-ntfs.bkbits.net/ntfs-2.6
> >
> > Thanks! This update implements NFS exporting of mounted NTFS volumes
> > which people have been requesting for a while. Also, there are some minor
> > updates and white space cleanups. This has been tested including forcing
> > a server reboot while clients have open files on an NTFS volume NFS
> > exported by the server.
>
> Sounds like tha answer to the maiden's prayer. And if it will allow both
> NFS and SMB access to the same data, I know some people who will find
> it most useful.
It certainly should allow both NFS and SMB access to the same data. At
least I don't see any reason why it shouldn't work...
But keep in mind that whilst the ntfs driver can read everything (except
encrypted files) at present it can only overwrite existing files without
changes in file size...
Best regards,
Anton
--
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
Unix Support, Computing Service, University of Cambridge, CB2 3QH, UK
Linux NTFS maintainer / IRC: #ntfs on irc.freenode.net
WWW: http://linux-ntfs.sf.net/ &
http://www-stu.christs.cam.ac.uk/~aia21/
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2004-04-26 16:06 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-04-23 20:03 [PATCH-2.6.6-rc2-bk] NTFS 2.1.7 release: Implement NFS exporting Anton Altaparmakov
2004-04-26 15:59 ` Bill Davidsen
2004-04-26 16:01 ` Anton Altaparmakov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.