]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/configfs/dir.c
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[mirror_ubuntu-artful-kernel.git] / fs / configfs / dir.c
index 8fd032ad692092095edbfd586552cb3f035cd193..cab612b2ae767bbe2ffeb187a6f630f891cd52f3 100644 (file)
@@ -255,6 +255,12 @@ static void configfs_init_file(struct inode * inode)
        inode->i_fop = &configfs_file_operations;
 }
 
+static void configfs_init_bin_file(struct inode *inode)
+{
+       inode->i_size = 0;
+       inode->i_fop = &configfs_bin_file_operations;
+}
+
 static void init_symlink(struct inode * inode)
 {
        inode->i_op = &configfs_symlink_inode_operations;
@@ -423,7 +429,9 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den
        spin_unlock(&configfs_dirent_lock);
 
        error = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG,
-                               configfs_init_file);
+                               (sd->s_type & CONFIGFS_ITEM_BIN_ATTR) ?
+                                       configfs_init_bin_file :
+                                       configfs_init_file);
        if (error) {
                configfs_put(sd);
                return error;
@@ -583,6 +591,7 @@ static int populate_attrs(struct config_item *item)
 {
        struct config_item_type *t = item->ci_type;
        struct configfs_attribute *attr;
+       struct configfs_bin_attribute *bin_attr;
        int error = 0;
        int i;
 
@@ -594,6 +603,13 @@ static int populate_attrs(struct config_item *item)
                                break;
                }
        }
+       if (t->ct_bin_attrs) {
+               for (i = 0; (bin_attr = t->ct_bin_attrs[i]) != NULL; i++) {
+                       error = configfs_create_bin_file(item, bin_attr);
+                       if (error)
+                               break;
+               }
+       }
 
        if (error)
                detach_attrs(item);