]> git.hungrycats.org Git - linux/commitdiff
NTFS: - Remove BKL use from ntfs_setattr() syncing up with the rest of the
authorAnton Altaparmakov <aia21@cantab.net>
Wed, 22 Sep 2004 17:31:09 +0000 (18:31 +0100)
committerAnton Altaparmakov <aia21@cantab.net>
Wed, 22 Sep 2004 17:31:09 +0000 (18:31 +0100)
        kernel.
      - Update ->setattr (fs/ntfs/inode.c::ntfs_setattr()) to refuse to
        change the uid, gid, and mode of an inode as we do not support NTFS
        ACLs yet.

Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
fs/ntfs/ChangeLog
fs/ntfs/Makefile
fs/ntfs/inode.c

index d60c4933588daa7e13aaaa0f50c7d38090c29639..028bd144609bfc6d80b83b644cd263a74a25a105 100644 (file)
@@ -21,6 +21,14 @@ ToDo/Notes:
        - Enable the code for setting the NT4 compatibility flag when we start
          making NTFS 1.2 specific modifications.
 
+2.1.19-WIP
+
+       - Update ->setattr (fs/ntfs/inode.c::ntfs_setattr()) to refuse to
+         change the uid, gid, and mode of an inode as we do not support NTFS
+         ACLs yet.
+       - Remove BKL use from ntfs_setattr() syncing up with the rest of the
+         kernel.
+
 2.1.18 - Fix scheduling latencies at mount time as well as an endianness bug.
 
        - Remove vol->nr_mft_records as it was pretty meaningless and optimize
index 5d2967b7cd9f67c89c658cb5b6284d41fdb0f94d..884e665b08cccbe3497546c14418290ae30f350e 100644 (file)
@@ -6,7 +6,7 @@ ntfs-objs := aops.o attrib.o collate.o compress.o debug.o dir.o file.o \
             index.o inode.o mft.o mst.o namei.o super.o sysctl.o unistr.o \
             upcase.o
 
-EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.18\"
+EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.19-WIP\"
 
 ifeq ($(CONFIG_NTFS_DEBUG),y)
 EXTRA_CFLAGS += -DDEBUG
index d87e1e8254c55dc19a0a406caefc0dea95620894..6027259288df00e3315b751b1bff980ba825f855 100644 (file)
@@ -2270,7 +2270,11 @@ int ntfs_show_options(struct seq_file *sf, struct vfsmount *mnt)
  *
  * We don't support i_size changes yet.
  *
- * Called with ->i_sem held.
+ * Called with ->i_sem held.  In all but one case ->i_alloc_sem is held for
+ * writing.  The only case 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 which means that it is a noop as far
+ * as ntfs_truncate() is concerned.
  */
 void ntfs_truncate(struct inode *vi)
 {
@@ -2289,67 +2293,62 @@ void ntfs_truncate(struct inode *vi)
  * @attr:      structure describing the attributes and the changes
  *
  * We have to trap VFS attempts to truncate the file described by @dentry as
- * soon as possible, because we do not implement changes in i_size yet. So we
+ * soon as possible, because we do not implement changes in i_size yet.  So we
  * abort all i_size changes here.
  *
- * Called with ->i_sem held.
+ * 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_alloc_sem held for writing.
  *
  * Basically this is a copy of generic notify_change() and inode_setattr()
  * functionality, except we intercept and abort changes in i_size.
  */
 int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
 {
-       struct inode *vi;
+       struct inode *vi = dentry->d_inode;
        int err;
        unsigned int ia_valid = attr->ia_valid;
 
-       vi = dentry->d_inode;
-
        err = inode_change_ok(vi, attr);
        if (err)
                return err;
 
-       if ((ia_valid & ATTR_UID && attr->ia_uid != vi->i_uid) ||
-                       (ia_valid & ATTR_GID && attr->ia_gid != vi->i_gid)) {
-               err = DQUOT_TRANSFER(vi, attr) ? -EDQUOT : 0;
-               if (err)
-                       return err;
+       /* 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 "
+                               "supported yet, ignoring.");
+               err = -EOPNOTSUPP;
+               goto out;
        }
 
-       lock_kernel();
-
        if (ia_valid & ATTR_SIZE) {
-               ntfs_error(vi->i_sb, "Changes in i_size are not supported "
-                               "yet. Sorry.");
-               // TODO: Implement...
-               // err = vmtruncate(vi, attr->ia_size);
-               err = -EOPNOTSUPP;
-               if (err)
-                       goto trunc_err;
+               if (attr->ia_size != i_size_read(vi)) {
+                       ntfs_warning(vi->i_sb, "Changes in inode size are not "
+                                       "supported yet, ignoring.");
+                       err = -EOPNOTSUPP;
+                       // TODO: Implement...
+                       // err = vmtruncate(vi, attr->ia_size);
+                       if (err || ia_valid == ATTR_SIZE)
+                               goto out;
+               } else {
+                       /*
+                        * We skipped the truncate but must still update
+                        * timestamps.
+                        */
+                       ia_valid |= ATTR_MTIME|ATTR_CTIME;
+               }
        }
 
-       if (ia_valid & ATTR_UID)
-               vi->i_uid = attr->ia_uid;
-       if (ia_valid & ATTR_GID)
-               vi->i_gid = attr->ia_gid;
        if (ia_valid & ATTR_ATIME)
                vi->i_atime = attr->ia_atime;
        if (ia_valid & ATTR_MTIME)
                vi->i_mtime = attr->ia_mtime;
        if (ia_valid & ATTR_CTIME)
                vi->i_ctime = attr->ia_ctime;
-       if (ia_valid & ATTR_MODE) {
-               vi->i_mode = attr->ia_mode;
-               if (!in_group_p(vi->i_gid) &&
-                               !capable(CAP_FSETID))
-                       vi->i_mode &= ~S_ISGID;
-       }
        mark_inode_dirty(vi);
-
-trunc_err:
-
-       unlock_kernel();
-
+out:
        return err;
 }