Whamcloud - gitweb
Update smfs: fix bugs of smfs_create
[fs/lustre-release.git] / lustre / smfs / super.c
index 8e8cdd9..58dfcd3 100644 (file)
@@ -70,7 +70,7 @@ static int set_loop_fd(char *dev_path, char *loop_dev)
 
        if (!fd) RETURN(-EINVAL);
        
-       filp = filp_open(dev_path, 0, 0);
+       filp = filp_open(dev_path, FMODE_WRITE, 0);
        if (!filp || !S_ISREG(filp->f_dentry->d_inode->i_mode)) 
                RETURN(-EINVAL);
        
@@ -109,7 +109,7 @@ static int set_loop_fd(char *dev_path, char *loop_dev)
 #define SIZE(a) (sizeof(a)/sizeof(a[0]))
 static char *find_unused_and_set_loop_device(char *dev_path)
 {
-        char *loop_formats[] = { "/dev/loop%d", "/dev/loop/%d" };
+        char *loop_formats[] = { "/dev/loop/%d", "/dev/loop%d"};
         struct loop_info loopinfo;
        struct nameidata nd;
        struct dentry *dentry;
@@ -125,7 +125,7 @@ static char *find_unused_and_set_loop_device(char *dev_path)
                                
                        if (path_init(dev, LOOKUP_FOLLOW, &nd)) {
                                error = path_walk(dev, &nd);
-                               if (error) {
+                               if (error && error != -ENOENT) {
                                        path_release(&nd);
                                        SM_FREE(dev, strlen(loop_formats[i]) + 1); 
                                        RETURN(NULL);
@@ -140,7 +140,7 @@ static char *find_unused_and_set_loop_device(char *dev_path)
                                              (unsigned long)&loopinfo);
                        path_release(&nd);
                         
-                       if (error == ENXIO) {
+                       if (error == -ENXIO) {
                                /*find unused loop and set dev_path to loopdev*/
                                error = set_loop_fd(dev_path, dev);
                                if (error) {
@@ -163,8 +163,8 @@ static char *parse_path2dev(struct super_block *sb, char *dev_path)
        char *name = NULL;
        int  error = 0;
 
-       if (path_init(name, LOOKUP_FOLLOW, &nd)) {
-               error = path_walk(name, &nd);
+       if (path_init(dev_path, LOOKUP_FOLLOW, &nd)) {
+               error = path_walk(dev_path, &nd);
                if (error) {
                        path_release(&nd);
                        RETURN(NULL);
@@ -190,6 +190,14 @@ static char *parse_path2dev(struct super_block *sb, char *dev_path)
        memcpy(name, dev_path, strlen(dev_path) + 1);
        RETURN(name);
 }
+static void duplicate_sb(struct super_block *csb, 
+                        struct super_block *sb)
+{
+       sb->s_blocksize = csb->s_blocksize;
+       sb->s_magic = csb->s_magic;
+       sb->s_blocksize_bits = csb->s_blocksize_bits;
+       sb->s_maxbytes = csb->s_maxbytes;
+}
 extern struct super_operations smfs_super_ops;
 
 static int sm_mount_cache(struct super_block *sb, 
@@ -216,12 +224,14 @@ static int sm_mount_cache(struct super_block *sb,
         free_page(page);
        
        if (IS_ERR(mnt)) {
-                CERROR("do_kern_mount failed: rc = %d\n", err);
-                GOTO(err_out, 0);
+                CERROR("do_kern_mount failed: rc = %d\n", PTR_ERR(mnt));
+                GOTO(err_out, err = PTR_ERR(mnt));
         }
        smb = S2SMI(sb); 
        smb->smsi_sb = mnt->mnt_sb;
        smb->smsi_mnt = mnt;
+       
+       duplicate_sb(mnt->mnt_sb, sb);
        sm_set_sb_ops(mnt->mnt_sb, sb); 
 err_out:
        if (dev_name) 
@@ -234,6 +244,7 @@ static int sm_umount_cache(struct super_block *sb)
        struct smfs_super_info *smb = S2SMI(sb);
        
        mntput(smb->smsi_mnt);
+       
        return 0;
 }
 void smfs_put_super(struct super_block *sb)
@@ -249,8 +260,6 @@ smfs_read_super(
         void *data,
         int silent)
 {
-       struct smfs_inode_info *smi;
-       struct dentry *bottom_root;
        struct inode *root_inode = NULL;
        char *devstr = NULL, *typestr = NULL;
        char *cache_data;
@@ -278,31 +287,23 @@ smfs_read_super(
                CERROR("Can not mount %s as %s\n", devstr, typestr);
                GOTO(out_err, 0);
        }
-       /* set up the super block */
-
-       bottom_root = dget(S2SMI(sb)->smsi_sb->s_root);
-       if (!bottom_root) {
-               CERROR("bottom not mounted\n");
-               GOTO(out_err, err=-ENOENT);
-        }
-
-       root_ino = bottom_root->d_inode->i_ino;
-       smi = I2SMI(root_inode);
-       /*FIXME Intialize smi here*/
-       
+       dget(S2CSB(sb)->s_root);
+       root_ino = S2CSB(sb)->s_root->d_inode->i_ino;
+       root_inode = iget(sb, root_ino);
+               
        CDEBUG(D_SUPER, "readinode %p, root ino %ld, root inode at %p\n",
               sb->s_op->read_inode, root_ino, root_inode);
        
-       sb->s_root = d_alloc_root(bottom_root->d_inode);
+       sb->s_root = d_alloc_root(root_inode);
        
        if (!sb->s_root) {
                GOTO(out_err, err=-EINVAL);
        }
-
+       
        CDEBUG(D_SUPER, "sb %lx, &sb->u.generic_sbp: %lx\n",
                 (ulong) sb, (ulong) &sb->u.generic_sbp);
        
- out_err:
+out_err:
        cleanup_option();
        if (err)
                return NULL;