Whamcloud - gitweb
- landing b_fid.
[fs/lustre-release.git] / lustre / lvfs / fsfilt_smfs.c
index b64cf91..b0b77b1 100644 (file)
@@ -241,8 +241,12 @@ static int fsfilt_smfs_iocontrol(struct inode *inode, struct file *file,
         RETURN(rc);
 }
 
-static int fsfilt_smfs_set_md(struct inode *inode, void *handle,
-                              void *lmm, int lmm_size)
+typedef int (*set_ea_func_t) (struct inode *, void *, void *, int);
+typedef int (*get_ea_func_t) (struct inode *, void *, int);
+
+static int fsfilt_smfs_set_ea(struct inode *inode, void *handle,
+                              void *ea, int ea_size, 
+                              set_ea_func_t set_ea_func)
 {
         struct fsfilt_operations *cache_fsfilt = I2FOPS(inode);
         struct inode *cache_inode = NULL;
@@ -256,24 +260,22 @@ static int fsfilt_smfs_set_md(struct inode *inode, void *handle,
         if (!cache_inode)
                 RETURN(-ENOENT);
 
-        pre_smfs_inode(inode, cache_inode);
-
-        if (!cache_fsfilt->fs_set_md)
+        if (!set_ea_func)
                 RETURN(-ENOSYS);
 
+        pre_smfs_inode(inode, cache_inode);
+
         down(&cache_inode->i_sem);
-        rc = cache_fsfilt->fs_set_md(cache_inode, handle, lmm, lmm_size);
+        rc = set_ea_func(cache_inode, handle, ea, ea_size);
         up(&cache_inode->i_sem);
 
         post_smfs_inode(inode, cache_inode);
 
-        smfs_rec_md(inode, lmm, lmm_size);
-
         RETURN(rc);
 }
 
-/* Must be called with i_sem held */
-static int fsfilt_smfs_get_md(struct inode *inode, void *lmm, int lmm_size)
+static int fsfilt_smfs_get_ea(struct inode *inode, void *ea, 
+                              int ea_size, get_ea_func_t get_ea_func)
 {
         struct fsfilt_operations *cache_fsfilt = I2FOPS(inode);
         struct inode *cache_inode = NULL;
@@ -287,13 +289,13 @@ static int fsfilt_smfs_get_md(struct inode *inode, void *lmm, int lmm_size)
         if (!cache_inode)
                 RETURN(-ENOENT);
 
-        pre_smfs_inode(inode, cache_inode);
-
-        if (!cache_fsfilt->fs_get_md)
+        if (!get_ea_func)
                 RETURN(-ENOSYS);
 
+        pre_smfs_inode(inode, cache_inode);
+
         down(&cache_inode->i_sem);
-        rc = cache_fsfilt->fs_get_md(cache_inode, lmm, lmm_size);
+        rc = get_ea_func(cache_inode, ea, ea_size);
         up(&cache_inode->i_sem);
 
         post_smfs_inode(inode, cache_inode);
@@ -301,6 +303,61 @@ static int fsfilt_smfs_get_md(struct inode *inode, void *lmm, int lmm_size)
         RETURN(rc);
 }
 
+static int fsfilt_smfs_set_md(struct inode *inode, void *handle,
+                              void *lmm, int lmm_size)
+{
+        int rc = 0;
+        struct fsfilt_operations *cache_fsfilt = I2FOPS(inode);
+        
+        rc = fsfilt_smfs_set_ea(inode, handle, lmm, lmm_size,
+                                cache_fsfilt->fs_set_md);
+        if (rc)
+                return rc;
+                
+        smfs_rec_md(inode, lmm, lmm_size);
+        return rc;
+}
+
+static int fsfilt_smfs_get_md(struct inode *inode, void *lmm, int
+                              lmm_size)
+{
+        struct fsfilt_operations *cache_fsfilt = I2FOPS(inode);
+        return fsfilt_smfs_get_ea(inode, lmm, lmm_size,
+                                  cache_fsfilt->fs_get_md);
+}
+
+static int fsfilt_smfs_set_mid(struct inode *inode, void *handle,
+                               void *mid, int mid_size)
+{
+        struct fsfilt_operations *cache_fsfilt = I2FOPS(inode);
+        return fsfilt_smfs_set_ea(inode, handle, mid, mid_size,
+                                  cache_fsfilt->fs_set_mid);
+}
+
+static int fsfilt_smfs_get_mid(struct inode *inode, void *mid,
+                               int mid_size)
+{
+        struct fsfilt_operations *cache_fsfilt = I2FOPS(inode);
+        return fsfilt_smfs_get_ea(inode, mid, mid_size,
+                                  cache_fsfilt->fs_get_mid);
+}
+
+static int fsfilt_smfs_set_sid(struct inode *inode, void *handle,
+                               void *sid, int sid_size)
+{
+        struct fsfilt_operations *cache_fsfilt = I2FOPS(inode);
+        return fsfilt_smfs_set_ea(inode, handle, sid, sid_size,
+                                  cache_fsfilt->fs_set_sid);
+}
+
+static int fsfilt_smfs_get_sid(struct inode *inode, void *sid,
+                               int sid_size)
+{
+        struct fsfilt_operations *cache_fsfilt = I2FOPS(inode);
+        return fsfilt_smfs_get_ea(inode, sid, sid_size,
+                                  cache_fsfilt->fs_get_sid);
+}
+
 static int fsfilt_smfs_send_bio(int rw, struct inode *inode, struct kiobuf *bio)
 {
         struct inode *cache_inode;
@@ -1004,6 +1061,10 @@ static struct fsfilt_operations fsfilt_smfs_ops = {
         .fs_iocontrol           = fsfilt_smfs_iocontrol,
         .fs_set_md              = fsfilt_smfs_set_md,
         .fs_get_md              = fsfilt_smfs_get_md,
+        .fs_set_mid             = fsfilt_smfs_set_mid,
+        .fs_get_mid             = fsfilt_smfs_get_mid,
+        .fs_set_sid             = fsfilt_smfs_set_sid,
+        .fs_get_sid             = fsfilt_smfs_get_sid,
         .fs_readpage            = fsfilt_smfs_readpage,
         .fs_getpage             = fsfilt_smfs_getpage,
         .fs_add_journal_cb      = fsfilt_smfs_add_journal_cb,
@@ -1016,9 +1077,9 @@ static struct fsfilt_operations fsfilt_smfs_ops = {
         .fs_setup               = fsfilt_smfs_setup,
         .fs_post_setup          = fsfilt_smfs_post_setup,
         .fs_post_cleanup        = fsfilt_smfs_post_cleanup,
-        .fs_set_fs_flags       = fsfilt_smfs_set_fs_flags,
-        .fs_clear_fs_flags     = fsfilt_smfs_clear_fs_flags,
-        .fs_get_fs_flags       = fsfilt_smfs_get_fs_flags,
+        .fs_set_fs_flags        = fsfilt_smfs_set_fs_flags,
+        .fs_clear_fs_flags      = fsfilt_smfs_clear_fs_flags,
+        .fs_get_fs_flags        = fsfilt_smfs_get_fs_flags,
         .fs_set_ost_flags       = fsfilt_smfs_set_ost_flags,
         .fs_set_mds_flags       = fsfilt_smfs_set_mds_flags,
         .fs_precreate_rec       = fsfilt_smfs_precreate_rec,
@@ -1034,8 +1095,6 @@ static struct fsfilt_operations fsfilt_smfs_ops = {
         .fs_write_extents       = fsfilt_smfs_write_extents,
         .fs_set_snap_item       = fsfilt_smfs_set_snap_item,
         .fs_do_write_cow        = fsfilt_smfs_do_write_cow,
-        /* FIXME-UMKA: probably fsfilt_smfs_get_op_len() should be
-         * put here too. */
 };
 
 static int __init fsfilt_smfs_init(void)