* Fix bug with updating atime on read-only volumes. (Thanks to Szaka and Anton)

* Add MS_NOATIME to ntfs_mount. (By Yuval's request)
edge.strict_endians
cha0smaster 2005-11-15 16:31:40 +00:00
parent 56c8393be0
commit e58a468d0c
4 changed files with 33 additions and 22 deletions

View File

@ -88,6 +88,7 @@ xx/xx/2005 - 1.12.2-WIP
stayed at approximately same level. (Yura)
- Automatically update access and change time in ntfs_attr_p{read,write}
and ntfs_attr_truncate. (Yura)
- Add support of MS_NOATIME flag to ntfs_mount(). (Yura)
10/10/2005 - 1.12.1 - Minor fix to location of mount.ntfs-fuse and mkfs.ntfs.

View File

@ -82,6 +82,7 @@ typedef enum {
NV_ReadOnly, /* 1: Volume is read-only. */
NV_CaseSensitive, /* 1: Volume is mounted case-sensitive. */
NV_LogFileEmpty, /* 1: $logFile journal is empty. */
NV_NoATime, /* 1: Do not update access time. */
} ntfs_volume_state_bits;
#define test_nvol_flag(nv, flag) test_bit(NV_##flag, (nv)->state)
@ -100,11 +101,15 @@ typedef enum {
#define NVolSetLogFileEmpty(nv) set_nvol_flag(nv, LogFileEmpty)
#define NVolClearLogFileEmpty(nv) clear_nvol_flag(nv, LogFileEmpty)
#define NVolNoATime(nv) test_nvol_flag(nv, NoATime)
#define NVolSetNoATime(nv) set_nvol_flag(nv, NoATime)
#define NVolClearNoATime(nv) clear_nvol_flag(nv, NoATime)
/*
* NTFS version 1.1 and 1.2 are used by Windows NT4.
* NTFS version 2.x is used by Windows 2000 Beta
* NTFS version 3.0 is used by Windows 2000.
* NTFS version 3.1 is used by Windows XP, Windows Server 2003 and Longhorn.
* NTFS version 3.1 is used by Windows XP, 2003 and Vista.
*/
#define NTFS_V1_1(major, minor) ((major) == 1 && (minor) == 1)
@ -200,13 +205,13 @@ struct _ntfs_volume {
extern ntfs_volume *ntfs_volume_alloc(void);
extern ntfs_volume *ntfs_volume_startup(struct ntfs_device *dev,
unsigned long rwflag);
unsigned long flags);
extern ntfs_volume *ntfs_device_mount(struct ntfs_device *dev,
unsigned long rwflag);
unsigned long flags);
extern int ntfs_device_umount(ntfs_volume *vol, const BOOL force);
extern ntfs_volume *ntfs_mount(const char *name, unsigned long rwflag);
extern ntfs_volume *ntfs_mount(const char *name, unsigned long flags);
extern int ntfs_umount(ntfs_volume *vol, const BOOL force);
extern int ntfs_version_is_supported(ntfs_volume *vol);

View File

@ -770,8 +770,10 @@ s64 ntfs_attr_pread(ntfs_attr *na, const s64 pos, s64 count, void *b)
errno = EACCES;
return -1;
}
vol = na->ni->vol;
/* Update access time if accessing unnamed data attribute. */
if (na->type == AT_DATA && na->name == AT_UNNAMED) {
if (!NVolReadOnly(vol) && !NVolNoATime(vol) && na->type == AT_DATA &&
na->name == AT_UNNAMED) {
na->ni->last_access_time = time(NULL);
NInoFileNameSetDirty(na->ni);
NInoSetDirty(na->ni);
@ -784,7 +786,6 @@ s64 ntfs_attr_pread(ntfs_attr *na, const s64 pos, s64 count, void *b)
return 0;
count = na->data_size - pos;
}
vol = na->ni->vol;
/* If it is a resident attribute, get the value from the mft record. */
if (!NAttrNonResident(na)) {
ntfs_attr_search_ctx *ctx;

View File

@ -384,7 +384,7 @@ error_exit:
/**
* ntfs_volume_startup - allocate and setup an ntfs volume
* @dev: device to open
* @rwflag: optional mount flags
* @flags: optional mount flags
*
* Load, verify, and parse bootsector; load and setup $MFT and $MFTMirr. After
* calling this function, the volume is setup sufficiently to call all read
@ -393,7 +393,7 @@ error_exit:
* Return the allocated volume structure on success and NULL on error with
* errno set to the error code.
*/
ntfs_volume *ntfs_volume_startup(struct ntfs_device *dev, unsigned long rwflag)
ntfs_volume *ntfs_volume_startup(struct ntfs_device *dev, unsigned long flags)
{
LCN mft_zone_size, mft_lcn;
s64 br;
@ -429,8 +429,10 @@ ntfs_volume *ntfs_volume_startup(struct ntfs_device *dev, unsigned long rwflag)
}
ntfs_upcase_table_build(vol->upcase,
vol->upcase_len * sizeof(ntfschar));
if ((rwflag & MS_RDONLY) == MS_RDONLY)
if (flags & MS_RDONLY)
NVolSetReadOnly(vol);
if (flags & MS_NOATIME)
NVolSetNoATime(vol);
ntfs_log_debug("Reading bootsector... ");
if (dev->d_ops->open(dev, NVolReadOnly(vol) ? O_RDONLY: O_RDWR)) {
ntfs_log_debug(FAILED);
@ -730,15 +732,16 @@ out:
/**
* ntfs_device_mount - open ntfs volume
* @dev: device to open
* @rwflag: optional mount flags
* @flags: optional mount flags
*
* This function mounts an ntfs volume. @dev should describe the device which
* to mount as the ntfs volume.
*
* @rwflags is an optional second parameter. The same flags are used as for
* the mount system call (man 2 mount). Currently only the following flag
* is implemented:
* @flags is an optional second parameter. The same flags are used as for
* the mount system call (man 2 mount). Currently only the following flags
* are implemented:
* MS_RDONLY - mount volume read-only
* MS_NOATIME - do not update access time
*
* The function opens the device @dev and verifies that it contains a valid
* bootsector. Then, it allocates an ntfs_volume structure and initializes
@ -749,7 +752,7 @@ out:
* Return the allocated volume structure on success and NULL on error with
* errno set to the error code.
*/
ntfs_volume *ntfs_device_mount(struct ntfs_device *dev, unsigned long rwflag)
ntfs_volume *ntfs_device_mount(struct ntfs_device *dev, unsigned long flags)
{
s64 l;
#ifndef NTFS_DISABLE_DEBUG_LOGGING
@ -767,7 +770,7 @@ ntfs_volume *ntfs_device_mount(struct ntfs_device *dev, unsigned long rwflag)
int i, j, eo;
u32 u;
vol = ntfs_volume_startup(dev, rwflag);
vol = ntfs_volume_startup(dev, flags);
if (!vol) {
ntfs_log_perror("Failed to startup volume");
return NULL;
@ -1101,7 +1104,7 @@ ntfs_volume *ntfs_device_mount(struct ntfs_device *dev, unsigned long rwflag)
* Check for dirty logfile and hibernated Windows.
* We care only about read-write mounts.
*/
if (!(rwflag & MS_RDONLY)) {
if (!(flags & MS_RDONLY)) {
if (ntfs_volume_check_logfile(vol) < 0)
goto error_exit;
if (ntfs_volume_check_hiberfile(vol) < 0)
@ -1125,15 +1128,16 @@ error_exit:
/**
* ntfs_mount - open ntfs volume
* @name: name of device/file to open
* @rwflag: optional mount flags
* @flags: optional mount flags
*
* This function mounts an ntfs volume. @name should contain the name of the
* device/file to mount as the ntfs volume.
*
* @rwflags is an optional second parameter. The same flags are used as for
* the mount system call (man 2 mount). Currently only the following flag
* is implemented:
* @flags is an optional second parameter. The same flags are used as for
* the mount system call (man 2 mount). Currently only the following flags
* are implemented:
* MS_RDONLY - mount volume read-only
* MS_NOATIME - do not update access time
*
* The function opens the device or file @name and verifies that it contains a
* valid bootsector. Then, it allocates an ntfs_volume structure and initializes
@ -1148,7 +1152,7 @@ error_exit:
* soon as the function returns.
*/
ntfs_volume *ntfs_mount(const char *name __attribute__((unused)),
unsigned long rwflag __attribute__((unused)))
unsigned long flags __attribute__((unused)))
{
#ifndef NO_NTFS_DEVICE_DEFAULT_IO_OPS
struct ntfs_device *dev;
@ -1159,7 +1163,7 @@ ntfs_volume *ntfs_mount(const char *name __attribute__((unused)),
if (!dev)
return NULL;
/* Call ntfs_device_mount() to do the actual mount. */
vol = ntfs_device_mount(dev, rwflag);
vol = ntfs_device_mount(dev, flags);
if (!vol) {
int eo = errno;
ntfs_device_free(dev);