Merge branch 'master' of /usr/src/ntfs-2.6/
This commit is contained in:
@@ -884,7 +884,7 @@ ToDo/Notes:
|
||||
|
||||
- Add handling for initialized_size != data_size in compressed files.
|
||||
- Reduce function local stack usage from 0x3d4 bytes to just noise in
|
||||
fs/ntfs/upcase.c. (Randy Dunlap <rddunlap@osdl.ord>)
|
||||
fs/ntfs/upcase.c. (Randy Dunlap <rdunlap@xenotime.net>)
|
||||
- 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
|
||||
|
@@ -1532,7 +1532,7 @@ int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a,
|
||||
* NOTE to self: No changes in the attribute list are required to move from
|
||||
* a resident to a non-resident attribute.
|
||||
*
|
||||
* Locking: - The caller must hold i_sem on the inode.
|
||||
* Locking: - The caller must hold i_mutex on the inode.
|
||||
*/
|
||||
int ntfs_attr_make_non_resident(ntfs_inode *ni, const u32 data_size)
|
||||
{
|
||||
@@ -1728,7 +1728,7 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni, const u32 data_size)
|
||||
/*
|
||||
* This needs to be last since the address space operations ->readpage
|
||||
* and ->writepage can run concurrently with us as they are not
|
||||
* serialized on i_sem. Note, we are not allowed to fail once we flip
|
||||
* serialized on i_mutex. Note, we are not allowed to fail once we flip
|
||||
* this switch, which is another reason to do this last.
|
||||
*/
|
||||
NInoSetNonResident(ni);
|
||||
|
@@ -69,7 +69,7 @@ ntfschar I30[5] = { const_cpu_to_le16('$'), const_cpu_to_le16('I'),
|
||||
* work but we don't care for how quickly one can access them. This also fixes
|
||||
* the dcache aliasing issues.
|
||||
*
|
||||
* Locking: - Caller must hold i_sem on the directory.
|
||||
* Locking: - Caller must hold i_mutex on the directory.
|
||||
* - Each page cache page in the index allocation mapping must be
|
||||
* locked whilst being accessed otherwise we may find a corrupt
|
||||
* page due to it being under ->writepage at the moment which
|
||||
@@ -1085,11 +1085,11 @@ static inline int ntfs_filldir(ntfs_volume *vol, loff_t fpos,
|
||||
* While this will return the names in random order this doesn't matter for
|
||||
* ->readdir but OTOH results in a faster ->readdir.
|
||||
*
|
||||
* VFS calls ->readdir without BKL but with i_sem held. This protects the VFS
|
||||
* VFS calls ->readdir without BKL but with i_mutex held. This protects the VFS
|
||||
* parts (e.g. ->f_pos and ->i_size, and it also protects against directory
|
||||
* modifications).
|
||||
*
|
||||
* Locking: - Caller must hold i_sem on the directory.
|
||||
* Locking: - Caller must hold i_mutex on the directory.
|
||||
* - Each page cache page in the index allocation mapping must be
|
||||
* locked whilst being accessed otherwise we may find a corrupt
|
||||
* page due to it being under ->writepage at the moment which
|
||||
@@ -1520,7 +1520,7 @@ static int ntfs_dir_open(struct inode *vi, struct file *filp)
|
||||
* Note: In the past @filp could be NULL so we ignore it as we don't need it
|
||||
* anyway.
|
||||
*
|
||||
* Locking: Caller must hold i_sem on the inode.
|
||||
* Locking: Caller must hold i_mutex on the inode.
|
||||
*
|
||||
* TODO: We should probably also write all attribute/index inodes associated
|
||||
* with this inode but since we have no simple way of getting to them we ignore
|
||||
|
@@ -106,7 +106,7 @@ static int ntfs_file_open(struct inode *vi, struct file *filp)
|
||||
* this is the case, the necessary zeroing will also have happened and that all
|
||||
* metadata is self-consistent.
|
||||
*
|
||||
* Locking: i_sem on the vfs inode corrseponsind to the ntfs inode @ni must be
|
||||
* Locking: i_mutex on the vfs inode corrseponsind to the ntfs inode @ni must be
|
||||
* held by the caller.
|
||||
*/
|
||||
static int ntfs_attr_extend_initialized(ntfs_inode *ni, const s64 new_init_size,
|
||||
@@ -473,7 +473,7 @@ static inline int ntfs_submit_bh_for_read(struct buffer_head *bh)
|
||||
* @bytes: number of bytes to be written
|
||||
*
|
||||
* This is called for non-resident attributes from ntfs_file_buffered_write()
|
||||
* with i_sem held on the inode (@pages[0]->mapping->host). There are
|
||||
* with i_mutex held on the inode (@pages[0]->mapping->host). There are
|
||||
* @nr_pages pages in @pages which are locked but not kmap()ped. The source
|
||||
* data has not yet been copied into the @pages.
|
||||
*
|
||||
@@ -1637,7 +1637,7 @@ err_out:
|
||||
* @pos: byte position in file at which the write begins
|
||||
* @bytes: number of bytes to be written
|
||||
*
|
||||
* This is called from ntfs_file_buffered_write() with i_sem held on the inode
|
||||
* This is called from ntfs_file_buffered_write() with i_mutex held on the inode
|
||||
* (@pages[0]->mapping->host). There are @nr_pages pages in @pages which are
|
||||
* locked but not kmap()ped. The source data has already been copied into the
|
||||
* @page. ntfs_prepare_pages_for_non_resident_write() has been called before
|
||||
@@ -1814,7 +1814,7 @@ err_out:
|
||||
/**
|
||||
* ntfs_file_buffered_write -
|
||||
*
|
||||
* Locking: The vfs is holding ->i_sem on the inode.
|
||||
* Locking: The vfs is holding ->i_mutex on the inode.
|
||||
*/
|
||||
static ssize_t ntfs_file_buffered_write(struct kiocb *iocb,
|
||||
const struct iovec *iov, unsigned long nr_segs,
|
||||
@@ -2173,7 +2173,7 @@ static ssize_t ntfs_file_aio_write_nolock(struct kiocb *iocb,
|
||||
err = remove_suid(file->f_dentry);
|
||||
if (err)
|
||||
goto out;
|
||||
inode_update_time(inode, 1);
|
||||
file_update_time(file);
|
||||
written = ntfs_file_buffered_write(iocb, iov, nr_segs, pos, ppos,
|
||||
count);
|
||||
out:
|
||||
@@ -2196,9 +2196,9 @@ static ssize_t ntfs_file_aio_write(struct kiocb *iocb, const char __user *buf,
|
||||
|
||||
BUG_ON(iocb->ki_pos != pos);
|
||||
|
||||
down(&inode->i_sem);
|
||||
mutex_lock(&inode->i_mutex);
|
||||
ret = ntfs_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos);
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
|
||||
int err = sync_page_range(inode, mapping, pos, ret);
|
||||
if (err < 0)
|
||||
@@ -2221,12 +2221,12 @@ static ssize_t ntfs_file_writev(struct file *file, const struct iovec *iov,
|
||||
struct kiocb kiocb;
|
||||
ssize_t ret;
|
||||
|
||||
down(&inode->i_sem);
|
||||
mutex_lock(&inode->i_mutex);
|
||||
init_sync_kiocb(&kiocb, file);
|
||||
ret = ntfs_file_aio_write_nolock(&kiocb, iov, nr_segs, ppos);
|
||||
if (ret == -EIOCBQUEUED)
|
||||
ret = wait_on_sync_kiocb(&kiocb);
|
||||
up(&inode->i_sem);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
|
||||
int err = sync_page_range(inode, mapping, *ppos - ret, ret);
|
||||
if (err < 0)
|
||||
@@ -2269,7 +2269,7 @@ static ssize_t ntfs_file_write(struct file *file, const char __user *buf,
|
||||
* Note: In the past @filp could be NULL so we ignore it as we don't need it
|
||||
* anyway.
|
||||
*
|
||||
* Locking: Caller must hold i_sem on the inode.
|
||||
* Locking: Caller must hold i_mutex on the inode.
|
||||
*
|
||||
* TODO: We should probably also write all attribute/index inodes associated
|
||||
* with this inode but since we have no simple way of getting to them we ignore
|
||||
|
@@ -32,7 +32,7 @@
|
||||
* Allocate a new index context, initialize it with @idx_ni and return it.
|
||||
* Return NULL if allocation failed.
|
||||
*
|
||||
* Locking: Caller must hold i_sem on the index inode.
|
||||
* Locking: Caller must hold i_mutex on the index inode.
|
||||
*/
|
||||
ntfs_index_context *ntfs_index_ctx_get(ntfs_inode *idx_ni)
|
||||
{
|
||||
@@ -50,7 +50,7 @@ ntfs_index_context *ntfs_index_ctx_get(ntfs_inode *idx_ni)
|
||||
*
|
||||
* Release the index context @ictx, releasing all associated resources.
|
||||
*
|
||||
* Locking: Caller must hold i_sem on the index inode.
|
||||
* Locking: Caller must hold i_mutex on the index inode.
|
||||
*/
|
||||
void ntfs_index_ctx_put(ntfs_index_context *ictx)
|
||||
{
|
||||
@@ -106,7 +106,7 @@ void ntfs_index_ctx_put(ntfs_index_context *ictx)
|
||||
* or ntfs_index_entry_write() before the call to ntfs_index_ctx_put() to
|
||||
* ensure that the changes are written to disk.
|
||||
*
|
||||
* Locking: - Caller must hold i_sem on the index inode.
|
||||
* Locking: - Caller must hold i_mutex on the index inode.
|
||||
* - Each page cache page in the index allocation mapping must be
|
||||
* locked whilst being accessed otherwise we may find a corrupt
|
||||
* page due to it being under ->writepage at the moment which
|
||||
|
@@ -2125,13 +2125,13 @@ void ntfs_put_inode(struct inode *vi)
|
||||
ntfs_inode *ni = NTFS_I(vi);
|
||||
if (NInoIndexAllocPresent(ni)) {
|
||||
struct inode *bvi = NULL;
|
||||
down(&vi->i_sem);
|
||||
mutex_lock(&vi->i_mutex);
|
||||
if (atomic_read(&vi->i_count) == 2) {
|
||||
bvi = ni->itype.index.bmp_ino;
|
||||
if (bvi)
|
||||
ni->itype.index.bmp_ino = NULL;
|
||||
}
|
||||
up(&vi->i_sem);
|
||||
mutex_unlock(&vi->i_mutex);
|
||||
if (bvi)
|
||||
iput(bvi);
|
||||
}
|
||||
@@ -2311,7 +2311,7 @@ static const char *es = " Leaving inconsistent metadata. Unmount and run "
|
||||
*
|
||||
* Returns 0 on success or -errno on error.
|
||||
*
|
||||
* Called with ->i_sem held. In all but one case ->i_alloc_sem is held for
|
||||
* Called with ->i_mutex held. In all but one case ->i_alloc_sem is held for
|
||||
* writing. The only case in the kernel where ->i_alloc_sem is not held is
|
||||
* mm/filemap.c::generic_file_buffered_write() where vmtruncate() is called
|
||||
* with the current i_size as the offset. The analogous place in NTFS is in
|
||||
@@ -2767,7 +2767,25 @@ unm_done:
|
||||
up_write(&ni->runlist.lock);
|
||||
done:
|
||||
/* Update the mtime and ctime on the base inode. */
|
||||
inode_update_time(VFS_I(base_ni), 1);
|
||||
/* normally ->truncate shouldn't update ctime or mtime,
|
||||
* but ntfs did before so it got a copy & paste version
|
||||
* of file_update_time. one day someone should fix this
|
||||
* for real.
|
||||
*/
|
||||
if (!IS_NOCMTIME(VFS_I(base_ni)) && !IS_RDONLY(VFS_I(base_ni))) {
|
||||
struct timespec now = current_fs_time(VFS_I(base_ni)->i_sb);
|
||||
int sync_it = 0;
|
||||
|
||||
if (!timespec_equal(&VFS_I(base_ni)->i_mtime, &now) ||
|
||||
!timespec_equal(&VFS_I(base_ni)->i_ctime, &now))
|
||||
sync_it = 1;
|
||||
VFS_I(base_ni)->i_mtime = now;
|
||||
VFS_I(base_ni)->i_ctime = now;
|
||||
|
||||
if (sync_it)
|
||||
mark_inode_dirty_sync(VFS_I(base_ni));
|
||||
}
|
||||
|
||||
if (likely(!err)) {
|
||||
NInoClearTruncateFailed(ni);
|
||||
ntfs_debug("Done.");
|
||||
@@ -2831,7 +2849,7 @@ void ntfs_truncate_vfs(struct inode *vi) {
|
||||
* We also abort all changes of user, group, and mode as we do not implement
|
||||
* the NTFS ACLs yet.
|
||||
*
|
||||
* Called with ->i_sem held. For the ATTR_SIZE (i.e. ->truncate) case, also
|
||||
* Called with ->i_mutex held. For the ATTR_SIZE (i.e. ->truncate) case, also
|
||||
* called with ->i_alloc_sem held for writing.
|
||||
*
|
||||
* Basically this is a copy of generic notify_change() and inode_setattr()
|
||||
|
@@ -96,7 +96,7 @@
|
||||
* 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.
|
||||
*
|
||||
* Locking: Caller must hold i_sem on the directory.
|
||||
* Locking: Caller must hold i_mutex on the directory.
|
||||
*/
|
||||
static struct dentry *ntfs_lookup(struct inode *dir_ino, struct dentry *dent,
|
||||
struct nameidata *nd)
|
||||
@@ -254,7 +254,7 @@ handle_name:
|
||||
nls_name.hash = full_name_hash(nls_name.name, nls_name.len);
|
||||
|
||||
/*
|
||||
* Note: No need for dent->d_lock lock as i_sem is held on the
|
||||
* Note: No need for dent->d_lock lock as i_mutex is held on the
|
||||
* parent inode.
|
||||
*/
|
||||
|
||||
@@ -374,7 +374,7 @@ struct inode_operations ntfs_dir_inode_ops = {
|
||||
* 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.
|
||||
* Note: ntfs_get_parent() is called with @child_dent->d_inode->i_mutex down.
|
||||
*
|
||||
* Return the dentry of the parent directory on success or the error code on
|
||||
* error (IS_ERR() is true).
|
||||
|
@@ -48,7 +48,7 @@ BOOL ntfs_mark_quotas_out_of_date(ntfs_volume *vol)
|
||||
ntfs_error(vol->sb, "Quota inodes are not open.");
|
||||
return FALSE;
|
||||
}
|
||||
down(&vol->quota_q_ino->i_sem);
|
||||
mutex_lock(&vol->quota_q_ino->i_mutex);
|
||||
ictx = ntfs_index_ctx_get(NTFS_I(vol->quota_q_ino));
|
||||
if (!ictx) {
|
||||
ntfs_error(vol->sb, "Failed to get index context.");
|
||||
@@ -98,7 +98,7 @@ BOOL ntfs_mark_quotas_out_of_date(ntfs_volume *vol)
|
||||
ntfs_index_entry_mark_dirty(ictx);
|
||||
set_done:
|
||||
ntfs_index_ctx_put(ictx);
|
||||
up(&vol->quota_q_ino->i_sem);
|
||||
mutex_unlock(&vol->quota_q_ino->i_mutex);
|
||||
/*
|
||||
* We set the flag so we do not try to mark the quotas out of date
|
||||
* again on remount.
|
||||
@@ -110,7 +110,7 @@ done:
|
||||
err_out:
|
||||
if (ictx)
|
||||
ntfs_index_ctx_put(ictx);
|
||||
up(&vol->quota_q_ino->i_sem);
|
||||
mutex_unlock(&vol->quota_q_ino->i_mutex);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@@ -443,8 +443,8 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt)
|
||||
|
||||
ntfs_debug("Entering with remount options string: %s", opt);
|
||||
#ifndef NTFS_RW
|
||||
/* For read-only compiled driver, enforce all read-only flags. */
|
||||
*flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
/* For read-only compiled driver, enforce read-only flag. */
|
||||
*flags |= MS_RDONLY;
|
||||
#else /* NTFS_RW */
|
||||
/*
|
||||
* For the read-write compiled driver, if we are remounting read-write,
|
||||
@@ -1213,10 +1213,10 @@ static int check_windows_hibernation_status(ntfs_volume *vol)
|
||||
* Find the inode number for the hibernation file by looking up the
|
||||
* filename hiberfil.sys in the root directory.
|
||||
*/
|
||||
down(&vol->root_ino->i_sem);
|
||||
mutex_lock(&vol->root_ino->i_mutex);
|
||||
mref = ntfs_lookup_inode_by_name(NTFS_I(vol->root_ino), hiberfil, 12,
|
||||
&name);
|
||||
up(&vol->root_ino->i_sem);
|
||||
mutex_unlock(&vol->root_ino->i_mutex);
|
||||
if (IS_ERR_MREF(mref)) {
|
||||
ret = MREF_ERR(mref);
|
||||
/* If the file does not exist, Windows is not hibernated. */
|
||||
@@ -1307,10 +1307,10 @@ static BOOL load_and_init_quota(ntfs_volume *vol)
|
||||
* Find the inode number for the quota file by looking up the filename
|
||||
* $Quota in the extended system files directory $Extend.
|
||||
*/
|
||||
down(&vol->extend_ino->i_sem);
|
||||
mutex_lock(&vol->extend_ino->i_mutex);
|
||||
mref = ntfs_lookup_inode_by_name(NTFS_I(vol->extend_ino), Quota, 6,
|
||||
&name);
|
||||
up(&vol->extend_ino->i_sem);
|
||||
mutex_unlock(&vol->extend_ino->i_mutex);
|
||||
if (IS_ERR_MREF(mref)) {
|
||||
/*
|
||||
* If the file does not exist, quotas are disabled and have
|
||||
@@ -1390,10 +1390,10 @@ static BOOL load_and_init_usnjrnl(ntfs_volume *vol)
|
||||
* Find the inode number for the transaction log file by looking up the
|
||||
* filename $UsnJrnl in the extended system files directory $Extend.
|
||||
*/
|
||||
down(&vol->extend_ino->i_sem);
|
||||
mutex_lock(&vol->extend_ino->i_mutex);
|
||||
mref = ntfs_lookup_inode_by_name(NTFS_I(vol->extend_ino), UsnJrnl, 8,
|
||||
&name);
|
||||
up(&vol->extend_ino->i_sem);
|
||||
mutex_unlock(&vol->extend_ino->i_mutex);
|
||||
if (IS_ERR_MREF(mref)) {
|
||||
/*
|
||||
* If the file does not exist, transaction logging is disabled,
|
||||
@@ -1721,7 +1721,7 @@ static BOOL load_system_files(ntfs_volume *vol)
|
||||
es3);
|
||||
goto iput_mirr_err_out;
|
||||
}
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
ntfs_error(sb, "%s. Mounting read-only%s",
|
||||
!vol->mftmirr_ino ? es1 : es2, es3);
|
||||
} else
|
||||
@@ -1837,7 +1837,7 @@ get_ctx_vol_failed:
|
||||
es1, es2);
|
||||
goto iput_vol_err_out;
|
||||
}
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
} else
|
||||
ntfs_warning(sb, "%s. Will not be able to remount "
|
||||
@@ -1874,7 +1874,7 @@ get_ctx_vol_failed:
|
||||
}
|
||||
goto iput_logfile_err_out;
|
||||
}
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
} else
|
||||
ntfs_warning(sb, "%s. Will not be able to remount "
|
||||
@@ -1919,7 +1919,7 @@ get_ctx_vol_failed:
|
||||
es1, es2);
|
||||
goto iput_root_err_out;
|
||||
}
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
} else
|
||||
ntfs_warning(sb, "%s. Will not be able to remount "
|
||||
@@ -1943,7 +1943,7 @@ get_ctx_vol_failed:
|
||||
goto iput_root_err_out;
|
||||
}
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
/*
|
||||
* Do not set NVolErrors() because ntfs_remount() might manage
|
||||
* to set the dirty flag in which case all would be well.
|
||||
@@ -1970,7 +1970,7 @@ get_ctx_vol_failed:
|
||||
goto iput_root_err_out;
|
||||
}
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
NVolSetErrors(vol);
|
||||
}
|
||||
#endif
|
||||
@@ -1989,7 +1989,7 @@ get_ctx_vol_failed:
|
||||
goto iput_root_err_out;
|
||||
}
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
NVolSetErrors(vol);
|
||||
}
|
||||
#endif /* NTFS_RW */
|
||||
@@ -2030,7 +2030,7 @@ get_ctx_vol_failed:
|
||||
es1, es2);
|
||||
goto iput_quota_err_out;
|
||||
}
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
} else
|
||||
ntfs_warning(sb, "%s. Will not be able to remount "
|
||||
@@ -2053,7 +2053,7 @@ get_ctx_vol_failed:
|
||||
goto iput_quota_err_out;
|
||||
}
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
NVolSetErrors(vol);
|
||||
}
|
||||
/*
|
||||
@@ -2074,7 +2074,7 @@ get_ctx_vol_failed:
|
||||
es1, es2);
|
||||
goto iput_usnjrnl_err_out;
|
||||
}
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
} else
|
||||
ntfs_warning(sb, "%s. Will not be able to remount "
|
||||
@@ -2097,7 +2097,7 @@ get_ctx_vol_failed:
|
||||
goto iput_usnjrnl_err_out;
|
||||
}
|
||||
ntfs_error(sb, "%s. Mounting read-only%s", es1, es2);
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
NVolSetErrors(vol);
|
||||
}
|
||||
#endif /* NTFS_RW */
|
||||
@@ -2312,9 +2312,9 @@ static void ntfs_put_super(struct super_block *sb)
|
||||
if (!list_empty(&sb->s_dirty)) {
|
||||
const char *s1, *s2;
|
||||
|
||||
down(&vol->mft_ino->i_sem);
|
||||
mutex_lock(&vol->mft_ino->i_mutex);
|
||||
truncate_inode_pages(vol->mft_ino->i_mapping, 0);
|
||||
up(&vol->mft_ino->i_sem);
|
||||
mutex_unlock(&vol->mft_ino->i_mutex);
|
||||
write_inode_now(vol->mft_ino, 1);
|
||||
if (!list_empty(&sb->s_dirty)) {
|
||||
static const char *_s1 = "inodes";
|
||||
@@ -2689,7 +2689,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent)
|
||||
|
||||
ntfs_debug("Entering.");
|
||||
#ifndef NTFS_RW
|
||||
sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
#endif /* ! NTFS_RW */
|
||||
/* Allocate a new ntfs_volume and place it in sb->s_fs_info. */
|
||||
sb->s_fs_info = kmalloc(sizeof(ntfs_volume), GFP_NOFS);
|
||||
|
Reference in New Issue
Block a user