From: Dmitry Monakhov on
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(a)openvz.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(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/