Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9438250 authored by Anton Altaparmakov's avatar Anton Altaparmakov
Browse files

NTFS: Enable ATTR_SIZE attribute changes in ntfs_setattr(). This completes


      the initial implementation of file truncation.  Now both open(2)ing
      a file with the O_TRUNC flag and the {,f}truncate(2) system calls
      will resize a file appropriately.  The limitations are that only
      uncompressed and unencrypted files are supported.  Also, there is
      only very limited support for highly fragmented files (the ones whose
      $DATA attribute is split into multiple attribute extents).

Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
parent dd072330
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -50,6 +50,13 @@ ToDo/Notes:
	  but not the initialized size can be extended, too.
	- Implement fs/ntfs/inode.[hc]::ntfs_truncate().  It only supports
	  uncompressed and unencrypted files.
	- Enable ATTR_SIZE attribute changes in ntfs_setattr().  This completes
	  the initial implementation of file truncation.  Now both open(2)ing
	  a file with the O_TRUNC flag and the {,f}truncate(2) system calls
	  will resize a file appropriately.  The limitations are that only
	  uncompressed and unencrypted files are supported.  Also, there is
	  only very limited support for highly fragmented files (the ones whose
	  $DATA attribute is split into multiple attribute extents).

2.1.24 - Lots of bug fixes and support more clean journal states.

+15 −8
Original line number Diff line number Diff line
@@ -2845,8 +2845,7 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr)

	err = inode_change_ok(vi, attr);
	if (err)
		return err;

		goto out;
	/* We do not support NTFS ACLs yet. */
	if (ia_valid & (ATTR_UID | ATTR_GID | ATTR_MODE)) {
		ntfs_warning(vi->i_sb, "Changes in user/group/mode are not "
@@ -2854,14 +2853,22 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
		err = -EOPNOTSUPP;
		goto out;
	}

	if (ia_valid & ATTR_SIZE) {
		if (attr->ia_size != i_size_read(vi)) {
			ntfs_warning(vi->i_sb, "Changes in inode size are not "
					"supported yet, ignoring.");
			ntfs_inode *ni = NTFS_I(vi);
			/*
			 * FIXME: For now we do not support resizing of
			 * compressed or encrypted files yet.
			 */
			if (NInoCompressed(ni) || NInoEncrypted(ni)) {
				ntfs_warning(vi->i_sb, "Changes in inode size "
						"are not supported yet for "
						"%s files, ignoring.",
						NInoCompressed(ni) ?
						"compressed" : "encrypted");
				err = -EOPNOTSUPP;
			// TODO: Implement...
			// err = vmtruncate(vi, attr->ia_size);
			} else
				err = vmtruncate(vi, attr->ia_size);
			if (err || ia_valid == ATTR_SIZE)
				goto out;
		} else {