diff options
author | Sage Weil <sage@newdream.net> | 2009-10-09 16:38:45 -0700 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-10-09 16:39:30 -0700 |
commit | 752727a1b21a462d6ef634d552f180ae692f8947 (patch) | |
tree | 46e59f04e85e160641a71f64fcfbb899dfb7e438 /fs/ceph/ceph_fs.c | |
parent | 13e38c8ae771d73bf6d1f0f98e35f99c0f0d48ff (diff) |
ceph: add file layout validation
This tracks updates to code shared with userspace.
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/ceph_fs.c')
-rw-r--r-- | fs/ceph/ceph_fs.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/fs/ceph/ceph_fs.c b/fs/ceph/ceph_fs.c index 9371ff1c000..a950b408357 100644 --- a/fs/ceph/ceph_fs.c +++ b/fs/ceph/ceph_fs.c @@ -3,6 +3,30 @@ */ #include "types.h" +/* + * return true if @layout appears to be valid + */ +int ceph_file_layout_is_valid(const struct ceph_file_layout *layout) +{ + __u32 su = le32_to_cpu(layout->fl_stripe_unit); + __u32 sc = le32_to_cpu(layout->fl_stripe_count); + __u32 os = le32_to_cpu(layout->fl_object_size); + + /* stripe unit, object size must be non-zero, 64k increment */ + if (!su || (su & (CEPH_MIN_STRIPE_UNIT-1))) + return 0; + if (!os || (os & (CEPH_MIN_STRIPE_UNIT-1))) + return 0; + /* object size must be a multiple of stripe unit */ + if (os < su || os % su) + return 0; + /* stripe count must be non-zero */ + if (!sc) + return 0; + return 1; +} + + int ceph_flags_to_mode(int flags) { #ifdef O_DIRECTORY /* fixme */ |