[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1266608845-13212-3-git-send-email-dmonakhov@openvz.org>
Date: Fri, 19 Feb 2010 22:47:20 +0300
From: Dmitry Monakhov <dmonakhov@...nvz.org>
To: linux-kernel@...r.kernel.org
Cc: linux-fsdevel@...r.kernel.org,
Dmitry Monakhov <dmonakhov@...nvz.org>
Subject: [PATCH 2/7] vfs: inode_change_ok have to perform all necessery checks
Usually this is the only function which called before inode
attributes manipulation. In fact inode_change_ok() performs only
posix checks. But it new_size check is also important. Otherwise
we mail fail in very late stage.
Signed-off-by: Dmitry Monakhov <dmonakhov@...nvz.org>
---
fs/attr.c | 19 +++++++++++++++++--
include/linux/fs.h | 3 ++-
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/fs/attr.c b/fs/attr.c
index b1cc391..cc2a801 100644
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -18,7 +18,7 @@
/* Taken over from the old code... */
/* POSIX UID/GID verification for setting inode attributes. */
-int inode_change_ok(const struct inode *inode, struct iattr *attr)
+int inode_change_posix_ok(const struct inode *inode, struct iattr *attr)
{
int retval = -EPERM;
unsigned int ia_valid = attr->ia_valid;
@@ -60,7 +60,7 @@ fine:
error:
return retval;
}
-EXPORT_SYMBOL(inode_change_ok);
+EXPORT_SYMBOL(inode_change_posix_ok);
/**
* inode_newsize_ok - may this inode be truncated to a given size
@@ -105,6 +105,21 @@ out_big:
}
EXPORT_SYMBOL(inode_newsize_ok);
+/*
+ * General verification for setting inode attributes.
+ */
+int inode_change_ok(const struct inode *inode, struct iattr *attr)
+{
+ int ret;
+ ret = inode_change_posix_ok(inode, attr);
+ if (ret)
+ return ret;
+ if (attr->ia_valid & ATTR_SIZE)
+ ret = inode_newsize_ok(inode, attr->ia_size);
+ return ret;
+}
+EXPORT_SYMBOL(inode_change_ok);
+
void __inode_setattr(struct inode * inode, struct iattr * attr)
{
unsigned int ia_valid = attr->ia_valid;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 18b7be8..eee26ea 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2371,8 +2371,9 @@ extern int buffer_migrate_page(struct address_space *,
#define buffer_migrate_page NULL
#endif
-extern int inode_change_ok(const struct inode *, struct iattr *);
+extern int inode_change_posix_ok(const struct inode *, struct iattr *);
extern int inode_newsize_ok(const struct inode *, loff_t offset);
+extern int inode_change_ok(const struct inode *, struct iattr *);
extern void __inode_setattr(struct inode *, struct iattr *);
extern int __must_check inode_setattr(struct inode *, struct iattr *);
--
1.6.6
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists